From 3ffaa3cf3fa4586ad9c234e7c0bbd4c5cf2ece72 Mon Sep 17 00:00:00 2001 From: Jinwoo Hwang Date: Sun, 30 Nov 2025 18:42:54 -0500 Subject: [PATCH 01/10] GEODE-10467: Remove unneeded scripts Remove likely-to-become-outdated copies of release scripts to ensure they are not run by accident from a branch (they should always be run from develop). Also remove CODEOWNERS to avoid the confusion of GitHub showing owner names like on develop, but codeowner reviews not actually being required (due to lack of branch protection or minimum review count on support branches) --- dev-tools/release/README.md | 32 +- dev-tools/release/commit_rc.sh | 163 ----- dev-tools/release/create_support_branches.sh | 292 -------- dev-tools/release/deploy_rc_pipeline.sh | 655 ----------------- dev-tools/release/end_of_support.sh | 155 ---- dev-tools/release/license_review.sh | 377 ---------- dev-tools/release/prepare_rc.sh | 374 ---------- dev-tools/release/print_announce_email.sh | 102 --- dev-tools/release/print_rc_email.sh | 101 --- dev-tools/release/promote_rc.sh | 703 ------------------- dev-tools/release/set_copyright.sh | 68 -- dev-tools/release/set_versions.sh | 215 ------ 12 files changed, 1 insertion(+), 3236 deletions(-) delete mode 100755 dev-tools/release/commit_rc.sh delete mode 100755 dev-tools/release/create_support_branches.sh delete mode 100755 dev-tools/release/deploy_rc_pipeline.sh delete mode 100755 dev-tools/release/end_of_support.sh delete mode 100755 dev-tools/release/license_review.sh delete mode 100755 dev-tools/release/prepare_rc.sh delete mode 100755 dev-tools/release/print_announce_email.sh delete mode 100755 dev-tools/release/print_rc_email.sh delete mode 100755 dev-tools/release/promote_rc.sh delete mode 100755 dev-tools/release/set_copyright.sh delete mode 100755 dev-tools/release/set_versions.sh diff --git a/dev-tools/release/README.md b/dev-tools/release/README.md index a5a51e20bb15..4bc08cde7dfb 100644 --- a/dev-tools/release/README.md +++ b/dev-tools/release/README.md @@ -1,31 +1 @@ -# geode/dev-tools/release -This directory contains scripts to help create a release of Geode and manage branches. - -Not all release steps have scripts. Please follow all instructions as documented in the wiki: [Releasing Apache Geode](https://cwiki.apache.org/confluence/display/GEODE/Releasing+Apache+Geode). - -These scripts are intended to be run from the parent directory of your geode develop checkout, e.g.: - - $ cd .. - $ geode/dev-tools/release/foo.sh - -## Overview of scripts - -**license\_review.sh** compares versions with a previous release and/or checks that all bundled dependencies are noted in appropriate LICENSE file - -**create\_support\_branches.sh** cuts support/x.y from develop for all projects and walks you through creating pipelines and setting version numbers - -**set\_copyright.sh** updates the copyright year - -**set\_versions.sh** updates files that need to contain the version number planned for the next release from this support branch - -**prepare\_rc.sh** Checks out the various geode repos, builds a release candidate, and publishes to nexus staging repo - -**commit\_rc.sh** Pushes the tags and artifacts staged by prepare\_rc.sh and then runs print\_rc\_email.sh - -**print\_rc\_email.sh** Generates an email to send to the dev list announcing a release candidate - -**promote\_rc.sh** Tags an RC as the final release, builds docker images, merges to master, uploads to mirrors, and starts the brew process - -**print\_annouce\_email.sh** Generates an email to send to all lists announcing a release - -**end\_of\_support.sh** cleans up pipelines and branches after N-2 support lifetime is reached +See [Releasing Apache Geode](https://cwiki.apache.org/confluence/display/GEODE/Releasing+Apache+Geode) diff --git a/dev-tools/release/commit_rc.sh b/dev-tools/release/commit_rc.sh deleted file mode 100755 index eb454795bf75..000000000000 --- a/dev-tools/release/commit_rc.sh +++ /dev/null @@ -1,163 +0,0 @@ -#!/usr/bin/env bash -# -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -set -e - -usage() { - echo "Usage: commit_rc.sh -j ticket -v version_number -m maven_repo_id" - echo " -j The GEODE-nnnnn Jira identifier for this release" - echo " -v The #.#.#.RC# version number" - echo " -m The 4 digit id of the nexus maven repo" - exit 1 -} - -JIRA="" -FULL_VERSION="" -MAVEN="" - -while getopts ":j:v:m:" opt; do - case ${opt} in - j ) - JIRA=$OPTARG - ;; - v ) - FULL_VERSION=$OPTARG - ;; - m ) - MAVEN=$OPTARG - ;; - \? ) - usage - ;; - esac -done - -if [[ ${JIRA} == "" ]] || [[ ${FULL_VERSION} == "" ]] || [[ ${MAVEN} == "" ]]; then - usage -fi - -if [[ $FULL_VERSION =~ ^([0-9]+\.[0-9]+\.[0-9]+)\.(RC[0-9]+)$ ]]; then - VERSION=${BASH_REMATCH[1]} -else - echo "Malformed version number ${FULL_VERSION}. Example valid version: 1.9.0.RC1" - exit 1 -fi - -VERSION_MM=${VERSION%.*} - -set -x -WORKSPACE=$PWD/release-${VERSION}-workspace -GEODE=$WORKSPACE/geode -GEODE_EXAMPLES=$WORKSPACE/geode-examples -GEODE_NATIVE=$WORKSPACE/geode-native -GEODE_BENCHMARKS=$WORKSPACE/geode-benchmarks -SVN_DIR=$WORKSPACE/dist/dev/geode -set +x - -if [ -d "$GEODE" ] && [ -d "$GEODE_EXAMPLES" ] && [ -d "$GEODE_NATIVE" ] && [ -d "$GEODE_BENCHMARKS" ] && [ -d "$SVN_DIR" ] ; then - true -else - echo "Please run this script from the same working directory as you initially ran prepare_rc.sh" - exit 1 -fi - - -function failMsg { - errln=$1 - echo "ERROR: script did NOT complete successfully" - echo "Comment out any steps that already succeeded (approximately lines 87-$(( errln - 1 ))) and try again" -} -trap 'failMsg $LINENO' ERR - - -echo "" -echo "============================================================" -echo "Publishing artifacts to apache release location..." -echo "============================================================" -set -x -cd ${SVN_DIR} -svn commit -m "$JIRA: Release Apache Geode ${FULL_VERSION} - -Publish the source, binary, and checksum artifacts to ASF svn server, -from which they will be picked up and published within 15 minutes to -the URLs on https://geode.apache.org/releases/" -set +x - - -echo "" -echo "============================================================" -echo "Adding temporary commit for geode-examples to build against staged ${FULL_VERSION}..." -echo "============================================================" -set -x -cd ${GEODE_EXAMPLES} -set +x -sed -e 's#^geodeRepositoryUrl *=.*#geodeRepositoryUrl = https://repository.apache.org/content/repositories/orgapachegeode-'"${MAVEN}#" \ - -e 's#^geodeReleaseUrl *=.*#geodeReleaseUrl = https://dist.apache.org/repos/dist/dev/geode/'"${FULL_VERSION}#" -i.bak gradle.properties -rm gradle.properties.bak -set -x -git add gradle.properties -git diff --staged --color | cat -git commit -m "$JIRA: Set temporary staging repo - -This serves two purposes: it gives the RC pipeline a way to get the -nexus staging repo id needed for various tests, and it gives the -Jenkins server a valid configuration during the voting period." -git push -set +x - - -echo "" -echo "============================================================" -echo "Keeping -build.0 suffix" -echo "============================================================" -cd ${GEODE}/../.. -set -x -${0%/*}/set_versions.sh -j $JIRA -v ${VERSION} -s -n -w "${WORKSPACE}" -set +x - - -echo "" -echo "============================================================" -echo "Pushing copyrights, versions, and tags..." -echo "============================================================" -for DIR in ${GEODE} ${GEODE_EXAMPLES} ${GEODE_NATIVE} ${GEODE_BENCHMARKS} ; do - set -x - cd ${DIR} - git pull -r - git push -u origin - git push origin rel/v${FULL_VERSION} - set +x -done - - -echo "" -echo "============================================================" -echo "Done publishing the release candidate! Next steps:" -echo "============================================================" -cd ${GEODE}/../.. -echo "1. In a separate terminal window, ${0%/*}/deploy_rc_pipeline.sh -v ${VERSION_MM}" -echo "2. Monitor https://concourse.apachegeode-ci.info/teams/main/pipelines/apache-support-${VERSION_MM//./-}-rc until all green" -echo "3. If you haven't already, add a ${VERSION} section to https://cwiki.apache.org/confluence/display/GEODE/Release+Notes" -JIRABASE=https://issues.apache.org/jira/secure -jiraverid=$(curl -fs $JIRABASE'/ConfigureReleaseNote.jspa?projectId=12318420' | tr -d ' \n' | tr '<' '\n'| awk '/optionvalue.*'$VERSION'$/{sub(/optionvalue="/,"");sub(/">.*/,"");print}') -echo " The 'full list' link will be $JIRABASE/ReleaseNote.jspa?projectId=12318420&version=$jiraverid" -echo "4. Send the following email to announce the RC:" -echo "To: dev@geode.apache.org" -echo "Subject: [VOTE] Apache Geode ${FULL_VERSION}" -${0%/*}/print_rc_email.sh -v ${FULL_VERSION} -m ${MAVEN} -echo "" -which pbcopy >/dev/null && ${0%/*}/print_rc_email.sh -v ${FULL_VERSION} -m ${MAVEN} | pbcopy && echo "(copied to clipboard)" diff --git a/dev-tools/release/create_support_branches.sh b/dev-tools/release/create_support_branches.sh deleted file mode 100755 index c13e4111012d..000000000000 --- a/dev-tools/release/create_support_branches.sh +++ /dev/null @@ -1,292 +0,0 @@ -#!/usr/bin/env bash -# -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -set -e - -usage() { - echo "Usage: create_support_branches.sh -j ticket -v version_number -g your_github_username" - echo " -j The GEODE-nnnnn Jira identifier for this release" - echo " -v The #.# version number of the support branch to create" - echo " -g Your github username" - exit 1 -} - -JIRA="" -VERSION_MM="" -GITHUB_USER="" - -while getopts ":j:v:g:" opt; do - case ${opt} in - j ) - JIRA=$OPTARG - ;; - v ) - VERSION_MM=$OPTARG - ;; - g ) - GITHUB_USER=$OPTARG - ;; - \? ) - usage - ;; - esac -done - -if [[ ${JIRA} == "" ]] || [[ ${VERSION_MM} == "" ]] || [[ ${GITHUB_USER} == "" ]] ; then - usage -fi - -if [[ $VERSION_MM =~ ^([0-9]+\.[0-9]+)$ ]]; then - true -else - echo "Malformed version number ${VERSION_MM}. Example valid version: 1.9" - exit 1 -fi - -MAJOR=${VERSION_MM%.*} -MINOR=${VERSION_MM#*.} - -#tip: hardcode NEWMAJOR and NEWMINOR as needed if jumping to a new major -NEWMAJOR=${MAJOR} -NEWMINOR=$((MINOR + 1)) - -NEWVERSION_MM=${NEWMAJOR}.${NEWMINOR} -NEWVERSION_MM_NODOT=${NEWVERSION_MM//./} -NEWVERSION=${NEWVERSION_MM}.0 - -set -x -WORKSPACE=$PWD/support-${VERSION_MM}-workspace -GEODE=$WORKSPACE/geode -GEODE_DEVELOP=$WORKSPACE/geode-develop -GEODE_EXAMPLES=$WORKSPACE/geode-examples -GEODE_EXAMPLES_DEVELOP=$WORKSPACE/geode-examples-develop -GEODE_NATIVE=$WORKSPACE/geode-native -GEODE_BENCHMARKS=$WORKSPACE/geode-benchmarks -set +x - - -function failMsg1 { - echo "ERROR: script did NOT complete successfully. Please try again." -} -trap failMsg1 ERR - - -echo "" -echo "============================================================" -echo "Cleaning workspace directory..." -echo "============================================================" -set -x -rm -rf $WORKSPACE -mkdir -p $WORKSPACE -set +x - - -echo "" -echo "============================================================" -echo "Cloning repositories..." -echo "============================================================" -set -x -cd ${WORKSPACE} -git clone --single-branch --branch develop git@github.com:apache/geode.git -#(cd geode; git reset --hard $desired_sha) #uncomment if latest commit is not the desired branchpoint -git clone --single-branch --branch develop git@github.com:apache/geode.git geode-develop -git clone --single-branch --branch develop git@github.com:apache/geode-examples.git -git clone --single-branch --branch develop git@github.com:apache/geode-examples.git geode-examples-develop -git clone --single-branch --branch develop git@github.com:apache/geode-native.git -git clone --single-branch --branch develop git@github.com:apache/geode-benchmarks.git -set +x - - -function failMsg2 { - errln=$1 - echo "ERROR: script did NOT complete successfully" - echo "Comment out any steps that already succeeded (approximately lines 88-$(( errln - 1 ))) and try again" -} -trap 'failMsg2 $LINENO' ERR - - -cd ${GEODE}/../.. -set -x -${0%/*}/set_copyright.sh -j $JIRA ${GEODE} ${GEODE_DEVELOP} ${GEODE_EXAMPLES} ${GEODE_EXAMPLES_DEVELOP} ${GEODE_NATIVE} ${GEODE_BENCHMARKS} -set +x - - -echo "" -echo "============================================================" -echo "Creating support/${VERSION_MM} branches" -echo "============================================================" -for DIR in ${GEODE} ${GEODE_EXAMPLES} ${GEODE_NATIVE} ${GEODE_BENCHMARKS} ; do - set -x - cd ${DIR} - git checkout -b support/${VERSION_MM} - git push -u origin support/${VERSION_MM} - git remote set-branches --add origin support/${VERSION_MM} - set +x -done - - -echo "" -echo "============================================================" -echo "Bumping version on develop to ${NEWVERSION}" -echo "============================================================" -set -x -cd ${GEODE_DEVELOP} -git pull -r -git remote add myfork git@github.com:${GITHUB_USER}/geode.git || true -git checkout -b roll-develop-to-${NEWVERSION} -set +x - -#version = 1.13.0-build.0 -sed -e "s/^version =.*/version = ${NEWVERSION}-build.0/" -i.bak gradle.properties - -# initial_version: 1.13.0-((stuff)).0 -sed -e "s/^ initial_version:[^-]*\(-[^.0-9]*\)[.0-9]*/ initial_version: ${NEWVERSION}\1.0/" -i.bak ./ci/pipelines/shared/jinja.variables.yml - -VER=geode-serialization/src/main/java/org/apache/geode/internal/serialization/KnownVersion.java -[ -r $VER ] || VER=geode-serialization/src/main/java/org/apache/geode/internal/serialization/Version.java -#add the new ordinal and KnownVersion constants and set them as current&highest -CURORD=$(cat $VER | awk '/private static final short GEODE_.*_ORDINAL/{print $NF}' | tr -d ';' | sort -n | tail -1) -NEWORD=$(( CURORD + 10 )) -sed -e "s#/. NOTE: when adding a new version#private static final short GEODE_${NEWMAJOR}_${NEWMINOR}_0_ORDINAL = ${NEWORD};\\ -\\ - @Immutable\\ - public static final KnownVersion GEODE_${NEWMAJOR}_${NEWMINOR}_0 =\\ - new KnownVersion("'"'"GEODE"'"'", "'"'"${NEWMAJOR}.${NEWMINOR}.0"'"'", (byte) ${NEWMAJOR}, (byte) ${NEWMINOR}, (byte) 0, (byte) 0,\\ - GEODE_${NEWMAJOR}_${NEWMINOR}_0_ORDINAL);\\ -\\ - /* NOTE: when adding a new version#" \ - -e "/public static final KnownVersion CURRENT/s#GEODE[0-9_]*#GEODE_${NEWMAJOR}_${NEWMINOR}_0#" \ - -e "/public static final int HIGHEST_VERSION/s# = [0-9]*# = ${NEWORD}#" \ - -i.bak $VER - -# directory: docs/guide/113 -# product_version: '1.13' -# product_version_nodot: '113' -# product_version_geode: '1.13' -# product_version_old_minor: '1.12' -sed -E \ - -e "s#docs/guide/[0-9]+#docs/guide/${NEWVERSION_MM_NODOT}#" \ - -e "s#product_version: '[0-9.]+'#product_version: '${NEWVERSION_MM}'#" \ - -e "s#version_nodot: '[0-9]+'#version_nodot: '${NEWVERSION_MM_NODOT}'#" \ - -e "s#product_version_geode: '[0-9.]+'#product_version_geode: '${NEWVERSION_MM}'#" \ - -e "s#product_version_old_minor: '[0-9.]+'#product_version_old_minor: '${VERSION_MM}'#" \ - -i.bak geode-book/config.yml - -#rewrite '/', '/docs/guide/113/about_geode.html' -#rewrite '/index.html', '/docs/guide/113/about_geode.html' -sed -E -e "s#docs/guide/[0-9]+#docs/guide/${NEWVERSION_MM_NODOT}#" -i.bak geode-book/redirects.rb - -rm gradle.properties.bak ci/pipelines/shared/jinja.variables.yml.bak geode-book/config.yml.bak geode-book/redirects.rb.bak $VER.bak* -set -x -git add . -git diff --staged --color | cat - -./gradlew updateExpectedPom - -git commit -a -m "$JIRA: Roll develop to ${NEWVERSION} - -Now that support/${VERSION_MM} has been created, develop advances." -git push -u myfork -set +x - - -echo "" -echo "============================================================" -echo "Bumping examples version on develop to ${NEWVERSION}" -echo "============================================================" -set -x -cd ${GEODE_EXAMPLES_DEVELOP} -git pull -r -set +x - -#version = 1.13.0-build.0 -#geodeVersion = 1.13.0-build+ -sed \ - -e "s/^version =.*/version = ${NEWVERSION}-build.0/" \ - -e "s/^geodeVersion =.*/geodeVersion = ${NEWVERSION_MM}.+/" \ - -i.bak gradle.properties -rm gradle.properties.bak -set -x -git add gradle.properties -git diff --staged --color | cat -git commit -m "$JIRA: Update examples version - -Now that support/${VERSION_MM} has been created, -pair develop examples with ${NEWVERSION}" -git push -u origin -set +x - - -echo "" -echo "============================================================" -echo "Removing CODEOWNERS and duplicate scripts from support/${VERSION_MM}" -echo "============================================================" -set -x -cd ${GEODE}/dev-tools/release -git pull -r -git rm *.sh -cat << EOF > README.md -See [Releasing Apache Geode](https://cwiki.apache.org/confluence/display/GEODE/Releasing+Apache+Geode) -EOF -git add README.md -cd ${GEODE} -[ ! -r CODEOWNERS ] || git rm CODEOWNERS -[ ! -r CODEWATCHERS ] || git rm CODEWATCHERS -git commit -m "$JIRA: Remove unneeded scripts - -Remove likely-to-become-outdated copies of release scripts to ensure -they are not run by accident from a branch (they should always be run -from develop). - -Also remove CODEOWNERS to avoid the confusion of GitHub showing owner -names like on develop, but codeowner reviews not actually being -required (due to lack of branch protection or minimum review count on -support branches)" -git push -u origin -set +x - - -echo "" -echo "============================================================" -echo "Setting version on support/${VERSION_MM}" -echo "============================================================" -cd ${GEODE}/../.. -set -x -${0%/*}/set_versions.sh -j $JIRA -v ${VERSION_MM}.0 -s -w "${WORKSPACE}" -set +x - - -echo "" -echo "============================================================" -echo "Logging you in to concourse" -echo "============================================================" -set -x -fly -t concourse.apachegeode-ci.info-main login --team-name main --concourse-url https://concourse.apachegeode-ci.info/ -set +x - - -echo "" -echo "============================================================" -echo "Done creating support branches" -echo "============================================================" -cd ${GEODE}/../.. -echo "Next steps:" -echo "1. Go to https://github.com/${GITHUB_USER}/geode/pull/new/roll-develop-to-${NEWVERSION} and create the pull request" -echo "2. Plus the BumpMinor job at https://concourse.apachegeode-ci.info/teams/main/pipelines/apache-develop-main?group=semver-management" -echo "3. Add ${NEWVERSION} to Jira at https://issues.apache.org/jira/projects/GEODE?selectedItem=com.atlassian.jira.jira-projects-plugin:release-page" -echo "4. (cd ${GEODE}/ci/pipelines/meta && ./deploy_meta.sh) #takes 1-2 hours. keep re-running until successful." -echo "5. That's it for now. Once all needed fixes have been proposed and cherry-picked to support/${VERSION_MM} and https://concourse.apachegeode-ci.info/teams/main/pipelines/apache-support-${VERSION_MM/./-}-main is green, come back and run ${0%/*}/prepare_rc.sh -v ${VERSION_MM}.0.RC1" diff --git a/dev-tools/release/deploy_rc_pipeline.sh b/dev-tools/release/deploy_rc_pipeline.sh deleted file mode 100755 index b257d12f7029..000000000000 --- a/dev-tools/release/deploy_rc_pipeline.sh +++ /dev/null @@ -1,655 +0,0 @@ -#!/usr/bin/env bash -# -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -set -e - -usage() { - echo "Usage: deploy_rc_pipeline -v version_number" - echo " -v The #.# version number" - exit 1 -} - -VERSION_MM="" - -while getopts ":v:" opt; do - case ${opt} in - v ) - VERSION_MM=$OPTARG - ;; - \? ) - usage - ;; - esac -done - -if [[ ${VERSION_MM} == "" ]]; then - usage -fi - -if [[ $VERSION_MM =~ ^([0-9]+\.[0-9]+)$ ]]; then - true -else - echo "Malformed version number ${VERSION_MM}. Example valid version: 1.9" - exit 1 -fi - -if [[ $VERSION_MM =~ ^(1\.1[0-4])$ ]]; then - needscmake="" -else - needscmake="-e s/echo.skipping.latest.cmake.//" -fi - -PIPEYML=$PWD/rc-pipeline.yml -cat << "EOF" | sed -e "s//${VERSION_MM}/" $needscmake > $PIPEYML ---- - -resources: -- name: geode - type: git - source: - branch: support/ - tag_filter: rel/v.*.RC* - uri: https://github.com/apache/geode.git -- name: geode-develop - type: git - source: - branch: develop - uri: https://github.com/apache/geode.git -- name: geode-examples - type: git - source: - branch: support/ - uri: https://github.com/apache/geode-examples.git -- name: geode-native - type: git - source: - branch: support/ - tag_filter: rel/v.*.RC* - uri: https://github.com/apache/geode-native.git -- name: geode-benchmarks - type: git - source: - branch: support/ - tag_filter: rel/v.*.RC* - uri: https://github.com/apache/geode-benchmarks.git -- name: upthewaterspout-tests - type: git - source: - branch: master - uri: https://github.com/upthewaterspout/geode-release-check.git - -jobs: - - name: build-geode-from-tag - serial: true - public: true - plan: - - in_parallel: - - get: geode - trigger: true - passed: [verify-expected-files-and-keys] - - task: validate - timeout: 1h - config: - image_resource: - type: docker-image - source: - repository: bellsoft/liberica-openjdk-debian - tag: 8 - inputs: - - name: geode - platform: linux - run: - path: /bin/sh - args: - - -ecx - - | - apt update -q - apt install -qq -y --no-install-recommends unzip git - FULL_VERSION=$(cd geode && git fetch && git describe --tags | sed -e 's#^rel/v##') - VERSION=$(echo $FULL_VERSION|sed -e 's/\.RC.*//') - SHA=$(cd geode && git rev-parse HEAD) - java -version - cd geode - ./gradlew test installDist - gfsh=geode-assembly/build/install/apache-geode/bin/gfsh - $gfsh version --full | grep "^Source-Revision: ${SHA}$" - $gfsh version --full | grep "^Product-Version: ${VERSION}-build" - ! $gfsh version --full | grep Oracle - - name: build-geode-from-src-tgz - serial: true - public: true - plan: - - in_parallel: - - get: geode - trigger: true - passed: [verify-expected-files-and-keys] - - task: validate - timeout: 1h - config: - image_resource: - type: docker-image - source: - repository: bellsoft/liberica-openjdk-debian - tag: 8 - inputs: - - name: geode - platform: linux - run: - path: /bin/sh - args: - - -ecx - - | - apt update -q - apt install -qq -y --no-install-recommends unzip git - FULL_VERSION=$(cd geode && git fetch && git describe --tags | sed -e 's#^rel/v##') - VERSION=$(echo $FULL_VERSION|sed -e 's/\.RC.*//') - SHA=$(cd geode && git rev-parse HEAD) - curl -fLs https://dist.apache.org/repos/dist/dev/geode/${FULL_VERSION}/apache-geode-${VERSION}-src.tgz > src.tgz - tar xzf src.tgz - cd apache-geode-${VERSION}-src - java -version - ./gradlew test installDist - gfsh=geode-assembly/build/install/apache-geode/bin/gfsh - $gfsh version --full | grep "^Source-Revision: ${SHA}$" - $gfsh version --full | grep "^Product-Version: ${VERSION}-build" - ! $gfsh version --full | grep Oracle - - name: run-gfsh-from-tgz - serial: true - public: true - plan: - - in_parallel: - - get: geode - trigger: true - passed: [verify-expected-files-and-keys] - - task: validate - timeout: 1h - config: - image_resource: - type: docker-image - source: - repository: bellsoft/liberica-openjdk-debian - tag: 8 - inputs: - - name: geode - platform: linux - run: - path: /bin/sh - args: - - -ecx - - | - apt update -q - apt install -qq -y --no-install-recommends git - FULL_VERSION=$(cd geode && git fetch && git describe --tags | sed -e 's#^rel/v##') - VERSION=$(echo $FULL_VERSION|sed -e 's/\.RC.*//') - SHA=$(cd geode && git rev-parse HEAD) - curl -fLs https://dist.apache.org/repos/dist/dev/geode/${FULL_VERSION}/apache-geode-${VERSION}.tgz > bin.tgz - tar xzf bin.tgz - cd apache-geode-${VERSION} - java -version - gfsh=bin/gfsh - $gfsh version --full | grep "^Source-Revision: ${SHA}$" - $gfsh version --full | grep "^Product-Version: ${VERSION}$" - ! $gfsh version --full | grep Oracle - - name: run-geode-examples-jdk11 - serial: true - public: true - plan: - - in_parallel: - - get: geode-examples - trigger: true - - task: validate - timeout: 1h - config: - image_resource: - type: docker-image - source: - repository: bellsoft/liberica-openjdk-debian - tag: 11 - inputs: - - name: geode-examples - platform: linux - run: - path: /bin/sh - args: - - -ecx - - | - apt update -q - apt install -qq -y --no-install-recommends unzip - cd geode-examples - java -version - ./gradlew runAll - - name: run-geode-examples-from-src-tgz-jdk8 - serial: true - public: true - plan: - - in_parallel: - - get: geode-examples - trigger: true - - task: validate - timeout: 1h - config: - image_resource: - type: docker-image - source: - repository: bellsoft/liberica-openjdk-debian - tag: 8 - inputs: - - name: geode-examples - platform: linux - run: - path: /bin/sh - args: - - -ecx - - | - apt update -q - apt install -qq -y --no-install-recommends unzip git - FULL_VERSION=$(cd geode-examples && git fetch && git describe --tags | sed -e 's#^rel/v##' -e 's#-.*##') - VERSION=$(echo $FULL_VERSION|sed -e 's/\.RC.*//') - if [ "${FULL_VERSION}" = "${VERSION}" ] ; then - GRADLE_ARGS="" - curl -fLs https://downloads.apache.org/geode/${VERSION}/apache-geode-examples-${VERSION}-src.tgz > src.tgz - else - STAGING_MAVEN=$(cat geode-examples/gradle.properties | grep geodeRepositoryUrl | awk '{print $3}') - GRADLE_ARGS="-PgeodeReleaseUrl=https://dist.apache.org/repos/dist/dev/geode/${FULL_VERSION} -PgeodeRepositoryUrl=${STAGING_MAVEN}" - curl -fLs https://dist.apache.org/repos/dist/dev/geode/${FULL_VERSION}/apache-geode-examples-${VERSION}-src.tgz > src.tgz - fi - tar xzf src.tgz - cd apache-geode-examples-${VERSION}-src - java -version - ./gradlew ${GRADLE_ARGS} build runAll - - name: build-geode-native-from-tag - serial: true - public: true - plan: - - in_parallel: - - get: geode-native - trigger: true - - task: validate - timeout: 1h - config: - image_resource: - type: docker-image - source: - repository: adoptopenjdk/openjdk8 - tag: slim - inputs: - - name: geode-native - platform: linux - run: - path: /bin/sh - args: - - -ecx - - | - apt update -q - apt install -qq -y --no-install-recommends git - FULL_VERSION=$(cd geode-native && git fetch && git describe --tags | sed -e 's#^rel/v##') - VERSION=$(echo $FULL_VERSION|sed -e 's/\.RC.*//') - #use geode from binary dist - curl -fLs https://dist.apache.org/repos/dist/dev/geode/${FULL_VERSION}/apache-geode-${VERSION}.tgz > geode-bin.tgz - tar xzf geode-bin.tgz - apt-get update || true - DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y cmake openssl doxygen build-essential libssl-dev zlib1g-dev - - echo skipping latest cmake tmp=`mktemp` - echo skipping latest cmake curl -fo ${tmp} -v -L https://github.com/Kitware/CMake/releases/download/v3.21.2/cmake-3.21.2-linux-x86_64.sh - echo skipping latest cmake bash ${tmp} --skip-license --prefix=/usr/local - echo skipping latest cmake rm -f ${tmp} - - #cmake wrongly assumes javah wasn't removed until JDK10, but adoptopenjdk removed it in JDK8 - echo '/opt/java/openjdk/bin/javac -h "$@"' > /opt/java/openjdk/bin/javah - chmod +x /opt/java/openjdk/bin/javah - cd geode-native - mkdir build - cd build - cmake .. -DGEODE_ROOT=$PWD/../../apache-geode-${VERSION} - cmake --build . -- -j 4 - cmake --build . --target docs -- -j 4 - cmake --build . --target install -- -j 4 - - name: build-geode-native-from-src-tgz - serial: true - public: true - plan: - - in_parallel: - - get: geode-native - - get: geode - trigger: true - passed: [verify-expected-files-and-keys] - - task: validate - timeout: 1h - config: - image_resource: - type: docker-image - source: - repository: adoptopenjdk/openjdk8 - tag: slim - inputs: - - name: geode-native - - name: geode - platform: linux - run: - path: /bin/sh - args: - - -ecx - - | - apt update -q - apt install -qq -y --no-install-recommends unzip git - FULL_VERSION=$(cd geode-native && git fetch && git describe --tags | sed -e 's#^rel/v##') - VERSION=$(echo $FULL_VERSION|sed -e 's/\.RC.*//') - # build geode from source - cd geode - ./gradlew build -x test -x javadoc -x rat -x pmdMain - cd .. - apt-get update || true - DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y cmake openssl doxygen build-essential libssl-dev zlib1g-dev - - echo skipping latest cmake tmp=`mktemp` - echo skipping latest cmake curl -fo ${tmp} -v -L https://github.com/Kitware/CMake/releases/download/v3.21.2/cmake-3.21.2-linux-x86_64.sh - echo skipping latest cmake bash ${tmp} --skip-license --prefix=/usr/local - echo skipping latest cmake rm -f ${tmp} - - #cmake wrongly assumes javah wasn't removed until JDK10, but adoptopenjdk removed it in JDK8 - echo '/opt/java/openjdk/bin/javac -h "$@"' > /opt/java/openjdk/bin/javah - chmod +x /opt/java/openjdk/bin/javah - curl -fLs https://dist.apache.org/repos/dist/dev/geode/${FULL_VERSION}/apache-geode-native-${VERSION}-src.tgz > src.tgz - tar xzf src.tgz - cd apache-geode-native-${VERSION}-src - mkdir build - cd build - cmake .. -DGEODE_ROOT=$PWD/../../geode/geode-assembly/build/install/apache-geode - cmake --build . -- -j 4 - cmake --build . --target docs -- -j 4 - cmake --build . --target install -- -j 4 - - name: upthewaterspout - serial: true - public: true - plan: - - in_parallel: - - get: geode - trigger: true - passed: [verify-expected-files-and-keys] - - get: upthewaterspout-tests - - get: geode-examples - - task: validate - timeout: 2h - config: - image_resource: - type: docker-image - source: - repository: bellsoft/liberica-openjdk-debian - tag: 8 - inputs: - - name: geode - - name: upthewaterspout-tests - - name: geode-examples - platform: linux - run: - path: /bin/sh - args: - - -ecx - - | - apt update -q - apt install -qq -y --no-install-recommends unzip git gpg gpg-agent wget - FULL_VERSION=$(cd geode && git fetch && git describe --tags | sed -e 's#^rel/v##') - VERSION=$(echo $FULL_VERSION|sed -e 's/\.RC.*//') - STAGING_MAVEN=$(cat geode-examples/gradle.properties | grep geodeRepositoryUrl | awk '{print $3}') - cd upthewaterspout-tests - curl -fLs https://dist.apache.org/repos/dist/dev/geode/KEYS > KEYS - gpg --import KEYS - java -version - ./gradlew build -PmavenURL=${STAGING_MAVEN} -PdownloadURL=https://dist.apache.org/repos/dist/dev/geode/${FULL_VERSION}/ -Pversion=${FULL_VERSION} - - name: benchmarks-test - serial: true - public: true - plan: - - get: geode-benchmarks - trigger: true - - task: validate - timeout: 1h - config: - image_resource: - type: docker-image - source: - repository: bellsoft/liberica-openjdk-debian - tag: 8 - inputs: - - name: geode-benchmarks - platform: linux - run: - path: /bin/sh - args: - - -ecx - - | - apt update -q - apt install -qq -y --no-install-recommends unzip git keychain - FULL_VERSION=$(cd geode-benchmarks && git fetch && git describe --tags | sed -e 's#^rel/v##') - VERSION=$(echo $FULL_VERSION|sed -e 's/\.RC.*//') - curl -fLs https://dist.apache.org/repos/dist/dev/geode/${FULL_VERSION}/apache-geode-benchmarks-${VERSION}-src.tgz > src.tgz - tar xzf src.tgz - cd apache-geode-benchmarks-${VERSION}-src - java -version - mkdir -p ~/.ssh - ssh-keygen -m PEM -b 2048 -t rsa -f ~/.ssh/id_rsa -q -N "" - cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys - apt-get update || true - apt-get install openssh-server --no-install-recommends -y - echo "StrictHostKeyChecking no" >> /etc/ssh/ssh_config - service ssh start - echo 'tasks.withType(JavaCompile) { options.encoding = "UTF-8" }' >> geode-benchmarks/build.gradle - ./gradlew build test - - name: verify-expected-files-and-keys - serial: true - public: true - plan: - - in_parallel: - - get: geode - trigger: true - - task: validate - timeout: 1h - config: - image_resource: - type: docker-image - source: - repository: bellsoft/liberica-openjdk-debian - tag: 8 - inputs: - - name: geode - platform: linux - run: - path: /bin/bash - args: - - -ecx - - | - apt update -q - apt install -qq -y --no-install-recommends git gpg gpg-agent - FULL_VERSION=$(cd geode && git fetch && git describe --tags | sed -e 's#^rel/v##') - VERSION=$(echo $FULL_VERSION|sed -e 's/\.RC.*//') - curl -fLs https://dist.apache.org/repos/dist/dev/geode/KEYS > KEYS - gpg --import KEYS - url=https://dist.apache.org/repos/dist/dev/geode/${FULL_VERSION} - function verifyArtifactSizeSignatureLicenseNoticeAndCopyright { - tld=$1 - file=${tld}.tgz - minfilesize=$2 - maxfilesize=$3 - echo Verifying $file... - asc=${file}.asc - sha=${file}.sha256 - sum=sha256sum - curl -fLs $url/$file > $file - actualfilesize=$(wc -c < $file) - if [ $actualfilesize -lt $minfilesize ] ; then - echo "File size of $file is only $actualfilesize bytes, expected at least $minfilesize" - return 1 - fi - if [ $actualfilesize -gt $maxfilesize ] ; then - echo "File size of $file is $actualfilesize, expected no more than $maxfilesize bytes" - return 1 - fi - curl -fLs $url/$asc > $asc - curl -fLs $url/$sha > $sha - gpg --verify $asc - $sum -c $sha - echo $file >> exp - echo $asc >> exp - echo $sha >> exp - #check that each archive contains all content below a top-level-directory with the same name as the file (sans .tgz) - ! tar tvzf $file | grep -v " ${tld}/" - #check that each archive contains LICENSE and NOTICE - tar tvzf $file | grep " ${tld}/LICENSE" - tar tvzf $file | grep " ${tld}/NOTICE" - #check that NOTICE contains current copyright year and correctly assigns copyright to ASF - tar xzf $file "${tld}/NOTICE" - year=$(date +%Y) - grep "Copyright" "${tld}/NOTICE" - grep -q "Copyright.*${year}.*Apache Software Foundation" "${tld}/NOTICE" - #check that the declared license is of the correct type - tar xzf $file "${tld}/LICENSE" - head -1 "${tld}/LICENSE" | grep -q "Apache License" - } - verifyArtifactSizeSignatureLicenseNoticeAndCopyright apache-geode-${VERSION}-src 16000000 20000000 - verifyArtifactSizeSignatureLicenseNoticeAndCopyright apache-geode-${VERSION} 120000000 137000000 - verifyArtifactSizeSignatureLicenseNoticeAndCopyright apache-geode-examples-${VERSION}-src 840000 900000 - verifyArtifactSizeSignatureLicenseNoticeAndCopyright apache-geode-native-${VERSION}-src 2400000 3200000 - verifyArtifactSizeSignatureLicenseNoticeAndCopyright apache-geode-benchmarks-${VERSION}-src 85000 125000 - curl -fLs ${url}/ | awk '/>../{gsub(/ *<[^>]*>/,"");print}' | sort > actual-file-list - sort < exp > expected-file-list - set +x - echo "" - if diff -q expected-file-list actual-file-list ; then - echo "The file list at $url matches what is expected and all signatures were verified :)" - else - echo "Expected:" - cat expected-file-list - echo "" - echo "Actual:" - cat actual-file-list - echo "" - echo "Diff:" - diff expected-file-list actual-file-list - exit 1 - fi - - name: verify-no-binaries - serial: true - public: true - plan: - - in_parallel: - - get: geode - trigger: true - passed: [verify-expected-files-and-keys] - - task: validate - timeout: 1h - config: - image_resource: - type: docker-image - source: - repository: bellsoft/liberica-openjdk-debian - tag: 8 - inputs: - - name: geode - platform: linux - run: - path: /bin/bash - args: - - -ecx - - | - apt update -q - apt install -qq -y --no-install-recommends git - FULL_VERSION=$(cd geode && git fetch && git describe --tags | sed -e 's#^rel/v##') - VERSION=$(echo $FULL_VERSION|sed -e 's/\.RC.*//') - url=https://dist.apache.org/repos/dist/dev/geode/${FULL_VERSION} - BINARY_EXTENSIONS="jar|war|class|exe|dll|o|so|obj|bin|out|pyc" - echo "Source artifacts should not contain any files ending in$(echo "|${BINARY_EXTENSIONS}"|sed 's/[^a-z]/ ./g')" - echo "" - function verifyNoBinaries { - file=$1 - echo "" - echo Checking $file... - curl -fLs $url/$file | tar tvzf - | egrep '\.('"${BINARY_EXTENSIONS}"')$' | tee -a bins - } - verifyNoBinaries apache-geode-${VERSION}-src.tgz - verifyNoBinaries apache-geode-examples-${VERSION}-src.tgz - verifyNoBinaries apache-geode-native-${VERSION}-src.tgz - verifyNoBinaries apache-geode-benchmarks-${VERSION}-src.tgz - echo "" - echo "" - if grep -q . bins ; then - echo Binary files were found! - exit 1 - else - echo All good - fi - - name: verify-license - serial: true - public: true - plan: - - in_parallel: - - get: geode - trigger: true - passed: [verify-expected-files-and-keys] - - get: geode-develop - - task: validate - timeout: 1h - config: - image_resource: - type: docker-image - source: - repository: bellsoft/liberica-openjdk-debian - tag: 8 - inputs: - - name: geode - - name: geode-develop - platform: linux - run: - path: /bin/bash - args: - - -ecx - - | - apt update -q - apt install -qq -y --no-install-recommends unzip git - FULL_VERSION=$(cd geode && git fetch && git describe --tags | sed -e 's#^rel/v##') - ./geode-develop/dev-tools/release/license_review.sh -v $FULL_VERSION - - name: all-passed - serial: true - public: true - plan: - - in_parallel: - - get: geode - trigger: true - passed: - - verify-license - - upthewaterspout - - run-gfsh-from-tgz - - verify-no-binaries - - build-geode-from-tag - - build-geode-from-src-tgz - - get: geode-examples - passed: - - run-geode-examples-jdk11 - - run-geode-examples-from-src-tgz-jdk8 - - get: geode-native - passed: - - build-geode-native-from-tag - - build-geode-native-from-src-tgz - - get: geode-benchmarks - passed: - - benchmarks-test -EOF -fly -t concourse.apachegeode-ci.info-main login --team-name main --concourse-url https://concourse.apachegeode-ci.info/ -fly -t concourse.apachegeode-ci.info-main set-pipeline -p apache-support-${VERSION_MM//./-}-rc -c $PIPEYML -fly -t concourse.apachegeode-ci.info-main unpause-pipeline -p apache-support-${VERSION_MM//./-}-rc -fly -t concourse.apachegeode-ci.info-main expose-pipeline -p apache-support-${VERSION_MM//./-}-rc -rm $PIPEYML diff --git a/dev-tools/release/end_of_support.sh b/dev-tools/release/end_of_support.sh deleted file mode 100755 index 38f69b9ace5b..000000000000 --- a/dev-tools/release/end_of_support.sh +++ /dev/null @@ -1,155 +0,0 @@ -#!/usr/bin/env bash -# -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -set -e - -usage() { - echo "Usage: end_of_support.sh -v version_number" - echo " -v The #.# version number of the support branch that is no longer supported" - exit 1 -} - -VERSION_MM="" - -while getopts ":v:" opt; do - case ${opt} in - v ) - VERSION_MM=$OPTARG - ;; - \? ) - usage - ;; - esac -done - -if [[ ${VERSION_MM} == "" ]] ; then - usage -fi - -if [[ $VERSION_MM =~ ^([0-9]+\.[0-9]+)$ ]]; then - true -else - echo "Malformed version number ${VERSION_MM}. Example valid version: 1.9" - exit 1 -fi - -set -x -WORKSPACE=$PWD/support-${VERSION_MM}-workspace -GEODE=$WORKSPACE/geode -GEODE_EXAMPLES=$WORKSPACE/geode-examples -GEODE_NATIVE=$WORKSPACE/geode-native -GEODE_BENCHMARKS=$WORKSPACE/geode-benchmarks -set +x - -function failMsg1 { - echo "ERROR: script did NOT complete successfully. Please try again." -} -trap failMsg1 ERR - - -echo "" -echo "============================================================" -echo "Cleaning workspace directory..." -echo "============================================================" -set -x -rm -rf $WORKSPACE -mkdir -p $WORKSPACE -cd $WORKSPACE -set +x - - -echo "" -echo "============================================================" -echo "Cloning repositories..." -echo "============================================================" -set -x -git clone --branch support/${VERSION_MM} git@github.com:apache/geode.git -git clone --branch support/${VERSION_MM} git@github.com:apache/geode-examples.git -git clone --branch support/${VERSION_MM} git@github.com:apache/geode-native.git -git clone --branch support/${VERSION_MM} git@github.com:apache/geode-benchmarks.git -set +x - - -echo "" -echo "============================================================" -echo "Confirming end of support" -echo "============================================================" -cd ${GEODE} -echo "Geode support branches should be kept for at least 9 months after initial release." -echo "Geode ${VERSION_MM}.0 was released about $(git log -1 --format=%ar rel/v${VERSION_MM}.0)" -read -p "To continue and delete support/${VERSION_MM} and all associated pipelines, type YES if you are sure: " -if [ "$REPLY" != "YES" ] ; then - echo cancelled - exit 1 -fi - - -function failMsg2 { - errln=$1 - echo "ERROR: script did NOT complete successfully" - echo "Comment out any steps that already succeeded (approximately lines 65-$(( errln - 1 ))) and try again" -} -trap 'failMsg2 $LINENO' ERR - - -echo "" -echo "============================================================" -echo "Destroying pipelines" -echo "============================================================" -set -x -cd ${0%/*}/../../ci/pipelines/meta -DEVELOP_META=$(pwd) -cd ${GEODE} -fly -t concourse.apachegeode-ci.info-main login --team-name main --concourse-url https://concourse.apachegeode-ci.info/ -${DEVELOP_META}/destroy_pipelines.sh -set +x - - -echo "" -echo "============================================================" -echo "Destroying support branches" -echo "============================================================" -for DIR in ${GEODE} ${GEODE_EXAMPLES} ${GEODE_NATIVE} ${GEODE_BENCHMARKS} ; do - set -x - cd ${DIR} - git checkout develop - git push origin --delete support/${VERSION_MM} - git branch -D support/${VERSION_MM} - set +x -done - - -echo "" -echo "============================================================" -echo "Cleaning up RC tags" -echo "============================================================" -for DIR in ${GEODE} ${GEODE_EXAMPLES} ${GEODE_NATIVE} ${GEODE_BENCHMARKS} ; do - set -x - cd ${DIR} - git tag | grep "^rel/v${VERSION_MM}.*RC" | while read RCTAG ; do - git push origin --delete "$RCTAG" - done - set +x -done - - -echo "" -echo "============================================================" -echo 'Done shutting down the support branch!' -echo "============================================================" -echo "Don't forget to remove the JIRA Release placeholder for any future ${VERSION_MM}.x" -echo "Probably also a good idea to announce on the dev list that support/${VERSION_MM} has expired" diff --git a/dev-tools/release/license_review.sh b/dev-tools/release/license_review.sh deleted file mode 100755 index 1ce58225fba3..000000000000 --- a/dev-tools/release/license_review.sh +++ /dev/null @@ -1,377 +0,0 @@ -#!/usr/bin/env bash -# -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -set -e - -usage() { - echo "Usage: license_review.sh -v version_number_or_tgz [-p previous_version_number_or_tgz]" - echo " -v The #.#.#.RC# or #.#.# version number to review -or- a path or URL to .tgz -or- 'HEAD'" - echo " -p The #.#.#.RC# or #.#.# version number to compare against -or- a path or URL to .tgz" - echo " -n No license check (useful if you just want the version comparison)" - echo " -s No source license check (just check the binary license)" - exit 1 -} - - -while getopts ":v:p:ns" opt; do - case ${opt} in - v ) - NEW_VERSION=$OPTARG - ;; - p ) - OLD_VERSION=$OPTARG - ;; - n ) - SKIP_LICENSES=true - ;; - s ) - SKIP_SRC_LICENSE=true - ;; - \? ) - usage - ;; - esac -done - -if [ -z "${NEW_VERSION}" ] ; then - usage -fi - -WORKSPACE=$(pwd)/license_tmp -DOWNLOAD=${WORKSPACE}/download -EXTRACT=${WORKSPACE}/extracted -mkdir -p ${DOWNLOAD} -mkdir -p ${EXTRACT} -root=$0 -root=${root%/dev-tools*} - -if [ "$NEW_VERSION" = "HEAD" ] ; then - licFromWs=true - rm -Rf $root/geode-assembly/build/distributions -fi - - -function resolve() { - [ -n "$1" ] || return - spec=$1 - suffix=$2 - if [ "HEAD" = "$spec" ] ; then - [ "${suffix}" = "-src" ] && target=srcDistTar || target=distTar - (cd $root && ./gradlew ${target} 1>&2) - spec=$root/geode-assembly/build/distributions/$(cd $root/geode-assembly/build/distributions && ls -t | grep -v sha256 | grep "apache-geode-.*-build.[0-9][0-9]*${suffix}.tgz" | tail -1) - [ -r "$spec" ] || echo "Build not found: $spec" 1>&2 - [ -r "$spec" ] - fi - - if [[ $spec =~ ^([0-9]+\.[0-9]+\.[0-9]+)\.(RC[0-9]+)$ ]]; then - mmp=$(echo $spec | sed 's/.RC.*//') - #bare RC version -> RC url - spec=https://dist.apache.org/repos/dist/dev/geode/${spec}/apache-geode-${mmp}${suffix}.tgz - elif [[ $spec =~ ^([0-9]+\.[0-9]+\.[0-9]+)$ ]]; then - #bare released version -> release url - spec=https://archive.apache.org/dist/geode/${spec}/apache-geode-${spec}${suffix}.tgz - elif echo "$spec" | grep -q '^http.*tgz$' ; then - #tgz url - echo "$spec" | grep -q -- "${suffix}.tgz$" || return - elif [ -r "$spec" ] && echo "$spec" | grep -q 'tgz$' ; then - #tgz file present locally - echo "$spec" | grep -q -- "${suffix}.tgz$" || return - else - #unsupported - return - fi - - #download if url (and not already downloaded) - if echo "$spec" | grep -q '^http.*tgz$' ; then - filename=$(echo $spec | sed 's#.*/##') - [ -r ${DOWNLOAD}/$filename ] || curl -fL "$spec" > ${DOWNLOAD}/$filename - spec=${DOWNLOAD}/$filename - fi - - #extract it (if not already extracted) - dirname=$(echo $spec | sed -e 's#.*/##' -e 's#.tgz$##') - [ "${licFromWs}" = "true" ] && rm -Rf ${EXTRACT}/$dirname || true - [ -d ${EXTRACT}/$dirname ] || tar xzf $spec -C ${EXTRACT} - [ -d ${EXTRACT}/$dirname ] && echo ${EXTRACT}/$dirname || true -} - -NEW_DIR=$(resolve $NEW_VERSION) - -if [ -z "${NEW_DIR}" ] || [ ! -d "${NEW_DIR}" ] ; then - usage -fi - -if [ "${licFromWs}" = "true" ] && ! [ "$SKIP_LICENSES" = "true" ] && ! [ "$SKIP_SRC_LICENSE" = "true" ] ; then - NEW_SRC_DIR=$(resolve $NEW_VERSION -src) -fi - -function banner() { - echo "" - echo "$@" | sed 's/./=/g' - echo "$@" - echo "$@" | sed 's/./=/g' -} - -function listJarsInWar() { - war=$1 - jar tvf $war | awk '/.jar$/{print "'"$war"'/"$8}' -} - -function extractLicense() { - [ "$SKIP_LICENSES" != "true" ] || return 0 - war=$1 - rm -Rf tmpl - mkdir tmpl - cd tmpl - jar xf ../$war META-INF/LICENSE - cd .. - cp tmpl/META-INF/LICENSE $2 - rm -Rf tmpl -} - -function generateList() { - dir=$1 - banner "Listing 3rd-party deps in ${dir##*/}" - - #also extract geode jar licenses for later checking - (cd $dir; find . -name '*.jar' | egrep '(geode|gfsh)-' | sort | sed 's#^./##' | while read geodejar ; do - extractLicense $geodejar ${geodejar%.jar}.LICENSE - done) - - echo "**** ${dir##*/} jars ****" | tr '[:lower:]-' '[:upper:] ' > $dir/report1 - (cd $dir; find . -name '*.jar' | grep -v geode- | grep -v gfsh- | sort | sed 's#^./##' | tee -a report1) - - echo "**** ${dir##*/} wars ****" | tr '[:lower:]-' '[:upper:] ' > $dir/report2 - (cd $dir; find . -name '*.war' | sort | sed 's#^./##' | while read war ; do - listJarsInWar $war | sed 's#-[v0-9][-0-9.SNAPSHOTbuild]*[.]#.#' | sort - extractLicense $war ${war%.war}.LICENSE - done | tee -a report2) -} - -generateList $NEW_DIR -if [ -n "${OLD_VERSION}" ] ; then - OLD_DIR=$(resolve $OLD_VERSION) - generateList $OLD_DIR - - banner "Diffing 3rd-party deps changes from ${OLD_DIR##*/} to ${NEW_DIR##*/}" - for REPORT in report1 report2 ; do - diff -y -W $(tput cols) $OLD_DIR/$REPORT $NEW_DIR/$REPORT | grep '[<|>]' - done -fi - -[ "$SKIP_LICENSES" = "true" ] && exit 0 - -banner "Checking that all binary licenses are identical" -sizes=$(find $NEW_DIR -name '*LICENSE' | xargs wc -c | grep -v total | awk '{print $1}' | sort -u | wc -l) -if [ $sizes -gt 1 ] ; then - echo "NOT all LICENSES are the same:" - (cd $NEW_DIR; find * -name '*LICENSE' | xargs wc -c | grep -v total | sort) - result=1 -else - echo 'All Good!' -fi - -function isApache2() { - apache="HikariCP -accessors-smart -byte-buddy -classmate -commons-beanutils -commons-codec -commons-collections -commons-digester -commons-fileupload -commons-io -commons-lang3 -commons-logging -commons-math3 -commons-modeler -commons-text -commons-validator -content-type -error_prone_annotations -failureaccess -fastutil -findbugs-annotations -geo -guava -grumpy- -httpclient -httpcore -j2objc-annotations -jackson- -jcip-annotations -jna -json-path -json-smart -jsr305 -jetty- -jgroups -jna- -joda-time -lang-tag -listenablefuture -log4j- -lucene- -mapstruct -micrometer-core -netty- -nimbus-jose-jwt -oauth2-oidc-sdk -rmiio -shiro- -snakeyaml -snappy -spring- -springdoc- -swagger-annotations -swagger-core -swagger-models -swagger-ui" - echo "$1" | egrep -q "(mx4j-remote|jaxb-api|$(echo -n "$apache" | tr '\n' '|'))" -} -function shortenDep() { - echo "$1" | sed \ - -e 's/-api//' \ - -e 's/-impl//' \ - -e 's/-java//' \ - -e 's/shiro-.*/shiro-*/' \ - -e 's/jackson-.*/jackson-*/' \ - -e 's/jetty-.*/jetty-*/' \ - -e 's/jna-.*/jna-*/' \ - -e 's/lucene-.*/lucene-*/' \ - -e 's/log4j-.*/log4j-*/' \ - -e 's/mx4j-.*/mx4j*/' \ - -e 's/spring-.*/spring-*/' \ - -e 's/springdoc-.*/springdoc-*/' -} -for REPORT in report1 report2 ; do - [ "$REPORT" = "report1" ] && topic=JAR || topic=WAR - if [ "${licFromWs}" = "true" ] ; then - LICENSE=${root}/geode-assembly/src/main/dist/LICENSE - else - [ "$REPORT" = "report1" ] && LICENSE=${NEW_DIR}/LICENSE || LICENSE=${NEW_DIR}/tools/Pulse/$(cd ${NEW_DIR}/tools/Pulse; ls | grep LICENSE) - fi - LICENSE=${LICENSE#./} - banner "Comparing $topic dep versions in ${NEW_DIR##*/} to $LICENSE" - rm -f missing-$REPORT apache-$REPORT - touch missing-$REPORT apache-$REPORT - tail -n +2 $NEW_DIR/$REPORT | sed -e 's#.*/##' -e 's/\.jar//' | sed 's/-\([0-9]\)/ \1/' | sort -u | grep -v '^ra$' | while read dep ver; do - if isApache2 $dep ; then - echo $dep $ver >> apache-$REPORT - else - echo $(shortenDep $dep) $ver - fi - done | sort -u | while read dep ver ; do - if grep -qi "${dep//-/.}.*$ver" $LICENSE ; then - echo "$dep $ver Found (and version matches)" - elif grep -qi $dep $LICENSE ; then - match="$(grep -i $dep $LICENSE | grep -v License | head -1)" - if echo $match | grep -q '[0-9][0-9]*[.][0-9][0-9]*' ; then - echo "$dep FOUND WITH A DIFFERENT VERSION, PLEASE UPDATE TO $ver:" >> missing-$REPORT - echo "$match" >> missing-$REPORT - else - echo "$dep $ver probably found (without version):" - echo "$match" - fi - else - echo "$LICENSE FAILS TO MENTION $dep v$ver" >> missing-$REPORT - fi - done - echo $(wc -l < apache-$REPORT) "deps are licensed under Apache 2.0 (no need to mention individually)" - rm apache-$REPORT - if [ $(wc -l < missing-$REPORT) -eq 0 ] ; then - echo 'All Good!' - else - cat missing-$REPORT - rm missing-$REPORT - result=1 - fi -done - -function checkMissing() { - rm -f missing - touch missing - grep '^ - ' | sed -e 's/^ - //' -e 's/, .*//' -e 's/ (.*//' -e 's/s* v.*//' -e 's/ /.?/g' | while read f; do - if (cd ${root} && git grep -Eqi "$f" -- ':!LICENSE' ':!**/LICENSE' ':!NOTICE' ':!**/NOTICE') ; then - true - #echo "${f//\?/} found" - else - echo "${f//\?/} appears to be unused. Please remove from $1" >> missing - fi - done - if [ $(wc -l < missing) -eq 0 ] ; then - echo 'All Good!' - rm missing - else - cat missing - rm missing - return 1 - fi -} - -if [ "${licFromWs}" = "true" ] ; then - banner "Checking that binary license is a superset of src license" - SLICENSE=${root}/LICENSE - BLICENSE=${root}/geode-assembly/src/main/dist/LICENSE - if diff $SLICENSE $BLICENSE | grep -q '^<' ; then - echo $(diff $SLICENSE $BLICENSE | grep '^<' | wc -l) "lines appear in $SLICENSE that were not found in $BLICENSE." - echo "Please ensure the binary license is a strict superset of the source license." - echo "(diff $SLICENSE $BLICENSE)" - result=1 - else - echo 'All Good!' - fi - - banner "Checking that binary license is correct" - if diff -q ${BLICENSE} ${NEW_DIR}/LICENSE ; then - echo 'All Good!' - else - echo "Incorrect LICENSE in binary distribution" - echo "Expected:" $(wc -c ${BLICENSE}) - echo "Actual:" $(wc -c ${NEW_DIR}/LICENSE) - result=1 - fi - - if ! [ "$SKIP_SRC_LICENSE" = "true" ] ; then - banner "Checking that source license is correct" - if diff -q ${SLICENSE} ${NEW_SRC_DIR}/LICENSE ; then - echo 'All Good!' - else - echo "Incorrect LICENSE in source distribution" - echo "Expected:" $(wc -c ${SLICENSE}) - echo "Actual:" $(wc -c ${NEW_SRC_DIR}/LICENSE) - result=1 - fi - - banner "Checking references in source license" - cat $SLICENSE | checkMissing $SLICENSE || result=1 - - - banner "Checking references in binary license" - cat $SLICENSE $SLICENSE $BLICENSE | sort | uniq -u | checkMissing $BLICENSE || result=1 - fi -fi - -if [ "$result" == 1 ] ; then - banner "ERRORS WERE FOUND" - echo "review each section above for details" - exit 1 -else - banner "SUMMARY" - echo 'ALL GOOD!' -fi diff --git a/dev-tools/release/prepare_rc.sh b/dev-tools/release/prepare_rc.sh deleted file mode 100755 index 90ed0f9365af..000000000000 --- a/dev-tools/release/prepare_rc.sh +++ /dev/null @@ -1,374 +0,0 @@ -#!/usr/bin/env bash -# -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -set -e - -usage() { - echo "Usage: prepare_rc.sh -j ticket -v version_number -k signing_key -a apache_ldap_username" - echo " -j The GEODE-nnnnn Jira identifier for this release" - echo " -v The #.#.#.RC# version number" - echo " -k Your 8 digit GPG key id (the last 8 digits of your gpg fingerprint)" - echo " -a Your apache LDAP username (that you use to log in to https://id.apache.org)" - exit 1 -} - -checkCommand() { - COMMAND=$1 - if ! [[ -x "$(command -v $COMMAND)" ]]; then - echo "$COMMAND must be installed" - exit 1 - fi -} - -JIRA="" -FULL_VERSION="" -SIGNING_KEY="" -APACHE_USERNAME="" - -while getopts ":j:v:k:a:" opt; do - case ${opt} in - j ) - JIRA=$OPTARG - ;; - v ) - FULL_VERSION=$OPTARG - ;; - k ) - SIGNING_KEY=$OPTARG - ;; - a ) - APACHE_USERNAME=$OPTARG - ;; - \? ) - usage - ;; - esac -done - -if [[ ${JIRA} == "" ]] || [[ ${FULL_VERSION} == "" ]] || [[ ${SIGNING_KEY} == "" ]] || [[ ${APACHE_USERNAME} == "" ]]; then - usage -fi - -if [[ $SIGNING_KEY =~ ^[0-9A-Fa-f]{8}$ ]]; then - true -else - echo "Malformed signing key ${SIGNING_KEY}. Example valid key: ABCD1234" - exit 1 -fi - -if [[ $FULL_VERSION =~ ^([0-9]+\.[0-9]+\.[0-9]+)\.(RC[0-9]+)$ ]]; then - VERSION=${BASH_REMATCH[1]} -else - echo "Malformed version number ${FULL_VERSION}. Example valid version: 1.9.0.RC1" - exit 1 -fi - -VERSION_MM=${VERSION%.*} - -checkCommand gpg -checkCommand cmake -checkCommand svn -checkCommand doxygen - - -echo "" -echo "============================================================" -echo "Checking java..." -echo "============================================================" -[ -z "$JAVA_HOME" ] && JAVA=java || JAVA=$JAVA_HOME/bin/java -if ! $JAVA -XshowSettings:properties -version 2>&1 | grep 'java.specification.version = 1.8' ; then - echo "Please set JAVA_HOME to use JDK 8 to compile Geode for release" - exit 1 -fi -if $JAVA -XshowSettings:properties -version 2>&1 | grep 'java.vm.vendor = Oracle' ; then - echo "Please set JAVA_HOME to use an Open JDK 8 such as from https://adoptopenjdk.net/?variant=openjdk8&jvmVariant=hotspot to compile Geode for release" - exit 1 -else - $JAVA -XshowSettings:properties -version 2>&1 | grep 'java.vm.vendor = ' -fi - - -echo "" -echo "============================================================" -echo "Checking gpg... (you will be prompted to enter passphrase)" -echo "============================================================" -SECRING=~/.gnupg/secring.gpg -! [ -r $SECRING ] || SECRING=/dev/null -if gpg --export-secret-keys > ${SECRING} && echo "1234" | gpg -o /dev/null --local-user ${SIGNING_KEY} -as - ; then - echo "You entered the correct passphrase; proceeding." - echo "Please note, you will still need to enter it a few more times." - echo "PLEASE NOTE, the very last prompt will be for your apache password (not gpg). Pay attention as the prompts look very similar." -else - echo "Hmm, gpg seems unhappy. Check that you entered correct passphrase or refer to release wiki for troubleshooting." - exit 1 -fi -if ! gpg --list-keys ${SIGNING_KEY} | grep -q "${APACHE_USERNAME}@apache.org" ; then - echo "Please specify a gpg key that is associated with your apache email address." - echo "Expected: ${APACHE_USERNAME}@apache.org" - echo "Found: $(gpg --list-keys ${SIGNING_KEY} | grep ^uid | sed -e 's/.*.*//')" - exit 1 -fi - - -set -x -WORKSPACE=$PWD/release-${VERSION}-workspace -GEODE=$WORKSPACE/geode -GEODE_EXAMPLES=$WORKSPACE/geode-examples -GEODE_NATIVE=$WORKSPACE/geode-native -GEODE_BENCHMARKS=$WORKSPACE/geode-benchmarks -BREW_DIR=$WORKSPACE/homebrew-core -SVN_DIR=$WORKSPACE/dist/dev/geode -if which shasum >/dev/null; then - SHASUM="shasum -a 256" -else - SHASUM=sha256sum -fi -set +x - - -function failMsg1 { - echo "ERROR: script did NOT complete successfully. Please try again." -} -trap failMsg1 ERR - - -echo "" -echo "============================================================" -echo "Cleaning workspace directory..." -echo "============================================================" -set -x -rm -rf $WORKSPACE -mkdir -p $WORKSPACE -cd $WORKSPACE -set +x - - -echo "" -echo "============================================================" -echo "Cloning repositories..." -echo "============================================================" -set -x -git clone --single-branch --branch support/${VERSION_MM} git@github.com:apache/geode.git -#if you attempt to reset to a prior SHA here, skip ${GEODE} in set_copyright.sh or it may backfire -#(cd geode; git reset --hard $desired_sha) #uncomment if latest commit is not the desired sha -git clone git@github.com:apache/geode.git geode-develop -git clone --single-branch --branch support/${VERSION_MM} git@github.com:apache/geode-examples.git -git clone --single-branch --branch support/${VERSION_MM} git@github.com:apache/geode-native.git -git clone --single-branch --branch develop git@github.com:apache/geode-native.git geode-native-develop -git clone --single-branch --branch support/${VERSION_MM} git@github.com:apache/geode-benchmarks.git -git clone --single-branch --branch develop git@github.com:apache/geode-benchmarks.git geode-benchmarks-develop -git clone --single-branch --branch master git@github.com:Homebrew/homebrew-core.git - -svn checkout https://dist.apache.org/repos/dist --depth empty -svn update --set-depth immediates --parents dist/release/geode -svn update --set-depth infinity --parents dist/dev/geode -set +x - -for REPO in ${GEODE} ${WORKSPACE}/geode-develop ${GEODE_EXAMPLES} ${GEODE_NATIVE} ${GEODE_BENCHMARKS} ${BREW_DIR} ; do - cd ${REPO} - git config user.email "${APACHE_USERNAME}@apache.org" -done - -cd ${GEODE}/../.. -set -x -${0%/*}/set_copyright.sh -j $JIRA ${GEODE} ${GEODE_EXAMPLES} ${GEODE_NATIVE} ${GEODE_BENCHMARKS} -set +x - - -echo "" -echo "============================================================" -echo "Keeping -build.0 suffix" -echo "============================================================" -cd ${GEODE}/../.. -set -x -${0%/*}/set_versions.sh -j $JIRA -v ${VERSION} -n -w ${WORKSPACE} -set +x - - -echo "" -echo "============================================================" -echo "Building geode..." -echo "============================================================" -set -x -cd ${GEODE} -git clean -fdx && ./gradlew build -x test publishToMavenLocal -Pversion=${VERSION} -Paskpass -Psigning.keyId=${SIGNING_KEY} -Psigning.secretKeyRingFile=${HOME}/.gnupg/secring.gpg -set +x - - -if [ "${FULL_VERSION##*.RC}" -gt 1 ] ; then - echo "" - echo "============================================================" - echo "Removing previous RC's temporary commit from geode-examples..." - echo "============================================================" - set -x - cd ${GEODE_EXAMPLES} - git pull - set +x - sed -e 's#^geodeRepositoryUrl *=.*#geodeRepositoryUrl =#' \ - -e 's#^geodeReleaseUrl *=.*#geodeReleaseUrl =#' -i.bak gradle.properties - rm gradle.properties.bak - set -x - git add gradle.properties - if [ $(git diff --staged | wc -l) -gt 0 ] ; then - git diff --staged --color | cat - git commit -m "Revert "'"'"$JIRA: Set temporary staging repo"'"' - fi - set +x -fi - - -echo "" -echo "============================================================" -echo "Building geode-examples..." -echo "============================================================" -set -x -cd ${GEODE_EXAMPLES} -git clean -dxf && ./gradlew -Pversion=${VERSION} -PsignArchives -PgeodeReleaseUrl="file://${GEODE}/geode-assembly/build/geode-assembly/build/distributions/apache-geode-${VERSION}" -PgeodeRepositoryUrl="file://${HOME}/.m2/repository" -Psigning.keyId=${SIGNING_KEY} -Psigning.secretKeyRingFile=${HOME}/.gnupg/secring.gpg build -set +x - - -echo "" -echo "============================================================" -echo "Building geode-native..." -echo "============================================================" -set -x -cd ${GEODE_NATIVE} -mkdir build -which brew >/dev/null && OPENSSL_ROOT_DIR=$(brew --prefix openssl) || OPENSSL_ROOT_DIR=$(which openssl) -cd ${GEODE_NATIVE}/build -cmake .. -DPRODUCT_VERSION=${VERSION} -DOPENSSL_ROOT_DIR=$OPENSSL_ROOT_DIR -DGEODE_ROOT=${GEODE}/geode-assembly/build/install/apache-geode -cpack -G TGZ --config CPackSourceConfig.cmake -NCOUT=apache-geode-native-${VERSION}-src.tar.gz -NCTGZ=apache-geode-native-${VERSION}-src.tgz -mkdir repkg-temp -cd repkg-temp -tar xzf ../${NCOUT} -rm ../${NCOUT}* -mv apache-geode-native apache-geode-native-${VERSION}-src -tar czf ../${NCTGZ} * -cd .. -rm -Rf repkg-temp -gpg --armor -u ${SIGNING_KEY} -b ${NCTGZ} -${SHASUM} ${NCTGZ} > ${NCTGZ}.sha256 -set +x - - -echo "" -echo "============================================================" -echo "Building geode-benchmarks..." -echo "============================================================" -set -x -cd ${GEODE_BENCHMARKS} -BMDIR=apache-geode-benchmarks-${VERSION}-src -BMTAR=${BMDIR}.tgz -git clean -dxf -mkdir ../${BMDIR} -cp -r .travis.yml * ../${BMDIR} -tar czf ${BMTAR} -C .. ${BMDIR} -rm -Rf ../${BMDIR} -gpg --armor -u ${SIGNING_KEY} -b ${BMTAR} -${SHASUM} ${BMTAR} > ${BMTAR}.sha256 -set +x - - -function failMsg2 { - errln=$1 - echo "ERROR: script did NOT complete successfully" - echo "Comment out any steps that already succeeded (approximately lines 149-$(( errln - 1 ))) and try again" - echo "For this script only (prepare_rc.sh), it's also safe to just try again from the top" -} -trap 'failMsg2 $LINENO' ERR - - -echo "" -echo "============================================================" -echo "Tagging the release candidate in each repository. The tags will not be pushed yet..." -echo "============================================================" -for DIR in ${GEODE} ${GEODE_EXAMPLES} ${GEODE_NATIVE} ${GEODE_BENCHMARKS} ; do - set -x - cd ${DIR} - git tag -s -u ${SIGNING_KEY} rel/v${FULL_VERSION} -m "Release candidate ${FULL_VERSION}" - set +x -done - - -echo "" -echo "============================================================" -echo "Copying artifacts to svn directory for publication. The artifacts will not be committed..." -echo "============================================================" -set -x -cd ${SVN_DIR} -svn rm ${VERSION}.RC* &>/dev/null || true -cp ${GEODE}/KEYS . -mkdir ${FULL_VERSION} -cp ${GEODE}/geode-assembly/build/distributions/* ${FULL_VERSION} -cp ${GEODE_EXAMPLES}/build/distributions/* ${FULL_VERSION} -cp ${GEODE_NATIVE}/build/apache-geode-native-${VERSION}* ${FULL_VERSION} -cp ${GEODE_BENCHMARKS}/apache-geode-benchmarks-${VERSION}* ${FULL_VERSION} -set +x - -# verify all files are signed. sometimes gradle "forgets" to make the .asc file -for f in ${FULL_VERSION}/*.tgz ; do - if ! [ -r $f.sha256 ] ; then - echo missing $f.sha256 - exit 1 - fi - if ! [ -r $f.asc ] ; then - set -x - gpg --armor -u ${SIGNING_KEY} -b $f - set +x - if ! [ -r $f.asc ] ; then - echo missing $f.asc - exit 1 - fi - fi - size=$(ls -l $f | awk '{print $5}') - if [ $size -lt 10000 ] ; then - echo $f file size is only $size bytes, that seems suspicious. - exit 1 - fi -done - -set -x -svn add ${FULL_VERSION} -set +x - - -echo "" -echo "============================================================" -echo "Publishing artifacts to nexus staging manager..." -echo "PLEASE NOTE, the 2nd prompt will be for your apache (not gpg) password. Pay attention as the prompts look very similar." -echo "============================================================" -publishcmd="./gradlew publish --no-parallel -Pversion=${VERSION} -Paskpass -Psigning.keyId=${SIGNING_KEY} -Psigning.secretKeyRingFile=${HOME}/.gnupg/secring.gpg -PmavenUsername=${APACHE_USERNAME}" -set -x -cd ${GEODE} -sh -c "$publishcmd" -set +x - - -echo "" -echo "============================================================" -echo "Done preparing the release and staging to nexus! Next steps:" -echo "============================================================" -cd ${GEODE}/../.. -echo "1. Go to https://repository.apache.org, login as ${APACHE_USERNAME}, and click on Staging Repositories" -echo "2. If there is a prior ${VERSION} RC, select it and click Drop." -echo "2b.If publication got split between two staging repos, drop one of them then run: pushd ${GEODE}; $publishcmd; popd" -echo '3. Make a note of the 4-digit ID of the current ("implicitly created") staging repo.' -echo '4. Select the current staging repo and click Close.' -echo '5. Wait ~10 seconds and then refresh the page to confirm that status has become "Closed"' -echo "6. Run ${0%/*}/commit_rc.sh -j $JIRA -v ${FULL_VERSION} -m <4-DIGIT-ID-NOTED-ABOVE>" diff --git a/dev-tools/release/print_announce_email.sh b/dev-tools/release/print_announce_email.sh deleted file mode 100755 index 1faf9e150dfa..000000000000 --- a/dev-tools/release/print_announce_email.sh +++ /dev/null @@ -1,102 +0,0 @@ -#!/usr/bin/env bash -# -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -set -e - -usage() { - echo "Usage: print_announce_email.sh -v version_number -f latest_version_number" - echo " -v The #.#.# version number" - echo " -f The #.#.# version number of the latest and greatest, if other than above" - exit 1 -} - -VERSION="" -LATER="" - -while getopts ":v:f:" opt; do - case ${opt} in - v ) - VERSION=$OPTARG - ;; - f ) - LATER=$OPTARG - ;; - \? ) - usage - ;; - esac -done - -if [[ ${VERSION} == "" ]] ; then - usage -fi - -if [[ $VERSION =~ ^([0-9]+\.[0-9]+\.[0-9]+)$ ]]; then - true -else - echo "Malformed version number ${VERSION}. Example valid number - 1.9.0" - exit 1 -fi - -if [ -z "$FLAGSHIP" ] || [[ "$FLAGSHIP" =~ ^([0-9]+\.[0-9]+\.[0-9]+)$ ]]; then - true -else - echo "Malformed version number ${FLAGSHIP}. Example valid number - 1.9.0" - exit 1 -fi - -VERSION_MM=${VERSION%.*} - -#support mac or linux date arithmetic syntax -DEADLINE=$(date --date '+5 days' '+%a, %B %d %Y' 2>/dev/null || date -v +5d "+%a, %B %d %Y" 2>/dev/null || echo "<5 days from now>") - -if [ -n "${LATER}" ] && [ "${VERSION}" != "${LATER}" ] ; then - LATEST="Users are encouraged to upgrade to the latest ${LATER%.*}.x release (currently $LATER)." -else - LATEST="Users are encouraged to upgrade to this latest release." -fi - -if echo $VERSION | grep -q '\.0$' ; then - IMPROV=" improvements and" -else - IMPROV="" -fi - -cat << EOF -To: user@geode.apache.org, announce@apache.org, dev@geode.apache.org -Subject: [ANNOUNCE] Apache Geode ${VERSION} - -The Apache Geode community is pleased to announce the availability of -Apache Geode ${VERSION}. - -Geode is a data management platform that provides a database-like consistency -model, reliable transaction processing and a shared-nothing architecture -to maintain very low latency performance with high concurrency processing. - -Apache Geode ${VERSION} contains a number of${IMPROV} bug fixes. -$LATEST -For the full list of changes please review the release notes at: -https://cwiki.apache.org/confluence/display/GEODE/Release+Notes#ReleaseNotes-${VERSION} - -Release artifacts and documentation can be found at the project website: -https://geode.apache.org/releases/ -https://geode.apache.org/docs/guide/${VERSION_MM//./}/about_geode.html - -We would like to thank all the contributors that made the release possible. -Regards, -$(git config --get user.name) on behalf of the Apache Geode team -EOF diff --git a/dev-tools/release/print_rc_email.sh b/dev-tools/release/print_rc_email.sh deleted file mode 100755 index 29e45feb7683..000000000000 --- a/dev-tools/release/print_rc_email.sh +++ /dev/null @@ -1,101 +0,0 @@ -#!/usr/bin/env bash -# -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -set -e - -usage() { - echo "Usage: print_rc_email.sh -v version_number -m maven_repo_id" - echo " -v The #.#.#.RC# version number" - echo " -m The 4 digit id of the nexus maven repo" - exit 1 -} - -FULL_VERSION="" -MAVEN="" - -while getopts ":v:m:" opt; do - case ${opt} in - v ) - FULL_VERSION=$OPTARG - ;; - m ) - MAVEN=$OPTARG - ;; - \? ) - usage - ;; - esac -done - -if [[ ${FULL_VERSION} == "" ]] || [[ ${MAVEN} == "" ]]; then - usage -fi - -if [[ $FULL_VERSION =~ ^([0-9]+\.[0-9]+\.[0-9]+)\.(RC[0-9]+)$ ]]; then - VERSION=${BASH_REMATCH[1]} -else - echo "Malformed version number ${FULL_VERSION}. Example valid number - 1.9.0.RC1" - exit 1 -fi - -VERSION_MM=${VERSION%.*} - -#support mac or linux date arithmetic syntax -DEADLINE=$(date --date '+5 days' '+%a, %B %d %Y' 2>/dev/null || date -v +5d "+%a, %B %d %Y" 2>/dev/null || echo "<5 days from now>") - -cat << EOF -Hello Geode Dev Community, - -This is a release candidate for Apache Geode version ${FULL_VERSION}. -Thanks to all the community members for their contributions to this release! - -Please do a review and give your feedback, including the checks you performed. - -Voting deadline: -3PM PST ${DEADLINE}. - -Please note that we are voting upon the source tag: -rel/v${FULL_VERSION} - -Release notes: -https://cwiki.apache.org/confluence/display/GEODE/Release+Notes#ReleaseNotes-${VERSION} - -Source and binary distributions: -https://dist.apache.org/repos/dist/dev/geode/${FULL_VERSION}/ - -Maven staging repo: -https://repository.apache.org/content/repositories/orgapachegeode-${MAVEN} - -GitHub: -https://github.com/apache/geode/tree/rel/v${FULL_VERSION} -https://github.com/apache/geode-examples/tree/rel/v${FULL_VERSION} -https://github.com/apache/geode-native/tree/rel/v${FULL_VERSION} -https://github.com/apache/geode-benchmarks/tree/rel/v${FULL_VERSION} - -Pipelines: -https://concourse.apachegeode-ci.info/teams/main/pipelines/apache-support-${VERSION_MM//./-}-main -https://concourse.apachegeode-ci.info/teams/main/pipelines/apache-support-${VERSION_MM//./-}-rc - -Geode's KEYS file containing PGP keys we use to sign the release: -https://github.com/apache/geode/blob/develop/KEYS - -Command to run geode-examples: -./gradlew -PgeodeReleaseUrl=https://dist.apache.org/repos/dist/dev/geode/${FULL_VERSION} -PgeodeRepositoryUrl=https://repository.apache.org/content/repositories/orgapachegeode-${MAVEN} build runAll - -Regards -$(git config --get user.name) -EOF diff --git a/dev-tools/release/promote_rc.sh b/dev-tools/release/promote_rc.sh deleted file mode 100755 index 9d8459a443de..000000000000 --- a/dev-tools/release/promote_rc.sh +++ /dev/null @@ -1,703 +0,0 @@ -#!/usr/bin/env bash -# -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -set -e - -usage() { - echo "Usage: promote_rc.sh -j ticket -v version_number -k your_full_gpg_public_key -g your_github_username" - echo " -j The GEODE-nnnnn Jira identifier for this release" - echo " -v The #.#.#.RC# version number to ship" - echo " -k Your 8 digit GPG key id (the last 8 digits of your gpg fingerprint)" - echo " -g Your github username" - exit 1 -} - -JIRA="" -FULL_VERSION="" -SIGNING_KEY="" -GITHUB_USER="" - -while getopts ":j:v:k:g:" opt; do - case ${opt} in - j ) - JIRA=$OPTARG - ;; - v ) - FULL_VERSION=$OPTARG - ;; - k ) - SIGNING_KEY=$OPTARG - ;; - g ) - GITHUB_USER=$OPTARG - ;; - \? ) - usage - ;; - esac -done - -if [[ ${JIRA} == "" ]] || [[ ${FULL_VERSION} == "" ]] || [[ ${SIGNING_KEY} == "" ]] || [[ ${GITHUB_USER} == "" ]]; then - usage -fi - -SIGNING_KEY=$(gpg --fingerprint "${SIGNING_KEY}" | tr -d ' ' | grep "${SIGNING_KEY}" | sed 's/Keyfingerprint=//' | tail -1) - -if [[ $SIGNING_KEY =~ ^[0-9A-Fa-f]{40}$ ]]; then - true -else - echo "Malformed signing key ${SIGNING_KEY}. Example valid key: ABCD1234" - exit 1 -fi - -if [[ $FULL_VERSION =~ ^([0-9]+\.[0-9]+\.[0-9]+)\.(RC[0-9]+)$ ]]; then - VERSION=${BASH_REMATCH[1]} -else - echo "Malformed version number ${FULL_VERSION}. Example valid version: 1.9.0.RC1" - exit 1 -fi - -VERSION_MM=${VERSION%.*} - -set -x -WORKSPACE=$PWD/release-${VERSION}-workspace -GEODE=$WORKSPACE/geode -GEODE_DEVELOP=$WORKSPACE/geode-develop -GEODE_EXAMPLES=$WORKSPACE/geode-examples -GEODE_NATIVE=$WORKSPACE/geode-native -GEODE_NATIVE_DEVELOP=$WORKSPACE/geode-native-develop -GEODE_BENCHMARKS=$WORKSPACE/geode-benchmarks -GEODE_BENCHMARKS_DEVELOP=$WORKSPACE/geode-benchmarks-develop -BREW_DIR=$WORKSPACE/homebrew-core -SVN_DIR=$WORKSPACE/dist/dev/geode -set +x - -if [ -d "$GEODE" ] && [ -d "$GEODE_DEVELOP" ] && [ -d "$GEODE_EXAMPLES" ] && [ -d "$GEODE_NATIVE" ] && [ -d "$GEODE_NATIVE_DEVELOP" ] && [ -d "$GEODE_BENCHMARKS" ] && [ -d "$GEODE_BENCHMARKS_DEVELOP" ] && [ -d "$BREW_DIR" ] && [ -d "$SVN_DIR" ] ; then - true -else - echo "Please run this script from the same working directory as you initially ran prepare_rc.sh" - exit 1 -fi - - -echo "" -echo "============================================================" -echo "Checking docker..." -echo "============================================================" -if ! docker images >/dev/null ; then - echo "Make sure docker daemon is running and try again." - exit 1 -fi - - -PATCH=${VERSION##*.} -if [ $PATCH -ne 0 ] ; then - echo "" - echo "============================================================" - echo "Checking if serialization version has changed" - echo "============================================================" - cd ${GEODE} - PREV=${VERSION%.*}.$(( PATCH - 1 )) - VER=geode-serialization/src/main/java/org/apache/geode/internal/serialization/KnownVersion.java - [ -r $VER ] || VER=geode-serialization/src/main/java/org/apache/geode/internal/serialization/Version.java - set -x - prevsver=$(git show "rel/v${PREV}:${VER}" | awk '/CURRENT =/{print $NF}') - cursver=$(cat ${VER} | awk '/CURRENT =/{print $NF}') - set +x - [ "$cursver" = "$prevsver" ] && echo "No change: $VERSION will replace $PREV in old-versions list" || echo "Changed: old-versions list will include both $PREV and $VERSION" -fi - - -function failMsg { - errln=$1 - echo "ERROR: script did NOT complete successfully" - echo "Comment out any steps that already succeeded (approximately lines 151-$(( errln - 1 ))) and try again" -} -trap 'failMsg $LINENO' ERR - - -echo "" -echo "============================================================" -echo "Checking for later versions..." -echo "============================================================" -cd ${GEODE_DEVELOP} -latestnv=$(git tag| grep '^rel/v' | grep -v RC | cut -c6- | egrep '^[0-9]+\.[0-9]+\.[0-9]+$' | awk -F. '{print 1000000*$1+1000*$2+$3,$1"."$2"."$3}' | sort -n | tail -1) -latestn=$(echo $latestnv | awk '{print $1}') -latestv=$(echo $latestnv | awk '{print $2}') -thisre=$(echo $VERSION | awk -F. '{print 1000000*$1+1000*$2+$3}') -if [ $latestn -gt $thisre ] ; then - LATER="$latestv" - echo "Later version $LATER found; $VERSION will not be merged to master or tagged as 'latest' in docker." -else - LATER="" - echo "No later versions found; $VERSION will be tagged as 'latest' in docker and merged to master" -fi - - -echo "" -echo "============================================================" -echo "Releasing artifacts to mirror sites..." -echo "(note: must be logged in to svn as a PMC member or this will fail)" -echo "============================================================" -set -x -cd ${SVN_DIR}/../.. -svn update -svn mv dev/geode/${FULL_VERSION} release/geode/${VERSION} -cp dev/geode/KEYS release/geode/KEYS -svn commit -m "$JIRA: Release Apache Geode ${VERSION} - -Publish the source, binary, and checksum artifacts to ASF svn server, -from which they will be picked up and published within 15 minutes to -the URLs on https://geode.apache.org/releases/" -set +x - - -echo "" -echo "============================================================" -echo "Tagging ${FULL_VERSION} as ${VERSION} and pushing tags..." -echo "============================================================" -for DIR in ${GEODE} ${GEODE_EXAMPLES} ${GEODE_NATIVE} ${GEODE_BENCHMARKS} ; do - set -x - cd ${DIR} - git tag -s -u ${SIGNING_KEY} rel/v${VERSION} -m "Apache Geode v${VERSION} release" rel/v${FULL_VERSION}^{} - git push origin rel/v${VERSION} - set +x -done - - -function waitforserver { - server="$1" - msg="$2" - file=apache-geode-${VERSION}.tgz - baseurl=https://${server}/${VERSION}/${file} - echo "" - echo "============================================================" - echo "Waiting for ${baseurl} to appear..." - if echo "${server}" | grep -q repo1 ; then - echo "(may take up to one hour after clicking 'Release' on http://repository.apache.org/ )" - elif echo "${server}" | grep -q dlcdn ; then - echo "(may take a few hours)" - else - echo "(may take up to 15 minutes)" - fi - [ -z "$msg" ] || echo "$msg" - echo "============================================================" - for suffix in "" .asc .sha256 ; do - if [ "${suffix}" = ".sha256" ] && echo "${server}" | grep -q repo1 ; then - continue; - fi - url=${baseurl}${suffix} - expectedsize=$(cd ${SVN_DIR}/../../release/geode/${VERSION}; ls -l ${file}${suffix} | awk '{print $5}') - if [ -z "$expectedsize" ] ; then - echo "internal error: unable to get size of ${SVN_DIR}/../../release/geode/${VERSION}/${file}${suffix}" - exit 1 - fi - actualsize=0 - while [ "$expectedsize" -ne "$actualsize" ] ; do - while ! curl -sk --output /dev/null --head --fail "$url"; do - echo -n . - sleep 12 - done - actualsize=$(curl -fsk --head "$url" | grep -i "Content-Length" | awk '{print $2}' | tr -d '\r') - done - echo "$url exists and is correct size" - done -} - -waitforserver "downloads.apache.org/geode" - - -echo "" -echo "============================================================" -GEODE_SHA=$(awk '{print $1}' < $WORKSPACE/dist/release/geode/${VERSION}/apache-geode-${VERSION}.tgz.sha256) -if [ -n "$LATER" ] ; then - echo "NOT updating brew to avoid overwriting newer version $LATER" - echo "============================================================" -else - echo "Updating brew" - echo "============================================================" - set -x - cd ${BREW_DIR}/Formula - git pull - git remote add myfork git@github.com:${GITHUB_USER}/homebrew-core.git || true - if ! git fetch myfork ; then - echo "Please fork https://github.com/Homebrew/homebrew-core" - exit 1 - fi - git checkout -b apache-geode-${VERSION} - set +x - sed -e 's# *url ".*# url "https://www.apache.org/dyn/closer.lua?path=geode/'"${VERSION}"'/apache-geode-'"${VERSION}"'.tgz"#' \ - -e '/ *mirror ".*www.*/d' \ - -e '/ *mirror ".*downloads.*/d' \ - -e 's# *mirror ".*archive.*# mirror "https://archive.apache.org/dist/geode/'"${VERSION}"'/apache-geode-'"${VERSION}"'.tgz"\ - mirror "https://downloads.apache.org/geode/'"${VERSION}"'/apache-geode-'"${VERSION}"'.tgz"#' \ - -e 's/ *sha256 ".*/ sha256 "'"${GEODE_SHA}"'"/' \ - -i.bak apache-geode.rb - rm apache-geode.rb.bak - set -x - git add apache-geode.rb - git diff --staged --color | cat - git commit -m "$JIRA: Brew apache-geode ${VERSION} - -This is the latest and greatest release of Apache Geode." - git push -u myfork - set +x -fi - - -echo "" -echo "============================================================" -echo "Updating Geode Dockerfile" -echo "============================================================" -set -x -cd ${GEODE}/docker -git pull -r -set +x -sed -e "s/^ENV GEODE_GPG.*/ENV GEODE_GPG ${SIGNING_KEY}/" \ - -e "s/^ENV GEODE_VERSION.*/ENV GEODE_VERSION ${VERSION}/" \ - -e "s/^ENV GEODE_SHA256.*/ENV GEODE_SHA256 ${GEODE_SHA}/" \ - -e "s/ha.pool.sks-keyservers.net/keyserver.ubuntu.com/" \ - -e '/This is a TEMPLATE/d' \ - -i.bak Dockerfile -rm Dockerfile.bak -set -x -git add Dockerfile -git diff --staged --color | cat -git commit -m "$JIRA: update Dockerfile to apache-geode ${VERSION} - -The Dockerfile is updated _after_ the release is already tagged, -because it needs to embed the sha256 of the release" -git push -set +x - - -echo "" -echo "============================================================" -echo "Updating Native Dockerfile and other variables" -echo "============================================================" -set -x -cd ${GEODE_NATIVE} -git pull -r -set +x -if [ -r .travis.yml ] ; then - sed -e "s/geode-native-build:[latest0-9.]*/geode-native-build:${VERSION}/" \ - -i.bak .travis.yml -fi -sed -e "s/GEODE_VERSION=.*/GEODE_VERSION=${VERSION}/" \ - -e "s/^ENV GEODE_VERSION.*/ENV GEODE_VERSION ${VERSION}/" \ - -i.bak $(git grep -l GEODE_VERSION= ; git grep -l 'ENV GEODE_VERSION') -rm $(find . -name '*.bak') -set -x -git add . -git diff --staged --color | cat -git commit -m "$JIRA: Update Dockerfile and vars - -Native client hardcodes Geode version to test with in several places. -Update native Dockerfile and other variables to apache-geode ${VERSION}" -git push -set +x - - -echo "" -echo "============================================================" -echo "Building Geode docker image" -echo "============================================================" -set -x -cd ${GEODE}/docker -sed -e '/www.apache.org.dyn.closer/d' -i.backup Dockerfile -if ! docker build . ; then - echo retrying in 1 minute... - sleep 60 - if ! docker build . ; then - echo retrying in 4 minutes... - sleep 240 - if ! docker build . ; then - echo retrying in 7 minutes... - sleep 420 - if ! docker build . ; then - echo "Hmm, the geode Dockerfile doesn't seem to want to build..." - echo "Try instrumenting it with some echo's to track down where it's failing..." - exit 7 - fi - fi - fi -fi -mv Dockerfile.backup Dockerfile -docker build -t apachegeode/geode:${VERSION} . -[ -n "$LATER" ] || docker build -t apachegeode/geode:latest . -set +x - - -echo "" -echo "============================================================" -echo "Building Native docker image" -echo "============================================================" -set -x -cd ${GEODE_NATIVE}/docker -docker build . || docker build . || docker build . -docker build -t apachegeode/geode-native-build:${VERSION} . -[ -n "$LATER" ] || docker build -t apachegeode/geode-native-build:latest . -set +x - - -echo "" -echo "============================================================" -echo "Publishing Geode docker image" -echo "============================================================" -set -x -cd ${GEODE}/docker -docker login -docker push apachegeode/geode:${VERSION} -[ -n "$LATER" ] || docker push apachegeode/geode:latest -set +x - - -echo "" -echo "============================================================" -echo "Publishing Native docker image" -echo "============================================================" -set -x -cd ${GEODE_NATIVE}/docker -docker push apachegeode/geode-native-build:${VERSION} -[ -n "$LATER" ] || docker push apachegeode/geode-native-build:latest -set +x - - -if [ -z "$LATER" ] ; then - echo "" - echo "============================================================" - echo "Setting Geode version for geode-native develop" - echo "============================================================" - set -x - cd ${GEODE_NATIVE_DEVELOP} - git pull - git remote add myfork git@github.com:${GITHUB_USER}/geode-native.git || true - git checkout -b update-to-geode-${VERSION} - set +x - - sed -e "s/GEODE_VERSION=[0-9.]*/GEODE_VERSION=${VERSION}/" \ - -e "s/^ENV GEODE_VERSION.*/ENV GEODE_VERSION ${VERSION}/" \ - -i.bak $(git grep -l GEODE_VERSION= ; git grep -l 'ENV GEODE_VERSION') - - rm $(find . -name '*.bak') - set -x - git add . - if [ $(git diff --staged | wc -l) -gt 0 ] ; then - git diff --staged --color | cat - git commit -m "$JIRA: Bump Geode version to ${VERSION} - -Native client hardcodes Geode version to test with in several places. -Update those variables to latest-and-greatest apache-geode ${VERSION}" - git push -u myfork - fi - set +x -fi - - -echo "" -echo "============================================================" -echo "Removing temporary commit from geode-examples..." -echo "============================================================" -set -x -cd ${GEODE_EXAMPLES} -git pull -set +x -sed -e 's#^geodeRepositoryUrl *=.*#geodeRepositoryUrl =#' \ - -e 's#^geodeReleaseUrl *=.*#geodeReleaseUrl =#' -i.bak gradle.properties -rm gradle.properties.bak -set -x -git add gradle.properties -git diff --staged --color | cat -git commit -m "Revert "'"'"$JIRA: Set temporary staging repo"'"'" - -The staging repo no longest exists, so set this back to search the -default location (mavencentral)" -git push -set +x - - -echo "" -echo "============================================================" -if [ -n "$LATER" ] ; then - echo "NOT merging to master to avoid overwriting newer version $LATER" - echo "============================================================" -else - echo "Merging to master" - echo "============================================================" - for DIR in ${GEODE} ${GEODE_EXAMPLES} ${GEODE_NATIVE} ${GEODE_BENCHMARKS} ; do - set -x - cd ${DIR} - git remote set-branches --add origin master - git fetch origin - git checkout support/${VERSION_MM} - git checkout -b release/${VERSION} rel/v${VERSION} - #this creates a merge commit that will then be ff-merged to master, so word it from that perspective - git merge -s ours origin/master -m "Replacing master with contents of rel/v${VERSION}" - git checkout master - git merge release/${VERSION} - git push origin master - set +x - done -fi - - -echo "" -echo "============================================================" -echo "Updating 'old' versions and Benchmarks baseline on develop" -echo "============================================================" -set -x -cd ${GEODE_DEVELOP} -git pull -git remote add myfork git@github.com:${GITHUB_USER}/geode.git || true -git checkout -b add-${VERSION}-to-old-versions -set +x -#add at the end if this is a new minor or a patch to the latest minor, otherwise add after it's predecessor -if [ $PATCH -eq 0 ] || grep -q "'${PREV}'].each" settings.gradle ; then - #before: - # '1.9.0'].each { - #after: - # '1.9.0', - # '1.10.0'].each { - sed -e "s/].each/,\\ - '${VERSION}'].each/" \ - -i.bak settings.gradle -else - #before: - # '1.9.0', - #after: - # '1.9.0', - # '1.9.1', - sed -e "s/'${PREV}'/'${PREV}',\\ - '${VERSION}'/" \ - -i.bak settings.gradle -fi -rm settings.gradle.bak - -action="Add" -ser="" -if [ $PATCH -ne 0 ] ; then - #if the serialization version has not changed, we can drop the previous patch - if [ "$cursver" = "$prevsver" ] ; then - sed -e "/'${PREV}'/d" -i.bak settings.gradle - rm settings.gradle.bak - action="Replace ${PREV} with" - ser=" - -The serialization version has not changed between ${PREV} and ${VERSION}, -so there should be no need to keep both" - fi -fi - -if [ -z "$LATER" ] ; then - #also update benchmark baseline for develop to this new minor - sed \ - -e "s/^ baseline_version_default:.*/ baseline_version_default: '${VERSION}'/" \ - -e "s/^ baseline_branch_default:.*/ baseline_branch_default: ''/" \ - -i.bak ci/pipelines/shared/jinja.variables.yml - rm ci/pipelines/shared/jinja.variables.yml.bak - BENCHMSG=" and set as default Benchmarks baseline" - #if custom baseline on develop is newer [than release branch cut date], resetting might - #be the wrong choice. but, assuming it's older, a new minor is the time to un-custom it - if [ $PATCH = 0 ] ; then - sed \ - -e "s/^ baseline_version:.*/ baseline_version: '${VERSION}'/" \ - -e "s/^ baseline_branch:.*/ baseline_branch: ''/" \ - -i.bak ci/pipelines/shared/jinja.variables.yml - rm ci/pipelines/shared/jinja.variables.yml.bak - BENCHMSG=" and set as Benchmarks baseline" - fi - set -x - git add ci/pipelines/shared/jinja.variables.yml -fi -set -x -git add settings.gradle -git diff --staged --color | cat -git commit -m "$JIRA: ${action} ${VERSION} as old version - -${action} ${VERSION} in old versions${BENCHMSG} on develop -to enable rolling upgrade tests from ${VERSION}${ser}" -git push -u myfork -set +x - - -echo "" -echo "============================================================" -echo "Updating 'old' versions and Benchmarks baseline on support/$VERSION_MM" -echo "============================================================" -set -x -cd ${GEODE} -git checkout support/${VERSION_MM} -git pull -set +x -#add at the end as this release will always be the latest on this branch -sed -e "s/].each/,\\ - '${VERSION}'].each/" \ - -i.bak settings.gradle -rm settings.gradle.bak -action="Add" -ser="" -if [ $PATCH -ne 0 ] ; then - #if the serialization version has not changed, we can drop the previous patch - if [ "$cursver" = "$prevsver" ] ; then - sed -e "/'${PREV}'/d" -i.bak settings.gradle - rm settings.gradle.bak - action="Replace ${PREV} with" - ser=" - -The serialization version has not changed between ${PREV} and ${VERSION}, -so there should be no need to keep both" - fi -else - #also update benchmark baseline for support branch to its new minor - sed \ - -e "s/^ baseline_version:.*/ baseline_version: '${VERSION}'/" \ - -e "s/^ baseline_version:.*/ baseline_version: '${VERSION}'/" \ - -e "s/^ baseline_version_default:.*/ baseline_version_default: '${VERSION}'/" \ - -e "s/^ baseline_branch:.*/ baseline_branch: ''/" \ - -e "s/^ baseline_branch_default:.*/ baseline_branch_default: ''/" \ - -i.bak ci/pipelines/shared/jinja.variables.yml - rm ci/pipelines/shared/jinja.variables.yml.bak - BENCHMSG2=" and set as Benchmarks baseline" - set -x - git add ci/pipelines/shared/jinja.variables.yml -fi -set -x -git add settings.gradle -git diff --staged --color | cat -git commit -m "$JIRA: ${action} ${VERSION} as old version - -${action} ${VERSION} in old versions${BENCHMSG2} on support/$VERSION_MM -to enable rolling upgrade tests from ${VERSION}${ser}" -git push -set +x - - -if [ -z "$LATER" ] ; then - for branch in develop support/$VERSION_MM ; do - echo "" - echo "============================================================" - echo "Updating default benchmark baseline on $branch" - echo "============================================================" - set -x - [ "develop" = "$branch" ] && BENCH=${GEODE_BENCHMARKS_DEVELOP} || BENCH=${GEODE_BENCHMARKS} - [ "develop" = "$branch" ] && BASEL=${VERSION} || BASEL=${VERSION_MM}.0 - cd ${BENCH} - git checkout $branch - git pull - set +x - #DEFAULT_BASELINE_VERSION=1.14.0 - sed -e "s/^DEFAULT_BASELINE_VERSION=.*/DEFAULT_BASELINE_VERSION=${BASEL}/" \ - -i.bak infrastructure/scripts/aws/run_against_baseline.sh - rm infrastructure/scripts/aws/run_against_baseline.sh.bak - set -x - git add infrastructure/scripts/aws/run_against_baseline.sh - if [ $(git diff --staged | wc -l) -gt 0 ] ; then - git diff --staged --color | cat - git commit -m "$JIRA: Update benchmark baseline - -Updates the default benchmark baseline on $branch to ${BASEL}" - git push - fi - set +x - done -fi - - -echo "" -echo "============================================================" -echo "Removing old Geode versions from mirrors" -echo "============================================================" -set -x -cd ${SVN_DIR}/../../release/geode -svn update -#identify the latest patch release for "N-2" (the latest 3 major.minor releases), remove anything else from mirrors (all releases remain available on non-mirrored archive site) -RELEASES_TO_KEEP=3 -set +x -ls | awk -F. '/^[0-9]/{print 1000000*$1+1000*$2+$3,$1"."$2"."$3}'| sort -n | awk '{mm=$2;sub(/\.[^.]*$/,"",mm);V[mm]=$2}END{for(v in V){print V[v]}}'|tail -$RELEASES_TO_KEEP > ../keep -echo Keeping releases: $(cat ../keep) -rm -f ../did.remove -(ls | grep '^[0-9]'; cat ../keep ../keep)|sort|uniq -u|while read oldVersion; do - set -x - svn rm $oldVersion - svn commit -m "$JIRA: Remove $oldVersion from mirrors - -ASF requests that we keep preferably one, and definitely fewer than 5 -releases on the mirrors, so aim for 3 to match N-2 support policy. - -Note: it is still archived at http://archive.apache.org/dist/geode" - set +x - [ ! -r ../did.remove ] || echo -n " and " >> ../did.remove - echo -n $oldVersion >> ../did.remove -done -touch ../did.remove -DID_REMOVE=$(cat ../did.remove) -rm ../keep ../did.remove - - -waitforserver "repo1.maven.org/maven2/org/apache/geode/apache-geode" - -echo "" -NEWVERSION="${VERSION_MM}.$(( PATCH + 1 ))" -echo "============================================================" -echo -n "Bumping version to ${NEWVERSION}" -cd "${WORKSPACE}/.." -${0%/*}/set_versions.sh -j $JIRA -v ${NEWVERSION} -s -w "${WORKSPACE}" - - -echo "" -echo "============================================================" -echo 'Done promoting Release Candidate to Official Release!' -echo "============================================================" -MAJOR="${VERSION_MM%.*}" -MINOR="${VERSION_MM#*.}" -PATCH="${VERSION##*.}" -cd ${GEODE}/../.. -echo "Final steps (some gaps in numbering is normal since not all steps apply to all releases):" -[ -n "$LATER" ] || echo "2. Go to https://github.com/${GITHUB_USER}/homebrew-core/pull/new/apache-geode-${VERSION} and submit the pull request" -echo "3. Go to https://github.com/${GITHUB_USER}/geode/pull/new/add-${VERSION}-to-old-versions and create the pull request" -[ -n "$LATER" ] || echo "3b.Go to https://github.com/${GITHUB_USER}/geode-native/pull/new/update-to-geode-${VERSION} and create the pull request" -[ -n "$LATER" ] && tag=":${VERSION}" || tag="" -echo "4. Validate docker image: docker run -it apachegeode/geode${tag}" -[ -n "$LATER" ] && caveat=" (UNLESS they are still unreleased on a later patch branch)" -echo "5. Mark ${VERSION} as Released in Jira and Bulk-transition JIRA issues fixed in this release to Closed${caveat}" -echo "5b.Publish to GitHub ( https://github.com/apache/geode/tags then Create Release from the 2nd ... menu ), filling out the form as follows:" -echo " Upload apache-geode-${VERSION}.tgz from: open ${GEODE}/geode-assembly/build/distributions/" -echo " Release Title: Apache Geode ${VERSION}" -echo " Release Description:" -[ "${PATCH}" -ne 0 ] && echo "This patch release includes a few bug fixes." || echo " This release includes a significant number of bug fixes and improvements." -echo "" -echo "sha256 for apache-geode-${VERSION}.tgz is $(awk '{print $1}' < ${GEODE}/geode-assembly/build/distributions/apache-geode-${VERSION}.tgz.sha256)" -echo "" -echo "See full release notes at https://cwiki.apache.org/confluence/display/GEODE/Release+Notes#ReleaseNotes-${VERSION}" -echo "" -echo "8. Check that ${VERSION} documentation has been published to https://geode.apache.org/docs/" -[ -z "$DID_REMOVE" ] || DID_REMOVE=" and ${DID_REMOVE} info has been removed" -echo "9. Check that ${VERSION} download info has been published to https://geode.apache.org/releases/${DID_REMOVE}" -[ "${PATCH}" -ne 0 ] || echo "10. If 3rd-party dependencies haven't been bumped in awhile, ask on the dev list for a volunteer (details in dev-tools/dependencies/README.md)" -[ "${PATCH}" -ne 0 ] || [ "${MINOR}" -lt 15 ] || echo "11. In accordance with Geode's N-2 support policy, propose on the dev list that the time has come to ${0%/*}/end_of_support.sh -v ${MAJOR}.$((MINOR - 3))" -[ "${PATCH}" -ne 0 ] || [ -n "$LATER" ] || echo "12. Log in to https://hub.docker.com/repository/docker/apachegeode/geode and update the latest Dockerfile linktext and url to ${VERSION_MM}" -[ -n "$LATER" ] || andnative=", geode-benchmarks, and geode-native" -echo "If there are any support branches between ${VERSION_MM} and develop, manually cherry-pick '${VERSION}' bump from develop to those branches of geode${andnative}." -echo "Bump support pipeline to ${VERSION_MM}.$(( PATCH + 1 )) by plussing BumpPatch in https://concourse.apachegeode-ci.info/teams/main/pipelines/apache-support-${VERSION_MM//./-}-main?group=semver-management" -[ "${PATCH}" -ne 0 ] || echo "Run cd ${GEODE} && geode-management/src/test/script/update-management-wiki.sh" -[ -n "$LATER" ] || echo "Make a note to confirm tomorrow morning that your homebrew PR passed its PR checks and was merged to master" -echo 'Send email! Note: MUST be sent from your @apache.org email address (see https://infra.apache.org/committer-email.html) and MUST be sent as Plain text (in gmail click three dots at bottom of compose window then Plain text mode)' -${0%/*}/print_announce_email.sh -v "${VERSION}" -f "${LATER}" -echo "" -which pbcopy >/dev/null && ${0%/*}/print_announce_email.sh -v "${VERSION}" -f "${LATER}" | pbcopy && echo "(copied to clipboard)" -waitforserver "dlcdn.apache.org/geode" "Please wait for this to complete before sending the above [ANNOUNCE] email. -All other tasks above can be completed now (while you wait for dlcdn)." diff --git a/dev-tools/release/set_copyright.sh b/dev-tools/release/set_copyright.sh deleted file mode 100755 index 74df49d655de..000000000000 --- a/dev-tools/release/set_copyright.sh +++ /dev/null @@ -1,68 +0,0 @@ -#!/usr/bin/env bash -# -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -set -e - -usage() { - echo "Usage: set_copyright.sh -j ticket dirs" - echo " -j The GEODE-nnnnn Jira identifier for this chore" - echo " dirs one or more directories to search for copyrights" - exit 1 -} - -if [[ "$3" == "" ]] ; then - usage -fi - -if [[ "$1" != "-j" ]] ; then - usage -fi - -JIRA=$2 -shift 2 - -function failMsg { - errln=$1 - echo "ERROR: set_copyright script did NOT complete successfully" - echo "Comment out any steps that already succeeded (approximately lines 46-$(( errln - 1 ))) and try again" -} -trap 'failMsg $LINENO' ERR - - -echo "" -echo "============================================================" -echo "Checking Copyright NOTICE and updating year if necessary" -echo "============================================================" -set -x -year=$(date +%Y) -for DIR in $@ ; do - cd ${DIR} - git grep -l '^Copyright.*Apache' | grep NOTICE | while read NOTICE ; do - sed \ - -e "2s/ \(20[0-9][0-9]\) / \1-${year} /" \ - -e "2s/-20[0-9][0-9] /-${year} /" \ - -e "2s/${year}-${year}/${year}/" \ - -i.bak $NOTICE - rm -f $NOTICE.bak - git add $NOTICE - done - if [ $(git diff --staged | wc -l) -gt 0 ] ; then - git diff --staged --color | cat - git commit -a -m "$JIRA: Bumping copyright year to ${year}" - fi -done -set +x diff --git a/dev-tools/release/set_versions.sh b/dev-tools/release/set_versions.sh deleted file mode 100755 index afb65a6dc7f6..000000000000 --- a/dev-tools/release/set_versions.sh +++ /dev/null @@ -1,215 +0,0 @@ -#!/usr/bin/env bash -# -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -set -e - -usage() { - echo "Usage: set_versions.sh -j ticket -v version_number [-s]" - echo " -j The GEODE-nnnnn Jira identifier for this release" - echo " -v The #.#.# version number for the next release" - echo " -s configure examples to use latest snapshot instead of release" - exit 1 -} - -JIRA="" -FULL_VERSION="" - -while getopts ":j:v:snw:" opt; do - case ${opt} in - j ) - JIRA=$OPTARG - ;; - v ) - VERSION=$OPTARG - ;; - s ) - EXAMPLES_USE_SNAPSHOTS=true - ;; - n ) - NOPUSH=true - ;; - w ) - WORKSPACE="$OPTARG" - CLEAN=false - ;; - \? ) - usage - ;; - esac -done - -if [[ ${JIRA} == "" ]] || [[ ${VERSION} == "" ]] ; then - usage -fi - -if ! [[ $VERSION =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then - echo "Malformed version number ${VERSION}. Example valid version: 1.9.0" - exit 1 -fi - -BUILDSUFFIX="-build.0" -VERSION_MM=${VERSION%.*} - -if [ "${EXAMPLES_USE_SNAPSHOTS}" = "true" ] ; then - GEODEFOREXAMPLES="${VERSION_MM}.+" -else - GEODEFOREXAMPLES="${VERSION}" -fi - -set -x -[ -n "${WORKSPACE}" ] || WORKSPACE=$PWD/release-${VERSION}-workspace -GEODE=$WORKSPACE/geode -GEODE_EXAMPLES=$WORKSPACE/geode-examples -GEODE_BENCHMARKS=$WORKSPACE/geode-benchmarks -set +x - - -function failMsg1 { - echo "ERROR: set_versions script did NOT complete successfully. Please try again." -} -trap failMsg1 ERR - - -if [ "${CLEAN}" != "false" ] ; then - echo "" - echo "============================================================" - echo "Cleaning workspace directory..." - echo "============================================================" - set -x - rm -rf $WORKSPACE - mkdir -p $WORKSPACE - cd $WORKSPACE - set +x - - - echo "" - echo "============================================================" - echo "Cloning repositories..." - echo "============================================================" - set -x - git clone --single-branch --branch support/${VERSION_MM} git@github.com:apache/geode.git - git clone --single-branch --branch support/${VERSION_MM} git@github.com:apache/geode-examples.git - git clone --single-branch --branch support/${VERSION_MM} git@github.com:apache/geode-benchmarks.git - set +x -fi - - -function failMsg2 { - errln=$1 - echo "ERROR: set_versions script did NOT complete successfully" - echo "Comment out any steps that already succeeded (approximately lines 87-$(( errln - 1 ))) and try again" -} -trap 'failMsg2 $LINENO' ERR - - -echo "" -echo "============================================================" -echo "Setting Geode versions" -echo "============================================================" -set -x -cd ${GEODE} -set +x - -#version = 1.13.0-build.0 -sed -e "s/^version =.*/version = ${VERSION}${BUILDSUFFIX}/" -i.bak gradle.properties - -# product_version: '1.13' -sed -E \ - -e "s#product_version: '[0-9.]+'#product_version: '${VERSION_MM}'#" \ - -i.bak geode-book/config.yml - -#git clone -b branch --depth 1 https://github.com/apache/geode.git geode -sed -e "s#clone -b [ds][evlopurt/0-9.]*#clone -b support/${VERSION_MM}#" \ - -i.bak \ - ci/docker/cache_dependencies.sh \ - ci/images/google-geode-builder/scripts/cache_dependencies.sh - -rm -f gradle.properties.bak geode-book/config.yml.bak ci/docker/cache_dependencies.sh.bak ci/images/google-geode-builder/scripts/cache_dependencies.sh.bak -set -x -git add gradle.properties geode-book/config.yml ci/docker/cache_dependencies.sh ci/images/google-geode-builder/scripts/cache_dependencies.sh -if [ $(git diff --staged | wc -l) -gt 0 ] ; then - git diff --staged --color | cat - git commit -m "$JIRA: Bump version to ${VERSION} - -As part of the Geode Release Process, the build number must -be rolled forward so work can begin on the next release" - [ "$NOPUSH" = "true" ] || git push -u origin -fi -set +x - - -echo "" -echo "============================================================" -echo "Setting geode-examples version" -echo "============================================================" -set -x -cd ${GEODE_EXAMPLES} -git pull -set +x - -#version = 1.12.0-build.0 -#geodeVersion = 1.12.+ -sed -e "s/^version = .*/version = ${VERSION}${BUILDSUFFIX}/" \ - -e "s/^geodeVersion = .*/geodeVersion = ${GEODEFOREXAMPLES}/" \ - -i.bak gradle.properties - -rm gradle.properties.bak -set -x -git add . -if [ $(git diff --staged | wc -l) -gt 0 ] ; then - git diff --staged --color | cat - git commit -m "$JIRA: Bump version to ${VERSION} - -As part of the Geode Release Process, the geode-examples build number -must be rolled forward as work begins on the next release" - [ "$NOPUSH" = "true" ] || git push -u origin -fi -set +x - - -echo "" -echo "============================================================" -echo "Setting geode-benchmarks version" -echo "============================================================" -set -x -cd ${GEODE_BENCHMARKS} -git pull -set +x - -#versionNumber = 1.14.0 -sed -e "s/^versionNumber = .*/versionNumber = ${VERSION}/" \ - -i.bak gradle.properties - -rm gradle.properties.bak -set -x -git add gradle.properties -if [ $(git diff --staged | wc -l) -gt 0 ] ; then - git diff --staged --color | cat - git commit -m "$JIRA: Bump version to ${VERSION} - -As part of the Geode Release Process, the geode-benchmarks build number -must be rolled forward as work begins on the next release" - [ "$NOPUSH" = "true" ] || git push -u origin -fi -set +x - - -echo "" -echo "============================================================" -echo 'Done setting support versions!' -echo "============================================================" -cd ${GEODE}/../.. From a64d5758cbd8c5779c13d8f44decf30dd499b5d4 Mon Sep 17 00:00:00 2001 From: Jinwoo Hwang Date: Sun, 30 Nov 2025 18:42:56 -0500 Subject: [PATCH 02/10] GEODE-10467: Bump version to 2.0.0 As part of the Geode Release Process, the build number must be rolled forward so work can begin on the next release --- ci/docker/cache_dependencies.sh | 2 +- ci/images/google-geode-builder/scripts/cache_dependencies.sh | 2 +- geode-book/config.yml | 2 +- gradle.properties | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ci/docker/cache_dependencies.sh b/ci/docker/cache_dependencies.sh index 0b72de826c0d..4088a58980b5 100644 --- a/ci/docker/cache_dependencies.sh +++ b/ci/docker/cache_dependencies.sh @@ -20,7 +20,7 @@ set -e WORK_DIR=$(mktemp -d) pushd ${WORK_DIR} - git clone -b develop --depth 1 https://github.com/apache/geode.git geode + git clone -b support/2.0 --depth 1 https://github.com/apache/geode.git geode pushd geode ./gradlew --no-daemon --console=plain --info resolveDependencies diff --git a/ci/images/google-geode-builder/scripts/cache_dependencies.sh b/ci/images/google-geode-builder/scripts/cache_dependencies.sh index ef56172a9b74..e41f225230e7 100644 --- a/ci/images/google-geode-builder/scripts/cache_dependencies.sh +++ b/ci/images/google-geode-builder/scripts/cache_dependencies.sh @@ -28,7 +28,7 @@ if [ -z ${JAVA_HOME} ]; then fi pushd ${WORK_DIR} - git clone -b develop --depth 1 https://github.com/apache/geode.git geode + git clone -b support/2.0 --depth 1 https://github.com/apache/geode.git geode pushd geode ./gradlew --no-daemon --console=plain --info resolveDependencies diff --git a/geode-book/config.yml b/geode-book/config.yml index c156d7e965c2..e22411f50310 100644 --- a/geode-book/config.yml +++ b/geode-book/config.yml @@ -28,7 +28,7 @@ template_variables: product_name_long: Apache Geode product_name: Geode product_name_lowercase: geode - product_version: '1.15' + product_version: '2.0' product_version_nodot: '115' product_version_old_minor: '1.14' product_version_geode: '1.15' diff --git a/gradle.properties b/gradle.properties index 72695f0437e1..6bfc6b19a27c 100755 --- a/gradle.properties +++ b/gradle.properties @@ -26,7 +26,7 @@ # - release # # The full version string consists of 'versionNumber + releaseQualifier + releaseType' -version = 1.16.0-build.0 +version = 2.0.0-build.0 # Default Maven targets mavenSnapshotUrl = gcs://maven.apachegeode-ci.info/snapshots From 2819823b0782634cf8543a2f7f91328d00a9e442 Mon Sep 17 00:00:00 2001 From: Jinwoo Hwang <92374539+JinwooHwang@users.noreply.github.com> Date: Wed, 3 Dec 2025 11:32:49 -0500 Subject: [PATCH 03/10] GEODE-10521: Eliminate reflection-based access to java.nio.Buffer internals (#7956) Replace reflection-based access to DirectByteBuffer private APIs with Unsafe field offset access, eliminating the need for --add-opens=java.base/java.nio=ALL-UNNAMED JVM flag. Key Changes: - Enhanced Unsafe wrapper with buffer field access methods * Added cached field offsets (BUFFER_ADDRESS_FIELD_OFFSET, BUFFER_CAPACITY_FIELD_OFFSET) * Added getBufferAddress/setBufferAddress methods * Added getBufferCapacity/setBufferCapacity methods * Field offset access does NOT require --add-opens flags - Refactored AddressableMemoryManager to eliminate reflection * Removed all reflection imports (Constructor, Method, InvocationTargetException) * Removed static volatile reflection caching fields * Reimplemented getDirectByteBufferAddress() using Unsafe.getBufferAddress() * Reimplemented createDirectByteBuffer() using field manipulation * Maintains zero-copy semantics by modifying buffer fields - Removed JAVA_NIO_OPEN flag from MemberJvmOptions * Deleted JAVA_NIO_OPEN constant and documentation * Removed flag from JAVA_11_OPTIONS list * Reduced required JVM flags from 5 to 4 Benefits: - Eliminates security audit findings for --add-opens usage - Improves Java module system compliance - Compatible with Java 17+ strong encapsulation (JEP 403) - Forward compatible with Java 21 - Simplifies deployment configuration - Better performance through cached field offsets - Enables GraalVM native image compilation This change is part of the broader initiative to eliminate all --add-opens and --add-exports flags from Apache Geode for full Java module system compliance. --- .../offheap/AddressableMemoryManager.java | 134 ++++++------------ .../cli/commands/MemberJvmOptions.java | 8 +- .../unsafe/internal/sun/misc/Unsafe.java | 82 +++++++++++ 3 files changed, 125 insertions(+), 99 deletions(-) diff --git a/geode-core/src/main/java/org/apache/geode/internal/offheap/AddressableMemoryManager.java b/geode-core/src/main/java/org/apache/geode/internal/offheap/AddressableMemoryManager.java index 7429c978786b..473beebf8e6e 100644 --- a/geode-core/src/main/java/org/apache/geode/internal/offheap/AddressableMemoryManager.java +++ b/geode-core/src/main/java/org/apache/geode/internal/offheap/AddressableMemoryManager.java @@ -14,13 +14,9 @@ */ package org.apache.geode.internal.offheap; -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; import java.nio.ByteBuffer; import org.apache.geode.annotations.Immutable; -import org.apache.geode.annotations.internal.MakeNotStatic; import org.apache.geode.internal.JvmSizeUtils; import org.apache.geode.unsafe.internal.sun.misc.Unsafe; @@ -174,114 +170,68 @@ public static void fill(long addr, int size, byte fill) { unsafe.setMemory(addr, size, fill); } - @SuppressWarnings("rawtypes") - @MakeNotStatic - private static volatile Class dbbClass = null; - @SuppressWarnings("rawtypes") - @MakeNotStatic - private static volatile Constructor dbbCtor = null; - @MakeNotStatic - private static volatile boolean dbbCreateFailed = false; - @MakeNotStatic - private static volatile Method dbbAddressMethod = null; - @MakeNotStatic - private static volatile boolean dbbAddressFailed = false; - /** - * Returns the address of the Unsafe memory for the first byte of a direct ByteBuffer. If the - * buffer is not direct or the address can not be obtained return 0. + * Returns the address of the Unsafe memory for the first byte of a direct ByteBuffer. + * + * This implementation uses Unsafe to access the ByteBuffer's 'address' field directly, + * which eliminates the need for reflection with setAccessible() and therefore does not + * require the --add-opens=java.base/java.nio=ALL-UNNAMED JVM flag. + * + * If the buffer is not direct or the address cannot be obtained, returns 0. + * + * @param bb the ByteBuffer to get the address from + * @return the native memory address, or 0 if not available */ - @SuppressWarnings({"rawtypes", "unchecked"}) public static long getDirectByteBufferAddress(ByteBuffer bb) { if (!bb.isDirect()) { return 0L; } - if (dbbAddressFailed) { + if (unsafe == null) { return 0L; } - Method m = dbbAddressMethod; - if (m == null) { - Class c = dbbClass; - if (c == null) { - try { - c = Class.forName("java.nio.DirectByteBuffer"); - } catch (ClassNotFoundException e) { - // throw new IllegalStateException("Could not find java.nio.DirectByteBuffer", e); - dbbCreateFailed = true; - dbbAddressFailed = true; - return 0L; - } - dbbClass = c; - } - try { - m = c.getDeclaredMethod("address"); - } catch (NoSuchMethodException | SecurityException e) { - // throw new IllegalStateException("Could not get method DirectByteBuffer.address()", e); - dbbClass = null; - dbbAddressFailed = true; - return 0L; - } - m.setAccessible(true); - dbbAddressMethod = m; - } try { - return (Long) m.invoke(bb); - } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { - // throw new IllegalStateException("Could not create an invoke DirectByteBuffer.address()", - // e); - dbbClass = null; - dbbAddressMethod = null; - dbbAddressFailed = true; + return unsafe.getBufferAddress(bb); + } catch (Exception e) { + // If Unsafe access fails, return 0 to indicate failure return 0L; } } /** - * Create a direct byte buffer given its address and size. The returned ByteBuffer will be direct - * and use the memory at the given address. + * Create a direct byte buffer given its address and size. + * + * This implementation creates a standard DirectByteBuffer and then modifies its internal + * 'address' field to point to the given memory address using Unsafe. This approach uses + * field-level access via Unsafe which does not require --add-opens flags. * - * @return the created direct byte buffer or null if it could not be created. + * The resulting ByteBuffer directly wraps the memory at the given address without copying, + * making it a zero-copy operation suitable for off-heap memory management. + * + * @param address the native memory address to wrap + * @param size the size of the buffer + * @return the created direct byte buffer wrapping the address, or null if creation failed */ - @SuppressWarnings({"rawtypes", "unchecked"}) static ByteBuffer createDirectByteBuffer(long address, int size) { - if (dbbCreateFailed) { + if (unsafe == null) { return null; } - Constructor ctor = dbbCtor; - if (ctor == null) { - Class c = dbbClass; - if (c == null) { - try { - c = Class.forName("java.nio.DirectByteBuffer"); - } catch (ClassNotFoundException e) { - // throw new IllegalStateException("Could not find java.nio.DirectByteBuffer", e); - dbbCreateFailed = true; - dbbAddressFailed = true; - return null; - } - dbbClass = c; - } - try { - ctor = c.getDeclaredConstructor(long.class, int.class); - } catch (NoSuchMethodException | SecurityException e) { - // throw new IllegalStateException("Could not get constructor DirectByteBuffer(long, int)", - // e); - dbbClass = null; - dbbCreateFailed = true; - return null; - } - ctor.setAccessible(true); - dbbCtor = ctor; - } try { - return (ByteBuffer) ctor.newInstance(address, size); - } catch (InstantiationException | IllegalAccessException | IllegalArgumentException - | InvocationTargetException e) { - // throw new IllegalStateException("Could not create an instance using DirectByteBuffer(long, - // int)", e); - dbbClass = null; - dbbCtor = null; - dbbCreateFailed = true; + // Allocate a small DirectByteBuffer using standard public API + // We'll reuse this buffer's structure but change its address and capacity + ByteBuffer buffer = ByteBuffer.allocateDirect(1); + + // Use Unsafe to modify the buffer's internal fields to point to our address + // This is similar to calling the private DirectByteBuffer(long, int) constructor + // but using field access instead of constructor reflection + unsafe.setBufferAddress(buffer, address); + unsafe.setBufferCapacity(buffer, size); + + // Reset position and limit to match the new capacity + buffer.clear(); + buffer.limit(size); + + return buffer; + } catch (Exception e) { return null; } } diff --git a/geode-gfsh/src/main/java/org/apache/geode/management/internal/cli/commands/MemberJvmOptions.java b/geode-gfsh/src/main/java/org/apache/geode/management/internal/cli/commands/MemberJvmOptions.java index dbfc1ee40043..2672c36b5d59 100644 --- a/geode-gfsh/src/main/java/org/apache/geode/management/internal/cli/commands/MemberJvmOptions.java +++ b/geode-gfsh/src/main/java/org/apache/geode/management/internal/cli/commands/MemberJvmOptions.java @@ -27,7 +27,6 @@ import java.util.List; import org.apache.geode.distributed.internal.deadlock.UnsafeThreadLocal; -import org.apache.geode.internal.offheap.AddressableMemoryManager; import org.apache.geode.internal.stats50.VMStats50; import org.apache.geode.unsafe.internal.com.sun.jmx.remote.security.MBeanServerAccessController; import org.apache.geode.unsafe.internal.sun.nio.ch.DirectBuffer; @@ -48,10 +47,6 @@ public class MemberJvmOptions { * open needed by {@link UnsafeThreadLocal} */ private static final String JAVA_LANG_OPEN = "--add-opens=java.base/java.lang=ALL-UNNAMED"; - /** - * open needed by {@link AddressableMemoryManager} - */ - private static final String JAVA_NIO_OPEN = "--add-opens=java.base/java.nio=ALL-UNNAMED"; /** * open needed by {@link VMStats50} */ @@ -62,8 +57,7 @@ public class MemberJvmOptions { COM_SUN_JMX_REMOTE_SECURITY_EXPORT, SUN_NIO_CH_EXPORT, COM_SUN_MANAGEMENT_INTERNAL_OPEN, - JAVA_LANG_OPEN, - JAVA_NIO_OPEN); + JAVA_LANG_OPEN); public static List getMemberJvmOptions() { if (isJavaVersionAtLeast(JAVA_11)) { diff --git a/geode-unsafe/src/main/java/org/apache/geode/unsafe/internal/sun/misc/Unsafe.java b/geode-unsafe/src/main/java/org/apache/geode/unsafe/internal/sun/misc/Unsafe.java index 3c5db9e96df1..96e028205521 100644 --- a/geode-unsafe/src/main/java/org/apache/geode/unsafe/internal/sun/misc/Unsafe.java +++ b/geode-unsafe/src/main/java/org/apache/geode/unsafe/internal/sun/misc/Unsafe.java @@ -26,6 +26,33 @@ public class Unsafe { private final sun.misc.Unsafe unsafe; + + // Cached field offsets for ByteBuffer access + // These are computed once and reused to avoid repeated reflection + private static final long BUFFER_ADDRESS_FIELD_OFFSET; + private static final long BUFFER_CAPACITY_FIELD_OFFSET; + + static { + long addressOffset = -1; + long capacityOffset = -1; + try { + Field unsafeField = sun.misc.Unsafe.class.getDeclaredField("theUnsafe"); + unsafeField.setAccessible(true); + sun.misc.Unsafe unsafeInstance = (sun.misc.Unsafe) unsafeField.get(null); + + // Get field offsets for Buffer fields + Field addressField = java.nio.Buffer.class.getDeclaredField("address"); + addressOffset = unsafeInstance.objectFieldOffset(addressField); + + Field capacityField = java.nio.Buffer.class.getDeclaredField("capacity"); + capacityOffset = unsafeInstance.objectFieldOffset(capacityField); + } catch (Exception e) { + // If initialization fails, offsets remain -1 + } + BUFFER_ADDRESS_FIELD_OFFSET = addressOffset; + BUFFER_CAPACITY_FIELD_OFFSET = capacityOffset; + } + { sun.misc.Unsafe tmp; try { @@ -210,4 +237,59 @@ public boolean compareAndSwapObject(Object o, long offset, Object expected, Obje public void putOrderedObject(Object o, long offset, Object x) { unsafe.putOrderedObject(o, offset, x); } + + /** + * Gets the native memory address from a DirectByteBuffer using field offset. + * This method accesses the 'address' field of java.nio.Buffer directly via Unsafe, + * which does not require --add-opens flags (unlike method reflection with setAccessible()). + * + * @param buffer the DirectByteBuffer to get the address from + * @return the native memory address + */ + public long getBufferAddress(Object buffer) { + if (BUFFER_ADDRESS_FIELD_OFFSET == -1) { + throw new RuntimeException("Buffer address field offset not initialized"); + } + return unsafe.getLong(buffer, BUFFER_ADDRESS_FIELD_OFFSET); + } + + /** + * Sets the native memory address for a ByteBuffer using field offset. + * This allows wrapping an arbitrary memory address as a ByteBuffer. + * + * @param buffer the ByteBuffer to set the address for + * @param address the native memory address + */ + public void setBufferAddress(Object buffer, long address) { + if (BUFFER_ADDRESS_FIELD_OFFSET == -1) { + throw new RuntimeException("Buffer address field offset not initialized"); + } + unsafe.putLong(buffer, BUFFER_ADDRESS_FIELD_OFFSET, address); + } + + /** + * Gets the capacity from a ByteBuffer using field offset. + * + * @param buffer the ByteBuffer to get the capacity from + * @return the buffer capacity + */ + public int getBufferCapacity(Object buffer) { + if (BUFFER_CAPACITY_FIELD_OFFSET == -1) { + throw new RuntimeException("Buffer capacity field offset not initialized"); + } + return unsafe.getInt(buffer, BUFFER_CAPACITY_FIELD_OFFSET); + } + + /** + * Sets the capacity for a ByteBuffer using field offset. + * + * @param buffer the ByteBuffer to set the capacity for + * @param capacity the capacity value + */ + public void setBufferCapacity(Object buffer, int capacity) { + if (BUFFER_CAPACITY_FIELD_OFFSET == -1) { + throw new RuntimeException("Buffer capacity field offset not initialized"); + } + unsafe.putInt(buffer, BUFFER_CAPACITY_FIELD_OFFSET, capacity); + } } From 83ff86f9c0cd92c4ed4b72cdabc50393f3de9a0d Mon Sep 17 00:00:00 2001 From: Jinwoo Hwang <92374539+JinwooHwang@users.noreply.github.com> Date: Wed, 3 Dec 2025 11:34:46 -0500 Subject: [PATCH 04/10] [GEODE-10520] Security : Eliminate DirectBuffer Access to sun.nio.ch Internal Package (#7955) * refactor: Replace internal JDK DirectBuffer with public API solution Replace sun.nio.ch.DirectBuffer usage with BufferAttachmentTracker, using only public Java APIs (WeakHashMap and ByteBuffer). Changes: - Created BufferAttachmentTracker: WeakHashMap-based tracker for slice-to-original buffer mappings, replacing internal DirectBuffer.attachment() access - Updated BufferPool: Modified slice creation to record mappings and simplified getPoolableBuffer() to use the tracker - Removed DirectBuffer wrapper: Deleted geode-unsafe DirectBuffer wrapper class - Updated MemberJvmOptions: Removed SUN_NIO_CH_EXPORT from required JVM options - Added comprehensive unit tests: BufferAttachmentTrackerTest validates all tracker functionality Benefits: - Eliminates one JVM module export requirement - Uses only public Java APIs - Maintains functionality with automatic memory cleanup via WeakHashMap - Fully backward compatible Testing: - All BufferPool tests pass - New BufferAttachmentTracker tests pass - Compilation successful * Add comprehensive documentation to BufferAttachmentTracker - Add detailed PMD suppression justification explaining thread-safety - Document why ConcurrentHashMap is safe for concurrent access - Explain lock-free operations and atomic guarantees - Add 7-line comment block explaining mutable static field design choice * Apply spotless formatting to BufferAttachmentTrackerTest * fix: Correct buffer pooling to prevent capacity issues in NioEngine - Fixed acquirePredefinedFixedBuffer() to return full-capacity buffers instead of modifying buffer limits before return - Added BufferAttachmentTracker.removeTracking() in releaseBuffer() to properly clean up slice-to-original mappings - Created non-slicing buffer acquisition methods for NioPlainEngine and NioSslEngine which require reusable full-capacity buffers - Separated buffer acquisition into two use cases: * Single-use sliced buffers (2-param acquireDirectBuffer) * Reusable full-capacity buffers (3-param acquireDirectBuffer) This fixes IllegalArgumentException 'newLimit > capacity' errors in distributed tests by ensuring pooled buffers maintain proper capacity. * Fix IndexOutOfBoundsException in BufferAttachmentTracker Replace ConcurrentHashMap with synchronized IdentityHashMap to avoid ByteBuffer.equals() issues. ByteBuffer uses content-based equality which can throw IndexOutOfBoundsException when buffer state (position/limit) changes after being used as a map key. IdentityHashMap uses object identity (==) which is safe and appropriate for tracking buffer relationships. --- .../internal/net/BufferAttachmentTracker.java | 103 ++++++++ .../apache/geode/internal/net/BufferPool.java | 75 ++++-- .../net/BufferAttachmentTrackerTest.java | 236 ++++++++++++++++++ .../cli/commands/MemberJvmOptions.java | 7 - .../internal/sun/nio/ch/DirectBuffer.java | 36 --- .../internal/sun/nio/ch/DirectBufferTest.java | 53 ---- 6 files changed, 387 insertions(+), 123 deletions(-) create mode 100644 geode-core/src/main/java/org/apache/geode/internal/net/BufferAttachmentTracker.java create mode 100644 geode-core/src/test/java/org/apache/geode/internal/net/BufferAttachmentTrackerTest.java delete mode 100644 geode-unsafe/src/main/java/org/apache/geode/unsafe/internal/sun/nio/ch/DirectBuffer.java delete mode 100644 geode-unsafe/src/test/java/org/apache/geode/unsafe/internal/sun/nio/ch/DirectBufferTest.java diff --git a/geode-core/src/main/java/org/apache/geode/internal/net/BufferAttachmentTracker.java b/geode-core/src/main/java/org/apache/geode/internal/net/BufferAttachmentTracker.java new file mode 100644 index 000000000000..67bc775c2622 --- /dev/null +++ b/geode-core/src/main/java/org/apache/geode/internal/net/BufferAttachmentTracker.java @@ -0,0 +1,103 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more contributor license + * agreements. See the NOTICE file distributed with this work for additional information regarding + * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. You may obtain a + * copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ + +package org.apache.geode.internal.net; + +import java.nio.ByteBuffer; +import java.util.Collections; +import java.util.IdentityHashMap; +import java.util.Map; + +/** + * Tracks the relationship between sliced ByteBuffers and their original parent buffers. + * This replaces the need to access internal JDK implementation classes, using only + * public Java APIs instead. + * + * When ByteBuffer.slice() is called, it creates a new buffer that shares content with + * the original. We need to track this relationship so that when returning buffers to + * the pool, we return the original pooled buffer, not the slice. + * + * This class uses IdentityHashMap (synchronized) which provides thread-safe access + * using object identity rather than equals(). This is critical because ByteBuffer.equals() + * compares buffer content and can throw IndexOutOfBoundsException if buffer position/limit + * is modified after being used as a map key. Callers must explicitly call removeTracking() + * to clean up entries when buffers are returned to the pool. + */ +class BufferAttachmentTracker { + + /** + * Maps sliced buffers to their original parent buffers using object identity. + * Uses synchronized IdentityHashMap for thread-safe access without relying on + * ByteBuffer.equals() or hashCode(), which can be problematic when buffer state changes. + * Entries must be explicitly removed via removeTracking() to prevent memory leaks. + * + * Note: This static mutable field is intentionally designed for global buffer tracking + * across the application. The PMD.StaticFieldsMustBeImmutable warning is suppressed + * because: + * 1. Mutable shared state is required to track buffer relationships across all threads + * 2. IdentityHashMap uses object identity (==) avoiding equals()/hashCode() issues + * 3. Collections.synchronizedMap provides thread-safe operations + * 4. This is the most efficient design for this use case + */ + @SuppressWarnings("PMD.StaticFieldsMustBeImmutable") + private static final Map sliceToOriginal = + Collections.synchronizedMap(new IdentityHashMap<>()); + + /** + * Records that a slice buffer was created from an original buffer. + * + * @param slice the sliced ByteBuffer + * @param original the original ByteBuffer that was sliced + */ + static void recordSlice(ByteBuffer slice, ByteBuffer original) { + sliceToOriginal.put(slice, original); + } + + /** + * Retrieves the original buffer for a given buffer, which may be a slice. + * If the buffer is not a slice (not tracked), returns the buffer itself. + * + * @param buffer the buffer to look up, which may be a slice + * @return the original pooled buffer, or the buffer itself if not a slice + */ + static ByteBuffer getOriginal(ByteBuffer buffer) { + ByteBuffer original = sliceToOriginal.get(buffer); + return original != null ? original : buffer; + } + + /** + * Removes tracking for a buffer. Should be called when returning a buffer + * to the pool to avoid memory leaks in the tracking map. + * + * @param buffer the buffer to stop tracking + */ + static void removeTracking(ByteBuffer buffer) { + sliceToOriginal.remove(buffer); + } + + /** + * For testing: returns the current size of the tracking map. + */ + static int getTrackingMapSize() { + return sliceToOriginal.size(); + } + + /** + * For testing: clears all tracking entries. + */ + static void clearTracking() { + sliceToOriginal.clear(); + } +} diff --git a/geode-core/src/main/java/org/apache/geode/internal/net/BufferPool.java b/geode-core/src/main/java/org/apache/geode/internal/net/BufferPool.java index 56c0b7328c0b..09a1b1796858 100644 --- a/geode-core/src/main/java/org/apache/geode/internal/net/BufferPool.java +++ b/geode-core/src/main/java/org/apache/geode/internal/net/BufferPool.java @@ -22,13 +22,11 @@ import org.jetbrains.annotations.NotNull; -import org.apache.geode.InternalGemFireException; import org.apache.geode.annotations.VisibleForTesting; import org.apache.geode.distributed.internal.DMStats; import org.apache.geode.distributed.internal.DistributionConfig; import org.apache.geode.internal.Assert; import org.apache.geode.internal.tcp.Connection; -import org.apache.geode.unsafe.internal.sun.nio.ch.DirectBuffer; import org.apache.geode.util.internal.GeodeGlossary; public class BufferPool { @@ -111,8 +109,11 @@ private ByteBuffer acquireDirectBuffer(int size, boolean send) { result = acquireLargeBuffer(send, size); } if (result.capacity() > size) { + ByteBuffer original = result; result.position(0).limit(size); result = result.slice(); + // Track the slice-to-original mapping to support buffer pool return + BufferAttachmentTracker.recordSlice(result, original); } return result; } @@ -159,19 +160,14 @@ private ByteBuffer acquirePredefinedFixedBuffer(boolean send, int size) { // it was garbage collected updateBufferStats(-defaultSize, ref.getSend(), true); } else { + // Reset the buffer to full capacity - clear() resets position and sets limit to capacity bb.clear(); - if (defaultSize > size) { - bb.limit(size); - } return bb; } ref = bufferTempQueue.poll(); } result = ByteBuffer.allocateDirect(defaultSize); updateBufferStats(defaultSize, send, true); - if (defaultSize > size) { - result.limit(size); - } return result; } @@ -267,17 +263,51 @@ ByteBuffer expandWriteBufferIfNeeded(BufferType type, ByteBuffer existing, } ByteBuffer acquireDirectBuffer(BufferPool.BufferType type, int capacity) { + // This method is used by NioPlainEngine and NioSslEngine which need full-capacity buffers + // that can be reused for multiple read/write operations. We should NOT create slices here. switch (type) { case UNTRACKED: return ByteBuffer.allocate(capacity); case TRACKED_SENDER: - return acquireDirectSenderBuffer(capacity); + return acquireDirectSenderBufferNonSliced(capacity); case TRACKED_RECEIVER: - return acquireDirectReceiveBuffer(capacity); + return acquireDirectReceiveBufferNonSliced(capacity); } throw new IllegalArgumentException("Unexpected buffer type " + type); } + /** + * Acquire a direct sender buffer without slicing - returns a buffer with capacity >= requested + * size + */ + private ByteBuffer acquireDirectSenderBufferNonSliced(int size) { + if (!useDirectBuffers) { + return ByteBuffer.allocate(size); + } + + if (size <= MEDIUM_BUFFER_SIZE) { + return acquirePredefinedFixedBuffer(true, size); + } else { + return acquireLargeBuffer(true, size); + } + } + + /** + * Acquire a direct receive buffer without slicing - returns a buffer with capacity >= requested + * size + */ + private ByteBuffer acquireDirectReceiveBufferNonSliced(int size) { + if (!useDirectBuffers) { + return ByteBuffer.allocate(size); + } + + if (size <= MEDIUM_BUFFER_SIZE) { + return acquirePredefinedFixedBuffer(false, size); + } else { + return acquireLargeBuffer(false, size); + } + } + ByteBuffer acquireNonDirectBuffer(BufferPool.BufferType type, int capacity) { switch (type) { case UNTRACKED: @@ -310,11 +340,13 @@ void releaseBuffer(BufferPool.BufferType type, @NotNull ByteBuffer buffer) { */ private void releaseBuffer(ByteBuffer buffer, boolean send) { if (buffer.isDirect()) { - buffer = getPoolableBuffer(buffer); - BBSoftReference bbRef = new BBSoftReference(buffer, send); - if (buffer.capacity() <= SMALL_BUFFER_SIZE) { + ByteBuffer original = getPoolableBuffer(buffer); + // Clean up tracking for this buffer to prevent memory leaks + BufferAttachmentTracker.removeTracking(buffer); + BBSoftReference bbRef = new BBSoftReference(original, send); + if (original.capacity() <= SMALL_BUFFER_SIZE) { bufferSmallQueue.offer(bbRef); - } else if (buffer.capacity() <= MEDIUM_BUFFER_SIZE) { + } else if (original.capacity() <= MEDIUM_BUFFER_SIZE) { bufferMiddleQueue.offer(bbRef); } else { bufferLargeQueue.offer(bbRef); @@ -328,25 +360,14 @@ private void releaseBuffer(ByteBuffer buffer, boolean send) { * If we hand out a buffer that is larger than the requested size we create a * "slice" of the buffer having the requested capacity and hand that out instead. * When we put the buffer back in the pool we need to find the original, non-sliced, - * buffer. This is held in DirectBuffer in its "attachment" field. + * buffer. This is tracked using BufferAttachmentTracker. * * This method is visible for use in debugging and testing. For debugging, invoke this method if * you need to see the non-sliced buffer for some reason, such as logging its hashcode. */ @VisibleForTesting ByteBuffer getPoolableBuffer(final ByteBuffer buffer) { - final Object attachment = DirectBuffer.attachment(buffer); - - if (null == attachment) { - return buffer; - } - - if (attachment instanceof ByteBuffer) { - return (ByteBuffer) attachment; - } - - throw new InternalGemFireException("direct byte buffer attachment was not a byte buffer but a " - + attachment.getClass().getName()); + return BufferAttachmentTracker.getOriginal(buffer); } /** diff --git a/geode-core/src/test/java/org/apache/geode/internal/net/BufferAttachmentTrackerTest.java b/geode-core/src/test/java/org/apache/geode/internal/net/BufferAttachmentTrackerTest.java new file mode 100644 index 000000000000..aa37d9b64aa9 --- /dev/null +++ b/geode-core/src/test/java/org/apache/geode/internal/net/BufferAttachmentTrackerTest.java @@ -0,0 +1,236 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more contributor license + * agreements. See the NOTICE file distributed with this work for additional information regarding + * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. You may obtain a + * copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ + +package org.apache.geode.internal.net; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.nio.ByteBuffer; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; + +import org.junit.After; +import org.junit.Test; + +/** + * Unit tests for BufferAttachmentTracker. + */ +public class BufferAttachmentTrackerTest { + + @After + public void tearDown() { + // Clean up after each test + BufferAttachmentTracker.clearTracking(); + } + + @Test + public void getOriginal_returnsOriginalBufferForSlice() { + ByteBuffer original = ByteBuffer.allocateDirect(1024); + original.position(0).limit(512); + ByteBuffer slice = original.slice(); + + BufferAttachmentTracker.recordSlice(slice, original); + + ByteBuffer result = BufferAttachmentTracker.getOriginal(slice); + + assertThat(result).isSameAs(original); + } + + @Test + public void getOriginal_returnsBufferItselfWhenNotTracked() { + ByteBuffer buffer = ByteBuffer.allocateDirect(1024); + + ByteBuffer result = BufferAttachmentTracker.getOriginal(buffer); + + assertThat(result).isSameAs(buffer); + } + + @Test + public void removeTracking_removesSliceMapping() { + ByteBuffer original = ByteBuffer.allocateDirect(1024); + original.position(0).limit(512); + ByteBuffer slice = original.slice(); + + BufferAttachmentTracker.recordSlice(slice, original); + assertThat(BufferAttachmentTracker.getTrackingMapSize()).isEqualTo(1); + + BufferAttachmentTracker.removeTracking(slice); + + assertThat(BufferAttachmentTracker.getTrackingMapSize()).isEqualTo(0); + assertThat(BufferAttachmentTracker.getOriginal(slice)).isSameAs(slice); + } + + @Test + public void trackingMapSize_reflectsCurrentMappings() { + assertThat(BufferAttachmentTracker.getTrackingMapSize()).isEqualTo(0); + + ByteBuffer original1 = ByteBuffer.allocateDirect(1024); + ByteBuffer slice1 = original1.slice(); + BufferAttachmentTracker.recordSlice(slice1, original1); + assertThat(BufferAttachmentTracker.getTrackingMapSize()).isEqualTo(1); + + ByteBuffer original2 = ByteBuffer.allocateDirect(2048); + ByteBuffer slice2 = original2.slice(); + BufferAttachmentTracker.recordSlice(slice2, original2); + assertThat(BufferAttachmentTracker.getTrackingMapSize()).isEqualTo(2); + } + + @Test + public void clearTracking_removesAllMappings() { + ByteBuffer original1 = ByteBuffer.allocateDirect(1024); + ByteBuffer slice1 = original1.slice(); + BufferAttachmentTracker.recordSlice(slice1, original1); + + ByteBuffer original2 = ByteBuffer.allocateDirect(2048); + ByteBuffer slice2 = original2.slice(); + BufferAttachmentTracker.recordSlice(slice2, original2); + + assertThat(BufferAttachmentTracker.getTrackingMapSize()).isEqualTo(2); + + BufferAttachmentTracker.clearTracking(); + + assertThat(BufferAttachmentTracker.getTrackingMapSize()).isEqualTo(0); + } + + @Test + public void recordSlice_canOverwriteExistingMapping() { + ByteBuffer original1 = ByteBuffer.allocateDirect(1024); + ByteBuffer original2 = ByteBuffer.allocateDirect(2048); + ByteBuffer slice = original1.slice(); + + BufferAttachmentTracker.recordSlice(slice, original1); + assertThat(BufferAttachmentTracker.getOriginal(slice)).isSameAs(original1); + + BufferAttachmentTracker.recordSlice(slice, original2); + assertThat(BufferAttachmentTracker.getOriginal(slice)).isSameAs(original2); + } + + @Test + public void worksWithHeapBuffers() { + ByteBuffer original = ByteBuffer.allocate(1024); + original.position(0).limit(512); + ByteBuffer slice = original.slice(); + + BufferAttachmentTracker.recordSlice(slice, original); + + ByteBuffer result = BufferAttachmentTracker.getOriginal(slice); + + assertThat(result).isSameAs(original); + } + + @Test + public void simpleThreadSafetyTest() { + // Create a single original and slice + ByteBuffer original = ByteBuffer.allocateDirect(1024); + ByteBuffer slice = original.slice(); + + // Record it + BufferAttachmentTracker.recordSlice(slice, original); + + // Immediately retrieve it + ByteBuffer result = BufferAttachmentTracker.getOriginal(slice); + + // Should get back the exact same original + assertThat(result).isSameAs(original); + assertThat(result).isNotSameAs(slice); + + System.out.println("Original identity: " + System.identityHashCode(original)); + System.out.println("Slice identity: " + System.identityHashCode(slice)); + System.out.println("Result identity: " + System.identityHashCode(result)); + } + + /** + * Thread-safety test: Concurrent reads and writes on the same slice. + * This verifies that race conditions don't cause incorrect mappings. + */ + @Test + public void concurrentAccessToSameSlice_isThreadSafe() throws InterruptedException { + final int numThreads = 10; + final int iterations = 1000; + final ExecutorService executor = Executors.newFixedThreadPool(numThreads); + final CountDownLatch startLatch = new CountDownLatch(1); + final CountDownLatch doneLatch = new CountDownLatch(numThreads); + final AtomicInteger errors = new AtomicInteger(0); + + ByteBuffer original = ByteBuffer.allocateDirect(1024); + ByteBuffer slice = original.slice(); + + for (int i = 0; i < numThreads; i++) { + executor.submit(() -> { + try { + startLatch.await(); + + for (int j = 0; j < iterations; j++) { + // Record the mapping + BufferAttachmentTracker.recordSlice(slice, original); + + // Immediately retrieve it + ByteBuffer retrieved = BufferAttachmentTracker.getOriginal(slice); + + // Should always get the original back + if (retrieved != original) { + errors.incrementAndGet(); + } + } + } catch (Exception e) { + errors.incrementAndGet(); + e.printStackTrace(); + } finally { + doneLatch.countDown(); + } + }); + } + + startLatch.countDown(); + boolean completed = doneLatch.await(30, TimeUnit.SECONDS); + executor.shutdown(); + + assertThat(completed).isTrue(); + assertThat(errors.get()).isEqualTo(0); + } + + /** + * Memory safety test: Verifies that WeakHashMap allows slice buffers to be + * garbage collected without causing memory leaks. + */ + @Test + public void weakHashMap_allowsGarbageCollection() { + ByteBuffer original = ByteBuffer.allocateDirect(1024); + ByteBuffer slice = original.slice(); + + BufferAttachmentTracker.recordSlice(slice, original); + assertThat(BufferAttachmentTracker.getTrackingMapSize()).isEqualTo(1); + + // Remove reference to slice (but not original) + slice = null; + + // Force garbage collection + System.gc(); + System.runFinalization(); + + // Give GC time to clean up weak references + // The WeakHashMap should eventually remove the entry when the slice is GC'd + // Note: This is non-deterministic, so we can't assert on size without + // potentially making the test flaky. The important thing is that it + // doesn't prevent GC. + + // What we can verify is that having null'd the slice doesn't break anything + ByteBuffer result = BufferAttachmentTracker.getOriginal(original); + assertThat(result).isSameAs(original); // Original still works + } +} diff --git a/geode-gfsh/src/main/java/org/apache/geode/management/internal/cli/commands/MemberJvmOptions.java b/geode-gfsh/src/main/java/org/apache/geode/management/internal/cli/commands/MemberJvmOptions.java index 2672c36b5d59..d0fa681f47f2 100644 --- a/geode-gfsh/src/main/java/org/apache/geode/management/internal/cli/commands/MemberJvmOptions.java +++ b/geode-gfsh/src/main/java/org/apache/geode/management/internal/cli/commands/MemberJvmOptions.java @@ -29,15 +29,9 @@ import org.apache.geode.distributed.internal.deadlock.UnsafeThreadLocal; import org.apache.geode.internal.stats50.VMStats50; import org.apache.geode.unsafe.internal.com.sun.jmx.remote.security.MBeanServerAccessController; -import org.apache.geode.unsafe.internal.sun.nio.ch.DirectBuffer; public class MemberJvmOptions { static final int CMS_INITIAL_OCCUPANCY_FRACTION = 60; - /** - * export needed by {@link DirectBuffer} - */ - private static final String SUN_NIO_CH_EXPORT = - "--add-exports=java.base/sun.nio.ch=ALL-UNNAMED"; /** * export needed by {@link MBeanServerAccessController} */ @@ -55,7 +49,6 @@ public class MemberJvmOptions { static final List JAVA_11_OPTIONS = Arrays.asList( COM_SUN_JMX_REMOTE_SECURITY_EXPORT, - SUN_NIO_CH_EXPORT, COM_SUN_MANAGEMENT_INTERNAL_OPEN, JAVA_LANG_OPEN); diff --git a/geode-unsafe/src/main/java/org/apache/geode/unsafe/internal/sun/nio/ch/DirectBuffer.java b/geode-unsafe/src/main/java/org/apache/geode/unsafe/internal/sun/nio/ch/DirectBuffer.java deleted file mode 100644 index dc894cfea212..000000000000 --- a/geode-unsafe/src/main/java/org/apache/geode/unsafe/internal/sun/nio/ch/DirectBuffer.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more contributor license - * agreements. See the NOTICE file distributed with this work for additional information regarding - * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. You may obtain a - * copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ - -package org.apache.geode.unsafe.internal.sun.nio.ch; - -/** - * Provides access to methods on non-SDK class {@link sun.nio.ch.DirectBuffer}. - */ -public interface DirectBuffer { - - /** - * @see sun.nio.ch.DirectBuffer#attachment() - * @param object to get attachment for - * @return returns attachment if object is {@link sun.nio.ch.DirectBuffer} otherwise null. - */ - static Object attachment(final Object object) { - if (object instanceof sun.nio.ch.DirectBuffer) { - return ((sun.nio.ch.DirectBuffer) object).attachment(); - } - - return null; - } - -} diff --git a/geode-unsafe/src/test/java/org/apache/geode/unsafe/internal/sun/nio/ch/DirectBufferTest.java b/geode-unsafe/src/test/java/org/apache/geode/unsafe/internal/sun/nio/ch/DirectBufferTest.java deleted file mode 100644 index 6d2f52b1c339..000000000000 --- a/geode-unsafe/src/test/java/org/apache/geode/unsafe/internal/sun/nio/ch/DirectBufferTest.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more contributor license - * agreements. See the NOTICE file distributed with this work for additional information regarding - * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. You may obtain a - * copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ - - -package org.apache.geode.unsafe.internal.sun.nio.ch; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.parallel.ExecutionMode.CONCURRENT; - -import java.nio.ByteBuffer; - -import org.junit.jupiter.api.MethodOrderer; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestMethodOrder; -import org.junit.jupiter.api.parallel.Execution; - -@Execution(CONCURRENT) -@TestMethodOrder(MethodOrderer.Random.class) -public class DirectBufferTest { - - @Test - public void attachmentIsNullForNonDirectBuffer() { - assertThat(DirectBuffer.attachment(null)).isNull(); - assertThat(DirectBuffer.attachment(new Object())).isNull(); - assertThat(DirectBuffer.attachment(ByteBuffer.allocate(1))).isNull(); - } - - @Test - public void attachmentIsNullForUnslicedDirectBuffer() { - assertThat(DirectBuffer.attachment(ByteBuffer.allocateDirect(1))).isNull(); - } - - @Test - public void attachmentIsRootBufferForDirectBufferSlice() { - final ByteBuffer root = ByteBuffer.allocateDirect(10); - final ByteBuffer slice = root.slice(); - - assertThat(DirectBuffer.attachment(slice)).isSameAs(root); - } - -} From 7e3cccf271bac164057aa8b99ecdb3f08ab776c3 Mon Sep 17 00:00:00 2001 From: Jinwoo Hwang <92374539+JinwooHwang@users.noreply.github.com> Date: Wed, 3 Dec 2025 11:53:21 -0500 Subject: [PATCH 05/10] [GEODE-10508] Remedation of ANTLR nondeterminism warnings in OQL grammar (#7942) * GEODE-10508: Fix ANTLR nondeterminism warnings in OQL grammar This commit resolves four nondeterminism warnings generated by ANTLR during the OQL grammar compilation process. These warnings indicated parser ambiguity that could lead to unpredictable parsing behavior. Problem Analysis: ----------------- 1. Lines 574 & 578 (projection rule): The parser could not distinguish between aggregateExpr and expr alternatives when encountering aggregate function keywords (sum, avg, min, max, count). These keywords are valid both as: - Aggregate function identifiers: sum(field) - Regular identifiers in expressions: sum as a field name Without lookahead, ANTLR could not deterministically choose which production rule to apply, resulting in nondeterminism warnings. 2. Lines 961 & 979 (aggregateExpr rule): Optional 'distinct' keyword created ambiguity in aggregate function parsing. The parser could not decide whether to: - Match the optional 'distinct' keyword, or - Skip it and proceed directly to the expression Both paths were valid, but ANTLR's default behavior doesn't specify preference, causing nondeterminism. Solution Implemented: -------------------- 1. Added syntactic predicates to projection rule (lines 574, 578): Predicate: (('sum'|'avg'|'min'|'max'|'count') TOK_LPAREN)=> This instructs the parser to look ahead and check if an aggregate keyword is followed by a left parenthesis. If true, it chooses aggregateExpr; otherwise, it chooses expr. This resolves the ambiguity by providing explicit lookahead logic. 2. Added greedy option to aggregateExpr rule (lines 961, 979): Option: options {greedy=true;} This tells the parser to greedily match the 'distinct' keyword whenever it appears, rather than being ambiguous about whether to match or skip. The greedy option eliminates the nondeterminism by establishing clear matching priority. 3. Updated test to use token constants (AbstractCompiledValueTestJUnitTest): Changed: hardcoded value 89 -> OQLLexerTokenTypes.LITERAL_or Rationale: Adding syntactic predicates changes ANTLR's token numbering in the generated lexer (LITERAL_or shifted from 89 to 94). Using the constant ensures test correctness regardless of future grammar changes. This is a best practice for maintaining test stability. Impact: ------- - Zero nondeterminism warnings from ANTLR grammar generation - No changes to OQL syntax or semantics (fully backward compatible) - No runtime behavior changes (modifications only affect parser generation) - All existing tests pass with updated token reference - Improved parser determinism and maintainability Technical Details: ----------------- - Syntactic predicates (=>) are standard ANTLR 2 feature for lookahead - Greedy option is standard ANTLR feature for optional subrule disambiguation - Token constant usage follows best practices for generated code references - Changes are compile-time only with no runtime performance impact Files Modified: -------------- - geode-core/src/main/antlr/org/apache/geode/cache/query/internal/parse/oql.g - geode-core/src/test/java/org/apache/geode/cache/query/internal/AbstractCompiledValueTestJUnitTest.java * GEODE-10508: Apply code formatting to test file Fix line length formatting for improved readability. --- .../geode/cache/query/internal/parse/oql.g | 17 +++++++++++++---- .../AbstractCompiledValueTestJUnitTest.java | 9 ++++++++- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/geode-core/src/main/antlr/org/apache/geode/cache/query/internal/parse/oql.g b/geode-core/src/main/antlr/org/apache/geode/cache/query/internal/parse/oql.g index cdd1623333e5..5ae8b4e4a79e 100644 --- a/geode-core/src/main/antlr/org/apache/geode/cache/query/internal/parse/oql.g +++ b/geode-core/src/main/antlr/org/apache/geode/cache/query/internal/parse/oql.g @@ -571,11 +571,16 @@ projectionAttributes : projection!{ AST node = null;}: - lb1:identifier TOK_COLON! ( tok1:aggregateExpr{node = #tok1;} | tok2:expr{node = #tok2;}) + // Use syntactic predicate to resolve nondeterminism between aggregateExpr and expr. + // The predicate checks for aggregate function keywords (sum, avg, min, max, count) followed by '('. + // Without this, the parser cannot determine which alternative to choose when it sees these keywords, + // since they can also be used as identifiers in regular expressions. + lb1:identifier TOK_COLON! ( (("sum"|"avg"|"min"|"max"|"count") TOK_LPAREN)=> tok1:aggregateExpr{node = #tok1;} | tok2:expr{node = #tok2;}) { #projection = #([PROJECTION, "projection", "org.apache.geode.cache.query.internal.parse.ASTProjection"], node, #lb1); } | - (tok3:aggregateExpr{node = #tok3;} | tok4:expr{node = #tok4;}) + // Same syntactic predicate as above to handle projections without a label (identifier:) + ((("sum"|"avg"|"min"|"max"|"count") TOK_LPAREN)=> tok3:aggregateExpr{node = #tok3;} | tok4:expr{node = #tok4;}) ( "as" lb2: identifier @@ -958,7 +963,10 @@ collectionExpr : aggregateExpr { int aggFunc = -1; boolean distinctOnly = false; }: !("sum" {aggFunc = SUM;} | "avg" {aggFunc = AVG;} ) - TOK_LPAREN ("distinct"! {distinctOnly = true;} ) ? tokExpr1:expr TOK_RPAREN + // Use greedy option to resolve nondeterminism with optional 'distinct' keyword. + // Greedy tells the parser to match 'distinct' whenever it appears, rather than + // being ambiguous about whether to match it or skip directly to the expression. + TOK_LPAREN (options {greedy=true;}: "distinct"! {distinctOnly = true;} ) ? tokExpr1:expr TOK_RPAREN { #aggregateExpr = #([AGG_FUNC, "aggregate", "org.apache.geode.cache.query.internal.parse.ASTAggregateFunc"], #tokExpr1); ((ASTAggregateFunc)#aggregateExpr).setAggregateFunctionType(aggFunc); @@ -975,8 +983,9 @@ aggregateExpr { int aggFunc = -1; boolean distinctOnly = false; }: | "count"^ + // Same greedy option as above for count's optional 'distinct' keyword TOK_LPAREN! ( TOK_STAR - | ("distinct"! {distinctOnly = true;} ) ? expr ) TOK_RPAREN! + | (options {greedy=true;}: "distinct"! {distinctOnly = true;} ) ? expr ) TOK_RPAREN! { ((ASTAggregateFunc)#aggregateExpr).setAggregateFunctionType(COUNT); #aggregateExpr.setText("aggregate"); diff --git a/geode-core/src/test/java/org/apache/geode/cache/query/internal/AbstractCompiledValueTestJUnitTest.java b/geode-core/src/test/java/org/apache/geode/cache/query/internal/AbstractCompiledValueTestJUnitTest.java index 8f1e4f4d28ca..b996f872b11f 100644 --- a/geode-core/src/test/java/org/apache/geode/cache/query/internal/AbstractCompiledValueTestJUnitTest.java +++ b/geode-core/src/test/java/org/apache/geode/cache/query/internal/AbstractCompiledValueTestJUnitTest.java @@ -24,6 +24,7 @@ import org.junit.Test; import org.junit.runner.RunWith; +import org.apache.geode.cache.query.internal.parse.OQLLexerTokenTypes; import org.apache.geode.cache.query.internal.types.CollectionTypeImpl; import org.apache.geode.test.junit.runners.GeodeParamsRunner; @@ -47,7 +48,13 @@ private CompiledValue[] getCompiledValuesWhichDoNotImplementGetReceiver() { new LinkedHashMap<>()), new CompiledIn(compiledValue1, compiledValue2), new CompiledIteratorDef("test", new CollectionTypeImpl(), compiledValue1), - new CompiledJunction(new CompiledValue[] {compiledValue1, compiledValue2}, 89), + // Changed from hardcoded value 89 to OQLLexerTokenTypes.LITERAL_or constant. + // The hardcoded value 89 was the token number for LITERAL_or in the original grammar, + // but after adding syntactic predicates to fix nondeterminism warnings, the token + // numbering changed (LITERAL_or is now 94). Using the constant ensures this test + // remains correct regardless of future grammar changes. + new CompiledJunction(new CompiledValue[] {compiledValue1, compiledValue2}, + OQLLexerTokenTypes.LITERAL_or), new CompiledLike(compiledValue1, compiledValue2), new CompiledLiteral(compiledValue1), new CompiledMod(compiledValue1, compiledValue2), From 08930b6a31d803797a24bc311cf3fcb5cc1923cc Mon Sep 17 00:00:00 2001 From: Jinwoo Hwang <92374539+JinwooHwang@users.noreply.github.com> Date: Thu, 4 Dec 2025 03:38:35 -0500 Subject: [PATCH 06/10] [GEODE-10519] Security : Remove Unsafe Reflection Breaking Java Module System Encapsulation (#7954) * Replace reflection-based UnsafeThreadLocal with WeakHashMap implementation - Removed reflection access to ThreadLocal/ThreadLocalMap internals - Implemented cross-thread value lookup using synchronized WeakHashMap - Removed requirement for --add-opens=java.base/java.lang=ALL-UNNAMED - WeakHashMap ensures terminated threads can be garbage collected - Maintains same API and functionality for deadlock detection - All existing tests pass without JVM flag changes This eliminates the fragile reflection-based approach that required special JVM flags and was vulnerable to Java module system changes. The new implementation is safer, more maintainable, and works across all Java versions without requiring internal access. * Remove --add-opens=java.base/java.lang from test configuration - Removed unnecessary JVM flag from geode-test.gradle line 185 - Flag no longer needed after UnsafeThreadLocal refactoring - Tests now run with same security constraints as production - All UnsafeThreadLocal and deadlock tests pass without the flag - Validates that refactoring truly eliminated reflection dependency --- .../scripts/src/main/groovy/geode-test.gradle | 1 - .../internal/deadlock/UnsafeThreadLocal.java | 100 +++++++++--------- .../cli/commands/MemberJvmOptions.java | 8 +- 3 files changed, 52 insertions(+), 57 deletions(-) diff --git a/build-tools/scripts/src/main/groovy/geode-test.gradle b/build-tools/scripts/src/main/groovy/geode-test.gradle index 93488986e512..602f0b731651 100644 --- a/build-tools/scripts/src/main/groovy/geode-test.gradle +++ b/build-tools/scripts/src/main/groovy/geode-test.gradle @@ -182,7 +182,6 @@ gradle.taskGraph.whenReady({ graph -> if (project.hasProperty('testJVMVer') && testJVMVer.toInteger() >= 9) { jvmArgs += [ "--add-opens=java.base/java.io=ALL-UNNAMED", - "--add-opens=java.base/java.lang=ALL-UNNAMED", "--add-opens=java.base/java.lang.annotation=ALL-UNNAMED", "--add-opens=java.base/java.lang.module=ALL-UNNAMED", "--add-opens=java.base/java.lang.ref=ALL-UNNAMED", diff --git a/geode-core/src/main/java/org/apache/geode/distributed/internal/deadlock/UnsafeThreadLocal.java b/geode-core/src/main/java/org/apache/geode/distributed/internal/deadlock/UnsafeThreadLocal.java index 17872c29cb65..afabb84722d2 100644 --- a/geode-core/src/main/java/org/apache/geode/distributed/internal/deadlock/UnsafeThreadLocal.java +++ b/geode-core/src/main/java/org/apache/geode/distributed/internal/deadlock/UnsafeThreadLocal.java @@ -14,72 +14,68 @@ */ package org.apache.geode.distributed.internal.deadlock; -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; +import java.util.Map; +import java.util.WeakHashMap; /** - * Most of this thread local is safe to use, except for the getValue(Thread) method. That is not - * guaranteed to be correct. But for our deadlock detection tool I think it's good enough, and this - * class provides a very low overhead way for us to record what thread holds a particular resource. + * A ThreadLocal implementation that allows reading values from arbitrary threads, useful for + * deadlock detection. This implementation uses a WeakHashMap to track values per thread without + * requiring reflection or JVM internal access. * + *

+ * Unlike standard ThreadLocal, this class maintains an additional mapping that allows querying the + * value for any thread, not just the current thread. This is useful for deadlock detection where + * we need to inspect what resources other threads are holding. + *

* + *

+ * The implementation uses WeakHashMap with Thread keys to ensure threads can be garbage collected + * when they terminate, preventing memory leaks. + *

*/ public class UnsafeThreadLocal extends ThreadLocal { /** - * Dangerous method. Uses reflection to extract the thread local for a given thread. - * - * Unlike get(), this method does not set the initial value if none is found - * + * Maps threads to their values. Uses WeakHashMap so terminated threads can be GC'd. Synchronized + * to ensure thread-safe access. */ - public T get(Thread thread) { - return (T) get(this, thread); - } + private final Map threadValues = + java.util.Collections.synchronizedMap(new WeakHashMap<>()); - private static Object get(ThreadLocal threadLocal, Thread thread) { - try { - Object threadLocalMap = - invokePrivate(threadLocal, "getMap", new Class[] {Thread.class}, new Object[] {thread}); - - if (threadLocalMap != null) { - Object entry = invokePrivate(threadLocalMap, "getEntry", new Class[] {ThreadLocal.class}, - new Object[] {threadLocal}); - if (entry != null) { - return getPrivate(entry, "value"); - } - } - return null; - } catch (Exception e) { - throw new RuntimeException("Unable to extract thread local", e); + /** + * Sets the value for the current thread and records it in the cross-thread map. + */ + @Override + public void set(T value) { + super.set(value); + if (value != null) { + threadValues.put(Thread.currentThread(), value); + } else { + threadValues.remove(Thread.currentThread()); } } - private static Object getPrivate(Object object, String fieldName) throws SecurityException, - NoSuchFieldException, IllegalArgumentException, IllegalAccessException { - Field field = object.getClass().getDeclaredField(fieldName); - field.setAccessible(true); - return field.get(object); + /** + * Removes the value for the current thread from both the ThreadLocal and the cross-thread map. + */ + @Override + public void remove() { + super.remove(); + threadValues.remove(Thread.currentThread()); } - private static Object invokePrivate(Object object, String methodName, Class[] argTypes, - Object[] args) throws SecurityException, NoSuchMethodException, IllegalArgumentException, - IllegalAccessException, InvocationTargetException { - - Method method = null; - Class clazz = object.getClass(); - while (method == null) { - try { - method = clazz.getDeclaredMethod(methodName, argTypes); - } catch (NoSuchMethodException e) { - clazz = clazz.getSuperclass(); - if (clazz == null) { - throw e; - } - } - } - method.setAccessible(true); - Object result = method.invoke(object, args); - return result; + /** + * Gets the value for an arbitrary thread, useful for deadlock detection. + * + *

+ * Unlike get(), this method does not set the initial value if none is found. Returns null if the + * specified thread has no value set. + *

+ * + * @param thread the thread whose value to retrieve + * @return the value for the specified thread, or null if none exists + */ + public T get(Thread thread) { + return threadValues.get(thread); } } diff --git a/geode-gfsh/src/main/java/org/apache/geode/management/internal/cli/commands/MemberJvmOptions.java b/geode-gfsh/src/main/java/org/apache/geode/management/internal/cli/commands/MemberJvmOptions.java index d0fa681f47f2..4021db507d62 100644 --- a/geode-gfsh/src/main/java/org/apache/geode/management/internal/cli/commands/MemberJvmOptions.java +++ b/geode-gfsh/src/main/java/org/apache/geode/management/internal/cli/commands/MemberJvmOptions.java @@ -26,7 +26,7 @@ import java.util.Collections; import java.util.List; -import org.apache.geode.distributed.internal.deadlock.UnsafeThreadLocal; +import org.apache.geode.internal.offheap.AddressableMemoryManager; import org.apache.geode.internal.stats50.VMStats50; import org.apache.geode.unsafe.internal.com.sun.jmx.remote.security.MBeanServerAccessController; @@ -38,9 +38,9 @@ public class MemberJvmOptions { private static final String COM_SUN_JMX_REMOTE_SECURITY_EXPORT = "--add-exports=java.management/com.sun.jmx.remote.security=ALL-UNNAMED"; /** - * open needed by {@link UnsafeThreadLocal} + * open needed by {@link AddressableMemoryManager} */ - private static final String JAVA_LANG_OPEN = "--add-opens=java.base/java.lang=ALL-UNNAMED"; + private static final String JAVA_NIO_OPEN = "--add-opens=java.base/java.nio=ALL-UNNAMED"; /** * open needed by {@link VMStats50} */ @@ -50,7 +50,7 @@ public class MemberJvmOptions { static final List JAVA_11_OPTIONS = Arrays.asList( COM_SUN_JMX_REMOTE_SECURITY_EXPORT, COM_SUN_MANAGEMENT_INTERNAL_OPEN, - JAVA_LANG_OPEN); + JAVA_NIO_OPEN); public static List getMemberJvmOptions() { if (isJavaVersionAtLeast(JAVA_11)) { From 9ff1da5e57bec4fd89681e25932213c91dc797b1 Mon Sep 17 00:00:00 2001 From: Jinwoo Hwang <92374539+JinwooHwang@users.noreply.github.com> Date: Thu, 4 Dec 2025 08:45:19 -0500 Subject: [PATCH 07/10] [GEODE-10511] blocks-2.0.0 : Update LICENSE File with Correct Dependency Information (#7961) * Correct license classification for Jakarta EE dependencies - Moved jakarta.servlet v6.0.0 and jakarta.transaction v2.0.1 from CDDL to EPL 2.0 section - These components use EPL 2.0 with GPL-2.0 + Classpath Exception, not CDDL 1.1 * GEODE-10511: Update istack-commons-runtime version from 4.0.1 to 4.1.1 - Aligns declared version with actual resolved version - Eliminates version conflict resolution between 4.0.1 and 4.1.1 - Makes DependencyConstraints.groovy consistent with LICENSE file - jaxb-core/jaxb-runtime 4.0.2 transitively requires 4.1.1 * GEODE-10511: Update test expectations for istack-commons-runtime 4.1.1 - Update geode-server-all dependency_classpath.txt - Update geode-assembly assembly_content.txt to remove 4.0.1 reference - Fixes integration test failures in both modules --- .../plugins/DependencyConstraints.groovy | 2 +- .../resources/assembly_content.txt | 1 - geode-assembly/src/main/dist/LICENSE | 43 ++++++++++++------- .../resources/dependency_classpath.txt | 2 +- 4 files changed, 29 insertions(+), 19 deletions(-) diff --git a/build-tools/geode-dependency-management/src/main/groovy/org/apache/geode/gradle/plugins/DependencyConstraints.groovy b/build-tools/geode-dependency-management/src/main/groovy/org/apache/geode/gradle/plugins/DependencyConstraints.groovy index d8c75391ae22..972b5da06057 100644 --- a/build-tools/geode-dependency-management/src/main/groovy/org/apache/geode/gradle/plugins/DependencyConstraints.groovy +++ b/build-tools/geode-dependency-management/src/main/groovy/org/apache/geode/gradle/plugins/DependencyConstraints.groovy @@ -122,7 +122,7 @@ class DependencyConstraints { // Pinning transitive dependency from spring-security-oauth2 to clean up our licenses. api(group: 'com.nimbusds', name: 'oauth2-oidc-sdk', version: '8.9') api(group: 'jakarta.activation', name: 'jakarta.activation-api', version: get('jakarta.activation.version')) - api(group: 'com.sun.istack', name: 'istack-commons-runtime', version: '4.0.1') + api(group: 'com.sun.istack', name: 'istack-commons-runtime', version: '4.1.1') api(group: 'jakarta.mail', name: 'jakarta.mail-api', version: get('jakarta.mail.version')) api(group: 'jakarta.xml.bind', name: 'jakarta.xml.bind-api', version: get('jakarta.xml.bind.version')) api(group: 'org.glassfish.jaxb', name: 'jaxb-runtime', version: '4.0.2') diff --git a/geode-assembly/src/integrationTest/resources/assembly_content.txt b/geode-assembly/src/integrationTest/resources/assembly_content.txt index bcfefacec471..921f5f8ea050 100644 --- a/geode-assembly/src/integrationTest/resources/assembly_content.txt +++ b/geode-assembly/src/integrationTest/resources/assembly_content.txt @@ -963,7 +963,6 @@ lib/hibernate-validator-8.0.1.Final.jar lib/httpclient5-5.4.4.jar lib/httpcore5-5.3.4.jar lib/httpcore5-h2-5.3.4.jar -lib/istack-commons-runtime-4.0.1.jar lib/istack-commons-runtime-4.1.1.jar lib/jackson-annotations-2.17.0.jar lib/jackson-core-2.17.0.jar diff --git a/geode-assembly/src/main/dist/LICENSE b/geode-assembly/src/main/dist/LICENSE index 010654b3cb03..56386e284383 100644 --- a/geode-assembly/src/main/dist/LICENSE +++ b/geode-assembly/src/main/dist/LICENSE @@ -217,12 +217,14 @@ The BSD 3-Clause License (http://opensource.org/licenses/BSD-3-Clause) Apache Geode bundles the following files under the BSD 3-Clause License: + - angus-activation v2.0.0 (https://github.com/eclipse-ee4j/angus-activation) - ANSIBuffer (http://jline.sourceforge.net/apidocs/jline/ANSIBuffer.html), Copyright (c) 2002-2007 Marc Prud'hommeaux. - Antlr v2.7.7 (http://www.antlr.org), Copyright (c) 2012 Terrence Parr and Sam Harwell - - ASM v9.1 (https://asm.ow2.io) Copyright (c) 2000-2011 INRIA, France + - ASM v9.8 (https://asm.ow2.io) Copyright (c) 2000-2011 INRIA, France Telecom + - jakarta.activation v2.1.3 (https://github.com/jakartaee/jaf-api) - JLine v2.12 (http://jline.sourceforge.net), Copyright (c) 2002-2006, Marc Prud'hommeaux - jQuery Sparklines v2.0 (http://omnipotent.net/jquery.sparkline/), @@ -259,16 +261,6 @@ POSSIBILITY OF SUCH DAMAGE. The CDDL Version 1.1 (https://javaee.github.io/glassfish/LICENSE) --------------------------------------------------------------------------- -Apache Geode bundles the following files under the Common Development and -Distribution License: - - - javax.activation v1.2.0 - (https://www.oracle.com/technetwork/java/javase/jaf-135115.html) - - javax.mail v1.6.2 (http://www.oracle.com/) - - javax.resource v 1.7.1 (https://glassfish.java.net/) - - javax.servlet v3.1.0 (https://glassfish.java.net/) - - javax.transaction v1.3 (https://glassfish.java.net/) - - jaxb v2.3.2 (https://javaee.github.io/jaxb-v2/) 1. Definitions. @@ -1022,10 +1014,11 @@ The EDL 1.0 License (http://www.eclipse.org/org/documents/edl-v10.php) Apache Geode bundles the following file under the EDL 1.0 License: - - istack-commons-runtime v4.0.1 - - jakarta.activation v1.2.1 - - jakarta.validation v2.0.2 - - jakarta.xml.bind v2.3.2 + - istack-commons-runtime v4.1.1 + - jakarta.xml.bind v4.0.2 + - jaxb-core v4.0.2 + - jaxb-runtime v4.0.2 + - txw2 v4.0.2 Eclipse Distribution License - v 1.0 @@ -1059,6 +1052,24 @@ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +--------------------------------------------------------------------------- +The EPL 2.0 License (https://www.eclipse.org/legal/epl-2.0/) +--------------------------------------------------------------------------- + +Apache Geode bundles the following files under the Eclipse Public License 2.0 +with the Secondary License of GPL-2.0 with Classpath Exception: + + - jakarta.annotation v2.1.1 (https://github.com/jakartaee/common-annotations-api) + - jakarta.el v5.0.0 (https://github.com/jakartaee/expression-language) + - jakarta.interceptor v2.1.0 (https://github.com/jakartaee/interceptors) + - jakarta.mail v2.1.2 (https://github.com/jakartaee/mail-api) + - jakarta.resource v2.1.0 (https://github.com/jakartaee/connectors) + - jakarta.servlet v6.0.0 (https://github.com/jakartaee/servlet) + - jakarta.transaction v2.0.1 (https://github.com/jakartaee/transactions) + +For the full EPL 2.0 license text, see: +https://www.eclipse.org/legal/epl-2.0/ + --------------------------------------------------------------------------- The MIT License (http://opensource.org/licenses/mit-license.html) --------------------------------------------------------------------------- @@ -1097,7 +1108,7 @@ Apache Geode bundles the following files under the MIT License: - Normalize.css v2.1.0 (https://necolas.github.io/normalize.css/), Copyright (c) Nicolas Gallagher and Jonathan Neal - Sizzle.js (http://sizzlejs.com/), Copyright (c) 2011, The Dojo Foundation - - SLF4J API v1.7.36 (http://www.slf4j.org), Copyright (c) 2004-2025 QOS.ch + - SLF4J API v2.0.17 (http://www.slf4j.org), Copyright (c) 2004-2025 QOS.ch - Split.js (https://github.com/nathancahill/Split.js), Copyright (c) 2015 Nathan Cahill - TableDnD v0.5 (https://github.com/isocra/TableDnD), Copyright (c) 2012 diff --git a/geode-server-all/src/integrationTest/resources/dependency_classpath.txt b/geode-server-all/src/integrationTest/resources/dependency_classpath.txt index 0ce95af717d5..2e0a90e7e50b 100644 --- a/geode-server-all/src/integrationTest/resources/dependency_classpath.txt +++ b/geode-server-all/src/integrationTest/resources/dependency_classpath.txt @@ -62,7 +62,7 @@ classgraph-4.8.147.jar spring-aop-6.1.14.jar angus-activation-2.0.0.jar jakarta.activation-api-2.1.3.jar -istack-commons-runtime-4.0.1.jar +istack-commons-runtime-4.1.1.jar spring-web-6.1.14.jar spring-shell-table-3.3.3.jar spring-boot-starter-validation-3.3.5.jar From 4a171f5de051534927ac3b1344d87a2a5003b4b6 Mon Sep 17 00:00:00 2001 From: Jinwoo Hwang <92374539+JinwooHwang@users.noreply.github.com> Date: Thu, 4 Dec 2025 12:30:01 -0500 Subject: [PATCH 08/10] [GEODE-10522] Security : Eliminate Reflection in VMStats50 to Remove --add-opens Requirement (#7957) * GEODE-10522: Eliminate reflection in VMStats50 to remove --add-opens requirement Replace reflection-based access to platform MXBean methods with direct interface casting, eliminating the need for --add-opens=jdk.management/com.sun.management.internal=ALL-UNNAMED JVM flag. Key Changes: - Replaced Method.invoke() with direct calls to com.sun.management interfaces - Removed setAccessible(true) calls that required module opening - Updated to use OperatingSystemMXBean and UnixOperatingSystemMXBean directly - Removed COM_SUN_MANAGEMENT_INTERNAL_OPEN flag from MemberJvmOptions - Removed unused ClassPathLoader import - Improved code clarity and type safety Benefits: - Completes Java Platform Module System (JPMS) compliance initiative - Eliminates last remaining --add-opens flag requirement - Improves security posture (no module violations) - Better performance (no reflection overhead) - Simpler, more maintainable code Testing: - All VMStats tests pass - Tested without module flags - Uses public, documented APIs from exported com.sun.management package This completes the module compliance initiative: - GEODE-10519: Eliminated java.base/java.lang opening - GEODE-10520: Eliminated sun.nio.ch export - GEODE-10521: Eliminated java.base/java.nio opening - GEODE-10522: Eliminated jdk.management/com.sun.management.internal opening (this commit) Apache Geode now requires ZERO module flags to run on Java 17+. * Apply code formatting to VMStats50 - Fix import ordering (move com.sun.management imports after java.util imports) - Remove trailing whitespace - Apply consistent formatting throughout * Address reviewer feedback: Add null check and improve error message - Add null check for platformOsBean before calling getAvailableProcessors() - Enhance error message to clarify impact on statistics vs core functionality - Both changes suggested by @sboorlagadda in PR review * Remove SUN_NIO_CH_EXPORT reference from JAVA_11_OPTIONS - Fix compilation error after merging GEODE-10520 changes - SUN_NIO_CH_EXPORT constant was removed but still referenced in list * Fix duplicate JAVA_NIO_OPEN and missing JAVA_LANG_OPEN - Remove duplicate JAVA_NIO_OPEN definition - Add missing JAVA_LANG_OPEN constant - Fix comment to correctly reference UnsafeThreadLocal for JAVA_LANG_OPEN --- .../geode/internal/stats50/VMStats50.java | 176 ++++++++++-------- .../cli/commands/MemberJvmOptions.java | 13 +- 2 files changed, 100 insertions(+), 89 deletions(-) diff --git a/geode-core/src/main/java/org/apache/geode/internal/stats50/VMStats50.java b/geode-core/src/main/java/org/apache/geode/internal/stats50/VMStats50.java index a2d25dadeb0b..b223ab3ecbcf 100644 --- a/geode-core/src/main/java/org/apache/geode/internal/stats50/VMStats50.java +++ b/geode-core/src/main/java/org/apache/geode/internal/stats50/VMStats50.java @@ -20,10 +20,8 @@ import java.lang.management.MemoryMXBean; import java.lang.management.MemoryPoolMXBean; import java.lang.management.MemoryUsage; -import java.lang.management.OperatingSystemMXBean; import java.lang.management.ThreadInfo; import java.lang.management.ThreadMXBean; -import java.lang.reflect.Method; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; @@ -31,6 +29,8 @@ import java.util.List; import java.util.Map; +import com.sun.management.OperatingSystemMXBean; +import com.sun.management.UnixOperatingSystemMXBean; import org.apache.logging.log4j.Logger; import org.apache.geode.StatisticDescriptor; @@ -41,7 +41,6 @@ import org.apache.geode.SystemFailure; import org.apache.geode.annotations.Immutable; import org.apache.geode.annotations.internal.MakeNotStatic; -import org.apache.geode.internal.classloader.ClassPathLoader; import org.apache.geode.internal.statistics.StatisticsTypeFactoryImpl; import org.apache.geode.internal.statistics.VMStatsContract; import org.apache.geode.logging.internal.log4j.api.LogService; @@ -61,20 +60,24 @@ public class VMStats50 implements VMStatsContract { private static final ClassLoadingMXBean clBean; @Immutable private static final MemoryMXBean memBean; - @Immutable - private static final OperatingSystemMXBean osBean; + /** - * This is actually an instance of UnixOperatingSystemMXBean but this class is not available on - * Windows so needed to make this a runtime check. + * Platform-specific OperatingSystemMXBean providing extended metrics beyond the standard + * java.lang.management.OperatingSystemMXBean. This interface is in the exported + * com.sun.management package and provides processCpuTime and other platform metrics. + * Available on all platforms. */ @Immutable - private static final Object unixBean; - @Immutable - private static final Method getMaxFileDescriptorCount; - @Immutable - private static final Method getOpenFileDescriptorCount; + private static final OperatingSystemMXBean platformOsBean; + + /** + * Unix-specific OperatingSystemMXBean providing file descriptor metrics. + * Only available on Unix-like platforms (Linux, macOS, Solaris, etc.). + * Gracefully null on Windows and other non-Unix platforms. + */ @Immutable - private static final Method getProcessCpuTime; + private static final UnixOperatingSystemMXBean unixOsBean; + @Immutable private static final ThreadMXBean threadBean; @@ -150,52 +153,53 @@ public class VMStats50 implements VMStatsContract { static { clBean = ManagementFactory.getClassLoadingMXBean(); memBean = ManagementFactory.getMemoryMXBean(); - osBean = ManagementFactory.getOperatingSystemMXBean(); - { - Method m1 = null; - Method m2 = null; - Method m3 = null; - Object bean = null; - try { - Class c = - ClassPathLoader.getLatest().forName("com.sun.management.UnixOperatingSystemMXBean"); - if (c.isInstance(osBean)) { - m1 = c.getMethod("getMaxFileDescriptorCount"); - m2 = c.getMethod("getOpenFileDescriptorCount"); - bean = osBean; - } else { - // leave them null - } - // Always set ProcessCpuTime - m3 = osBean.getClass().getMethod("getProcessCpuTime"); - if (m3 != null) { - m3.setAccessible(true); - } - } catch (VirtualMachineError err) { - SystemFailure.initiateFailure(err); - // If this ever returns, rethrow the error. We're poisoned - // now, so don't let this thread continue. - throw err; - } catch (Throwable ex) { - // Whenever you catch Error or Throwable, you must also - // catch VirtualMachineError (see above). However, there is - // _still_ a possibility that you are dealing with a cascading - // error condition, so you also need to check to see if the JVM - // is still usable: - logger.warn(ex.getMessage()); - SystemFailure.checkFailure(); - // must be on a platform that does not support unix mxbean - bean = null; - m1 = null; - m2 = null; - m3 = null; - } finally { - unixBean = bean; - getMaxFileDescriptorCount = m1; - getOpenFileDescriptorCount = m2; - getProcessCpuTime = m3; + + // Initialize platform-specific MXBeans using direct interface casting. + // This approach eliminates the need for reflection and --add-opens flags. + // The com.sun.management package is exported by jdk.management module, + // making these interfaces accessible without module violations. + OperatingSystemMXBean tempPlatformBean = null; + UnixOperatingSystemMXBean tempUnixBean = null; + + try { + // Get the standard OperatingSystemMXBean + java.lang.management.OperatingSystemMXBean stdOsBean = + ManagementFactory.getOperatingSystemMXBean(); + + // Cast to com.sun.management.OperatingSystemMXBean for extended metrics + // This interface is in the exported com.sun.management package + if (stdOsBean instanceof OperatingSystemMXBean) { + tempPlatformBean = (OperatingSystemMXBean) stdOsBean; } + + // Check for Unix-specific interface + // This is only available on Unix-like platforms (Linux, macOS, Solaris) + if (stdOsBean instanceof UnixOperatingSystemMXBean) { + tempUnixBean = (UnixOperatingSystemMXBean) stdOsBean; + } + } catch (VirtualMachineError err) { + SystemFailure.initiateFailure(err); + // If this ever returns, rethrow the error. We're poisoned + // now, so don't let this thread continue. + throw err; + } catch (Throwable ex) { + // Whenever you catch Error or Throwable, you must also + // catch VirtualMachineError (see above). However, there is + // _still_ a possibility that you are dealing with a cascading + // error condition, so you also need to check to see if the JVM + // is still usable: + logger.warn( + "Unable to access platform OperatingSystemMXBean for statistics collection. " + + "This affects monitoring metrics but does not impact core Geode functionality: {}", + ex.getMessage()); + SystemFailure.checkFailure(); + tempPlatformBean = null; + tempUnixBean = null; + } finally { + platformOsBean = tempPlatformBean; + unixOsBean = tempUnixBean; } + threadBean = ManagementFactory.getThreadMXBean(); if (THREAD_STATS_ENABLED) { if (threadBean.isThreadCpuTimeSupported()) { @@ -242,7 +246,7 @@ public class VMStats50 implements VMStatsContract { true)); sds.add(f.createLongCounter("processCpuTime", "CPU timed used by the process in nanoseconds.", "nanoseconds")); - if (unixBean != null) { + if (unixOsBean != null) { sds.add(f.createLongGauge("fdLimit", "Maximum number of file descriptors", "fds", true)); sds.add(f.createLongGauge("fdsOpen", "Current number of open file descriptors", "fds")); } @@ -260,7 +264,7 @@ public class VMStats50 implements VMStatsContract { totalMemoryId = vmType.nameToId("totalMemory"); maxMemoryId = vmType.nameToId("maxMemory"); processCpuTimeId = vmType.nameToId("processCpuTime"); - if (unixBean != null) { + if (unixOsBean != null) { unix_fdLimitId = vmType.nameToId("fdLimit"); unix_fdsOpenId = vmType.nameToId("fdsOpen"); } else { @@ -585,7 +589,9 @@ private void refreshGC() { public void refresh() { Runtime rt = Runtime.getRuntime(); vmStats.setInt(pendingFinalizationCountId, memBean.getObjectPendingFinalizationCount()); - vmStats.setInt(cpusId, osBean.getAvailableProcessors()); + if (platformOsBean != null) { + vmStats.setInt(cpusId, platformOsBean.getAvailableProcessors()); + } vmStats.setInt(threadsId, threadBean.getThreadCount()); vmStats.setInt(daemonThreadsId, threadBean.getDaemonThreadCount()); vmStats.setInt(peakThreadsId, threadBean.getPeakThreadCount()); @@ -596,32 +602,38 @@ public void refresh() { vmStats.setLong(totalMemoryId, rt.totalMemory()); vmStats.setLong(maxMemoryId, rt.maxMemory()); - // Compute processCpuTime separately, if not accessible ignore - try { - if (getProcessCpuTime != null) { - Object v = getProcessCpuTime.invoke(osBean); - vmStats.setLong(processCpuTimeId, (Long) v); + // Collect process CPU time using public com.sun.management API. + // No reflection or setAccessible() required - this is a properly + // exported interface method from the jdk.management module. + if (platformOsBean != null) { + try { + long cpuTime = platformOsBean.getProcessCpuTime(); + vmStats.setLong(processCpuTimeId, cpuTime); + } catch (VirtualMachineError err) { + SystemFailure.initiateFailure(err); + // If this ever returns, rethrow the error. We're poisoned + // now, so don't let this thread continue. + throw err; + } catch (Throwable ex) { + // Whenever you catch Error or Throwable, you must also + // catch VirtualMachineError (see above). However, there is + // _still_ a possibility that you are dealing with a cascading + // error condition, so you also need to check to see if the JVM + // is still usable: + SystemFailure.checkFailure(); } - } catch (VirtualMachineError err) { - SystemFailure.initiateFailure(err); - // If this ever returns, rethrow the error. We're poisoned - // now, so don't let this thread continue. - throw err; - } catch (Throwable ex) { - // Whenever you catch Error or Throwable, you must also - // catch VirtualMachineError (see above). However, there is - // _still_ a possibility that you are dealing with a cascading - // error condition, so you also need to check to see if the JVM - // is still usable: - SystemFailure.checkFailure(); } - if (unixBean != null) { + // Collect Unix-specific file descriptor metrics. + // This interface is only implemented on Unix-like platforms; + // gracefully null on Windows. + if (unixOsBean != null) { try { - Object v = getMaxFileDescriptorCount.invoke(unixBean); - vmStats.setLong(unix_fdLimitId, (Long) v); - v = getOpenFileDescriptorCount.invoke(unixBean); - vmStats.setLong(unix_fdsOpenId, (Long) v); + long maxFd = unixOsBean.getMaxFileDescriptorCount(); + vmStats.setLong(unix_fdLimitId, maxFd); + + long openFd = unixOsBean.getOpenFileDescriptorCount(); + vmStats.setLong(unix_fdsOpenId, openFd); } catch (VirtualMachineError err) { SystemFailure.initiateFailure(err); // If this ever returns, rethrow the error. We're poisoned diff --git a/geode-gfsh/src/main/java/org/apache/geode/management/internal/cli/commands/MemberJvmOptions.java b/geode-gfsh/src/main/java/org/apache/geode/management/internal/cli/commands/MemberJvmOptions.java index 4021db507d62..fd9116cedeff 100644 --- a/geode-gfsh/src/main/java/org/apache/geode/management/internal/cli/commands/MemberJvmOptions.java +++ b/geode-gfsh/src/main/java/org/apache/geode/management/internal/cli/commands/MemberJvmOptions.java @@ -26,8 +26,8 @@ import java.util.Collections; import java.util.List; +import org.apache.geode.distributed.internal.deadlock.UnsafeThreadLocal; import org.apache.geode.internal.offheap.AddressableMemoryManager; -import org.apache.geode.internal.stats50.VMStats50; import org.apache.geode.unsafe.internal.com.sun.jmx.remote.security.MBeanServerAccessController; public class MemberJvmOptions { @@ -38,18 +38,17 @@ public class MemberJvmOptions { private static final String COM_SUN_JMX_REMOTE_SECURITY_EXPORT = "--add-exports=java.management/com.sun.jmx.remote.security=ALL-UNNAMED"; /** - * open needed by {@link AddressableMemoryManager} + * open needed by {@link UnsafeThreadLocal} */ - private static final String JAVA_NIO_OPEN = "--add-opens=java.base/java.nio=ALL-UNNAMED"; + private static final String JAVA_LANG_OPEN = "--add-opens=java.base/java.lang=ALL-UNNAMED"; /** - * open needed by {@link VMStats50} + * open needed by {@link AddressableMemoryManager} */ - private static final String COM_SUN_MANAGEMENT_INTERNAL_OPEN = - "--add-opens=jdk.management/com.sun.management.internal=ALL-UNNAMED"; + private static final String JAVA_NIO_OPEN = "--add-opens=java.base/java.nio=ALL-UNNAMED"; static final List JAVA_11_OPTIONS = Arrays.asList( COM_SUN_JMX_REMOTE_SECURITY_EXPORT, - COM_SUN_MANAGEMENT_INTERNAL_OPEN, + JAVA_LANG_OPEN, JAVA_NIO_OPEN); public static List getMemberJvmOptions() { From d2b21d8166622c56ca25bf447623d33aeccf4d91 Mon Sep 17 00:00:00 2001 From: Jinwoo Hwang <92374539+JinwooHwang@users.noreply.github.com> Date: Mon, 8 Dec 2025 12:12:27 -0500 Subject: [PATCH 09/10] [GEODE-10518] blocks-2.0.0 : Update documentation for Jakarta EE 10 and Java 17 (#7953) * docs: Update documentation for Jakarta EE 10 and Java 17 - Update Java version format from 1.8.0_121 to 17.0.16 - Update all Geode module versions from 1.0.0 to 2.0.0 - Replace javax.transaction-api with jakarta.transaction-api 2.0.1 - Update dependency versions (slf4j 2.0.17, log4j 2.17.2, jgroups 3.6.20, fastutil 8.5.8) - Update config.yml: min_java_version='17', min_java_update='16' - Fix Java version template expressions across 20+ documentation files - Update WebLogic HTTP session management guide for Jakarta EE 10 - Update installation guides with Java 17 requirements Breaking Changes: - Minimum Java version now Java 17.0.16 (was Java 8u121) - Jakarta EE 10 required (was Java EE 8) - All javax.* packages replaced with jakarta.* Testing: - Verified peer-to-peer and client-server configurations - Documentation builds successfully - All quality checks passed (spotlessCheck, rat, checkPom, pmdMain) * docs: Address review feedback - fix version consistency and consolidate tc Server deprecation notes - Fix Tomcat version inconsistency: Changed CATALINA_HOME path from 10.1.49 to 10.1.30 to match example text - Consolidate duplicate tc Server removal messages into single Note for clarity - Improve documentation consistency and readability * Fix log file path to be consistent with server path --- geode-book/config.yml | 12 +- .../source/subnavs/geode-subnav.erb | 20 --- .../persisting_configurations.html.md.erb | 14 +- .../running_the_cacheserver.html.md.erb | 11 +- .../running/running_the_locator.html.md.erb | 2 +- .../15_minute_quickstart_gfsh.html.md.erb | 8 +- .../install_standalone.html.md.erb | 8 +- geode-docs/images/Apache_Tomcat_Homepage.png | Bin 134725 -> 252140 bytes .../jmx_manager_operations.html.md.erb | 2 +- .../gfsh/tour_of_gfsh.html.md.erb | 18 +-- .../chapter_overview.html.md.erb | 10 +- .../common_gemfire_topologies.html.md.erb | 2 +- .../http_session_mgmt/quick_start.html.md.erb | 47 +++---- .../session_mgmt_tcserver.html.md.erb | 2 +- .../session_mgmt_tomcat.html.md.erb | 4 +- .../session_mgmt_weblogic.html.md.erb | 2 +- .../tc_additional_info.html.md.erb | 2 +- .../tc_setting_up_the_module.html.md.erb | 6 +- ...tomcat_changing_gf_default_cfg.html.md.erb | 6 +- .../tomcat_installing_the_module.html.md.erb | 13 +- .../tomcat_setting_up_the_module.html.md.erb | 130 +++++++++++++----- ...weblogic_setting_up_the_module.html.md.erb | 50 +++---- 22 files changed, 195 insertions(+), 174 deletions(-) diff --git a/geode-book/config.yml b/geode-book/config.yml index e22411f50310..a311be02b4bf 100644 --- a/geode-book/config.yml +++ b/geode-book/config.yml @@ -21,7 +21,7 @@ public_host: localhost sections: - repository: name: geode-docs - directory: docs/guide/115 + directory: docs/guide/20 subnav_template: geode-subnav template_variables: @@ -29,11 +29,11 @@ template_variables: product_name: Geode product_name_lowercase: geode product_version: '2.0' - product_version_nodot: '115' - product_version_old_minor: '1.14' - product_version_geode: '1.15' - min_java_version: '8' - min_java_update: '121' + product_version_nodot: '20' + product_version_old_minor: '1.15' + product_version_geode: '2.0' + min_java_version: '17' + min_java_update: '16' support_url: http://geode.apache.org/community product_url: http://geode.apache.org/ book_title: Apache Geode Documentation diff --git a/geode-book/master_middleman/source/subnavs/geode-subnav.erb b/geode-book/master_middleman/source/subnavs/geode-subnav.erb index b4ba7467a4ce..f06a8914d460 100644 --- a/geode-book/master_middleman/source/subnavs/geode-subnav.erb +++ b/geode-book/master_middleman/source/subnavs/geode-subnav.erb @@ -2147,26 +2147,6 @@ limitations under the License.
  • Configuring Non-Sticky Sessions
  • -
  • - HTTP Session Management Module for Pivotal tc Server - -
  • HTTP Session Management Module for Tomcat
      diff --git a/geode-docs/configuring/cluster_config/persisting_configurations.html.md.erb b/geode-docs/configuring/cluster_config/persisting_configurations.html.md.erb index 8ba79f390e30..f522a62372f2 100644 --- a/geode-docs/configuring/cluster_config/persisting_configurations.html.md.erb +++ b/geode-docs/configuring/cluster_config/persisting_configurations.html.md.erb @@ -58,7 +58,7 @@ This section provides a walk-through example of configuring a simple <%=vars.pro Process ID: 70919 Uptime: 12 seconds <%=vars.product_name%> Version: <%=vars.product_version%> - Java Version: 1.<%=vars.min_java_version%>.0_<%=vars.min_java_update%> + Java Version: <%=vars.min_java_version%>.0.<%=vars.min_java_update%> Log File: /Users/username/my_geode/locator1/locator1.log JVM Arguments: -Dgemfire.enable-cluster-configuration=true -Dgemfire.load-cluster-configuration-from-dir=false @@ -84,7 +84,7 @@ This section provides a walk-through example of configuring a simple <%=vars.pro Process ID: 5627 Uptime: 2 seconds <%=vars.product_name%> Version: <%=vars.product_version%> - Java Version: 1.<%=vars.min_java_version%>.0_<%=vars.min_java_update%> + Java Version: <%=vars.min_java_version%>.0.<%=vars.min_java_update%> Log File: /Users/username/my_geode/server1/server1.log JVM Arguments: -Dgemfire.default.locators=192.0.2.0[10334] -Dgemfire.groups=group1 @@ -100,7 +100,7 @@ This section provides a walk-through example of configuring a simple <%=vars.pro Process ID: 5634 Uptime: 2 seconds <%=vars.product_name%> Version: <%=vars.product_version%> - Java Version: 1.<%=vars.min_java_version%>.0_<%=vars.min_java_update%> + Java Version: <%=vars.min_java_version%>.0.<%=vars.min_java_update%> Log File: /Users/username/my_geode/server2/server2.log JVM Arguments: -Dgemfire.default.locators=192.0.2.0[10334] -Dgemfire.groups=group1 @@ -117,7 +117,7 @@ This section provides a walk-through example of configuring a simple <%=vars.pro Process ID: 5637 Uptime: 2 seconds <%=vars.product_name%> Version: <%=vars.product_version%> - Java Version: 1.<%=vars.min_java_version%>.0_<%=vars.min_java_update%> + Java Version: <%=vars.min_java_version%>.0.<%=vars.min_java_update%> Log File: /Users/username/my_geode/server3/server3.log JVM Arguments: -Dgemfire.default.locators=192.0.2.0[10334] -Dgemfire.start-dev-rest-api=false -Dgemfire.use-cluster-configuration=true @@ -239,7 +239,7 @@ This section provides a walk-through example of configuring a simple <%=vars.pro Process ID: 5749 Uptime: 15 seconds <%=vars.product_name%> Version: <%=vars.product_version%> - Java Version: 1.<%=vars.min_java_version%>.0_<%=vars.min_java_update%> + Java Version: <%=vars.min_java_version%>.0.<%=vars.min_java_update%> Log File: /Users/username/new_geode/locator2/locator2.log JVM Arguments: -Dgemfire.enable-cluster-configuration=true @@ -276,7 +276,7 @@ This section provides a walk-through example of configuring a simple <%=vars.pro Process ID: 5813 Uptime: 4 seconds <%=vars.product_name%> Version: <%=vars.product_version%> - Java Version: 1.<%=vars.min_java_version%>.0_<%=vars.min_java_update%> + Java Version: <%=vars.min_java_version%>.0.<%=vars.min_java_update%> Log File: /Users/username/new_geode/server4/server4.log JVM Arguments: -Dgemfire.default.locators=192.0.2.0[10335] @@ -297,7 +297,7 @@ This section provides a walk-through example of configuring a simple <%=vars.pro Process ID: 5954 Uptime: 2 seconds <%=vars.product_name%> Version: <%=vars.product_version%> - Java Version: 1.<%=vars.min_java_version%>.0_<%=vars.min_java_update%> + Java Version: <%=vars.min_java_version%>.0.<%=vars.min_java_update%> Log File: /Users/username/new_geode/server5/server5.log JVM Arguments: -Dgemfire.default.locators=192.0.2.0[10335] -Dgemfire.groups=group1 -Dgemfire.start-dev-rest-api=false -Dgemfire.use-cluster-configuration=true diff --git a/geode-docs/configuring/running/running_the_cacheserver.html.md.erb b/geode-docs/configuring/running/running_the_cacheserver.html.md.erb index fd21d6a537a9..b607ba57eed1 100644 --- a/geode-docs/configuring/running/running_the_cacheserver.html.md.erb +++ b/geode-docs/configuring/running/running_the_cacheserver.html.md.erb @@ -147,12 +147,11 @@ If successful, the output provides information as in this sample: % gfsh status server --dir=server4 Server in /home/username/server4 on 192.0.2.0[40404] as server4 is currently online. Process ID: 49008 -Uptime: 2 minutes 4 seconds -<%=vars.product_name %> Version: <%=vars.product_version %> -Java Version: 1.<%=vars.min_java_version%>.0_<%=vars.min_java_update%> -Log File: /home/username/server4/server4.log -JVM Arguments: -... +Uptime: 2 seconds +<%=vars.product_name%> Version: <%=vars.product_version%> +Java Version: <%=vars.min_java_version%>.0.<%=vars.min_java_update%> +Log File: /Users/username/my_geode/server1/server1.log +JVM Arguments: -Dgemfire.default.locators=192.0.2.0[10334] ``` ## Stop Server diff --git a/geode-docs/configuring/running/running_the_locator.html.md.erb b/geode-docs/configuring/running/running_the_locator.html.md.erb index dbd7328b4744..591da1635b21 100644 --- a/geode-docs/configuring/running/running_the_locator.html.md.erb +++ b/geode-docs/configuring/running/running_the_locator.html.md.erb @@ -203,7 +203,7 @@ Locator in /home/user/locator1 on ubuntu.local[10334] as locator1 is currently o Process ID: 2359 Uptime: 17 minutes 3 seconds GemFire Version: 8.0.0 -Java Version: 1.<%=vars.min_java_version%>.0_<%=vars.min_java_update%> +Java Version: <%=vars.min_java_version%>.0.<%=vars.min_java_update%> Log File: /home/user/locator1/locator1.log JVM Arguments: -Dgemfire.enable-cluster-configuration=true -Dgemfire.load-cluster-configuration-from-dir=false -Dgemfire.launcher.registerSignalHandlers=true -Djava.awt.headless=true -Dsun.rmi.dgc.server.gcInterval=9223372036854775806 diff --git a/geode-docs/getting_started/15_minute_quickstart_gfsh.html.md.erb b/geode-docs/getting_started/15_minute_quickstart_gfsh.html.md.erb index bcf3700a8441..6b30e0b8281e 100644 --- a/geode-docs/getting_started/15_minute_quickstart_gfsh.html.md.erb +++ b/geode-docs/getting_started/15_minute_quickstart_gfsh.html.md.erb @@ -54,12 +54,12 @@ The *locator* is a <%=vars.product_name%> process that tells new, connecting mem Process ID: 3529 Uptime: 18 seconds <%=vars.product_name%> Version: <%=vars.product_version%> - Java Version: 1.<%=vars.min_java_version%>.0_<%=vars.min_java_update%> + Java Version: <%=vars.min_java_version%>.0.<%=vars.min_java_update%> Log File: /home/username/my_geode/locator1/locator1.log JVM Arguments: -Dgemfire.enable-cluster-configuration=true -Dgemfire.load-cluster-configuration-from-dir=false -Dgemfire.launcher.registerSignalHandlers=true -Djava.awt.headless=true -Dsun.rmi.dgc.server.gcInterval=9223372036854775806 - Class-Path: /home/username/Apache_Geode_Linux/lib/geode-core-1.0.0.jar: + Class-Path: /home/username/Apache_Geode_Linux/lib/geode-core-2.0.0.jar: /home/username/Apache_Geode_Linux/lib/geode-dependencies.jar Successfully connected to: JMX Manager [host=10.118.33.169, port=1099] @@ -413,12 +413,12 @@ In this step you restart the cache servers in parallel. Because the data is pers Process ID: 3402 Uptime: 1 minute 46 seconds <%=vars.product_name%> Version: <%=vars.product_version%> - Java Version: 1.<%=vars.min_java_version%>.0_<%=vars.min_java_update%> + Java Version: <%=vars.min_java_version%>.0.<%=vars.min_java_update%> Log File: /home/username/my_geode/server1/server1.log JVM Arguments: -Dgemfire.default.locators=192.0.2.0[10334] -Dgemfire.use-cluster-configuration=true -XX:OnOutOfMemoryError=kill -KILL %p -Dgemfire.launcher.registerSignalHandlers=true -Djava.awt.headless=true -Dsun.rmi.dgc.server.gcInterval=9223372036854775806 - Class-Path: /home/username/Apache_Geode_Linux/lib/geode-core-1.0.0.jar: + Class-Path: /home/username/Apache_Geode_Linux/lib/geode-core-2.0.0.jar: /home/username/Apache_Geode_Linux/lib/geode-dependencies.jar ``` diff --git a/geode-docs/getting_started/installation/install_standalone.html.md.erb b/geode-docs/getting_started/installation/install_standalone.html.md.erb index a6a3fc435827..3c9e71618d35 100644 --- a/geode-docs/getting_started/installation/install_standalone.html.md.erb +++ b/geode-docs/getting_started/installation/install_standalone.html.md.erb @@ -24,7 +24,7 @@ Build from source or use the TAR distribution to install <%=vars.product_name_lo 1. Set the JAVA\_HOME environment variable. ``` pre - JAVA_HOME=/usr/java/jdk1.<%=vars.min_java_version%>.0_<%=vars.min_java_update%> + JAVA_HOME=/usr/java/jdk-<%=vars.min_java_version%>.0.<%=vars.min_java_update%> export JAVA_HOME ``` @@ -54,7 +54,7 @@ Build from source or use the TAR distribution to install <%=vars.product_name_lo 1. Set the JAVA\_HOME environment variable. For example: ``` pre - $ set JAVA_HOME="C:\Program Files\Java\jdk1.<%=vars.min_java_version%>.0_<%=vars.min_java_update%>" + $ set JAVA_HOME="C:\Program Files\Java\jdk-<%=vars.min_java_version%>.0.<%=vars.min_java_update%>" ``` 2. Install Gradle, version 2.3 or a more recent version. @@ -91,14 +91,14 @@ Build from source or use the TAR distribution to install <%=vars.product_name_lo 3. Set the JAVA\_HOME environment variable. On Linux/Unix platforms: ``` pre - JAVA_HOME=/usr/java/jdk1.<%=vars.min_java_version%>.0_<%=vars.min_java_update%> + JAVA_HOME=/usr/java/jdk-<%=vars.min_java_version%>.0.<%=vars.min_java_update%> export JAVA_HOME ``` On Windows platforms: ``` pre - set JAVA_HOME="C:\Program Files\Java\jdk1.<%=vars.min_java_version%>.0_<%=vars.min_java_update%>" + set JAVA_HOME="C:\Program Files\Java\jdk-<%=vars.min_java_version%>.0.<%=vars.min_java_update%>" ``` 4. Add the <%=vars.product_name%> scripts to your PATH environment variable. On Linux/Unix platforms: diff --git a/geode-docs/images/Apache_Tomcat_Homepage.png b/geode-docs/images/Apache_Tomcat_Homepage.png index bca071c9038b6336193e0908dcd1743dea69b329..4a7d14584e97bcdec0f24db4abc938c70a3f9e87 100644 GIT binary patch literal 252140 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 z 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 literal 134725 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

      6{xOIO6tvzd8)oKO}MT{jD4jIY~ zju251>j^bE{!tPlet}O?feu0H_xMIAV;YU5l=F`hXgVyY+J36CkcFH#+ch)i%W2)& zQ%O-)JfPJkPbh-!e(V)fICxn}^`P;{VIr$bC(Fyad=699PW`=0au@1)=_8YloItIx zbK>orFYn&k$$OdAWxrBay+9T&lbWyJk-&VRMI3=?VipQptRDtWjnlLMz-H?pghjJw zQZ*f<+_uiK%W>YSMWM-kEQ?v4509@_%F^^Y@}BmJzJoX%pYl;|EVW4Rj=Cu5@kufMj&LV>LC3NQ#`u_khy7RA(LVDWde zR;TLnsOpqa@$Wa6PESRV?Im#dg|aW2naC{!ZDZXn++a07GJ=I9(L%|;@@An}UHn}P zQUe*IM^rYf|I(&}%6By4rhidC8S=(la&`xU$@PdtQ*%n}K>l3<@%Mt7ZRHcztZK3xx{zvln{8v~HmRMp>v)QSzZ zYe(r43#hKVes3bBzFhda1=46#3(&RfDVgrX#KF-uce5ZG^m;v7MhqMD^UXfg+e;t`;&;j@L5S_=}h`oMH{a6BCuirN( zj=xpj#4qD)T5&v7*n!{k`Orxwe=i!=@426HrR%%gpP0!gi zHC@x`Y14=A^{dll`V^#LzlrLRkd@EEviY(Xlo*sKrd3MbyWu`)1>ASOUJMkK{izIt z7`zqCDFUx^Lv=njg+sYG`yelP!kT?jI^-T+g?}8hSA@O+dXSJjH4eT;R(iFsmI3P4 zT{p)G_+M=DC#v*r)m=?1ou-2^0W8q6S3lf~N7mSQU%j&B686hrzsSq8P*9C0M#!zN zLZFFSxsA)e2)KXC*%9)2h%xU}h>9T5Y$%l2z-H8><1o#>r6{}Av4Y|_k@j0Z-jHcP z4>@7GxGP<^7wF=%x~M4ezFt18^&HpoIj5%8W=U4xz$uk+0Z$){t4jOqBzq8)k>;NR z0p;Br^vSIGGlJgffFZci`|FeIq!DfaDwfycd9ftHl#xNib>{B;W$0(16F@Oj65N{E zAziZeX32}qR+gpHs4QQX7k6G&IteqW6A@5rwi3{pxw31#dZ%X<2>N1g+XmKI#ukL8 zI_@Op*q z{)BEDC!pX@SWJS8zF%Mpit2|IS^Jfb!s}FxO!D6T>Wtugpkb6P)1u#J~r@+hd#9qI~z>kGTxp$0E5kyW8ZXw>64t39EU z6c&LGP#9G!@gmS}u=#47B%X%TZcYuu#`b>m+s~baYyXFGyjt9}fd9RF*`iuyP=PgxKQNB+myMuBo^d! ztADEonWy?K5Ry6aDsMg#_r?m#gN0&?)m^MFm#mpv0gpL6q&MStz2fT5_Qg!qiyLKP zhum5Y$8RI;j)ex2FNW!G`&HjVg}w*=l*4!+di@*{+_RG7G|4qnTy^&-JX2rb=q+>8!{LaH$UH%V_e8<$9{-Sa}YWCgaWg9isS#et57@dXfbd7jmF!Fa?T5LQU#^6`2zNgF*Ni!*BLDMCYt z^&JUm#*X~U!4?L^-xaF6Pzc1ZuVGQo`o48Th4|NusdR!iFORH^M-609%NFNh#_mM= zYucPxwI~noG&mv$X$>vul~9whK&54zeZ}_Io$9Ib?+I13r5V2{?f`4%cju{1jz-V} zi@RxU4BJb3-QN!?nl`L%MBN!0L+wowHK#M0JX=aQ&{StxHsAJ!u+1~Jkyu-m2tE=q zQ7(ud4k!1Ys>0jolicP3tBI8G%~7zYD##OkYF|6VtjVROdt2f+ndDtB)`aEOy0T9< z>XPd%6uz{bw#LBvUw&RnpR+NhlhxV1QG_P_hpQwN_S;fG4t*3ru~vtI`n-=M~Dh1f30=#(=k4z;Fov z^qI1}R84J|B|MbiDdwqc1SQ}3KxU@Jx~j7`+~KaFt3t`)buUK7U!si3NMN|p_@@=S zn_Pa6qGo&hU=^<5$bjD(lA6oSO+0B#$H=6ef%=L-9Mi4_9$ieexx>51VLGz0A8%KS zc9ZSChivO0wrhT`ob4*9JS3`vRk4yOl;igp3T=M9SpeZh=R@Ukk${H73x3mJ;14f( z50oIhGHuPJP3WI$;`p5p=U$FGVdPpK9%hr;8A(Ue?We(kWInu-u|j$4{w8QbE2C;Z z+~y8ogE>FEB@=I{pH^z$h)M~-GhBYgsbG)c!15b)dFaUA?6ozXYFi&X2QXke2be276<r5i!Mp$44fFo()Z<5ljDD5!G6A9HT!Y>beLV|kB$)da^68-RzJ)8v*+8ufVvg| z1QPNS3GMZ#3eAoI2qqiM?NGIT{H9If#iIpSOjw5IWO32pY3@Zwd%t%XjTJ5jpAs;v z#&m%naK@s(Y^;P#Lw(DE?}nGo+abGu;)G;T*0rp`%}WQL|7mUx1ab^_LuRB{jZ=#Z z1WHuVC4iN52_8qu|YJ?b&pKQ58C^y02eE0IE6r{vF|WCvf=! zhxQFWhkITz-VL8`kIZ5-SvYy4gJ~Mw73BLu5E7bPvc}tgK(fMDGW&h8k^LkaWjR|o zY`DHs7Mt72!`GN~I?q?93k!i}u@_7CK;M2TB%8qA1OH0a$Wa|5xK=rQ8n-);@x1P~ z+0f5-9MR(94cGKiF@a8y(Ql9FTpU>(lj-`K){7cRdl}5j!vXMnO6uSkC7*VoA<-4E zVr^VWFMInV`q^s9b^Vc2sofwBjRo*E!CdYKly!JPe?0n(chN?CdJ$Opd8Ucs5zFw| zln!Kc!Az|l=25#YxutfOxW{m+SA%CU9Mu#RP|*Z@7VAqO(SBS=sMZzLGDbgLRd4TO zq`KJ()KO`niD;w?B|0*vxW~zAEyFPJWP-L9fF3+-1`@awIaYlr@jrf*ak1Fy_Gfa~ z5ovj;Yy(W<;=m&D-o|EKIs}M@*5E|my&gPorYVjqW=F;A>$o%^WVl=81wt;kiI;wP z$6aT07#(j?A;%qNzyp0QUUBb+g7msPSM`TZLjp%t3$kn3$KbpQN}!p9*QqlfXFFnc zWhG+aY~H{4V5U%WSr{oMV*4t4FXomw#kn3*11kvB zoNlDi66Q>QlPMBZ@)f0$4a0Dmir4ejV!7%}YFShMQlqglONY6>)0?9$Yt47FuXmV0 z&cf@oXk`XQ(rUC2M|*givnR8K3k-AEfb-IIl`h3BoIu(i`^;v;x4oX%y+zq0 zx=m}82?w-4;`O+PGbRUzxmNtr#h8)-cbgN*m8%U&P*&`AYmv({R-yRRGOa6AP;|ux zC!uguozhX^^!qf>kD9}JC;WH>D#lxZ*c9S8tR1oSJbg03b9y@r+XXHGJ2%&y^^X4Xi zzSz0Fujd#2a#;m5mByv;-M^2NRo2e(Pdp1cdtxeockipYPqB+(@IS2 zDo|^~l)r1t#^Lp*$4`p^N%6(|WVbyp7vzT{k5|EIHaC51jbyhk(nyOHc(W!80Y<}<>p3@j2#y!Zd3zf@VURNG zdHV9H*H9jJ1vwnzt*$l{U0o(QjK@b#qooIdmkh7IE&+9+4QfpViWoZFy_wSl~s>v#DUj!UmB(?ol6j-0{oc}rYWuL^RmHFNvQlR*-v=tYZ&NHDLm)Z6XY;B) zKe^$_MHm3{JL`p@d@jXIb=PjSwvC1&gXl!9YOVrj{FWu=vu3q@#gAj3H@=sVsX>Cc z&kdRGJ3Zo~BPC9I{hXU4C5KtWEm1h5*LMZi+t9-KE`h;J-T`Sc8ucoz_%qU;E~}3@ z!S0>)A76eMIxJGHmXlK2c5{?5PFtQB0Bb$bBFy>oQ%_`b#IuV?L;4bA(cz zk9hX*xFisFp$x<7m_$x7PHTM3^2<6mds6cGTij{8PiVgV&sIy+^R3;9VoCd_%La36 zw5)DmZniCx1sY?_vL}#}+G%r9&ucsg#dimfjgp83R>x}z&+0Oi^L$pGAK*^lGN;Jo z?cn6`kpAqtGl)tq{;I6Qfg*1Oj9gz0T5aY9%cf4{3t%OLZHa5jnEb2)ddR8mDx+t_ z`+~a0*)Ww|_g2e_n3TjAW1QoCVW_-R%!*sS)U6Zx403AY*=6mz+}JO&yq0t2EvIW8 z5i*aCxh&a?f~~9o+ENbUs5vN6!6G%KdLMe-VmmrQUpBc7!mGy9S$_S_r(35~{aPhC z&LbYqqiSYqDMaGz#!8%cII8al2e@{{hBotX(Xn8?5(kAC3hs!M>|Xw2W!*-N=LkX! z{!$1pzDpPZ3!*Nc#4uD#WcGSPWiFUn63NE|ct=yWWwv*0EtJaXDI&R5J-g%{DF1}2 zulJj);*Z_2hJV>YYV(wq3MyI#^a%eWhV`vmEf55X8TZJ0r75ov6P|d0D>KF^O{;OP zTCj83W@y2W%x@{6yR&c2PJL(`shyf05uaXKz4+(tGeyZscqh)V%?69S9JdjB%eHyw zu&b^XB`RU?Fq*#VS~SmD=m-TBy9R>QQnf$4$9tGnkPJcq=>5w@mpqJ4AgC2s|aKjcziAu`Dt7`D5_~&0jw>popdb;LC&Sls8}$gmwG!l zLF-i7L*%E@vtT|~Mgu~JIIBtlJjvsGGWS7O#j|D z7xkse+DVQ&WzClrG^pMhkBIuq)Q4tRPfS-4Wed&_*G-RS8ko!vNIcH_5A*W{sh2w+ zY-eicl`I#wtXnS2_51V2-Sw%3!Xp`>2XRORLMOhY;@c?V!JKm{ zn^#!nc|_LEv=-vo;%pFVP!%mGq{G`o!Q$TbV0MyA*zB(TXb4Wpz@;cZm-GbBQ?pIG z`M&u^yN8($uLIel;x&d~44q9OKdgamVELBGKcXsONj&|=>11;;hesC?0z z5zOnrSfkkm(viK{^UFL3;y;M9lTK77SH-9KD7^R=}#Q&)9x?3x1iN*JtG0gZ`>nJdG;9P&)A zmg1OvcSN3ymbp0hh6qOlUmg+@qLl#2X3MF+;Dy33S_`Qq3BxkV5LI_rcdfsqbjrgg zQfDdl2nlRA!rR}tiR`@dmP?DbU>s$Y&08;!y`fG3R4=m_6nJcbKE)O`Xyl8cGGCh6 z5BAJQR$>?iTa0$!+_qL!*{+2Lc)Q^@eHPVV-mSznMd;KyoTq1y`T|5Te@@Y z8Rp$eO0Qq-T6${C5X;IFx)tZ%dR#bcf4rpeaX|b*-2DwLRgC37!1XXbUa=fTfL?^W z0R_?N2UD)J{cGtVbojbT)!1mSh{$1f(#^*KZIqMjVeQsT%1nlo8ch+UI6T?ArWd{R(mK9jc;@4_dxUBHvTmftgR6K z^Cxr+jOChqTo!mV`D`zWtj?m{3#+uw!|9urh9dbVJiie<`YM0?_kT)2Z2Wz^%;A*rye+QLTh3J%BaijqObiYN8HB3Q+E0H$yoTb= z(RXrTPfpO)YEPVnxc$~5(3FRUE)E7Szlm+}Ag(iEGC1od7}(X9U38)@ua7F?6F?Eg zz}^kA3OI)wOT_2kd@|s;sk2C6lPQJ!P88_Ai9UVcJO|A=WsfaVe~Z&a1a;v zcZ$?~6mVZ_d7kWR@p@gJm62zk;0V1Pg%H?M!G5RPbFk?_;&BLdzb{)9#k2Fm{!d-_ zufe#2{u*qAq>L`;8@7u-7!>Pbg*N%gVwF5oWqSl1dMVv07F?rZbbH}f6WfmG{^ z?K>|wa=Zr}6nl4XovYC{j=0W4@_c>1cY{3_(CBw?=5vq5a?QHEPqfi(a4GJHXn#NN z{TnuXO!WspD{h5&fKE0K2?qm(46)VexG#mSP%aHip@a3!4`~os-aHr#!!sCWj>-4f z0ry2>Gu0wyb(a(#Z6>B(r@NoARQ45@)ygISwhH&SZ+DRPKNak+&AYe^W-guQF8zC6 zY1!9Dg1yyX6c|t)5abra-?buYH2QSwjVBo_R!_X&_Pn%3AU( zgZd@{2t3F8l-k)u6ddrsb|x?|7YzR#Nk#EeI=T#j2rz$0Erd0C&Dt+lIy&M~sI{89 z5Xees=;+cwlt9JAbVm1h166bDg0#yl%=X_5$-jmFt=lbFAV2#>TuUBKtSU^qdflxXU~cLQCY;fH0E4j zC)oW_gz#lm`RZyva&t*E8*MaAH`tC|9CioN<0g;Elx8pIW!Gm|No0W0=l9^O_gS^FY$IMa##xLM-N_DN-$#R{*YbQ7E?Lm`8hcP@7Kv) z5(#9oCbz$*uZKuuBwp_EP1?>{lQ7HG*2ra2h@x=WlXP8|3)FVt;(lmlwm~7dPl*-# zVJbW}ko2f_GyXk7|8Hj6guy@%_a|vkV_)x;?M-}ZB@>0JqLeFBuS%Na|Io4RdaH7^ z`AYw=Y)&|9`?!~2NR}^PFr6a^j?HeH0qExdrls~HndO??4<<6HWBA{L#?n}&J@1ac zV(L2oWU<>=3&OK-izNI=v}G@$AH;Kt#Ph!Fp|nH-`gTAxW})q!$wUU{AHQVj#cji5 z@cKvgroaU61KzT64DZ+*F!B2%hVNP9CZ1j#-{l897DM;i?8gtx_h3xDSb08d+l_}! zKYq@;Ipwpg>z?Wa_20L%@(FI6K8x4&FXwHe^1j!ot4z#Ra}*v=`^k3_i>e{hz~lp9 zyjaK%i~UjEX6OB8en9qS|*cAwAJN=Og5b@fzRhY z>HY0R+T(FxcFg$#2kq(U=|0VMI{q=-8HPld%_mf%!tQ5)aONM29bOkizyhWwR_g^UaKE#L#SsMdHKIH*AF^!U z=aP=Li_VwG)c2Ro53)>dx6h5*0zsP92L5Z#vr*T9gs%cwUgsXO_tnW^{NT`tKY-~J zfoKjR10{hT>ge%TAQYusC@OGo**u$hli|^LATn$dIz?twfXe&(mM&Q+r9_ zpI&e1_nNxiqTZTgAigN-CDZAWHEnoC;JGgS3@{r8(gQqFcs#;oviWp7-|n?h2XyRv zARU46iZl>#LkX_LQ1rXYd3Dr1U^2c0n2g7-_4V$ zRAbg=+tlN+un5<$khWO?%nDB{=`NgVTz6c4r}NKnS?$=|)G}Cqyon zV~aE-nb4O z=wM$|8^L|>6YBEb;M+5+UJ#IRY2Wl|m#|zsxXoi_6Jr zDp%=uoqm_Y@`TyVi%q_p5=K%TkDEA1dJk>R#G?+PV&8C2xII~%Y@EvJ=;eml{ssJy zc)o8`HN1ph-g$oo|7vSr^o}C+>&Bm(KS*`MY^E>d@c&w2bpffu003~r`9^SvWVV2< zgr(@`I)G;J>cb^tb0grj^)r+}DeC+Dz%R$0flxx<;xzcTgpE)n!k^k`3+W7j6$HQ- zXElIiJdIVgB2=sqkS81(U2D`2YaEgQO5M`4&>#ObG5cT|2=As9j=nuxU2IIQt{|yA zQj}z>eY@}YH7dZ_JV>j348(q~gj?hqHa69gXmlrukX<`Z(KwV(kqAmS9i*CTU{|AW z2cXz|gD2q85R1ejmgl|uvGR}tm?jx2M(l(kDZaQq&c5$y`#=6OBp{GeNvzP=uCwTv zCF*OqVDQ_3piXyxl4NE4IQX^C9s>gd$9M#mYd>JBup6HiHSi11hRReLBXMl5yDd)f#ye3a|y%Y^=j32kAJ#U(@>tOHwb-60boJB;AV;iDQSy4%;l#NHrYMI`}j&e~(W4aUBS;uLdUe+ns z=f!oHfjrYWzTRTG*GAF#tTof19JLgF(*(kjeXgwu{For>^I~~UG|~UZZCnunc@HCO zkGvshz~*~2*TuRxE7r3no&|qC zsus8fCWmtNduOgWCYtH&cS_Xvx4H1}o$=d=R3{r(mC)aaHsjyzqQVB1vDJd2>M2Ix zQ;ohQ+`9u2x#^iPz(}NQW&3qF8nI&IW59NNzjT3dkz9O{X*n=!$v@XAA;&v1YT$nf z1k@J9=cQ4)G_2bly)o@o*+v)r+z{$u%nEfyUJ6^|B)G5TBN4BJYFjrpQONd*_f0|%__}poKnRG{(hy~(nY*hP*1fA0j1vU zscBNP=U)n&O5}w@z7`IvV!Cm0mc>)8zSQLi1f9-(SMFdFSyuaS=JQCQakU**SqzsQG~{wbDnnr|oA3*z zo9Jdy&ULV$YavRwB$i(Sh4|By4h~k**%e|}41iGaLw@Q9(WIbEH7dH2p52p<>?g`m zS=NDFS&Nc=bZG%m@PCJ}l_M1PLGa(@&+7R!PRwtG?#cq9)p*=vrYtvpYFhflY)RARXR_If5BG}IE9Fi|=tSD$QQ_f}Rcy0XBOQ4l`Wo=4pL zPqp&7lmCdB^`?IpaORP>O6-g_uVMR2h1xhan7y`QEd8(o474? zkZUf#_bHXyQ7GHSB+dsLiY;u_7DzkBHcwhm`>2b>w4;Pn94UUGYNd;^n>j4%E-A;6 z#SxJyA0Ao80-Ah;qmf3~u8HsoZ()?}#@%xzTXi=sCL0{Yo!9v$oBIs^rH3V-`@Whl zO7|wB{4p!2MEH$ho`Oi>$C$EM@!<8xXxg6{uc;0MNA@kkm?(413yZc$lmT(-sU*C= zFtYM#++zl+lJa{0CV>)!wBjUsuJ!G;{MNdQRc4BJ+2rt>)Jz{`Xm9l`NCnDvcHQh& ztHPP=me?tMl5^6h$!U4k5AwNO7P;jBubkQZvWiRMWHFxeZ4a#Tm|Lnv9SgVuA{+U; z+Syz&FVssduRir@`w(A!zIQ_XvJ%nAD$%6C0|Fz61q2*E$8Vi<`R%)Cs00<|=+R)3 z#R4LEqd5Si_TG2e4yb-Z|F)av^-fMfi(FQN%n{6o%zf(-#3}+|ghlu^G;ok+jwyKR z^Tv*#IPrdS@st{i2xXWb0eF%-Qvn>J`6=;x^9#!Ez~Id_<1po&L|M-ZWm3JwwK_~B z`zE9c#bL6tYi%Desk~4g&VtI&X0i~lzk+_hP-Y9ueH{QlO-Pp&tDD2se)ZzAV_&5jV?;A--D$Z(;jcV{T>NQ$P)Cv7npIA5@P`-$3NV?~# zJ;tW#IS2}fXpQuhn{*X_`$JAw)zWR!4e!KQrqBYTExh0>-YoEUXAXku;vk|Jy94w5 zM{y1I**@`22SHJ`Y$W;%x=Kb6gM3doER*LYll;Mwu#*DMVz`NNLcgumjMs^2f8D;_ zM0yxLl7A}m+~BO8Q)7PJT}gLtL}xeH4HVkI9^i`!YGm+Xiffk$M0pT4nQPRYEl_;4 zIV;-A?}y~q@>~Qw-*U^~7!$<2lKborDBde9tS~D-yVj%*o3C20QoE?CZ{EOJIt<{n z@FSOG>Lhbosq!bG0Zq@&Qar}co)vxq^~Fy8yrS)r^e-quY~H;bA^)8-eDVKoAMnp; zH{in&{y+p5t=|KEIEa~emD_N@2)4TrOku<-HC5|`#2YXDRpSg;?8iNT)%;D+1}Pi( zueRl-p7E8fL}MasH_*u;1kb$U%cLd3)eBl56x|&>tW)D8^UH2v49rG%!VQk?MtC!9 z{)#XmypYpFwhmHK?@YRr=|{j)6SaUla<`;_RN zNg%WoL#xVh<-T@n>pt61()7XuQU;OOZ5(!Z1ToAT{tA?bq; zcvVt%6y<636nDjg?B6L<3wc3lWfuM4!ejyGJuJrezm=R>Xg3LWz0Z9WHIoxb6j7_m zio&3{4Bw^ZTMX;|>;(&#%t`YNe?fZg!nu(Ol)wmb6l(`L^Llr}kMY92KL+NWm$HMWA8N zwj9>f_XtZ3HB%Un^da^AXQ%v8*zV9W{%%y(P+O~{-DHyz*pSxp_trG2CxuSKB185M zcsdPj_=qrV{CzY^xg{T9Aic7oUB;#DsD*>lI@lY&1*>apIA{mW$ii&g0-1)3Tesma ziyXab+e-l}dBM5+6`I_Qz#$?4qhks+&1@=jt+BM-&&6@+*Ypxfk3_IeM7-#&6L!_6 zTzS}z?k9mMV$>h7k?sVZTO{SmVSB5GVz{;~L=^eY#CbsZK^)WJrj^v)HVakqew8-_ zVn{{N%l@fhR>2ryo^Gr$kXV|lw}0R%TteQ1&;;Yb3cRxgLc_C_;Xq0RVE5NgUtuI@VDPJ53>o^9P_0E)d5D z5^6DPujYuvZ_sjse=!Jw{+lcl(=}J2xH$2S-g@p)$R&>`ByVBR+?=S*yHJZGQM-&J^}Qb;#iR`Rmk~?L`-Mj+-mc~@9tzK zt>^vHzT8vJ>wiG_s!3eTOH0p2|M=e8{>yF<+IXYoLgkchp>61g4x^9Mk;l`P`w{r! z)!J-144}+|NBR!)H(XwqvMq2nQqR}-dB#>(<>qK*#lZf(M=?)uzCaAl+CAFd@BN>F z{N2A70|WcLY2JVIXB#c{Rz7E0ZR?!Zf6HvOPY3g?_JMJJZ(?SX=?T$iiheIi>{g56 zae;DKyi@1H2E-n_0Zza%s?y_zY?mEyz&9BPbp3d6?cwB)UASHbPvx}#;V<>ucyw=G zs#!Y*0MO`hWD4EU=g0MDCHExN$BXB@`%PLf*^wFB0WfPvywmsxu`$}m z)W<^&=1%^>0|EQ)EdG?Df#(s{GZ@&vZyYXhS^(IOb8idX&x)~H&VSeGeSN?7s}akL z6?_4B*mWOazp7u9b#8(MN8LvTvYn&dmbvWwhG`AV+oj>wsFjuc9!ADR8CMZ&(3|KcDbyr+NilHTP>l8LN^n1U+S(KIR(kurv^$;sb`b|+h2}ZTGVkTtAj6AZNA)sn zrT|B~8BUr~KMe+LrED_!EG0ii-HFevy^Du*3KFw^d3u_c5ARc=j)XW^ zknYZ~;0qeJZaU8hu%7*snHP_9tE$0m6`KEo14NWG9O2u~;2FgVG2RcOqg!Hdk-%%N|5M}Gn?A2_Z;OBIO=l;mztbvaK(^RGL+l*ukfmX+Q ztGz}~CkM?4*n0UwX#>V?mx(X$@vshgNN=Ln&)k!G7V9eBZpZI*wo_QyXBng$*XlXd zeZAL8I%wXNvDf7WBx9;H%PoDL9_FgNxF&G?(7&;$`!mRuFHB~z$y-c%d|viT49DNu zffJndZbu*UF)Bt4lm;UN!wVh;d#`)RZMMsVIPCfR;&^3nKo-lNT5C6A9b|yDX1X{o z6;A?olH72cN@3K7#JQ|wW1 zLEEffn=vg3G1n>+b$=d;bKfa6^u4PYI&jSG(V2rFU9Oj+PjP=@64e(m7gh#~Imq|czsjE;$ z|7i@CpOU<+iyUS?#k3i3_3(T9iXA{;jBuv$sfD#7tYn_E1E|gBn^Y5vch{B-^)n6NH!>qt# zbrhjv9gk+6{7Z;^3sy~Er&%cFu-||2`owb@37sDXZVTjKd48k-wMQ7h{ZL(6j${P5 zZWS1>&2TVqHY*S{o!*TY?CSF5b{k}oahv{hqDe2T?$f$mMbr;u$V-wEjx7Du?3$|i zM#$~M6?ilfZlVZSSwm4cc)rN!ivgnK5)vU!V-#uB&Rd%6E!O5o3^X*et4)menm=oo zzFK~d3}{{>gaH_uVfr)*vm0nL2Z`6ITxWJ$)s#UuGti@*qb{lQ5%J#JCJlc*@rQ&C zRvS-gHwJqLOqubtT|C?oo%)?SmyiFCF%!TP$n$>T~B;D z+8;u~^pV?$UFLbO0_$Y|nIIN<6D>=2>~W2^Dk5(!A3t>tL~IA)wiPO2ubVgQKGHim zE$0Vcq!yW4CY=UHUVjZg3=d;VD`f@6;DjFUv^(}E2or*|>I_v{|0W+9C@S zbs)u@TM;DtTaps&EOlJhg(X|8X+lO~n%LZTQTQp30_QI)*2$AMf=w-tj+EKxOLKq! zwHm{cb>5HbnD)xAFR(u3J#*yS#!cD?)IOLB-k z+L*Yjw$20g{(-FiyBpvJ2^8Xs7bBx1Ayl8B@e91XDbBSka?Ac(uKJU2*rn^XW@;u@ z9ptNHdr^b1V?nNz47DRs@_6?4r*vkiJICAUf?%YjGrIo0T5_j|T9>sO`Aq$ZPbIbJ ze9IO~6p@l-ZiV76eHfIvHTxW(O4$#y<7b-(+YHOopsk2VK2+0C%KxyK#M}2atm=U( z^v1kq-}7E5`NxtO(g*BQ{R*fqt`nUp#*{3mtH$LsrG<;(GG5N8rFO1}uCoIlGZ z6ZpH_?L3u1I}_p{z>lALLIVu&pb2WCa_>UmvHl8=R*yklG^-2h6^I5nvOxNX)Zw!o z%TBBi^WF-8Gh~(ebv1RrA85VMK9aFGyi_AP+%CaXmn)>vB-ltO)zNWFYzgh8m`G)4 zxP%#O09RG$yeyKY|J?b{4ajyJ#+&c*;>xIU1>KGe`~oxcP(`u+Va*VjLayWNB5F|% z#Xev!NlO3#&gBBRIXArB{{sY9UrZ#^sDRtYa*hHX8(y!xP8U@| zFtpod1fMF)8H13{yYu`$+J?kFX69e4*6KqLDrS30)6iy$z&ecyR$8U=x=EF`yrtPZ=vwjt|h_n!?jg4U)IU0L-?HHM;E(>y1H zmfMwWn_fFztoGadvRNr&!4}{ZBQu(SYkGg%^Cai!enFw-30^+e^B8Z)y!{9|06|B! z`=>nG;$|HGzBE>`xA8-aUR2(vuG%rjVdN1VjH}BjI8BwtnA2g=;XR2fwx1tEZ_ur~ zaVgULaMqBJXX*9Ye@+;RA%gJG1!f(`#Px1{Z->(889&}`^ z@%Z|O5SHM2u;bXaPQ|xw_&Vd48k1qt*ds3!oe@U#*W_5=YdlGDcw};*iV5SIY9MqB zEE`h`cs(Y^67l`DItV;H(k%)qOCI9( zMuJio2rIPoQEUgf0_=OOZ0YV)H|R0J@B7ffb{r+=W2;EF@!giZu|n>Mg5Og@4Z9PU zPJ!>;C8Op{060n_3zQOiN$>^aY80ICzaFy)&KX#01m|#grSd;*I`^v!z0hxD34VY~ zFlSj&AJicu5aK5KLd3%(LG$kkr7b(enTb!9FGQY4M`;WK>*PoKUQXZ*gQoB2!?mAI z&pu>TGdMoF{+NnoRTFki638%Y)~HNxM>Mh)EgtWiNh}VWaEJWjv_Z@}q(MW~nkHts=<{ZnC%2lGvR`9SH%q?+IAkKk{J z&b;&b<#NQGdU(GJJ=cft2H7t5z7fsPWs?JE$P}mP+_Cq`hBn?B!X@Zm7gskLK#Wx!S7gt z_4ZKvs~o)LB1ptJ;NHlN%r+P-NfH+&bcSUVL;hs!@9Q*iH@s-A<1D9O*hB~;Ik@V$ zPMBco*-Yo}?*|psBeS%bKV$(W8IS=~X8uIMp>S(dg0*zi^vsn;FE|X^zdq0@2lus!EX5$FStcANJ^H7eH0_f{=<(Ru zgZLmcmP*GUi#SL8^8Q3l+jT^_&W8Z2W&09G*7@~_pJM2efa0FvjoFXaOD0>6cW~)W z`K(#AkET%>r8fs@8xW0LN(i)5@rilCz#Ra2)DCv+Z3!^0j$$%Cy)ONLF9bDI8;0y= z-4U z3rsJ00Od}!YaBBE_lx)9uHt(RZ&qgErAjoIBEtbq8P)EkAQ=o%TwL#Nghf8nV0baX z-T+Q1J}E<7CV~%ir>?tczD-0ZyjJOk3Vd}sJH3(0RKk5DZ_*#5YpoKj z`fj%)nBm8>Po0&$LsAWxYBYLY8!C8cqtJ>GG&QPq)l%KnkYMA&)OMvhf_sBs#BK(^ z*ZcK+EK6Pd`7o;dqYGaKE~7g8MjrtU3G4aaNouZwIGYk?%G~k!t>q{W9mE6wP}8q<=%?Qozlxz$@^vYQh=j;NIPF^VgdTG(C9Y z2O<@Kc}RvN{gJ)fCjC?x#Ta>9pyh48zgGcPkAO=EtrQ`3k&DCoSef1m?on#Yn5wjq z5#zE43DqqrQ4XRbV^8jaYKEz(RHe69i{g5r`}I0-iQfmJ^$j^VHhr4@^=WrVuwX|n+sr89}~y@ zeK5sEzwPlnXV#}lLbnzS2^dEnSnY7PM}i|>r247=iw>03#{Ds12JJ~wSz!eL_lrEr z8NzT|NP1)%_6j)m9+K_u5)a2NnX5}iAW3Gtl)QXR*<%`E9uu` zaXYn^LT8r?6pQTzgsovyZIR_O49y8LC?NJU&*&dP!=nuY) zd~@Hwt?K}XM1Tu0@+PdgFz{DKGFHMe>x->v6_YA06{I=>bOFBbm6Qc3&TQk zoS2=!m&^x9+b4yyBiAQT3j6*CuF09A&5)C5P>2hQ`ngNr7o1V~7Zjv7kgfEd=kte zI+Fe(9V9hNTU^Z&oNmfSTvj z{;>S_=NiBF3Ew0&g5{I#t2pa7uL0-bw(9APG)A4wZ%Q{lq2~Seyr%dgTWHPM%TlcxD?grWBu*f&JMph#56E7{sJd$Yhgp;3~!{qXyb3w{N3x z8vB2ecs$!zqey&i`n37Z0??8)&ylh8fXnh*!xi!2OB8QpmHxds2m}=li(hggL}1-V znP=&s(BYeWRKrQnqn2dVgKkG)61d|Pezv&SF&A~hmzAl!kva&+_kUkKD4nJ$s%ccA z4DXy-u3|#Relc?DgWSZ0L74ePTq(d<2_k=kMB4O8{P6~I^c$3+#cJ|;6Fzz_@>Uqk zqlsw+nE$Q6ByY5*JjfUq<>|_`U}Huwlq23h1no)k6?Ktn;+E(@(iXaaC3^QD(vX6Z zSZT}vtXnq5R?4^$#SaYQy7RL^5(RJRf&&=+dkT2TT;9^D?CSH=?uTIBQU>0+CrdBp zcN z399-xbmG7qOrz5g1vMfz0YZ)DEdNggs%%4T^hG?M1LiHWGzIvtq~nlxlels|q~7@` zDzN8CA3ylWW}>(5WzR!CWOa%e4^}l0PVVK-oLlU+604(WqN~t1HgFY5n8iT*!RRU8 z#ZOTl-Lr)bq9C|A-+iBz9Ubmr4EM6#OnJ|PXW?F?)Jj}WfH1_sUWyHZ)>&TPu7nUy{hlu@r(!e^>^odFYf7$Boh#w56H7K9m<7OX1Az7RfgwU3*Cof&7xuu+6mR;O4%1H3eKr4T(YwwmN!7 z#(7CC!z3?_6G{2hP&87){JU!Hrk{Kcx%aA+BpMSoNnS%JWQ^l89ITaiZB%$^;@gI} zH&U8!djPICyzYo4)3^mbf@?5h>?S+06Tl`E(zj2F%DY3GbMqX5pUX54bZ{#wNN2{j zT$}S3*8ED>!%NN}1q2sTK4i*<24D!6$pBhu5t~1XK)Buz9p|#Gyko`k;c3*{o`OzBR|IWB#Yi6O5va#aLd=KF^rK|tczu~b_Li~KyUK?Z2BHjUXgnpG+ z{NyFdTQ&Y#S`Yeqc0P1Fame(C=(~fPU)OJ2`y>e*AeqOJ6oKLV@7@47o9{~XEI$u; zv^nm#<-ns>^UZ()k_mHvq=j7lkb5>)f7F|vJ^Bw;?*)w3vJY}=TWvq@#lyL=Dg+Rs8GepcBVJtJ z&YXWqqAb=2?Tvis1!JPe1TSD^8&X~xg!ynbl>a5LJnGMiQfnLtx?~e3F+E`HJloy*D#OIBHwW2@54kDMOI#Kzx zYkbU&ZRT@h;fh28%edyrt6Rd5f3 zb!@v}z)<-ZC|VLuu9IyF-T?QXbc@ssF{@+$;2|P{wrO%r8MW&dXz$7zhoZxNWOaTe zxS@0#Uf*NoJB2KcU)Gwa_8Qps`*BD*y22ve)MA||4sl(1(%d=<2INte-xxw-hc!k*xsP(&?OEkCkh{7^^X@&-q)+;b=V5Ij6Mn8Ns7E-)~Ri-liYy z$H6`KA_0$1dm%WP@i-#5I~aMoWbydShW=|Ez}9!2K@Y!LE3JpQm+yp<@f4 zi?;6&{An{=xNO(yfyI6qBVe<8{kU!t?I79GHxH;U6iDa7!oaJ?vi=p|w^M6WbVv@z z3hG=U$|!m!Yv>r780<&e5o6!;@3qyVjTzy1AOHlJ(!J85$OO ziub@Ojy%BxbU;w_SdCsngT>XC~vRwm+pHybf2O>>x zJuYWobz;~RU&12T5}PA1CxXd7?24>aYtx-OJ58r^HPn9?QP$B2hneT`B(?q$NdB@` zc2%fhI@zFDX%zSl5*nXK^#@C>tHG(vor+Yo;p?gy_gF%P$AO6F84;cVh%Scr*-F=O zlz);r3O(N2v-B3uxvrS3+%fdm9?>YJE2G64U(Iu$YY>2D)7c4|2h$zC?=NeJH^V-^ zg77f6TH}&aLT<)<@dQ>4ChRYG+U1APxNaOpEks{`KP;(23w1tS>K=x;A^F@6ow&(^ zsTL$skz_bR*~C!8I^|wY@^p9e?_IWoc>873m$w1S`)kfyl18>#?j&Yt-x1 zeoN&$zzvaaY|)8vNN#$?Ccz&d^!XYj#AS*N$Y^$$?y_8!>F2wmOT<=ZTGYupd+UK1 zG`-&fX(`Zv%t+4tQN>E9uUCgV2)2yu7N=R&566k07P>BZ2{D+t9_^Qy=Ae@*;T4;;O==R4w4j|eC+kTdf3kCF zE9}N*G9dd!wp>3UIYbvU$bXBX7(-=c&39E>)KxlFbQB=ryaTI=%_kC}k<62U9ybt1u@urNwRCCp@k>nNvvKQUmg2@||J#t3$!H&AMAWp=#UQ zVd1siAYHv7rjIOVZr<>K#7`+j%QAHq+h$`w+%I~9&fiv>tg8?)l>F(&p*rK`$pd&wCr8bvN2;~=J z!lnYIha&6%82|OC>fXf8nb~|z3F8O;=D;iIp9N)qe=38C5q~vm6fDtRhx98S#(qR! zUej>8I?a^*BojmKAJH;kVn&xdM)jZZA4DpWM;*2~C5#NgGpxuI@(rNbJSV`H92 zBa$5Z>&;qFa$1(T)F%o+aP!gDB$`#>5aYbT-5>|1$27^SS==yw(J`=GDt%xXv29WJ5vl_R*;O9&HuB`wCs}5|^vX z)DLHJ+_E&6lJB~)frW!v%!bP7=jA#VeDdheq``8W!N3HGU<&hWU)VSqGNiJ9g5}%= zKV#=cxce3hXlj3OKywx%UoJ)-nwI5nncKjD!sgePdIwNj1gw*hY!Q7OjdzRe9iU+P zo5o+@Z7s>iHEZx_ImHatn!hIK2cQHJh5h7Y+I^%ml;l< zH2B?R%JyMu1IH50qd;)j)nID~FW6-8wB9X85=J%rGb?)b z#N@#Y0~gxPofBivh4O{w9mnVrLN6fB`a|oW#e*Gr#c4Q*wxxm^Y0e-9yNa&m8ph=E z;b_}%(97kTbirJ%rnW{+RX-}~@h8Tu;78Q+mTQ_`k|;tmt?Bm{()6@-(z!Wr@>EKE z^lkoD9kGeB?uhgPRZcdJD9+O`0P3@YzzwQ~yF_1lzG(!xv4E1ab_8B8c zwG$AYJ+s+x1UfNCO5`kEsu#!@;bwrTZ#8q$GG59WnkUnAkd?w_UeCi4(qg0EZIr=k zaDcnMj9g@r@sM=Y~ zNzH|R(XEr3I(Sn$7GXiZz%GnWN2SkfWE|qs#CdMK#TR$m3ofN!$K^-se??ML!}@IQ zFY;`?pO>{Y;P&lB5UOnc6!Nl%D$`Kj{+#JrbFUZ1PKEjU=p&^IkwTmA--;A2l%`&# zY5iy2%6drq-;Oq&dPSA%7v&27K>uAR>iW@cv9GDY@i3x~0&P$4Gv?E;*?cFPcXm%* zGTTp6Pcm0t(-}V9cax8kY-|@t#{>^tSYVY~99LZ5>4B?{lNH7C2J7FcNi3?VD5y9`#oNGfo^D=8NV7`x zw*@|2E_z{?~!hQQ*xlMR2?-HcCz&dc3(0wB8hUjlKfvMa{)IK zwiU40J90CFu7Nx*dp1t;%UKb|u@V4Z5q>-9F}qEJ+acL~JP?7^oblIaT2YAgjDOKc z)P`0%e=oFLJ^J)4w^;L(`SNzdOUm;pOHokP&A}^WKi}zYkX5RuH%k4VAsk)OPxFcO zkwxKWSmLo;5re>}9dv&FhTV*O{aB<&ODAr6Dk1WMu+}PzpcT#n`m!(!29o^UTBVA# zvQm{ipt!FMl&$B;Bxq}L5@1W|o~Xi!ZaRHQYm*ejboW6ipP}32vzv`RFQ0z1u%N&3 z&$EXX)vs=T%18y?{D;L>fF5d(*|-U?T7`8T_J%{-ML_Tq(=7vi`nA@ZjfR6SNiQoW z1`7nsG~H3~-oWb}vhxUON7I)Tl#Vt)!ALg_Ng9IjK&5}n(o!RE*~IZLGo?HvWyapd zelK(5=Kgs|ez%DgEwh8B8+n$$&Y9XmwpCz&+C~-#D9E-f^InVJ;Z|_Y@{4_NCEXqm z5imhoCwmcsjkjSa+$xQ!`?q!a$-}$`uMar?f__ib90TjuXnpTW*gobQl%`~ZB-jL; z0>1RV;)R^l(cLNM)HFYdYsqXhwc68qsXQ;H?y~C^{HGVdj zO(9O7LTi3ELN)w$Ot%c1{91+nHR&^a|JlCBqf-cV+ANA9xP;^Y^0@Y%ZPLUB*;His zo%Un)g_-MKaq{eRfU9szW5i>$pXjt>F+s{Sqxf@`4m( zA2NSND_HGVhn^PZ;u%c{k~RE6xl?J#j83@sq}`yHIYynNq(k$|K^V6+Za_}mnq`9` zW<=fL?&@YDKOIs48V~l383xX~t{#z%iXwSR3ekP7^{4OMl@h7xQoKl)nxHc@9dm|3 zk6qVHnk~m3@5t4!n`^49-B4lZ7UXq|d4B*VGOE{iG*xa`&*z&_I6AT2VG@*o`$?iD!J6rju3h1z+w2kETQqh zR`?(nR$)`9wy}y+w$U&ybY^tUJ%5C23w?BAy0#l6(})rjeo0U(Teopx=rHU@_((7T zXNFmCq!$PyJ6*gA+%w$qgiql6RZj30NziC^hXmjcF!};p+J6{+k3z)Cp3L`5##jqM zJ}-%vq>eA4KCB!9U@81Tbh~%SN;-!0u_g#%Kk(|P4?nY+zyy>Fxf&>-D$8S8`{Rv~ z*=yY@;Q`g1EfZ*n_+Wj`#I2GhA1=~PBLx%}+~wL;Q1fFUM}6~^#=*w>xfLTAEd@1{Zp`Bv<}Aq7+%QPk<+twRF? zZm8^Lr0IN+6>E3>mr1*c7qE?Bmv68-ksWWSFY)D67<^)Gu(YjH^$#%i$#aHZ@9hs) z#)bAWjMV<&Kdkjb!u=ztRHQJt2i&O5n>_||;(au*<+k=aH`GMk2eB9wpoo7?`y=;3 zxMp11HK#x^(5zdmBLU+RPlEOaLgBpWmWbwmbVifEjE}d-6FaX%zhQ9sAl}ZWCd9=Q z=(c;m)$KIa8C5rNGwAf zg7>F!m}Y}TP%W`vafC1BZ3|~~#C&%xL=Qx=A|^h;l#)3-&6}V_7X2+Uj772yd%huS z$UC|a2D5v>8JRmW?j%u=_6G~Ip;9kQUSx<=7? zHvdNE;=vTw$ZoIrNQ2P;*ayjSnAaJPMv0cHuuowyxN&*87qr`)&6rQ}u4)!cxH_i< zBk(ide}0aO@M*8bjanhn_pamn=ZI zHe6lq=lG6Q@8g%?Z=WB3{Lr3alDhpVE}hyGjLk0jpGk7i&yX+E6|?s2kF1`D2;Fax zxOD^+H;@3iO&Xy)hRJZZ+8)Ciq*L4R_nI%2?*l9kQ={|dNt853=E1R*!O9qD;+ ze zL9E?2`n?&RjywEo0M6O3*o%%F3lc*c>u)%JO?#p-t0?ps#Zri?@NG_82 zJ?K4T6(pQn5w9B&T%_a;M{9TJr&RER;@wr^M{mddl}#u1y7dd<=ghGD4Ww^|If?hK zS?jFOml`d1$4-g&{0FXJsm`}=k8I0vvs`Q+C^Wzx&eR);yQUgHhU~b2c&I4>Y}$cK zt8K-i_h?J1(0jDqk+}Z#Je%3QFdb4hePBOze-SDYsPJxw0ujRbb2pQpx>Z*Hr~4*o zx9f{LKa?liczsL7i0wo4VH;zx`ITs=FT@fK@f;PhXlK(V#gvj994qN?EDmyx9D~$Pd(hOx5m^Jl-x!^Xy>X$G zx?*_1)L;#UZRWa2p!Jb*L=EyuG+*AfZ6DL&3XWO29Hy_3FXM;~uyil2{Y`l7B&aj2 z1Z|ZccGz#(@NppH1@~4Yp#!%^%jZe`|*Qc9gaC@4Lqt1-X9)Fl@1w$Pwr%?u=Xj^S^b{VdY_7$ z0Ml6WI4#zp&hT-)6MMIM6GRX76Qx|SEq*VFZVcCqgF5ko=V-0CdB+2Ee|wtFJ)tas zNZJJh_l_`;4wQh^A#W^)8}IdlXO{~5JY*c%ygeMyj28+ttV4PKQvo_bFV9YOLbqJ! zukUGSFI8l^5X~dk?o*{TWqx!{X*6-L&wsQ9r4{GxlAnkCMjlr7QMjd^tJcv{x3G@L z^LF?RGL%O4DSVQ3E@BDT&|REXSx+i%;8=FORyww^*vn@P^O;8Pkj@z69z@@#(xmY1 zQy%?8L)-f`DT`~e4IC)n7z|H0j6DP~b5B$p=&e?wYv_BvcdECA^d2!TitJJOMr@cb zkf{RM8(2NYs|_FS7C$KdrXqMa+sCh3Q=lwl@% zAj_~Z{}h`I-4l{EbOsYMqkSl^sI*Z9@e~AUkEk$wBMy|DdWL50POQ87^cvr&0e^-? zjV?{o61p%2Mw7?lPC|{dx;WhET7{{W+XeU$UQYJDG5xl zKRP829`o!@d=cjC(1+6CVv8(!SY#H-7>hz#SsO%$+ZoS89ngh%CdPQ()!$5a%6lsDF zVj4a1W0S4J-USP)7ut)H5xwp0T0^%-7_v<8`>{32Ozdp2hvQn*$9fxzuLhh~N#PdJ zN6|MJ%x!eF-CZcJHcZBSXxb={us4Zdz7#qj9BmNJ2)*1_Tl+Xn zGju84NJ)o;#1Kj-sZt`{(tPAl)!@cXy8TP(uyF|MI?{y`OvU=l9|L z`hMeLX0CIcvCdfMv5rIb&$FmAVJ5U~K1BPg(l>Fc*Mf1fQVJ^VYu*F5%bS*%k2}=4 z$kZO>;oa>N$oJ*CEH9TeuvV$49EK8P{Qdh$jqfHo?Dzh9b6;xUZq9K~_sBYCLg2PG z9-VEA){Ng5x6J*9Q(+e(FwlMSKP9C_-Xx?dka`Nb3&}%Rs}FoXNUhwSwSQ>Aqguld z`D5Wa<~h@}P?3z5Zw^B4AZR`$pVHR&gG=x=_Bp{^Ku~4J7a38J(BBt^ltWq+E%skm zs_oU&Syx9wX#^E?oYK>J^PJ{igx=uohS|=|9J^r)?DU)qW zj`yon!MDrQ@ft;~CaJLQl2^81xDsOq4Q5|0dB8rZ`ox=!#gx zP7Hk>n7fkTvV$9S`Sd`k|K4{d?t5ueYafHyZb|w7fB7?o!xbQ|dQ%6LqS!_QKVJ7B z8IZa$$(i~=_DU{XG!F#u$$sYb##-1^JPeJ&``#(=o#`#fBqPuqkUkgrzf2!xi~g&b zNa6Vbxo>?11CXnDT!9NKY~u!@IT(+Uaup*4r!~6nz0sK&p#QYQhlI(z(R+>J?_ly+u@<$g_sq(3k~6J(E+2k z-1JYQz3DO&rbFL@xrQ#!A2q_}{LN9~yHcMqy@h-~ZfVp-l2AwfZP_`2YCU01H9kj9uB84%?BH?`_9S)+`kN_QUF&3JR5}mFTecz zVYDCQzUYyli(_a<@&Edq8S5b%Gs{ye2TQiU-TA-Y;h>E5Ab&RAl;__L|DWH;5yl{Y z@v2)%>_7kgFH71yp2#UgAAoA|$p8PUcsX3Q(bL5xr(5xOH-NfR4Hx#pfCA$nEHL!m zfsXOB(*JJlkU%tyX!RMtHc2qs{PnEB()HehB5ExC`=O+^wCH%;U&6J}|4-j&fbuc$ zvw#2m$$$6qolMN3T_G=5sX~qgSz=fK=Bn+Z(d z6)Y;|hQ9KIQ|zc0%ze76F;}>-s-@XpI0+dI@=Tx&(l^591}) zBNNL4h^_u-mH9Kef;hqL3Oi_;?@ zv(?jwr3*kyZ^@o~NT>t2=aLQqwy(X2B}@|O)qtx36P#0kUW`kcOdr_;K}IzG&WpLO z2P0-JmPP^)BDDayAfobzb)ei@hTE`f0#M^_8fXH~&pK%HS%JV%>dZCskhAZ?!uQ9% zL-xiSKU-1PlSIK^Mj)uu!fFw(D<6!A1pw<`Oj{C9+U;^Dh zZJD6Dbk=WTZSIbNTC5O*mHs5bS?rP0(kPi+kEbjGiX~3jkFvdUP5DRwMnw;n_V51ydK&-zqF! zKo%8`2F@Hudnf3#$5V!w`I+ zI#H#+o=ZY&_i9(ME^3_)%%z2vl2`9l-9Q`;O%Bhqcmu#jvn-v?xtZzo5l(~H5)|Crx$w6T(rJzanvXI1s4Ppx~sdJH9QP}u1Th@T_ly5)S0-X5+XT~r164j<|nf6cP9mREZ+Md_U8^UnJxo;0d|DwrZ7x`*5f$m z&<^sbkUrLc<+E?%Q`ItI9V7yPo+hb4fc7m+n)uaqj4hD2ez*Y$6Yge7^nF#=h(S6K zR08B|{GD{Lt5RqGA2)}dt$Uh={7kjg8>mhS&HSbt8wkRtU51ugDPt!v5QA3MuMRl%tvKnfMQzLTu`X4(tOAm= zgmyhlM?$yPGp+Gpo)$15%$X*rDSiAz97r1tfV}*srrJ?=z58RrGc?>owg(-Tesx%4 zBX;s9nPdE9lJQ>~_rGTsEhW<}qE>hNqn4TTOGicvlk3N|hb_LrZ5ZnKH39B%nTOrk zC|H10H_D`UTb_Q!3yMhBHJ2C8a@W_d=AaK zu4XA}@XC0N9~VTJ_$%z}#K>y-?4S3fFoO5$#uvq}TWjeJU*D5&<7^CJ}Cg2LZn=ZrahEw|4)g91tz>HH7uO$dB<4$?Voggf;l-!ZR& zQ5)cHjYSh=m&q%cCuBXBYx85zI@_bP0tg6>b6rhCzv1#+r0TH_Kez-S5Qcp|T7z>f zZG22qzq{$23B@&Cemo`19WsYeZk`Sy0`IP}@9>t*kwQ6xC$8eJag3R#j^vcbO=*df zjmw?S1p5q~>bsgEO6mP_ip@UFbbDX#6b?Oo61DR5g;?Tzgwi?W+B@{9xjIC1FCmHo%)BxQk5a>~MLoIITN z8u-OgpG3&xqJQCFf4SFq+f}$!gqaZS_bOni>9=H$$s=L$E1O4PYdszZHyh2xvgVDS z(RRN?Q*WM)_%&^pO;128L!KT;1-zTJ<-3_}ZcYayyK$4}%?c2r7q0XbzWet6J!YM2 zsgjy82{y7#vqsB~%fziuT}>Gy=vpb1N}Yj#j_l2FL_+;lMPdC`TEfU6&PRmAqR)zy zhRO%9MB)L>C?KSj-Jbsijn(7w&yK?E2y6&O?)o|0uhCCMPZDDL8F$7r9?!#=M%tZZ z`}0uLyfMV+Q54O0q{G;1Nl-R&lXII_`tD!_#dpd8A!R!DB0{H%NT6F6WEH3g4CVs~ z=FEupyjOniF)g)Kpp$- z=FJi6@aSYZUhze}c87g}<^KAD2;dGN^7R99hXZD!jQc_54>=lLF5KSE8G(r@^0JyY?CXV+)WWbqu{fgTq`?a_Esx$$JdNhdH0aj|LhS%bVj}c_1df zgcd6N&6{*isQRPo5h&~{XZGR4TRxDB#K5Q_BiWFEUL17#2LbUD4nf|0^( z>Y2cyE5%J$c9_YIowwQeW9LI8G)mme#Aj|Rps5AANtLu5?(^pmj$*{@24dtQ%fz98)r}su2;c2Soloe zK4DBR$Q{BNeTGV_>cZU@8k5?|Pf{S49R1*&p6@n|1*6*3bJ;*Ptr0o982igo6VZwB z+Oi84S5NKgqpj9PhvEt8J-+6{ULz!seizdIL79<;m}8S}EsSg)L+FEt;na3A=5R&Z zEx=8|sGDa|dn|=Z`dT*r@orIh?aDZ%=HdD&erjaE?#pa^7_C}{gpjR$U=*2?^99%rYI#e((S_$=+R!M0f^BtgOl$ zd23z*d9WKIsl0|Yyzj*mg_#|^4ghJScL7rBK8A$Wi$3H@pT%KLgWTDKj)={qQ>s`> zUj4+A>7BxCr*8R$@N}tI3Erf1ow{>qmFnQ|dgW1`&GOJ_?&oy$J;G>c)X@6gvtk=i zL$3(T(dBay87x?iYgmS@kQ?9;b8u|2?7xv0`N*FJVm;t<4?T?`!rX3mdIK zybT{8y@rs786G$KE|oxJzV_PZ(gcUDHIBGQb7s0(=h6{gAfa6}z7wzHsN3@I+S19} zRq4?%NTJ5pQ_gi2JrJInXDfKPYi-*$*=`j6$O%~_D(7jtcrZ3nA(aG&LH45MOS_8( zF660&(qJl<+iFoJ%nV(42Yj*EQaN=(VKRK(d($2Z=9uzsl)M=xPO=|#RlM8|cV^=_ zhGpH<#5T{Z4I?L$7*A6m-D{}~$BdrH3cJe;8wL8pOa!gli*wb6k6Z$-a?+8Oz9RQ;-5V21H8x?cSPxrDI!ABHxi_3a*?Zrv^rUtuTH1(JQlS~6+j<< zkLZCEFrM>AD0VL}Nywc#qqdy~8&;A^$%I_BSa9FIrUvmKjlIRqJ0n*eQj9$C44=>Lh2WDU0}3tuH%XkD#1VG$os_vGxFOqm)2<0PQQA${329(hM+r2^CB`<# zO3<=5QOnq&b#?TG=#$k}X;)^O=6m*DE|=fNjC~KbfMplO11cTlm31E<^xF33s;Rs{ z>PGV!)}-oqbxS{XoUe*CDj=!xWfqio2?>wE8zLnq&$9D_#~V7`i{j44sfsf1FO;mA zX#B_8djcwH*)XoXCgzwcaFM(0wxK%h&Y6X9T5POM*wppeobwTGbwsv~iOLBIZC_f@ zV}!j`hz2|W#FR6a;?D!(K2acUA(LZnl1mI~Gb>5p)cn>=N+1bJ2QQMWSSXR2!;Lq= zOv|PL3s_>r6qO_>Ih zw#b-`LR=&ANxDQ@;s#ExvYMH&iLO=|yS`xUW>g(B^ohR3rx8sD8>bV^lQ5;HrI*Lb zs919|(9skY`8H=jcvZ@2kR)oXB(ej&>@DphSFiIX&rgZaVV3e(k&2BnauzJp&n=CO zUNZy=5z`+DKa@e0(^WR(6L}k-< zz19$EsJ(`Jz0r!xmlZ@ip$M6NxtBOpbKk}vmE`Swzg5pm9{Q>*w`~(*cEt-wwxe^X zF_-A~RtyucUlL>B3fQ*EGKmEfhEi1ovS#Z;+nCm>Fobp@pbwFmNx}+2k~bXlRBF?% zDcK+k;}Ofnlc<|bXLB!MJ8M>kh#)i!;kBNo`rB%vQJ1<7f_v+D5&@U-9ncc;`}L37 zqr#rkn#)Jx8I+4Jo~$Lco;D%y40*m6g!y$LB}Dw#axGzs--pn zahO{YF3TG^;{zGQ$PExoIZ+BzpyK!-BqVQ1pvFEA1c7)A9$9H@{W=i-{Lr+CA*5I0 zQdIM+Qd~csRSORuyKp?RN3K6Gg z6z=~_+`85Ym4;jRk=n`tT(%aSSVwcZ_lBn)0#uDRyy{@~63fw!S-EDX#BOd}NQ^Y7YqY4(l5l6B^abQ$$(+t#k z!dIoT>Vn;9D0H42&$~)oTrb zrBBsGcV#1tJXlwKgs^3KmG{i!O0^Y_f8Ax>OU>2{0n&g|VBs6*kQJtQ$EdeO^@I{_ ziw95^j6m55Mfp^e>2VO9&aN4IVPrxEsdXLB#-|wVSiy`Sbc{ph_2}BPM3TW@t`~M* zSehtK*`todk7CH4wY99O)#Y(r)tD~mPuQH00{*ZVH7M6#TUDjq8yiL2rB+^aPA4=+ zC*$KT5yMKUC1|#lOlbJDEdR@h2R5-nXlk8^P>kMB@MSy6Elt|GXhN@%qevsg4DlcJ zbTG16F3ol+pAHSxJVq~v%dtVT)GV+6<)J_@?lD%@bwA0Q1S+kwYskck*B8Tp8=0Ro z*-yuSgA&&|ak|jZLBN{tZa2HFwikL38SVY48mrXCJevTX2uC)dHKFZHcyl({BmWy8hX zZJAHKuzuZ*YyE8Vw%g-a>af={<6_o%IYSg~^QpF{>7&61@8#yLF(}jTO0Vn=ImHEe zRO-I}2Ho6*gEqH~LdxC1NYo6m`^P?y z#7nvU*(ISK%Zo4m>lE1_ao<&(Aasm-x?jc+b*Sq-T;7~=2@5mABvt4m)-tu(xyQlG zL6{`9*qLs_l4+*(tdyl_pdm6r!2|NaKkZm;YiNW2fWihy-bA9vSLqO3)w!A ztCI%-2P~J|3<=GxuS~bLvw3cS1_W;5B)P z4c-Od1ed1{OME>NEPl4e(z}YhKanV}VpiL+IiWJ^!Po_G-=rvEXSz?$)v9hw1tCPWff6ZqBF-vQYi~>kN`qL@tt4g*PwU?(ezBm^swZPc=Fz?;s!sN?J zXW#1(t`IPoWnlK|^W8@d`4?pId4?;}uraWi`acpnf>)}p0! z_0Cn;`S_flJM;at0gc7a+rxX?Ru??py7oSbaRB@ z)3eK3=Pd80KMayK`_0qOX!&>IZpn2S?_&5HxZaOEuZEjvRk_@LZn%Z!YfyU+MFn{G z&fr2>@BYNT|8-=Z3~8$b-@M;xkSt6Icm%5&&t7)b-Z^vw>s}9K=%oaR!*mMLt+QV= zSPl0T^xPp%&#~?=@?I`LxQ6luTtVhi6i3Dx6 ziX=0fR5T0y#9lBpT_#(QL2mYqSY7{NPCB~b@;Xg2f^k+9$1&uj(QX=_%)Bxm`Yxsy zqp)9UQ?NjcYpEmALM$Q?9iSft!@+XGHakz9db^N5(*E&y?W5O*1Ht4@I{Wy|pXjbz zK_OMZ83DrHK~WAQhAQsQ}?o18;t18QSwbQO)(E4VLkY$3Bm z0-Xup051M}&Lry&I44$CLrLHo+Z4e$1SP;Ay_*qtS+rhetL(A~R z&h|I=|8|jrY5Pck;dIXL_iPubhm^PbIO3tDOzdTPYqfsxk_%q^_4OuD72U}^=9`-+ z91MhqZdd`)MF-ME%~m-lE+~`i^}VNNJqQm{j>8i}xk009PSm=@kNTknqDd2aVi@(S z`G+6CbnU}GVrtns&8B=frKK9%7hk6$mZC=9QXfSkiE*|aTbDu%(M}#BDx!U~+soD2 zbjNIb(J4x#U57hyW#K`wLP;t$W_~-*P5M(Ir|B#1#%wGW-MH4@aGaC%jNX544zEOG z1PFwfBUOk71UkEj=pCq{YVjxMvrUFjY)n^?8}uPx;~zg{GLpCmmUg4;mgAD;CA<4P z-kwZ8+yVcwTf7UQXG+rT-?S3&HE_sq%I%|02A{aXS~o-(Pf(HxxgUh(X59cSi*S33 zjdBSobhk2@543EF6^@jPa?m;MPxe`A`fa)itcy+G!cJ+yw@6mCK&n3>>kFyp53*s@ z6ro^aOzuUMB+ZzaKo@|CE_)zbS({JV>192TWgPm00TUgolja_X zW*ywP^VN0$cjlAEX}}5OIDe()L#J8y5&cJird9TO z;k!J<&%|%`>cqk$?lNklbTb=X9@Fut)|Avj)yt1=+x3#Db>_v)Y})=Q;B8nUmMa7b z&jK)XPjJzakylhYEXQHGC%zZYi}r5}3BNZC8U7;L98+fEyK)nFhAQv;2!0}bWU19U zw=4I!Iq=&i$w5h4t$ds`{$Sa9ic{l3%{XvF_Z;;mwAcEkRqO@MClb4GXCx8Ldrrz0 z(>+{2D1xfLogf~XJ@cT5mbmFR_Ct1vlOk8;_xQc42Tb|6jGQt<Jvk3 zcn8yAMMvD&f#;%K*_y%T4E^c|l02)vn)8s?Kh)lCV+lD$5#H4^apGu~aPWOiLHcO` zA?`k}dT3ProB<;*zlZ?-$f7>=HU}}C--#KmSY4$j0ngF&Af3NQr$<6Ky9klbYB##n zep&KN6b0uuahb_?>9sZmG7uw+$u#Wr+U0(MV)=kmI{#a6pK6EiOAS*S;dodnz= z6a*O&c=KkA0MI>PllR4lBW!VPg>T$ZBTXqO?7D~#V&2-t-#R3Ciqb{bIGa+MxY^nD zInT67*T1XudsH-&TyDrw*F70Ib<5gnt@-9nTs?5tRXz>|Vs<$Uq&I8$qdAhRWhW0b zmh0yyYJQLkd?5@CGTe8eh%h@o_8Tk2J0L!ZZoJe@kd!?LCm2Z#xKmqv=V<@2Me_9e zr&Jd|f}+QY+JKReZQN8Zm|U4G4S{LqcKgs<^sbK6f$ap)!|4grTwIjoo_p+s2s!_h zXkMQ9O5)!G?thM#`+`{0?-TG1rM@vh5)IdD{m;CDo;uH-jU9N%pyWI|sZie!t61pe zR7jo2xK0Ks;|fsI@k+flA2vsR^+p7hn_cx47TRd9GMa&AvOmf$OWv3-W%dz0$UkpO z|5=*0?I-=YMV9%^sf#c? zk##(b*k8fzr84S>SNHvI>ri)zUB9e z@trI9TumAMZX}cm{Ry9fR$F!^lXik>h@$vj+G-Nc@VCe^P?rP3YUNoqJE>Nz84ml8eo_7ig1hlnz}(s;?^`I1hy@%_Hdjv!NTZ3 z(WK-%)wyOj0=hl4Sg1eY+Wwd8MZQZb0<})fc3NcW{ep0ZJJa! zia4ufY|WRa%!^N{j6Q820K~BT(x$@ibEy8kF8mL?#e)mu2W6=X$(wUd&%GIEcQzmK z`i+stgM7`mWVL&ExQ+h9-u1rMnws@837H27>7OU~$HYT{tYwjHRw+hVPPIk9dkvY( z%kg9nNr^j?4&DZMh8i_r&6C;vxX)=Pt^l{JBjMO4e?blP!T;Yy>94{^lR=BfbCbpu z$bph)=bUn5VUw15^~}%TC+RX;bdV+3@;b3(V{5;!p|v~bbN41bGtPl)jZ7oQi`n8B zlQb%f{}}lIcx2Gx!c}Go^=0g*Q?1|e!bUWuc(4|t;rWxkbAi_5 zXU5TD{ZxCJl;;)C#ecj;A*Yl~|9J7)#RQ~InEuP$Uf4YuV@U9VG{@j<7lRK%$Vot; z?a%r;Dhsl0RKEH2`NhM3Z;bxFK9(a6;ym)1m)WWHDmjDV+h$wX)JIKty81FTdJY%J z0%0IqTmX?|8}Z@=?LT5de{F$_BHN5w>sHh=gxa$e*TU}g41WKuK?zt`C5!PmDerth zg&Vk7|DV45d&``IkKuOY(>;WM;^A?94}8GGGRgr`Q5oaFF0lOXCfAB>;}_weH0*r^ zI7N*jfNQGZ5oXu_FLyy#T&?-Rbn^P1$iYiZV8G1N1Mr{uCbZ9f|2cZfMcCkpU#*rm$g^#1Jn#49iB5}$#vkC8M*coBtjVYwHy8%o$1f zp2(`*1}hZa{*zi=um zI=0j1&)An|r2JhNd~2+4ia7p2>@JyiB&W*0%jEF?jcOz%WeNn)jG0L!TsQ6C;wSP= zf4_Pqf6~@x#Q0&;unt58eBsYGyQG=l0PxQokMYD_*|6u7Bsb*z;ZOb#Li9BQ)pHxR zk@)faa*Xwze%gCYJ&^YPJLcZRMp=i@=d0m_We+&;l-5&Zjmh{$8P}-*i_jSVE@I0k z2LOQvITMS@YPFJHcV*VevkFa4n*%uGmNLGi$!zh6JA5DATO!ILI6Raxm5cq@)UdiypGuz~q++$jbL7WH`TNzAS?n!>Fz80$5DN_#`n zR|`?@=olW8#&f>^a>@T$8XX9*Mw@JtA1frWl4+g!;5FU3A?1%JmIt=q>2)jDSzdKs zDghngCFeI95oE^lW^$w`lki+&0~E*ho9!>)Bzk5rXB>c%JUebT`xxb;O52V}5wh1sZ1>6hVPGm*t zyenz^*#cfqmO8)6WuDq*AAZeSoG3M_s!|tevWoTBt4QacoC7#e)4!k4FtUJ-^JSI= z>B!$g(H24imjeUBiF@^acninj`G%i;4kKG@E^#+UARI6~?ZrzyVsr)G#mw-!KA+)# zzgJu0*=+aJt~yxD=U<2Jf8bu2m2w(?EW|O&&Z{$sOsO-84;{#wX^KxnF0^lk^^%qd zlat=b?z;t!49_06=P!jehsXH$v~@zGC_QTnY+}+c*8RjGS4ifJ$jV&L|Mo_pJX=ky zZ}FMC)|y!d+n23oOC8t3V@iM=^!?CJRD+G_ONV1L3ehfHW`0X;hzdKC zd4jkOy$_8qM#m$Bxu^aKO!!wF+;K1>)MPpt9&PkK(Hgry^ju^vX3)^G<%_DZpUYE8 zKvza(S~bMvxSfc|$B_jVNY;iYpbhO`;aIZ6^fdGl_eJlLA=i3RP^9;Ntd=WeY0DFh znJ|22__3tA-LLwmw`UUe6paFYzDBOx2PL@q$`*q#`(Tq1U0r&uLkpFb^rB@&|39yA z{$*v=V+_#4ZN79^(j4RIRKxa?dhjw(;TL%i$LK=ItlFQLzoIk_BoB_6_Neukcnrbm zN>ZmRZUVq@%>Ol}mnKl={jpJ%DGjoaE4*+XWCMNoJV2mypCbB?tI&b~Flr8k$8?pH~t-PjE%-km@u%YJF zyv83q^rdsVhgpV|b#o`5Apgf0pkGC>vJ4v~1`VXlj2C#%6w`@vbdb12QLlWV&pAd* z;4AVmdB}J(o<`q*gVR!s!f}@Ws?T3Ye7qpo%mcS}-K?@{nQUv+64v`rjxfhPP%vH_ zSGGFYAW;sSaF;R)?Q7SfBcj%)WaU>&RNklm+hc$|%2*%kP4|EyTkp}lWB(Hiz@MYP z5@Ls0B&!dNgAb+_Yd$uvEp-?;kmMY1HDN+WI4W zS>DMqI(HbbY6Kj-`7jV*k-F~s+N!c5bzpT}w{tiv6HhevqW3gmf0S2)Mx=|+ zu$EW7qt7>czdM1RiMGN-TDO^=INc*P{gJCK{HDhS^*g!rh=7x*T+vu#4mfu?b=D=O zgQahAYyCP-i2Dp+mKK8ZO{`h`!uFKaRasYoKLgHo%i&`Vsny6M;kQ(^))TZd6ALc~ z?7CZuhIUWH)0$C%Gq|2SVkIuEkn0N?Fy?Klw9hZ!oxv2GBLY2s_Y3}(TEU`}A-}YA zQJ)vNM$7Q2o;Y;L&OL{+V{B?xAdWT`y$qQXU6abuyq`|UdoLwk$P+jrj>o!?DxfZPY0 z#0I-?iG6@h{J4L^N`w(jO$O;!94(4OfBW9k_4WDkPtg8jYrWcq)Fp+J9Y1vy*KKs0 z@c7x2E>p|SL^8zO3r(D+FvtlZPo!S%=O-?&=zdAzi5lS1&+)OzkBaaUkJRwp; z+zMrDis6MTQ^p=lt-fEVE?sg$THd-=MK5JhAk!&rsQJo0GN(@vi{XqadKn{{Gc_})1SMk2Tl z2_E8c_YV9v`??qXZXaIZD3D(?X*`21H%AtOUiRhop}1R08jUl&C-ehFaN89ktoEo} zmOH7)@hnIy6Hgo$2X&U4P0W>Sy%6%us$OOxR7qIY>9Vd$!-=N4fUNA@g4q9zd?I@I zFzJiS_Rxra9_>pi9LlYB>KmJioE`dGg~0A+^pJ>8Ml+A*y8u5`qs zL?OD~$>VfE9uCpNlE3MDa&#hoPwNp^?JFHOrtQ>kkl8MXl_gZy;6>U>Gu!@tpwMPW zJB>?^;q%q+c0W|iNpOB|X8(q^2Wz3%C6_7CtHrV`rS56~)~IeMo>m#}&8ng-NOI6i zcla>bib=}(Wv*4vy&_>@3DD&?k-;~fC*F=WAZ|Zx)*KM_vqEYPdiR9o!B);-{L61s zOGL!ZJfEhYnySnsCQ9J2&d9hfiK%jh(CSuBI~gy$x|Au%s?wNiE9Pnw>gbV}BsvWZ z2hCGsYVR;i%M8ZR2z5KoHnltM7Rw5<1*{hp@Dm}vhQ~eZ+!~`|e4ilTD{YyZ+!lOa zu4drZXG6AGYYfItk{a8Rr7AJFo=Cf} zt+;yr6rCQ4MA6$OZ62-u*w5Q>hGNs3Q?Jdo4wQ)*X!>2;Mz))Dw$odj_9H9I7Ua6~ zR=+at)AdokNV)G~fmhOOSsKe{jtvOl-(I;P-`hu^L!-larcHn9!6!Ev87hMKmJhj}c{uv};Q zM9Rh^9<6kb$Pf!~GpskW@`6PKF=fi0ZQw#O z@Imnl8xplgoBkb7=%scsPyvrF^mgPzf>sSl{CTF^Uv9F#Zm!l{ee@YbRv}?4n<`9BMkJ(7kn+B>GT>*WKjcyfi?-pzIA%T0amYNFYDj8 zm+mZU3pTng$FU4v_VkCf6IddTp$$}vQwc^4Qtxs1eFCM-Mkt_Z9QqEk4J>MCv#o?= zt;NK5hkYy9`$A<@hKtjAA|%oi>NGO!5{lwv;WyNz#QNA^su(|iVv5BBGj z=UI`(DEPJZO1B4RVzX+^)$ z{^X$k(MZ@Tai&L+l*h#;{XMT~4o<>vCNi)ovybE(q2Nnl#*$x4Tb8X>Xe{VYj5c_K zeX|;SWGYY6OuI?mr@D9YT$pM;-f+Y@-;QcHwz)y2rHhGilf;1JvA0xT|ETt!k#%)c zJV*>PIlyxsL&$CJeCheAn%SeDB-WoBX-n6RAAG?z@)DM@+eXu1woG)G->muWYj`~V z%Ia;Q&D|#Bn`_g{?LtPvHCF;ma2XhWp6h>wYF>d&WY*0@( zD;p{r7~ZK!`AxCug^5-!g^JxPS-nHb-umo4=R?xjmHj{u4i6Xor%UvU<7iY&m37p#VYE$L7su||X-l3XqCEa&*yR7PXY5({M$3m(Ix)>1-!c7=t^?oU` zoi^!XEhA$3jGk~1KCsej)`y=`Un}~n-`u?iDh18Ii?=xfDV2z&LO7rxF6P1H5(Dzd z7i7t^Xyg0VnqLlvWqD$!r`=M zV*k`y>?(GMOsvzY)3S$npo787z$^JksXT7u`&m45&${UgYpfbI)dWOlUvZcJWb9YoUae&gdijlTJo)CP4>;t_ zf*<^^N>Xh4Y3)xmn+4Y}t>J+MedBT7Z#0BVv`p4&r8Op5h?gFj!-t;P({lu@9_Vu^ zONY`BaDhT3$i&ieaz9A7Pi&8jcO;>Mp#+x`{X#XI{`rMt9$ds<$ED`A!bKdP#;%~h z{OEyQS*Ry%#2u+-aPsXEUVH|nVn$NtIOGsgFC7E4;5u<}Sd3dzUtbvpo{c0d7M(&pnpV2kp@k-l?_SJYkhW~%Un{(LWGVPX1Zp7j!VJtsb$JH(S6mkL6#Efkzs_PW=e5Y zh2ac4Ke}40>YZgbhl&G(FX2727|X-355J(XHC-Ibm+~&JNaCyFbgeH#KnVf%g7YA# znSAG`27MiLXz8URm2{?wx{TR{PQ#Yv$w6V9Y%smji zYq7w`h^%+z19gPIuVuko!IojX1SWQe2^aL-)Z3`HLJ^ zi2CVi9(fmql&-viPL+-qT-b~##2x1w>GyU|zJ>vzw&%Nb1hhP2t6=Z!Bv(q?o%sSY z_Afe2AaQ}YN@sQ+YTc_ftN`6C3*PlxgxX?kTUgUq`4=P=I?Tp#T_h{VZ}Y+w>wo11 z3{2GKdvgeYR3B2Nlh8ymq6+;=;w-l2R{xXQG(p6d#Iww}$rPVITc+VcFsdd>(Arx)YSsw3?BI)^ zt+Q?tYB25jLa!~g)u#rKVBlk)r|$p7NN*RhF8i^R`pkD)sppEZR|*5)3zL;!lx!VE zC%-4xPrjzK_$?6^TI=ye__0;?OZ=o*9OV{`k$Ed!m*+Q5w7Rjy{LM!%Jh#~NzByux z`=ynq`IsK-EO_Xqf@o^cF^u?RO-jZ6hvb)PE$81zNX^z#$%S@2?big$twETbKQ;M= zLP+pX7^Q%?_NRguJI$c?iV~pjBTopZWM-ZBS7_VIU5RdohaEbGbq1-BD-oJ1^ z9Vg^F%Yqa$wDtg>@YT*M`^<$zoL4XchN6Qzt4A5_%%RL}KU*z6n$8nNsDpWRJj*Dt zf9$!ByQ7K@*q8->;i0dnNjR{MJj^N08K0{(f6E~2#dewVQh5WD4?hwe{I>W!k%*Ey zcGhwcNA8kDFEklbAvFjd-ab!9?4#H){+gQ+OVYNKUidsQkY#79F)}rFUT$x7i5O7Q z)iO8l|k^;-NMCXHX72cu@ypn9|BWq%|d zD^v+Y#8K1GRE`J}EZY8}oUSG)*|@%Dxj?DVHE{u!aoEb^3oMECQody{TcQ}qa-pJs zFF)#$Vq2+XK#MDM)gtNG$GEnfX!EietmRfD|2L~q}|aELMhQho^l`oW?uK-iN&<1 zP85pEX{6)cb7)_Jm?(;)KlM^Qd=2B%KNm#D_DE7@e>l=4a%|?zeUC}S$_|gRo{7V< zW?j8!Ag~WdU9Ba}l+2`rbs(oLl=3(*;c{m)uKWg~dsT;j7$748O z(oD{N=AQ8EFFX%k=H3;{jt7G{MN^{kDk17h4-0w*H<}nFH&nzgy6Sh{(uSDtK9vrn z2RRECSGgzg55rbTP*zV@hONp)@5{uTP|T1}2(QkFKIP4jxTUE!87TxkGmrMpDAiPQ z^*4hXJ7;kj?tcAD1!WB7L7GMAqRrDD2QI9a?9G`<-HW*DB}fQ8K--Lq;)bT^4-8^8 zR%9zJlfkK7y?%Z$GY|;hE*q!dO^fYDnmTPDCI`RE>^Y|Vs5Vpkg!58`j9|ldV#9-Q zEdh^Pf>2D;R+C1^TTEK5*W#AdX^?oWTD$Z*xUs!+Wu4C_Pu?7=bX}rP?R;qPS((&s zQqA{u3`E`K`5O>-tXCO(etA^G)mr_Ki$hLa&OTY**B#q)Q4Nc)M`x9;CiVn4p_m#R z`8fv_$6vb0?4NX5a6YFZU9|rEMa<{bva4VU{11oIJ)g z^Ks4UFVeS&P9nNryrHB7>u1#5*{%8E04L52-1Ll8BQGVtdyPYN$4nJQ$Slv4GUv~` zXgmvXn^7Ha$do#_lo#`{`8XzX_X+~+_V=pxh*;m_j^qxRxx*(zUJ_y9oKzV(8chX43WC(c*|~2$M=I%~OgCGw)^Q z7O!_yJl9qtgXX-|Y4@ic4ktvn3@7pa71PzDWXMxpYyTw~ z()SQ*I&v4P)WHkHg5AQnS2DxUFsW%Tas;jOW9?g*1fLjP~!9Of#N$j{k`m0&W0|6g}n9WSmuUL)Q)Ta zKeo;?D6Xz+(~URUxI4jvyIZi}65QS0wQ-jO4Q>HK2ol^SxC9CA?$Wr!^z*#)*38s= z)qlFEYU=EL);{~}wXSvFj-O&`txN_`uq`afpV<7YLn9&)f7C+iS0yF+y=;oo&|i^y zNzj&%pJE8|fkz{iguOp(Uc2F*x3fQ0H|O>F*67P`33o3;_`^-6wZ{2_Lwgvr)FAD- zFkx-TG+(apeWLC%XV@1k`|k;oUa9+>JxN$l>*Xo$zhs+s=Z1K7_)3aopIQUI>xir_ z)Nzy~JTF=BYDHmu-VNG9R;oKyWj!eHG-JLX)wB+;@UO$YvQpEzF|*mVGhMJid}}-c zt-F{|hqBlApP+rwv#nu2U6gBca3s7*tY7%RGq+OflI^PwViBuXf`FAa6#bJSap7R; z2R6>QzuL}$5)l4{`@zGZu3{F;Q+i_Rw*!a&Y5|A=)wb*WnrTrbfA`d*kT|Mr^V@Gi z%cRH+8v@H`u9H=P)=K@Gi~gc3A(tGdrBf#LShe7+Q#_lpY5c5oYtdDF?*{r8V3t^X zwWN@k?Kx#lKWH0;=CM#m3V5YcV0yMie*@+q;R`BA7+i49k9i8O%|~unT#NIf497?E zT7Pj0+tlU3gk~@#u=OYPqeu9q3E8)@+-|(Y2~n2Q0a! zM4=l+UwuzgLHOjfQoEirt3YQ_EwthJy&xj&d-L3v5R6=*h1%9ps<=v-g%Af|NNg3D z_CzLTIA1AxQ30h2M^^d0fm$^#Zx|un`;rW9b*)MrKB)u~1>u~tKNiF%3(Q6dlan

      83GD$-P`rf7M8*RYR(UhQ5=VwYN&O{~1HS)NYZ#$ww{mSgKmN&`=K%uPJ zb~mRTV{9f?E>8AQ4 zhJSBxAE$Yab78I`Xtb>3k9kz)o!5_%~U!@>ykFMRP{6*CZ1HvTB; zQ2RUF_j)SF9}a4ZUTuI8`FKbQKV3x~$oNMe8lCm&ZCf*%Jf}b^X@0I0hk;$}F7tha zdcp_U(N-E;YAQ^c?!E*(J3;YcpEP1F3{!Ix*)sX4#Dd;>*0ChAxjsHPz~7phl$UWs zE)_a+kFmzB-=<%^Oz1W_U7Mk~%Lp}g8_U_q7@`l>3BGGN)+xu|yg7(a)Y{E1R51?J6N=0_?ogn@{y@mlp8_gB} z9)QQ#*0Cif7^CGqKOkLD;!Fdd3H2jDFDkf-1I^UgEYkd;94I-l`co3A&v*byaIv>* zw;DJ~FdVnFl2#GCvhz5_nMcHf`0Pe|_wGGb+r8?_oA1WQ_~u~>8(iJ<^khPUJl>Mj z8$8`dW6|uA_{Nl!CkAqk$N2l$jDGfz8elT9gQEyD_ZXG!p)W<&>y_``o~QDohB0k- zC~$n}LS!B;Io$pCwEcQAv zyEv$rPQFL!9zWt+!h#k1XUFVBwqrP#lP&{3u{q=ROZns+{efxp&5=9)lw_24i5oTR zcHpSE0lt;U10K_ZUf(%nj4byUH%6eeA!P^?a)(u}jEe{(PJB&<57rh9u-uzNU-^P~ zl)X74mlt%?SN%9E*87eHs1)Y|c*-QUjk+YnQU3fj!Wqu@sp@HIs`;qzd>3q1x$PZS zhJ}VT0!asJO@fVq`ETdum;iE^~#?`+|QY_EN~wH=9DH;dmtUhj+fZOCrkR<%n#vK-+o zsc`U2=MB7?ooso#hb^j*-^(v3TLsdc?%lXo^U+5H`gA&w^k9wGJcq26!c0NG>rjf# z6((L<_Z3d4(pbj0tSuc1CjxC)yWTGAJN1NxnP*kF=qr!&npx|AKDhM6w94Q6j%?>Q z&3ivl{qMc>{iR`Ei#>PYxJ>Qoi!&o_MR6Z4H|=v>(=*guVl7z_wt@%o=fT;Nx8X;8 zs5fUA0NY|h+SXhPT`BmP0`S*__!RGEs@+kTJO}5 z2|_B2^f#;6*-gX2GvaVA#eoVe9Dr6N=HmjmE9*(-bn+wBDv%D7un-%?m8tbKL6)$O zNs)&dtt#6B)*xx4Tu(>Z>&9gCCe`F=)xT38_rpLu+^WMU5>BF?{s)~GiQ}lW>Glmu zj0KmCcr2~QCR(1~BpdM6)TCe}=5J|uLNjHXAT6Lh7PDokI+~U*jLJ#=Cuhw|KC|%EQvp9O1R<))D#69`KK*)P z`$6AaK%~w_frBI*Re(k%t~lO^6(7}%7vG;{cX}W`ihU~H_~pIfytj!*&TB|#7}B!f zB-)rc=Op`XwFqYO#=+I}YXRQ=kDEVbQEe6q=i+MTK&t*d^|!Qn!sMDCEE3$jXLp^& ztATG-kHoJ*$QcrYRNdrm7;)XbDD0EQHMiwOda7P}nv ztJF*S-+pE+=KK@G#27rL zKk1mrA!HE%YoP^EM+LZ}r++TSj;6a&9OEx9jPd)LZoVv0hd~@D_gX`SX>;>nCvwQe zlMK^4OC^cI77J0&bpjz;YfzR$_VbYB6m32One~=e0i&vGg3!$0n@-Qc*%^k)AB&-L zh0|__CeL(!IFs%4gv}aNZZy@O*4Zfj@{7N~_|ihEA{FhxcMHd(Y1Kep)u~7^CBqJ~ z%kSJ??%CGe z^LaRqb*9Hr1R1B~jd$u4e zw3NTa{68XEs4&^6jYk2qAB)$nzdnTs3(3fZi1%7x9}18iD&!k7w{0^?fBt`A+JF04 zPYi&HwJjz{WA@oBEl_?5e)B_x^yg?MGe=|`qx#mi)q&GF2j7vd|KX?gM6en!1~s$L zJdMDvZI6gk ziyvz@Sa95OvOm|ln~76tDN7gIHqvPu<18-w9|l{`0o#_Ci{1EeF5+8CvLw=;lX9C? zO&7zO=bdy!ysmlZ5t&@H6M-A8XLcHc_TETU?GiwzAFwpC`VY3WHLI{X&BNAgd7R#Y zp3T=xeo6g5MO3=1NwhHo1&>2&_ErRr#^C8uGrQ>+ghQ=$*}Ie2vbT%wfpC_EDnj2_ zFKvi^M3CxRRn;Z5fsD5&AI=kvYqF>b8`J1g?5F|=w2^X+)8g@Nq`>Y8A%th zerC$&|84|#*tr*>9Z8?98K|V2tT~kHA~8+#uYBtPOaH&hr2|;;l>hm*hdO+qa~iUj zP>%?=8#ZN#tq!k*LW%YfXETCAWw(yr?5bGI2S6Y zOJEoMub?i2H_;Kn47n=Nf4JcPAmngIA@>E0qQE>P$X{ry=v;=DAL1pGz-JR`h{n52 zhY~;5L8gH1F2rl^Gib2T~+62!V)EPD-1|*dVn-!99FAe<_1X!L657+R|{J=mjr2GGjie1%zl8^$d z%Qb_Qg=_DxjerJw<-%{}8$mc8TUE8w`sc$aHI_MannO(g9fw5GpC4Z8ry-9D2_PHL zzw<0XNCYW%E!tCq>iTwzKSk88;=l#Ly&OXK($;AdkVzAP@-?C(O1C0B-l}Cn$eQLS z=`#~NsPHb7cL)DFRjR?Z6_x*6#TF{+3$FbP{qv+SMf~BHMyEo67K)Or@0duoJ&6W7hG7_V9c@B|1Qiwr73wOX z2n|r#hAdqZ^hkO8rbi%3t14VrHJ*k!Y|5OCgl2PU_0n!)UBn$lEuriEL*|PIU>=1G zV1;0DJ6$>!A%#$-45ScS$AP|Zgzo9vfsUZw@ieg^Z~t_+@pO#hz&l)``_+;oFyUNt z%eZAwQW;>A{v*um68i7(Ackd+qm%zfv3L))P(ZUQxx2vC%zQh{bv0$A8~tQTS29)@ zk((8bn=?UiO>NQW>=BOU`O!Qy21>PWh5b@31LJ9mp@?5V2j2YOd3!T$fZodgDnZX$ zHOC*@Da%bkBdhYH_wU&pRMemR8Km-R_C;tDR_s4b3?<~{xtjjs{{M-hFH=PWNOmA@ z(aC#CTl5(=?qxQ@M08;xjTBgU9Gag#IHp((Zrb6o)zQ7xn1q|^z_|Nwg!s@N23S}- zzE~oO|F11!vh>uVZdpW7Dup`Tt8MMq4qs|Hp7UjDn_164eEtmPztdarN^{6EOAeoa zoj^0gc8{V~zwzx=y}7(gGx+=KG>xj|n&UkhWDyEJU#pI-m9Q0F$q8YCj3~t|W?+U5 zO)5C?p|}4FHz!p5m~TcIkzDny@Kt>~nq6!99;zyw01Ei@k2*BqYr}m3hbW{fyATSa ztLfoCPO(Of(PDjMUk%Ow`1vcD9;>Mn8GHY;G%91 zwH^+-Xe8VN*gO4W_lrU_ppd859cvus!4EC14(!qPrP3AT|8{1`ivW-sQUYIOI32ZL zRG}X^JLp0gKuunfZ%EmKu0K1Fq`QtK`D|r!5ly3iDy%rNW*|EK`hYm1`7;?v+}u5& zf8EV`2!&u9)jzgcbG_25eD%QI`IFdVv*b&ZY2oYdqX?1N;PSVcrNURKm#8J^|ID2y zzuvVmaV9I2uVu1PPv!jONP^gRdDa)P(!OI~bE<}T6YYSHi?!PNVYNVMd? zQp{l%mH)JQNT?HVi!vM$40xYsX{N%wdPOI1A&3QBA9KILTit>p$Y&^=%o1etJ^n01 z9eG^@9B!x1j-j?99nU2=LKyo9Dl8rufp2biiKuI5w^D2zc#8i4( z$G>dJYwFI!j;D)9jZUW*!TJW(Z>(wjS1K?1WexUY*==o6%}_n-W-6(u7E`H3i>cG` zc7!icbW0b=t8EVeL}h64&ZjdTfQ`cNdH>xd3fD1L*%#V(-W(WdE)Sb`K|7-NXCS09 z|M4X*AhVIzw8D$G|8~>Hp*5NB(|lYP;pOeU!Wc#fn() z1=m^66S><2i{42jI>}Mz^Ud4De*0+0c{`|i%3P+cI^b#@o3LLSCWDiZF<5hpxkW=L z75F6q=gaMfXUS2!b{O7X1YGeC(8eL*<+is^A_QW;`?td8w%{-lR)1OkFfP&G_v6i2 z8KNp)9l|OOd?LA%mmfZCa>qQlfh|vfZr(~F$E(SkhE6jF9HyN(_^+c49+WTV@V4sw zO%-)Bs|h&!*ohpYUD zqNm<|Is>_1x180qZV3dM;>_BW9&L&%{ka||-_N|g*9f`ks#-4f?i$$MGTI)Sv|I9i z>O;jruVW~O?tjFIzI(mOY@mV4c&oOkt^d0-{Il1f!6o33kkBLUF}{_HI8OM@9Dfb^ zTgu{en#JSv!8SFU*Y~bj=cY4-vSz1W+NpSXV?c#)U&e>!l9lZ{;lX{Uu2O7aZm2*n z@SP~&YqEshQKWnrvv+bqn?R>@kN8P6a5f?hP;KK&V zSC=b_1hwh?P;1P-cMq8x2)Hsf!c;YcoF&U0Z@!n(^=B zS+{=vEfaqKMcr9=&GJWj3(5JTA@JNXD)-=aDJ?|&%};j>?oYzy4`Oqf#7klJ<#A4O z2$cg!)W>udRrHiEqP}aTEKnu?7GZ+Tqe;}mpWT1Fw%Q|QK;`y4VHfGIbN9qvg z58ThLEsYAlx7&~ZdF_s03H;UOdgio+4kmz6wOOP#9c@4^5nRKwuMMGmRZuXa6oAuRSO7 zwWcHr%)ac(uAj>!T&8@QP+tyxJIlQT>(>RL4>Omnuehi9?|!Cl(MS@YUDzLG+4Q)$ zGTG>T_Z&h`fx@5fyJc@^y8t2GOW17pTRq}#hqFH0r+?%^`Tb)Yj?dZ$ERIOiHM=xC zdpu_`-5I4K6pH$LzfUUBJ*6XA@|hskBReC?1^-W=XJ@Tfxt<7taZGiewmb_M=dmVw zU8uU#aq(CG&+GllQx01SWQH$vCS@93@(tBrnaK^6xi<%2pl9i6?a?|M_8Z!tzk zefLS7st;4HMV`B9oL*PxS62r2+ZycWTYgmEf6Kn>3%E;nUq4V5yJ|Q~YFarvYkTUP z0kMUR2Zy)ZUF&WpeY!FnQ0``!bUyD`>}dA$^`SWN!7~cIXx!5<`(D;j5rqV__fI2n zB}yRUnM0+ci|B#|-XnK%YYvRY6vlzJK4K@)QZIEoqEG!QQRj}m+VVqAJCM(36UKK{ zojw5;+N+NW-h;*72z7(_!kb2ZL&%Kl)yws3ECH{&>opE8T&0TMZAvRFy6mGDFRe<) zEAFG|%?%`Tt&3c@UfYB5Y?Tz*O-^1aEI|Vl<#kg^`JCgYt)o?6AzD9;kLP?7lBlF2 zo4>c6?4?)f9O1L*pOh+P9hItN?X^A|edSpjPf^J8GJocc_^NT|@jDXj%9gEV{I&1E z@`n-Hg>tU&?9VG(U$tzM*?oo~RI>j@IR@vlufXfeIB1LwNL|fO+?$9i@D6qGWuFullu=7sA`yy0XHZIfIGh z`*~~`%O$Qjfg%t+g|$^|=egy-$FIS+RdC`J)V2ig1@@cY4eNfcgvXMWR)yhmVS3G+ z2(X&axWI7dzZrw2{+L<<8@ltJXjouBhv2pvnvKrRGxhTJvLZ-tK)v zjxRQJ@$C%KEx`D<|K668$+!{oQ*syBI97EHM*;yA9=|F##q=ORD*Mkc3WLc}ND$*j zUlJGABmxE7=Sem@VW+UrdRZqlF#eZ3EZ34y8b>VzqY)(GkcW>jrX$Yva2y7RMuz_4>NO~>9KwI2u#VPffn~LS~8XFIb z!eN8C>u+_8NZI1z(KTj&nWVqj?N+EJxP7t>pQQt0=N(*P;*A+cYdP!7z6_vYK1a^7 z6}B+%Jxvse@ELiDpl7n{B=$_lS2;QtF5%hB2dlV|M5&NTUum(}RK5T-eoFx!#)B`OpxoO2L%+{#*=Bx^(j5=3!)T%L~$K zS#6Jr&zK_|IFj#N_nL$E!FdA+G6-y=j}CQV2w5Y$#vx{mcl{R8%o-#--dS?o zTyjEYYWMUedO9H#_HD-X3?B5?x!1^(87G!fm}kKmrvO$`Dr$5uh5B% zoCwB{UQib(&97&0doiRKg@N*UQgE*-Q+9h_<@Vxwk?4Kj@CYgkJPXS9>wPZ9MfDwn z^VJ^~30Ra#L^k_pzv_Zx1!MfGaxiSR)3*tg_uRUJOO)M0!^F6aVAxZ*HN?4TRm{hb zb$%+3j^0vIK-RdffbqQvo&99|SE0NhD=M&L+OM>o2k5X7kr@hX0hr_vn;1Wt@#k3r z)l@4b)c)Uu7`dF1HbFVto6F?&h*)F_N_2CfAo3(o z^#rm(5=((9@ggj%8Wpx5Y1WhKNsXukd~4`cFQmB}(AsF#YuibM@r1 zbC(j0Y+}jwU=mV;|L_-Di95yy#)f;ww2aS}5d=EF5d*Lu1Bnlx!mM=^ljXS?A@cDP z<^dzr7ILW*dhTV$V@0J~5OMNCbrg>ftME`1dZT-P1y|1Rhntc>Ci1fjhL;SLSAOH| zsq9<}WmNajs8yqD`KNEn65l2mClM?^NOmni6cuVE$OL`ETaa6fW^2&XSe$rQ_>mpTc<{c_(ztXYfjGWpJixmyYA(QiV ztE}F7i>foy+ndCfF6Ir7tx5SW#=j#_viOM^p|9s%^!Vv`gzl*$9a)9{X_$xpL#vT%$+z7^vJGz6bBxWCHzR#kYHD2zPJ4?G1?8=k;{;3^m z5{^531yDv3kYc>**4hi1exJ(lp@B(@z`cN(b$}4NLkL21;r#0kYOf+KT7Ej)e9F?^ znAEuZ2M6JL_8~O18{?T^1EuIVtI^y&b-+Q-BmVUzSK!tg30^E7zVNFJ+=Y3;t`f`g z713$gAVlgZJ|03Yegir)mc*SSP-9*QUo3u)K=)$BNk zPpqa}P}C)$AfWr)eKA09sdNY>0wj75Zgd9Od}h_D0Ykj|@w6vz=8f~IcsPO{59zab z#{;;E#E?MbB|r6>repD#4~FUUOW^0&rMr?NF_k}1vCE-A;I!-@DNOVL zo2DNzQg~%so%$Af#;8iVqoQ)wHUq(6hE@SJA!6Fp-(0EDU{=3&I&#$%VEDpK5?uvcCMIfHP_{*K-$3;e}aqVZVI!RBaR57tTw$E7?F=$G5 zhIZVP&F!wiij#xoyZz&fVt^;zjqApYMr>AHPU!Q z+${J;(RkA_T{1gOER|}D={0v8P9~*?IkfR)N%Eq9M3tHRZ}DK#)UO0)o1vY2o71@)>UbC<*z8I0+DFt9 zo=R8br~Qq_{UI48d%nF!kSu3d(;2m!XoN#^IGtjY_`uYj@#DY zQt?y{=67eSn)NnnSSS{w z=?Pt2V~4i)kzwg!x%jrevdnEK2M7b3yPlozM>mX!ARUjWi`tl9mdK~T{2>6C5 zc&ciG!-L%&$QbT|k7prqC8}w9{c{77Ii)U7P@0=1$v|Z6Q$mZ%_;~2JfVqSV_lU+V z8S5@g4qCtRS>RoaIndxc)&!jvKW<>Ipmnn?)O1ar+IkuIWOkCyY6lq(&;?(|*Up?C zE$_(I!iz2w$58>Y2)5rc-?={hdK-dyrG1Ldf0qb!9ehqsQ{YHMtG%FE@{SHxx})sm z5Bg?p(oTJ1p-x~_egU;Z@bY5Vt(A`m<=?q>q7=W7c$idRNY2Q=0niZv_}w*w5=M#l zce6ISH^E{Nxldj(19F(K>i{G@IFyA0d*4OL5x7JYW;ZS)gPcNyX?F`QHl;oouk|;J zV6^)>m@F8d7BT^^85LF|29saddU+3%KrXh9vIwMBG3ls>=Sw!(JLJ6(uO_#QUzg3Y z-EidNCe-Gr^6aI8Rk{~u)}2x2Y6$$DnnR{ts#5z=)Dhu}+pyQ8PFH~K9@ig|J?#TK zD0k8#QKeaB+jMt@H(N#z@=}z7!mCV< zueF~k_?$=$-G*srepxECLLI9ZoY&f^NxSbRc7{`=eF|0PD?Y_Rb%T^$e_?DQ0!V^v zxHYQ`zRp$ZO7+JPl$GTN>2+G0W^q6r=PJ~S5pNErq~IwrBN^Ul8>P@Geb6zxgA=oo z07G5$d>FeVBT%lPE@H&{YX;};6C!2Oe>GG@Xnip=1E8iL)T)zXqikI{f*uFr&K)=D zbPxAX2dp1Ju~x6skDkYK-=HV)sX>b1_b-o7c~prwd=_dO4^lx7xx9YwdB>(znVaKz z6)pB1Z4XgueB=9dU7M)fs=LRRZ>Gfc^GiG>61Mw4f#(P(2om8lyz+U!HQb=|pvPBU z+sGs<*%?J@YDbj0^5)8hGNqn~a^zt;FIC(8<`DmrW}fvbm2EdWpc7%WL4*&Jac#~s z)prA5_at8WS*H!gfVH+_8QO4jRfPJU8PB{2X_7u1Q3`v!mB7{9>st`TFl?LIHWP14 zrZUSh&%Orx*0T~F@0Pcrf0XDjDn&}%;iqUmaEm*_yG6H($S8!({t2$Zn7?C3Cnubp zI=aU0CbN4yGvMG&LN*x*nP&Z8V_@G$1`U3rQEDLr+&}ROID}?k)l<-Lo}e zH2|KPT$5S*YlE=fXzncmpNo$zsue^M2*Bw_WUVvlge}?)F@7}7XAH$sHtw)=1mJk; z!=^Q&>ud1L;lt#ZE_YN0WFd#Y*S$C1d=62%YZMVG=X^>8u*^B=5@;GtAAbU%PwZ|R zQ~%itiQqy5)qIabA^x)k!;08}0Ln2#$Hi0a-j~_eB74wGLb<*<2r42ow^O_(EzS~x z0zZvcj;hO+CM~AVV!jZ}-VMB8HuZj^#G$_xQ=1$DyQi#F7u99td^e4vF_Ms0i&K=u zWeH>nAYt2Z{~RC2Mh@oW?L{^sLf($O^Qcsz?&4TH_H(!txLt3rLYts0ICNs}faT!e0CzKz?Spta)Z4rjZA#O?r6p+1xmGE0~6FpO5P=l*YP6`y>hCc zev^|D?Z?yts9%)i5?oKXUA$thU|Orkq2wmy6F7y-TG^Ne9)X%HkeJ&hc@jwy&Bkzp zJQRIWxq+_)hG;kR?!(v>P2(R6Y^sQ_=0&UKdzk^LqmdDZG#s-e_=V-S6}w2r|==$OL~R)^wmz+{dZ^a-;=LwGq8>DP9&8p!2wMB0)mb^tl? z4PKlEPPNLSJ-oT#6z}5&=~~ODgH3A}ct;e+3X#`XsNww~Hl(6oyYPG5*x-a z>dGzYij=|}+h19@fPO|uuG@2;YpJC$PsO4*F{PzD`3P$1`a^bCP_V$(Qj{wP&Gy08 zJuX-8MaVyaz4jDKFE!xfZ2Ez)nZs@myzDahQ=bn@(ByY#(2L)qj})NRZkB0^2^@?9 zsHd!fiHiL2_WEKw5Kjbe8qy0jQl#fEduW5p4zf|{c80I#G6{tlk6&uA{|ohGq)aL) z6<(&IBbRx=W7fh|Lg9Z1Pli8@kb$pfSgN<(MrABm1r+v#fkYYfK$u?d4O?g4_QG$G z!s(f2R0B>4!m;l)1dl|x1pt$n5?xULGB$-xDSHXg6+`7Joe7w)fxJglY@-WYNnRKCxi>S6Y)tnC^i_ zgJDk2J+cRzKh-jKX&$87b`-j?O7^t)svE*PGAB}|e=dE^mcYh~j@?%G(?^wtA>S=5 zhXU%(lx8RweXI*9d$ND<=8b8C7L{ecxjOJpM&^3F4kSv{QUyN^CWSttiD3)W?OW6# zY&%QF)}mgI%mQ|sOl1rBKf$t9UtBF5GQ35=LN*j}6GdxlqiXgWM4b@}dA={I9;g>f z@-S)DFi6-V_&_UI=aj-La$PQ)jS*GayuT8V#__YE@-CwBerqlS4fY_(h)b4u!#&za?O;-+SZP(hvyL*KyeVYJZ|kG;jeojfV<@ zlz$_eOWYqe7=_&(oP-?l%W`yDjn_OvywG)ffVu=+BgJ<$Y12JG_DTu(&Ik&eR1$** zpmHch<5|l-`IMVZlM`9s?V>e24173#hLPWQUWL5hT$6j<$dnAIr^>OcfZ z^&8Lwz9Bs80SI3BKFkN)kes|w@;CT#P*_j^kb z(D}LnpG`cD4OH@$YZh&s9TtAAcdZY(X6C;uTZDn>&pdB^@La}n43md5ZJ)Tl>SH^~ z=n1!pLlSo4Gj=V`3^b{WH2yie4+?Ah*37O@iQb;fd_bJW?4^H`D@Q`o+H&9<_QL~zD z{?YCacCnX)r0N$c=+V99bX#dzx+1i;Hs<6;CP3eXlma0hd&X-8wq$;#gnZt+7_0JI zoyRJtSF~R&Q|-fW|EHrzVyPP1Syw4vcuUYXX`o@aT8U&qLDywIi7mBJdNQmpAZmXK z*vEbnomm`ri4nbdU{)HJE&FN#O*g5a@QHc+Y%bW3djH5d;aQjPjSZJFnvmBaGgG6x z37#8cV_kwr-*f=*h70KeBmgsc#jgOw1l@IfTQ0=N^w|u>COx6J6clW*nEV^?-P|8W zRUCc2+NSb*!jKfyp_Y)}s;H%7qmhxqaWTJy3)ak-Yh7T517|BfrD%vxuDJk0;5$D7 zD*6k1@k$CQ%D3nAo$-3$;aR(0Zb?oTYQq{Gm+AIsho{IabKC)9T(SpUHfv$EjRL4# z@ps?x?bY_rA4JNUGDm)bV#MwFr}X)sxuXV4j&-9Vw0<@W-460VyypC<5rkkGrEVh3`GVjgnKL5h*Ma!V{qUs0YMx zK#rmsf4*fF?sU>jz4Lk@+ni;iD@Wv^6zeHGaP> z20U|#NRTOn`fJ9XZxBC`APG7DkQG~hf=R#8ZigR;RDeP9osHHzZMHF47h<{EP#gct zo5#R7Oc4FIG5v<*BwUvFbflBhJ;hgA?{|v5Wk0%#EP0#vNcUSjWiR>tZKbFZCWlF? zhBXh-S-Om4o|syMWNb6@t*<;%yHh3189My(c3PJ{)^;w5Y=8~g84Ez|?1b707jc9r zc^^)Hldb`y^Pb)G#T#|_4NLvhYrw8U$q6sSV1e2L>pr;d{|1TS!bIAUnrw@@Y>4|} zl#;nP#H6shzzzwWx2GIko@jxfNz8%^7%;oV`C3O&f5;Q`Q75lVs5YJq#T!2A7utq2 zLal>6-HL|WeXqdE6Jl?|cnqrGNe}>%&F9QISkr526C^62!XxEEja*Ng=etMbivf#v z-wal@I$5ZtZuhyF)s{XeE-R8NB--HgK18d~X%J3h__XpDEdSD~&;7@}lfp8XGXh%H z)VYe{XJ&d>=h!pwxbjT&c<2W;VN763R1Htja#n>xHu}3rl#m>5Pc^uxnR`qMp(3(=F|{KJxeHO?@9q0%~<(H6C5mR3jSUQyS&SmFVz()JO(XF-DJpoN?%{eAc1Va z78|WF|7oA`N1uK7&S4p$h}Y86z^!Y}&`UyT-tz)?w`0}3989yFk6yy+e?@isn$Jq^ zx#@$UIX;7x{WBLIgoV0B;0OZqp(m$zRZeALkz{4b#bmGsxxJ9d=QR82=cv~$#oMn6 z`#{#97+bX_qFlki*m0+LCFbc7TxJ$pX?3HL8$n?yb%-?g_TIt%K}P!VC%bv{!QjL< z(zgqL{A%4-g*Z=xPGeOAls)oz>O`6-G$Lx)@B|V*>X?sdOwxDj!CifuayYV|CATFT zs5cyN^zfLH0n|Y>Q7%$EzzXeZ)@;*_?tM5(hf7x!IqqF~^L7Q2TLG8^jLg7p0|Y=m z0n|gO38z=)-@oWKy zB1DeK0^E#$94?}JjBaXm0VZJ~;&klT{3_GQ=Md^bh1%vz${ZjD^~E;j5QkB(t%kVE z=e3*VEL@eYXa1M%U3#)EllQC8%|AIY04zXJV7`)t=f~fLpWB#p&3Ebl zypEo={RtdwJ^$jdFp*>BzDTz0J=vO;T`qAmV7fk-1;o*HSTbD$xW^Pp$9*IX!rSnM zC5Gt^X@nW0E6@exV_*uJz$K0I^X_$rq=&OK1M>C?9a5tbgo0|KONHCUF>yCi(Sh#@ zhQa=+34R+Iu;523TnX}NHMU2vhLQseY=Esz=TZl}_@S$NOxh$Q70t z90@Em4B@59`)u-hsjK;&*j_!ARoQhVO71qH@afD+vy!_2VCRJjrdCQX))Z29MJ|W#S2*5^(}cS~njniZRGviVSya>bIQrs--T_ibjv*KgCh#8@wvzN70Qy z-0JTODvQ~!jO;t10S-g8$WaBbbVQiklw>51f#k~ERMFjtWWjQ>K(I3^cx@EjxMn!Y zT^VeM4=G|)LD@n*iev|55!vu9C0(jU8G<06kqSc^(eDd;aZi~aowsSo?lA{8d{>w^ zj1Cb=fr7Y5jzczp!LK$Q9x&~N=!*TFvJ^4AV;}a&3n=3A2-U;k|FbQftC%wxPB{;702jykoZ9J54t+o6bxWvXe zj3gp)0OCP@Iyev9Wb2Qr!9Cb;Bwe2k$JARz1&b6eqe^%Jm0K z@g4+5qF<0%Ib1ZyOmzgCpX%>ns{2fn=NNZea8vp*7Sv?W5zz%vZEg}y!US%l&0SX- zM7Vi8t+x&t`rQ>nvocHdrd&cr++{Wlwtt1fRV5o3O^#fvU|x84IwAM{2j+(N0q2h} zRo>70|J<<3x34>aXZMR2b=%gZ-3X5&dEfV|&(he1FaNf<*nP-Ig=mZMC$CX5>^i~u#ynAl$in-%t<8G(W<-d?iqMsn% zY%&T=8qtm~({Ec>%xJJ*(g^7Qt3gA)s=bMe!0NX zQFIFsfNviFj~oUz&qeMVlKcMipx*(BZyp$>r>%Q?vU>r>t)9PslK9vPL8}rQ_h8@d zY~c5oL~w75-Fp{CjMoud6VtS3Q2^bRJgo%N1C!RJB??spRlY0=T>%PAM1jQDy<%334J^y%F z2Zif4Rv$?s>m^kFY>i98d}j{bep*jWmLQH$Yi6pSIug&*qc+-9n#}OMna&hyCM&!3 zP;U^nGCksx8oROd*`szzH_@#KOdh5N0j)SL)N9#>+Z1}rywAM@+Dxgz#|CxEOcOZ^ zqGCcR6ba{!$Idw)EuaJ(VDq}pjYa|74d?mXtw+%GiwGEw*RGt0u6C^*!NBmoVbJG@ zOC+C&5f%kVvSBY7fx!Us?GVj+Z<|$x9tAf(;qNUsJ5~7TP)Qa3!CC_M`Y-3Sov?xL zM;MG%pOQsk?FvCr&j19Yf9^r|1q?&?#u}HC$bB3H2AVO#jjde#HNE!YU+&UF&55wG zTP+_Fh;*wy$Nw7#Q`1Mm)ZthHw`2?&JhbG@j2y`KCnm2W*m!tJl>9$`VB7M}05bZprJ;S^q6;F;CCi=Ie;T^T z-xeDT-amVq80X_#XWe;7XOZ<9(WV5k=+}j38BS9}|yznP?dR)oqSN8n(pimQG;h;Rdqm~3*Bs9>3uz^#?ukSvy%M*~q#YHj|A(quK+ zNj7o(CcaVT_z|j$c z^|v>_jf0Z|($iM^Jojt&>%Zr4O-3y@Ge41>MC8_Q0G$kOyCd=uD0ro0E#A{Jiz($7 z{Ys4fx1=VbNWoYrIsC3Ud#qVX0;m?|MnftsZhIE)p!;G~HEHhi;)9qB`EXoHaL3^t zJT^OVq>T`8n%sG*WN{{@f!+ZKM27tylKyVB(+zKQQbt7;%ZKx(w#oQKoIJFEni5UE zbj~$c?Zrm6DA~9@Ni|w^?t@?s#%h0X=_S;DfRXl z`_w18F3r7rqAGCTYSqQV%LAk7tkpL$V*Y1aB8Ze?h<-@mG12p!=1z1ZU4$8r!613$ zQ*0Rz^Ze8Vj;!kEfc|oq!XnLb6H`-J@8KNWgeH3;#@h8al5lXAgRo5H zKCuXRQ64(@Kj-Q67q2*KSwKyVH23eV3%FxY0*x?; zO9sZ8V>-@=&tqVd$)(kg8}-2XEt6aF{v@I*oq6+Ny}rlS$3^(f{iO_&4Su0;3)p)Y zx%?OY{0iHJ?|Zdhs9B<@{_D38i}r88+4`S!fm3}I)_KY@Efka&--tTxfD(k@78;d7 z3BE~HZ=ZbNKmin@x3)2(`{Q;{_=0e))qIs&0UsYcy)6svZHVEg{}aWEMVh9Ni!Hl( zhtx>aF02{unn=k+uq@pkL*(rBPaHQx zWY^Zq%MugOe`Tnb2wG=ya6!_$0hZ=P;JtM4zN8)n*01W6Bhg86=$+YP^WUlpNhCyV z&YQGQ6hHanV*R}`8LNt~?$P}24?$y}ag(Hl2$nhscxC@=0R~0y#5#1sK9+0$)bw}} zLSs_RE}XSd9aZX<955pMNTEZF^#l7`*Cf}*B+ou3r_3yU9D?RjlMRuSZ0F0PzEEP8 zTjLb$5zKezH^kg{ju+lx@t>fr9S^j9=xg zQ_@LlB$F7^)dJ{7aKEdeaKoa4AyDZaA4z1EEz+1Y71?y;4?{d-=RY0w({ow4}HA|f#)bjy&fkbjFLFtep4XAla(`8U0n zT^rnRaUDJpd~hYcb9h?gg!4y}g2;!R54!#6}N1PTQh+ye)imGxqTb*$>O{AC1eveo&H817lcGQa+pA`6?= zJr|SWSJDNSMCbse!z}0Og0EID%;lLnr?27aAD>YTVX5#zlqeb6&_WrfeGgzna|^IN z4R}!l0=f6woTtS&CT~bvr-F6I#2-}WmS(=26>fF$w&Os=ui;1XLcy|g1XdaSwg35QAEL}Oy~ zQ8ax@DcOt&CLFg|eIoS6_;7kKZH8om!O{DK2M#~6jL%}$b{fDw>a?pVe5dpX=2WBt zc!Ak*eb7|9CmxP6PzYu`#ugfnnj)L`!i1r1T<&)s@X{7}1yo@2jy7S%*aEC60A%hY z>_EICqIc#GDg@>Xsyyb3JBbuNld3O7f$s;KRM4;v86&h!PEy_obGv-`dO<>qe*xms zE_D9QZUJv6uLx;COo8YuPX1G+itD=TGTmX;XkY zE%v!wUJtxHGTm?u!yxGXu4;clB1L?+1){>wol+KGs`EV4+U`Rbu~;9l-B&S_EkD8b zccN*>D{vTU4FQMAlk6vv9gMoU{e5Oi3#guccOMWpc*JXCd-}9da>72!UzW}poOxx# z2{dCrmdoRO(9I^oFyW7;aGv7ryV$_cS=Rc7d&_L3+f)n+3Ua9Osv?-Oz=hA1z=V=G4_~ow_U(i$#O)^A!r;M9>kuBL(Ud+pFc6lt#(yTIP$21d& zkuX;zv8o;Ome3oy@cEcFP)mW#_;!q2AQtlykB@0mrGCy6?0t~ZK1M99Z<@D9p7XXm zVN~;lL-axit$_#rtH#0Hr!W$pJLW^w$vxBb;|mJVf?5C`sy@U$FtW{a$e;YgtvaT` zC~^WK^2HQU!;CjPLE2YiO!N!EAi6;Qpsim7R?-Kw_4vSXJK~3a@=Ww{(X^|X*1#hT ziYMVd_uN0`*CE;{%=X~7Ize0oBy7SkybpA*AE}U*KPdbQDU$0G-u=rfi1iF-?iu42FS?7F%+kg-c(RS&2W*KmEFNR47gG>OK30_q>R{ zjgk4s3X`5LxAa)Haz=@5vD~CO!i+Q5-)f}Gt|zX)FlV}2*|N3ZxOuMjDph)n@{LS! zgY79!ahF+j!}CR1_nBPIOQS{OUg7Q8iTXpiYW(}1*y|sE;kB`SQW@PJDR&-Kfvh^r z0XTtT5HywqT1kxKxk$ga7p8Z=F11|pUvBs+79rAEs5Q2|5eo2lv6L=PpRR!ESo=Yr ziWXiJ`>*kf-pD&QZ#ExS-Y2Cb#MiryCFhE7=w~`lSj}WaF(HL-!I;IRR;07Jmi`sW zoto0=&Cd(7HrJh{#LCGsWtduzu$OFekCLs&g{&`rqL_bj;uy)wh%zM=;L=||HvO7N zZ9iG`*bN`eEhJO60lREo<$V+?CVfltRhptrzx(oJ!uY}yILh|)fOXRWx*l$GMy8Rd2+C>gk2qsG4AaYo(yzaA{~}6cT_i2^;+IzRcck2ZjM<>O}gWmB{tU8 z&P7Q4e5X$xF-m &bxwHBxjEH@`=n?=3|}x?$`20lw&RNd#|kRHZ6D82c)8)A3M$WfXHozT6A8;h!tMTM|{%(6*`V)M)X)R6ZQazvRTZ`0h#f|FC zCH~~tBd8s(B4=2CajI1cNs}=O|5f+PCzpfWvtcgsSG!1u;P{e=+7l*kY}y{@PHS#q zFSMktdhswKbBD0hSdMgY>Nva|#++5A@lO9u|HCg}qXTzW*N~?+yXMdNvkl<=`_u2@ z;Mq4zmaIB-_T@)L@!RK^q&w#o!7o9MLiJI8Z=rZUze`wU>T>8uS%&z1<jI_3?^z9wr zO)qdQCiL3}=$l$yn{RJ#JW)v?Xpv2IgC{HVrXz_Y-45u)`m2fV zK}z)d_CmMS(g%xq_Dh1JVP5tHjksGq<85_t`V4Wjj*x%rp-=27{Zj4PXaa5n%cglQE z5jQA!yjWivstl@G$Sv4$r<_U8xU6}Nk>ORb2VN*$YN`LK16N8LySIB9)Mnb8{HJS+ z{P~oEUd`Hq$w}l+?p;!N%the+@^-yed7r5Fvj`+4o*tH7Tx>C)zdZbUEo+=VyBqj$ zM%?5T8V?29E=OtkI#%=vOZN(G7(2FG(D=S3Sg*EjEM1;_C4_H3yCy=dKZqn0%24sX z+8d(1#y&H$ZbsXQX~_F+P9o03;j_9A(f^ne>2+`yBs~QJC7^q%tqR4SSFeRLH0CQm z`i=}7X_wimkaPt#7KgO35SC-7y`SC!SH34?SqSiuIg5j1eb3h~#JrCJ=dP2^edx-& zM*5Ck*WGS&vmkJCHgY!49aeRu4FTRFoo)f1wU4L+`PEZOHV=boVel_G`$7XD8@lU) znHMEQ3wPA)DG>5pb$ZL$@K=b{IPT!!#5U86&_uuI}X8h%#_79uiLj0 z$5dL#%v{XyT;@Vaveh*me8WP0b}vv3vdt0HD zT!=mcJB%@27LUJ-t!Cpr=T&090t`HckN}@>c5!aFBs#KEq3=A$tXHNlFD11@1mEi+ zo2OhiC&c&>(UbgZ9jAWAc$eZ1B=!h0BYxXDvlB~!9~99i^{=CP% zl~GfAy~HmyXseeKQhxDq8qa(%SDZon$il z8f$VuLf$*Eaf{^3I}S3tN2tCt4?zbJx0Ero(^*-3d$H|%HaIB`6|(wk{Z#ZPuPJ%F z>LLBM@y)XP#Qn8QJBeSomeM0@3e}Jqi~mq+gX5gjXX@{V`8`p)XOkj|FE!zgY<&9T zq0yDA)+WfxiCIwe2m#+SdZAd*uuIv!WxPzUj09>qOUCEr^hPh8-MttH9sL+msQCSD z!+Y4oBb49iS3|zV%GO!Z+vPu(rpKQC8#c6043`lB!{=7obb97bpk`GH^84ydv9U}_ zCl)Z*-Xk3^`+I;Cr5O+ggII_TGf6QoG;MMYPPo*@BX* z56_}7_>)>GE0-V6EVq`8PHhRLqsoGVqXsr4LOJ4HKJ6H|AKYVT9byt{D(}28DX)md zoOkUyPh_zvbdP8L6GB(IeBC0j*jW<0*Y86rr@1CurWLy%w3+K1(P6`8I}`VPTOhKN zN4;j6zb{!Zz%&kSkY0STu!Sml4q;XQs|Hf-T)=d0;HuJ3HPFg2Uuu)>jq8HQ4GtI` z3&glZX+p{$_qvO>qWz!Sl)D7UOe0E1iQghby|$Uig#!{AcZF2{T<;e;E;U`&?}%z3 z;lO2&+@i++1^kqjPs~8bVq_>(#+1?g3#S!6`|u5YrP}s#lS_*qHD4CT!PjoB({^-a zhy)LADQquCPZD+XlU4LyegyyZ^mk@|ddhtqR{`Ra3JMmoZWQWiV0BrjZH|^c@5cgz z(E%8W=tQ$Za;&|oV_DYOzoK#)dHs@8L;t$!4POPE7y`$$dIKCqTwPvk9Sbiai~ICs zeg>2rZC-vWoR@UFt>d$K4%pJl-UXDa*OPfx&WBjq9PU(YB*l`$BdxC>F(JPA7Nd~) z*=2@e@Pb9gn#A7e%-owaZ!L5J{yogRRK54pAAj8^Zv7-sV|jG&Z^y^|5&pIHT+kQ! ztSja0rGY!?r^EP$){BxPfB_vF+1^O{aw<(Ls!ac)LHR;s!Ne1?`#|ihgsFQHtUOcZ zlB;B5pOz@Z(Q+|BwoKRUVEBvL<)+L(G_Sf^!yKM=(NO^6&d<*h$h@X`&CuF9Ly#iq zZ(7Gb4?A&YlS zsOm%PAI}dtV(v+4jlYn<8oG^B@PH5)WxnHjZ21EF#F%o$M8$xrn`^g>iK$M&<{VB2 z3d}*ycAZwTODr=spY&%~S^_i%(JHGZR9h8~%AgKp=7jb<1O%NJ?Mtrj^a3btvY z$w|+Q!*;eJDQx_-9{eq|fD8(`+&aRYo zUtRX?`Cj7<7JPUz7&>aBx>^pYn$0oKgn;rrivF$s{$kRTb1`S7*%B$LL@(x9t= z!@rEty(bGMwdK@^GbI(@ECENHp1*Cw$P6OCn51Lv_laN-M ztEyJ!0%TU)U{3nyn5Z?KpGAOTl`ag#+f_>&`;J_Kei4@^(IW>UNsdLVhON6U;(1O; zi0U1R5|bQDlgs?A`PjIwo4xUQ?~YDdq>Scy75B5-x06O1xs zh}3@}x+^rqROvqTuFHT>Q9=XyTYMSo?hNK)cn@N@;_<+ki3|5x4@10&-2DF?MYqJ38FD2Fcs*L*`~#i%fEF@2i|OD zPtpkqNN%=YXt|hDi*-zEocSh7wtCvzCqOu#Y_nk70@n!{gMGdI&Nu z>OR|Ncs?>D6MPTj1n}h)p^CuS*2k$o1qVfNKW*c$qzv2RiPjMVP zYBQVv^*5T{O76XX6V2*i>8#egbj^C5~)yZ%%e|4a%NExPpi4Y(-FdnO@Il7v6b$gqcsF+ zjp>7#U3-z>=?w?i*Iam16ljCE!(|0K;TEIzR+@fTj}Gc}DWs=640Lf2ZJXJ;5FNy+ z>kRH=y&%b@Ug!Z-!sIw!CF_=f9R@$O(Dqp9g7EY0AxF&Lle_3o+X@*RG_|cl5FUsD zp1wJ9*Z~hz9+wb(1g`ja#%rpCz4Q_V$F;+Sm3(b+9ER?X2ontdTzXah)naMo9wCv1 zs9K*Pf}NI24Ll5lbA#8#f?X!cPASdBvU=KOHoRX#D;p7`VaK>dcv7c2|2@y!^Q2Db z@s!67NR{@?Hp33(D>SUi+MYVe*ug$?Jfx}^eny0SCte&XeBA(JeMKKlC9uMSM|f#9 z<05k4bM@ca=tUY3bvRu_oHDEX0(6B)QisANCxlzOJbqh0=!7#&@5*+r`WMB|JU`Xe zBzZ?sPXX3SV6$?VjynC&$X2t|5~tfhiSq?!51q8Q7l$rC#Wop!WOU$HOf;jlM`-u~ zC|O?o*t_W0DV^uvO0#}*7I<>N1v^;6z6s?A%nfI~gnv{7R{IQ}ip-o*lnOJx?zw?N zzrGMmeV~2HzQBRCP1EfX7-boka`IWzHFHqV+C5Q=&;Itq)0cInnE6YEvd|)rVc3XE-rEmb~eqhG*8jOW6aX{Fl$ILSodC zW@IMaVR2^vmHoRjp>agbBh}U}^K$Sel@7CEmYGh7U{Y;2$IFR&zT*nWX#Bvlj% zjoH=Dz~h=-H~POV`u@n|9*t6wm%L7w9IxQtDI3!Avl$D2n>7U`w_78H(W=D!If+FL z%;%z3nk_}A~1;K2J-x-mtqDh;uY_)(u>=;huhh#u|!jG=#-R01B)XVVQFL5as z(%0sdp-(zO1&=~K@TABhT)LjllI5AgS|<0_B(#=z-z~)LuxElrfJRW z-y!2d@Tg8KzY=DJO|$LtQho@zC=m!F%!Q3vNiC0_oyGB9>6x z4SLonNJ2L;DHz3JG2iJS>$f?}vzzS*rYam`CEs5=7J!SGvNqa+I@j*v(t1E8O19hG z$%Uj}@z#3-?d+MyS-c=xukqd2Ei~r#E5}Y;I)#=&T6Ls>8dDU)C!dRdy^t>)-3=$7 zCBhK^j2T=FQgQ|6mhpJ11|drc<0}jGQ4!eTRm9#aTtO`Alp|U}pTx*^$1=sgA2?Tg z+)LNaG_zBmoZPY9b_R;O2%ra7SYM6$R*`_voKAyk*VrY2>hi1l;NwL)mms&ReUfo!* zi*ThYiX?NJSDm`q$Nn5f3kxtnpLQi3EUA2QCD5pDrH-$~58a?NH8A|GU+D8pHOKf$x{L<_n8I(+lsi2QprYhFB87(+|5l`dVg^-Uf$hjxBwBLKiy1Fw;aNlmKXP{2zsl@+`A5Kp?{9iS>dY?pB4v) zfnJ<{|8#9vEivTr_k{*s((0n;b^{s$)avVFwP?+Qyc$9KD$l92aN0a!D4B$3*wy~$ zJYotl$xHsH&lB$-SwGHVhhnZBuhKBEPhmfbiY|uonY8)r@J@OG8`GZ( z4l*StRJnHOFc`Png|B5KyS@?&*j>(b@i#d2>ylXICSA6xbjhE1`b0#;1tnfq><|rd=7atdoH1X9AT#SHZ_h=+Gv;%hUZr>C3Vn@M z%@t#oXp{P<>Y){BHamY^c}0-F~cV%E=RU61kU_!4$bG3yG9f89gs zFDY<^LLPtbla{ITho<^2>=)$(mloR8Z}ll!;H|`rdZ0#%4GcmU{PbIagsq3IZ{j>w z4{{u3bG$eKJ8B&WOc8H8`s{s@{t<+|%qb-Jw*o~_yG@rcTJf|FhEa=(8~}p=Mx_e) z-6Rmyp^Co&``*#oQVfSgI;H7&II#67yXKk?);up>>rFv~TrMbHVjdFhKOL0)IiFKC`$1C^y6 z3pcFFen6k1H#2zsiQCUk8`w>lq{Oc$|DI$iITOlYamf01Z->yfSm79xyFbD+2(aY; z4kc%~Yk%M<0Jg&FMG;$FTT4JR}^4jn|lbAc*T z)i5gg{2(tWcNl9zR4sw=6fxTxrc=ovP*G{1{A{N#n|^Lk`=vuLZ4GR+wH4_#_b;<1 zfw(d&E5T2GwI?+d)MyTN-5&e20vh(cy#PQQSHDL7qyFbB)vSf3xiUZ*;#0vjZGuJP zct@%IcieHjNq+wy@we@x2X?!==GSqiHKt$Aex3xjC;7%irNLblm}`N;UBVZ`;9jr* zl!WGZSS3oX9fqV_%_ZMi;g>yiO6G5ZR)U}RSP*?M%i5UW6{q#D0w~KDwn8Eln}K7~ z{nP#GfQ6KUy8kv=9JK5J>d2K|;oq8L7G8qe&pn@<-sH=>N^(60bAlTm`>TtY>&hZ# z3%eTaTFQ(_0*Mb^huKkJ6mwd<{@MhmU)#Of5Pz`*nzbcmKN+gYDi*2x*`6@Q14 zTnQ{rs3|K@X+Yt0$U~YIYnWQ792N9TJBhkGF+_v4MQw}OJIF5QJ9|X#VBr*h*Wia; zYC?E2Y-*rpKv$OFkEkdV$8`-cw)dPb{()pp2DxgmA@IEOL7NM{8JQ_ED~}6KDc+fC zGPeJ^zTKc;3L&lCu$QqEiv`Eila-A-PG}?{;7`pXQ&eoW$tbtHLiJ-=UFdl}A*oW- zA2^dP`>mg;9Nbd&W)&N+t;K$aZHlsE?R*W*Nq-tFix4aEVY&zG^h$<>T+7(>%#y$$r?wJ#k-h)X~zjL-s1=z3+}pb^gf57l_#zgNU`~Xjs?D zY{AJ1y;g1VD=ks{jIN4<`JH{z5dud>;uW;e1sA}Z){@v

      B@jrB<&e*Oe|RfXy;1 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

      0#(G`O`E&@lZcHJ_KPL?XFzYEg+1abv%jhcs` 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 b2lQu`!o1M?y^kmf9;qs6DptR=2>X8kl!#Wm diff --git a/geode-docs/managing/management/jmx_manager_operations.html.md.erb b/geode-docs/managing/management/jmx_manager_operations.html.md.erb index da8ca6a99b9d..5d578819b130 100644 --- a/geode-docs/managing/management/jmx_manager_operations.html.md.erb +++ b/geode-docs/managing/management/jmx_manager_operations.html.md.erb @@ -57,7 +57,7 @@ is currently online. Process ID: 27144 Uptime: 5 seconds <%=vars.product_name%> Version: <%=vars.product_version%> -Java Version: 1.<%=vars.min_java_version%>.0_<%=vars.min_java_update%> +Java Version: <%=vars.min_java_version%>.0.<%=vars.min_java_update%> Log File: /Users/username/apache-geode/locator1/locator1.log JVM Arguments: -Dgemfire.enable-cluster-configuration=true -Dgemfire.load-cluster-configuration-from-dir=false diff --git a/geode-docs/tools_modules/gfsh/tour_of_gfsh.html.md.erb b/geode-docs/tools_modules/gfsh/tour_of_gfsh.html.md.erb index 5e9dd5b79b58..98983f5f61ce 100644 --- a/geode-docs/tools_modules/gfsh/tour_of_gfsh.html.md.erb +++ b/geode-docs/tools_modules/gfsh/tour_of_gfsh.html.md.erb @@ -61,7 +61,7 @@ as locator1 is currently online. Process ID: 67666 Uptime: 6 seconds <%=vars.product_name%> Version: <%=vars.product_version%> -Java Version: 1.<%=vars.min_java_version%>.0_<%=vars.min_java_update%> +Java Version: <%=vars.min_java_version%>.0.<%=vars.min_java_update%> Log File: /home/username/gfsh_tutorial/locator1.log JVM Arguments: -Dgemfire.enable-cluster-configuration=true -Dgemfire.load-cluster-configuration-from-dir=false @@ -180,16 +180,12 @@ Starting a <%=vars.product_name%> Server in /home/username/gfsh_tutorial/server1 ... Server in /home/username/gfsh_tutorial/server1 on 192.0.2.0[40404] as server1 is currently online. -Process ID: 68375 -Uptime: 4 seconds +Process ID: 49601 +Uptime: 2 seconds <%=vars.product_name%> Version: <%=vars.product_version%> -Java Version: 1.<%=vars.min_java_version%>.0_<%=vars.min_java_update%> -Log File: /home/username//gfsh_tutorial/server1/server1.log -JVM Arguments: -Dgemfire.locators=localhost[10334] - -Dgemfire.use-cluster-configuration=true -Dgemfire.start-dev-rest-api=false - -XX:OnOutOfMemoryError=kill -KILL %p - -Dgemfire.launcher.registerSignalHandlers=true - -Djava.awt.headless=true -Dsun.rmi.dgc.server.gcInterval=9223372036854775806 +Java Version: <%=vars.min_java_version%>.0.<%=vars.min_java_update%> +Log File: /home/username/gfsh_tutorial/server1/server1.log +JVM Arguments: -Dgemfire.enable-cluster-configuration=true Class-Path: /home/username/geode/geode-assembly/build/install/apache-geode/lib /geode-core-1.2.0.jar:/home/username/geode/geode-assembly/build/install /apache-geode/lib/geode-dependencies.jar @@ -299,7 +295,7 @@ server2 is currently online. Process ID: 68423 Uptime: 4 seconds <%=vars.product_name%> Version: <%=vars.product_version%> -Java Version: 1.<%=vars.min_java_version%>.0_<%=vars.min_java_update%> +Java Version: <%=vars.min_java_version%>.0.<%=vars.min_java_update%> Log File: /home/username/gfsh_tutorial/server2/server2.log JVM Arguments: -Dgemfire.default.locators=192.0.2.0[10334] -Dgemfire.use-cluster-configuration=true -Dgemfire.start-dev-rest-api=false diff --git a/geode-docs/tools_modules/http_session_mgmt/chapter_overview.html.md.erb b/geode-docs/tools_modules/http_session_mgmt/chapter_overview.html.md.erb index 04c099ca1e52..d0513b459f61 100644 --- a/geode-docs/tools_modules/http_session_mgmt/chapter_overview.html.md.erb +++ b/geode-docs/tools_modules/http_session_mgmt/chapter_overview.html.md.erb @@ -21,7 +21,9 @@ limitations under the License. The <%=vars.product_name_long%> HTTP Session Management modules provide fast, scalable, and reliable session replication for HTTP servers without requiring application changes. -<%=vars.product_name_long%> offers HTTP session management modules for tc Server, Tomcat, and AppServers. +<%=vars.product_name_long%> offers HTTP session management modules for Tomcat and AppServers. + +**Note:** As of version 2.x, Geode only supports Tomcat 10.1 and later versions (Jakarta EE namespace). Support for Tomcat 7, 8, 9, and Pivotal tc Server has been discontinued. These modules are included with the <%=vars.product_name_long%> product distribution, and installation .zip files can be found in the `tools/Modules` directory of your product installation. @@ -49,13 +51,9 @@ These modules are included with the <%=vars.product_name_long%> product distribu This section describes the configuration of non-sticky sessions. -- **[HTTP Session Management Module for Pivotal tc Server](../../tools_modules/http_session_mgmt/session_mgmt_tcserver.html)** - - This section describes how to set up and use the HTTP session management module with tc Server templates. - - **[HTTP Session Management Module for Tomcat](../../tools_modules/http_session_mgmt/session_mgmt_tomcat.html)** - You set up and use the module by modifying the Tomcat's `server.xml` and `context.xml` files. + You set up and use the module by modifying Tomcat's `server.xml` and `context.xml` files. Supports Tomcat 10.1 and later (Jakarta EE). - **[HTTP Session Management Module for AppServers](../../tools_modules/http_session_mgmt/session_mgmt_weblogic.html)** diff --git a/geode-docs/tools_modules/http_session_mgmt/common_gemfire_topologies.html.md.erb b/geode-docs/tools_modules/http_session_mgmt/common_gemfire_topologies.html.md.erb index e0bf3a93eeff..ebc217db5286 100644 --- a/geode-docs/tools_modules/http_session_mgmt/common_gemfire_topologies.html.md.erb +++ b/geode-docs/tools_modules/http_session_mgmt/common_gemfire_topologies.html.md.erb @@ -33,4 +33,4 @@ In a peer-to-peer configuration, each instance within an application server cont -In a client/server configuration, the Tomcat or tc Server instance operates as a <%=vars.product_name%> client, which must communicate with one or more <%=vars.product_name%> servers to acquire session data. The client maintains its own local cache and will communicate with the server to satisfy cache misses. A client/server configuration is useful when you want to separate the application server instance from the cached session data. In this configuration, you can reduce the memory consumption of the application server since session data is stored in separate <%=vars.product_name%> server processes. +In a client/server configuration, the Tomcat instance operates as a <%=vars.product_name%> client, which must communicate with one or more <%=vars.product_name%> servers to acquire session data. The client maintains its own local cache and will communicate with the server to satisfy cache misses. A client/server configuration is useful when you want to separate the application server instance from the cached session data. In this configuration, you can reduce the memory consumption of the application server since session data is stored in separate <%=vars.product_name%> server processes. diff --git a/geode-docs/tools_modules/http_session_mgmt/quick_start.html.md.erb b/geode-docs/tools_modules/http_session_mgmt/quick_start.html.md.erb index fae1198d18f6..6d0b5bf3e1fe 100644 --- a/geode-docs/tools_modules/http_session_mgmt/quick_start.html.md.erb +++ b/geode-docs/tools_modules/http_session_mgmt/quick_start.html.md.erb @@ -22,10 +22,10 @@ limitations under the License. In this section you download, install, and set up the HTTP Session Management modules. Following the Apache Tomcat convention, this page assumes the CATALINA_HOME environment variable is set to the root directory of the "binary" Tomcat distribution. -For example, if Apache Tomcat is installed in `/usr/bin/apache-tomcat-9.0.62` then +For example, if Apache Tomcat is installed in `/opt/apache-tomcat-10.1.30` then ``` -CATALINA_HOME=/usr/bin/apache-tomcat-9.0.62 +CATALINA_HOME=/opt/apache-tomcat-10.1.30 ``` ## Quick Start Instructions @@ -34,61 +34,46 @@ CATALINA_HOME=/usr/bin/apache-tomcat-9.0.62 | Supported Application Server | Version | Download Location | |------------------------------|---------|-------------------------| - | tc Server | 3.2 | [https://network.pivotal.io/products/pivotal-tcserver](https://network.pivotal.io/products/pivotal-tcserver) | - | Tomcat | 8.5 | [Tomcat 8 Software Downloads](https://tomcat.apache.org/download-80.cgi) | - | Tomcat | 9.0 | [Tomcat 9 Software Downloads](https://tomcat.apache.org/download-90.cgi) | + | Tomcat | 10.1+ | [Tomcat 10 Software Downloads](https://tomcat.apache.org/download-10.cgi) | + | Tomcat | 11.x | [Tomcat 11 Software Downloads](https://tomcat.apache.org/download-11.cgi) | - The generic HTTP Session Management Module for AppServers is implemented as a servlet filter and should work on any application server platform that supports the Java Servlet 3.1 specification. + **Note:** Support for Tomcat 7, 8, 9, and Pivotal tc Server has been discontinued. Tomcat 10.1+ requires Jakarta EE (jakarta.servlet.* namespace). + + The generic HTTP Session Management Module for AppServers is implemented as a servlet filter and should work on any application server platform that supports the Java Servlet 6.0 specification (Jakarta EE). 2. The HTTP Session Management Modules installation .zip files are located in the `tools/Modules` directory of the product installation directory. Locate the .zip file for the HTTP Session Management Module that you wish to install. Unzip the appropriate HTTP Session Management Module into the specified directory for your application server: | Supported Application Server | Version | Module | Target Location for Module | |------------------------------|----------|------------------------------------------------------|----------------------------------| - | tc Server | 2.9 | Apache_Geode_Modules-SERVER-VERSION-tcServer.zip | `/templates` | - | tc Server | 3.2 | Apache_Geode_Modules-SERVER-VERSION-tcServer30.zip | `/templates` | - | Tomcat | 8.5, 9.0 | Apache_Geode_Modules-SERVER-VERSION-Tomcat.zip | `$CATALINA_HOME` | + | Tomcat | 10.1, 11 | Apache_Geode_Modules-SERVER-VERSION-Tomcat.zip | `$CATALINA_HOME` | + + **Note:** Support for Pivotal tc Server has been removed. Users should migrate to Tomcat 10.1 or later. 3. Complete the appropriate set up instructions for your application server described in the following sections: - - [Additional Quick Start Instructions for tc Server Module](quick_start.html#quick_start__section_EE60463F524A46B7B83CE74C1C3E8E0E) - [Additional Quick Start Instructions for Tomcat Module](quick_start.html#quick_start__section_4689A4FA609A4F4FB091F03E9BECA4DB) - [Additional Instructions for AppServers Module](quick_start.html#quick_start__section_1587C3E55F06406EBD4AB13014A406D4) -## Additional Quick Start Instructions for tc Server Module - -These steps provide a basic starting point for using the tc Server module. For more configuration options, see [HTTP Session Management Module for Pivotal tc Server](session_mgmt_tcserver.html). As a prerequisite, module set up requires a JAVA\_HOME environment variable set to the java installation. - -1. Navigate to the root directory of tc Server. -2. Create a <%=vars.product_name%> instance using one of the provided templates and start the instance after starting up a locator. For example: - - ``` pre - $ gfsh start locator --name=locator1 - $ ./tcruntime-instance.sh create my_instance_name --template geode-p2p - $ ./tcruntime-ctl.sh my_instance_name start - ``` - - This will create and run a <%=vars.product_name%> instance using the peer-to-peer topology and default configuration values. Another <%=vars.product_name%> instance on another system can be created and started in the same way. - - If you need to pin your tc Server instance to a specific tc Server runtime version, use the `--version` option when creating the instance. - ## Additional Quick Start Instructions for Tomcat Module These steps provide a basic starting point for using the Tomcat module. For more configuration options, see [HTTP Session Management Module for Tomcat](session_mgmt_tomcat.html). -1. Modify Tomcat's `server.xml` and `context.xml` files. Configuration is slightly different depending on the topology you are setting up and the version of Tomcat you are using. +1. Modify Tomcat's `server.xml` and `context.xml` files. Configuration is slightly different depending on the topology you are setting up. - For example, in a peer-to-peer configuration using Tomcat 9, you would add the following entry within the `` element of server.xml: + For example, in a peer-to-peer configuration using Tomcat 10.1+, you would add the following entry within the `` element of server.xml: ``` pre + locators="localhost[10334]" /> ``` and the following entry within the `` tag in the context.xml file: ``` pre - + ``` + **Note:** For Tomcat 10.1+, use `Tomcat10DeltaSessionManager`. Support for Tomcat 7, 8, and 9 has been discontinued. + See [Setting Up the HTTP Module for Tomcat](tomcat_setting_up_the_module.html) for additional instructions. 2. Start the Tomcat application server. diff --git a/geode-docs/tools_modules/http_session_mgmt/session_mgmt_tcserver.html.md.erb b/geode-docs/tools_modules/http_session_mgmt/session_mgmt_tcserver.html.md.erb index 8af8a039afd7..f9d01d4e9e98 100644 --- a/geode-docs/tools_modules/http_session_mgmt/session_mgmt_tcserver.html.md.erb +++ b/geode-docs/tools_modules/http_session_mgmt/session_mgmt_tcserver.html.md.erb @@ -1,5 +1,5 @@ --- -title: HTTP Session Management Module for Pivotal tc Server +title: DEPRECATED - Pivotal tc Server Support Removed --- -You set up and use the module by modifying the Tomcat's `server.xml` and `context.xml` files. +You set up and use the module by modifying Tomcat's `server.xml` and `context.xml` files. -For instructions specific to SpringSource tc Server templates, refer to [HTTP Session Management Module for Pivotal tc Server](session_mgmt_tcserver.html). +**Note:** Geode only supports Tomcat 10.1 and later versions (Jakarta EE). Support for Tomcat 7, 8, 9, and Pivotal tc Server has been discontinued. For tc Server users, migration to Tomcat 10.1 or later is required. - **[Installing the HTTP Module for Tomcat](../../tools_modules/http_session_mgmt/tomcat_installing_the_module.html)** diff --git a/geode-docs/tools_modules/http_session_mgmt/session_mgmt_weblogic.html.md.erb b/geode-docs/tools_modules/http_session_mgmt/session_mgmt_weblogic.html.md.erb index 0ef18684ba71..a8bc272a2703 100644 --- a/geode-docs/tools_modules/http_session_mgmt/session_mgmt_weblogic.html.md.erb +++ b/geode-docs/tools_modules/http_session_mgmt/session_mgmt_weblogic.html.md.erb @@ -21,7 +21,7 @@ limitations under the License. You implement session caching with the HTTP Session Management Module for AppServers with a special filter, defined in the `web.xml`, which is configured to intercept and wrap all requests. -You can use this HTTP module with a variety of application servers. Wrapping each request allows the interception of `getSession()` calls to be handled by <%=vars.product_name%> instead of the native container. This approach is a generic solution, which is supported by any container that implements the Servlet 3.1 specification. +You can use this HTTP module with a variety of application servers. Wrapping each request allows the interception of `getSession()` calls to be handled by <%=vars.product_name%> instead of the native container. This approach is a generic solution, which is supported by any container that implements the Jakarta Servlet 6.0 specification (Jakarta EE 10). - **[Setting Up the HTTP Module for AppServers](../../tools_modules/http_session_mgmt/weblogic_setting_up_the_module.html)** diff --git a/geode-docs/tools_modules/http_session_mgmt/tc_additional_info.html.md.erb b/geode-docs/tools_modules/http_session_mgmt/tc_additional_info.html.md.erb index 43bf40357732..47cf2ce74c86 100644 --- a/geode-docs/tools_modules/http_session_mgmt/tc_additional_info.html.md.erb +++ b/geode-docs/tools_modules/http_session_mgmt/tc_additional_info.html.md.erb @@ -45,7 +45,7 @@ To acquire <%=vars.product_name%> module version information, look in the web se ``` pre INFO: Initializing <%=vars.product_name%> Modules Java version: 1.0.0 user1 041216 2016-11-12 11:18:37 -0700 - javac 1.<%=vars.min_java_version%>.0_<%=vars.min_java_update%> + javac <%=vars.min_java_version%>.0.<%=vars.min_java_update%> Native version: native code unavailable Source revision: 857bb75916640a066eb832b43b3c805f0dd7ed0b Source repository: develop diff --git a/geode-docs/tools_modules/http_session_mgmt/tc_setting_up_the_module.html.md.erb b/geode-docs/tools_modules/http_session_mgmt/tc_setting_up_the_module.html.md.erb index 68802881d350..4757397cad29 100644 --- a/geode-docs/tools_modules/http_session_mgmt/tc_setting_up_the_module.html.md.erb +++ b/geode-docs/tools_modules/http_session_mgmt/tc_setting_up_the_module.html.md.erb @@ -71,8 +71,8 @@ With a similar environment to this example that is for a client/server set up, ``` pre TC_VER=tomcat-8.0.30.C.RELEASE INSTANCE=geode-cs -CLASSPATH=$PWD/$INSTANCE/lib/geode-modules-1.0.0.jar:\ -$PWD/$INSTANCE/lib/geode-modules-tomcat8-1.0.0.jar:\ +CLASSPATH=$PWD/$INSTANCE/lib/geode-modules-2.0.0.jar:\ +$PWD/$INSTANCE/lib/geode-modules-tomcat8-2.0.0.jar:\ $PWD/$TC_VER/lib/servlet-api.jar:\ $PWD/$TC_VER/lib/catalina.jar:\ $PWD/$TC_VER/lib/tomcat-util.jar:\ @@ -111,7 +111,7 @@ lifecycleEvent INFO: Initializing <%=vars.product_name%> Modules Modules version: 1.0.0 Java version: 1.0.0 user1 032916 2016-11-29 07:49:26 -0700 -javac 1.<%=vars.min_java_version%>.0_<%=vars.min_java_update%> +javac <%=vars.min_java_version%>.0.<%=vars.min_java_update%> Native version: native code unavailable Source revision: c36591b73243c7ee3a0186710338453d12efe364 Source repository: develop diff --git a/geode-docs/tools_modules/http_session_mgmt/tomcat_changing_gf_default_cfg.html.md.erb b/geode-docs/tools_modules/http_session_mgmt/tomcat_changing_gf_default_cfg.html.md.erb index 418671d82894..633e4f335b96 100644 --- a/geode-docs/tools_modules/http_session_mgmt/tomcat_changing_gf_default_cfg.html.md.erb +++ b/geode-docs/tools_modules/http_session_mgmt/tomcat_changing_gf_default_cfg.html.md.erb @@ -82,7 +82,7 @@ To edit <%=vars.product_name%> cache properties such as the name and the charact ``` pre ``` +**Note:** For Tomcat 10.1 and later, use `Tomcat10DeltaSessionManager`. Support for Tomcat 7, 8, and 9 has been discontinued. + The following parameters are the cache configuration parameters that can be added to Tomcat's `context.xml` file.

      **CommitSessionValve**
      diff --git a/geode-docs/tools_modules/http_session_mgmt/tomcat_installing_the_module.html.md.erb b/geode-docs/tools_modules/http_session_mgmt/tomcat_installing_the_module.html.md.erb index 9590dff4ba5d..79ef6bcea6b6 100644 --- a/geode-docs/tools_modules/http_session_mgmt/tomcat_installing_the_module.html.md.erb +++ b/geode-docs/tools_modules/http_session_mgmt/tomcat_installing_the_module.html.md.erb @@ -21,12 +21,12 @@ limitations under the License. This topic describes how to install the HTTP session management module for Tomcat. -1. If you have not already installed Tomcat, download the desired version from the [Apache Website](http://tomcat.apache.org/) and install it. +1. If you have not already installed Tomcat, download version 10.1 or later from the [Apache Website](http://tomcat.apache.org/) and install it. **Note:** Geode only supports Tomcat 10.1 and later versions (Jakarta EE). Support for Tomcat 7, 8, and 9 has been discontinued. 2. Following the Apache Tomcat convention, this page assumes the CATALINA_HOME environment variable is set to the root directory of the "binary" Tomcat distribution. - For example, if Apache Tomcat is installed in `/usr/bin/apache-tomcat-9.0.62` then + For example, if Apache Tomcat is installed in `/opt/apache-tomcat-10.1.30` then ``` - CATALINA_HOME=/usr/bin/apache-tomcat-9.0.62 + CATALINA_HOME=/opt/apache-tomcat-10.1.30 ``` Define $CATALINA_HOME if it is not already defined. @@ -48,12 +48,15 @@ This adds jar files to the `lib` subdirectory and XML files to the `conf` subdir unzip $GEODE_HOME/tools/Modules/Apache_Geode_Modules-SERVER-VERSION-Tomcat.zip ``` - -6. Copy all of the jar files from the <%=vars.product_name%> `lib` subdirectory to the `lib` subdirectory of your Tomcat server (`$CATALINA_HOME/lib`): +6. **CRITICAL:** Copy all of the jar files from the <%=vars.product_name%> `lib` subdirectory to the `lib` subdirectory of your Tomcat server (`$CATALINA_HOME/lib`). + + **The module zip file alone does not contain all required dependencies.** You must copy all Geode libraries including `geode-core`, `geode-common`, Jakarta Transaction API, and other runtime dependencies: ``` cd $CATALINA_HOME/lib cp $GEODE_HOME/lib/*.jar . ``` + + **Note:** Without these libraries, Tomcat will fail to start with `ClassNotFoundException` errors for Geode classes. The Geode session management module requires the complete Geode runtime, not just the module JARs included in the zip file. Proceed to [Setting Up the HTTP Module for Tomcat](./tomcat_setting_up_the_module.html) to complete your Tomcat configuration. diff --git a/geode-docs/tools_modules/http_session_mgmt/tomcat_setting_up_the_module.html.md.erb b/geode-docs/tools_modules/http_session_mgmt/tomcat_setting_up_the_module.html.md.erb index 1698795c3edb..0524c37c7514 100644 --- a/geode-docs/tools_modules/http_session_mgmt/tomcat_setting_up_the_module.html.md.erb +++ b/geode-docs/tools_modules/http_session_mgmt/tomcat_setting_up_the_module.html.md.erb @@ -27,32 +27,37 @@ Configuration is slightly different depending on the topology you are setting up -To run <%=vars.product_name%> in a peer-to-peer configuration, add the following line to Tomcat's `$CATALINA_HOME$/conf/server.xml` within the `` tag: +To run <%=vars.product_name%> in a peer-to-peer configuration, you must first start a <%=vars.product_name%> locator, then configure Tomcat to join the cluster as a peer member. + +### Starting the Locator + +Start a <%=vars.product_name%> locator using `gfsh`: ``` pre - +$ gfsh start locator --name=locator1 --port=10334 ``` -Depending on the version of Tomcat you are using, add one of the following lines to `$CATALINA_HOME$/conf/context.xml` within the `` tag: +The locator coordinates membership in the peer-to-peer cache. -For Tomcat 7.0: +### Configuring Tomcat -``` pre - -``` -For Tomcat 8.0 and 8.5: +Add the following line to Tomcat's `$CATALINA_HOME$/conf/server.xml` within the `` tag: ``` pre - + ``` -For Tomcat 9.0: +Add the following line to `$CATALINA_HOME$/conf/context.xml` within the `` tag: + +For Tomcat 10.1 and later (Jakarta EE 10): ``` pre - + ``` +**Note:** Tomcat 10.1+ implements Jakarta EE 10 with Servlet 6.0 specification and uses the Jakarta EE namespace (`jakarta.servlet.*`) instead of the legacy `javax.servlet.*` namespace. Ensure your application has been migrated to Jakarta EE 10 before using this module. Support for Tomcat 7, 8, and 9 has been discontinued. + ## Client/Server Setup @@ -63,41 +68,37 @@ To run <%=vars.product_name%> in a client/server configuration, the application ``` -Depending on the version of Tomcat you are using, add one of the following lines to `$CATALINA_HOME$/conf/context.xml` within the `` tag: +Add the following line to `$CATALINA_HOME$/conf/context.xml` within the `` tag: -For Tomcat 7.0: +For Tomcat 10.1 and later (Jakarta EE 10): ``` pre - + ``` -For Tomcat 8.0 and 8.5: +**Note:** Tomcat 10.1+ implements Jakarta EE 10 with Servlet 6.0 specification and uses the Jakarta EE namespace (`jakarta.servlet.*`) instead of the legacy `javax.servlet.*` namespace. Ensure your application has been migrated to Jakarta EE 10 before using this module. Support for Tomcat 7, 8, and 9 has been discontinued. -``` pre - -``` +The application server operates as a <%=vars.product_name%> client in this configuration. -For Tomcat 9.0: +### Setting the CLASSPATH + +Set the CLASSPATH environment variable to include Tomcat and <%=vars.product_name%> module libraries. This CLASSPATH is required when starting the locator and server. + +For a client/server setup using Apache Tomcat v10.1+ and Geode v2.x, the CLASSPATH should include: ``` pre - +export CLASSPATH=$CATALINA_HOME/lib/servlet-api.jar:$CATALINA_HOME/lib/catalina.jar:$CATALINA_HOME/bin/tomcat-juli.jar:$GEODE_HOME/lib/geode-modules-2.x.x.jar:$GEODE_HOME/lib/geode-modules-tomcat10-2.x.x.jar ``` -The application server operates as a <%=vars.product_name%> client in this configuration. - -Set the CLASSPATH environment variable. For a client/server set up using Apache Tomcat v9 and Geode v1.13, -the CLASSPATH setting should be similar to the following. Adjust filenames and version numbers as needed for your implementation. +Example with explicit paths: ``` pre -CLASSPATH="$CATALINA_HOME/lib/geode-modules-1.13.3.jar:\ -$CATALINA_HOME/lib/geode-modules-tomcat9-1.13.3.jar:\ -$CATALINA_HOME/lib/servlet-api.jar:\ -$CATALINA_HOME/lib/catalina.jar:\ -$CATALINA_HOME/lib/tomcat-util.jar:\ -$CATALINA_HOME/bin/tomcat-juli.jar" +CLASSPATH=/opt/apache-tomcat-10.1.x/lib/servlet-api.jar:/opt/apache-tomcat-10.1.x/lib/catalina.jar:/opt/apache-tomcat-10.1.x/bin/tomcat-juli.jar:/opt/geode-2.x/lib/geode-modules-2.x.x.jar:/opt/geode-2.x/lib/geode-modules-tomcat10-2.x.x.jar ``` -Start the locator and server using `gfsh`: +### Starting the Locator and Server + +Start the locator and server using `gfsh` with the configured CLASSPATH: ``` pre $ gfsh start locator --name=locator1 --classpath=$CLASSPATH @@ -107,7 +108,7 @@ $ gfsh start server --name=server1 --locators=localhost[10334] --server-port=0 \ ## Starting the Application Server -Once you've updated the configuration, you are now ready to start your tc Server or Tomcat instance. Refer to your application server documentation for starting the application server. Once started, <%=vars.product_name%> will automatically launch within the application server process. +Once you've updated the XML configuration files, you are now ready to start your Tomcat instance. Refer to your application server documentation for starting the application server. Once started, <%=vars.product_name%> will automatically launch within the application server process. **Note:** <%=vars.product_name%> session state management provides its own clustering functionality. If you are using <%=vars.product_name%>, you should NOT turn on Tomcat clustering as well. @@ -117,8 +118,65 @@ Once you've updated the configuration, you are now ready to start your tc Server You can verify that <%=vars.product_name%> has successfully started by inspecting the Tomcat log file. For example: ``` pre -15-Jul-2021 10:25:11.483 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/Users/user/workspace/apache-tomcat-9.0.62/webapps/host-manager] has finished in [1,688] ms -15-Jul-2021 10:25:11.486 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"] -15-Jul-2021 10:25:11.493 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [11682] milliseconds +15-Jul-2025 10:25:11.483 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/Users/user/workspace/apache-tomcat-10.1.x/webapps/host-manager] has finished in [1,688] ms +15-Jul-2025 10:25:11.486 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"] +15-Jul-2025 10:25:11.493 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [11682] milliseconds +``` + +### Verifying Cluster Topology + +You can verify the cluster configuration by using `gfsh` to list cluster members. + +**For Peer-to-Peer Configuration:** + +``` pre +$ gfsh -e "connect --locator=localhost[10334]" -e "list members" +``` + +You should see two members: the locator and the Tomcat server. The Tomcat server appears as a full member of the <%=vars.product_name%> distributed system. + +``` pre +Member Count : 2 + + Name | Id +----------- | ------------------------------------- +locator1 | 192.168.1.100(locator1:12345:locator) +TomcatNode | 192.168.1.100(67890) +``` + +**For Client/Server Configuration:** + +``` pre +$ gfsh -e "connect --locator=localhost[10334]" -e "list members" +``` + +You should see two members: the locator and the cache server. The Tomcat server does NOT appear in the member list because it operates as a lightweight client. + +``` pre +Member Count : 2 + + Name | Id +----------- | ------------------------------------- +locator1 | 192.168.1.100(locator1:12345:locator) +server1 | 192.168.1.100(server1:67890) ``` +## Troubleshooting + +**Problem:** Tomcat logs show `ClassNotFoundException: org.apache.geode.modules.util.BootstrappingFunction` (client/server only) + +**Solution:** Ensure you started the locator and server with the `--classpath` option as shown in the client/server configuration. The <%=vars.product_name%> server must have access to the session module classes. + +--- + +**Problem:** Tomcat fails with "Connection refused" when connecting to locator (peer-to-peer only) + +**Solution:** Ensure the <%=vars.product_name%> locator is running before starting Tomcat. Use `gfsh list members` or `lsof -i :10334` to verify the locator is listening on the configured port. + +--- + +**Problem:** Web applications fail to deploy with session manager errors + +**Solution:** Check that you completed all installation steps, including copying all JAR files from `$GEODE_HOME/lib` to `$CATALINA_HOME/lib` as described in [Installing the HTTP Module for Tomcat](./tomcat_installing_the_module.html). + + diff --git a/geode-docs/tools_modules/http_session_mgmt/weblogic_setting_up_the_module.html.md.erb b/geode-docs/tools_modules/http_session_mgmt/weblogic_setting_up_the_module.html.md.erb index 084db231743b..237ce158d361 100644 --- a/geode-docs/tools_modules/http_session_mgmt/weblogic_setting_up_the_module.html.md.erb +++ b/geode-docs/tools_modules/http_session_mgmt/weblogic_setting_up_the_module.html.md.erb @@ -73,7 +73,7 @@ To modify your war or ear file manually, make the following updates: - geode-serialization jar - geode-membership jar - geode-tcp-server jar - - javax.transaction-api jar + - jakarta.transaction-api jar - jgroups jar - log4j-api jar - log4j-core jar @@ -89,28 +89,28 @@ If you are deploying an ear file: ``` pre Manifest-Version: 1.0 Built-By: joe - Build-Jdk: 1.8.0_77 + Build-Jdk: 17.0.16 Created-By: Apache Maven Archiver-Version: Plexus Archiver - Class-Path: lib/geode-modules-1.0.0.jar - lib/geode-modules-session-internal-1.0.0.jar - lib/geode-modules-session-1.0.0.jar - lib/slf4j-api-1.7.7.jar - lib/slf4j-jdk14-1.7.7.jar + Class-Path: lib/geode-modules-2.0.0.jar + lib/geode-modules-session-internal-2.0.0.jar + lib/geode-modules-session-2.0.0.jar + lib/slf4j-api-2.0.17.jar + lib/slf4j-jdk14-2.0.17.jar lib/antlr-2.7.7.jar - lib/geode-membership.1.0.0.jar - lib/geode-tcp.1.0.0.jar - lib/fastutil-7.0.2.jar - lib/geode-core-1.0.0.jar - lib/geode-common.1.0.0.jar - lib/geode-management.1.0.0.jar - lib/geode-logging.1.0.0.jar - lib/geode-serialization.1.0.0.jar - lib/javax.transaction-api-1.3.jar - lib/jgroups-3.6.8.Final.jar - lib/log4j-api-2.5.jar - lib/log4j-core-2.5.jar - lib/log4j-jul-2.5.jar + lib/geode-membership-2.0.0.jar + lib/geode-tcp-server-2.0.0.jar + lib/fastutil-8.5.8.jar + lib/geode-core-2.0.0.jar + lib/geode-common-2.0.0.jar + lib/geode-management-2.0.0.jar + lib/geode-logging-2.0.0.jar + lib/geode-serialization-2.0.0.jar + lib/jakarta.transaction-api-2.0.1.jar + lib/jgroups-3.6.20.Final.jar + lib/log4j-api-2.17.2.jar + lib/log4j-core-2.17.2.jar + lib/log4j-jul-2.17.2.jar ``` ## Peer-to-Peer Setup @@ -182,8 +182,8 @@ $ gfsh start server \ --name=server1 \ --server-port=0 \ --locators=localhost[10334] \ - --classpath=/lib/geode-modules-1.0.0.jar:\ -/lib/geode-modules-session-internal-1.0.0.jar + --classpath=/lib/geode-modules-2.0.0.jar:\ +/lib/geode-modules-session-internal-2.0.0.jar ``` Once the application server is started, the <%=vars.product_name%> client will automatically launch within the application server process. @@ -193,10 +193,10 @@ Once the application server is started, the <%=vars.product_name%> client will a You can verify that <%=vars.product_name%> has successfully started by inspecting the application server log file. For example: ``` pre -info 2016/04/18 10:04:18.685 PDT tid=0x1a] +info 2025/04/18 10:04:18.685 PDT tid=0x1a] Initializing <%=vars.product_name%> Modules -Java version: 1.0.0 user1 041816 2016-11-18 08:46:17 -0700 -javac 1.<%=vars.min_java_version%>.0_<%=vars.min_java_update%> +Java version: 2.0.0 user1 041816 2025-11-18 08:46:17 -0700 +javac <%=vars.min_java_version%>.0.<%=vars.min_java_update%> Native version: native code unavailable Source revision: 19dd8eb1907e0beb2aa3e0a17d5f12c6cbec6968 Source repository: develop From 357c050e7e8e26fa70e472cefc42532fc52b61f4 Mon Sep 17 00:00:00 2001 From: Jinwoo Hwang Date: Thu, 11 Dec 2025 14:37:30 -0500 Subject: [PATCH 10/10] Add version constraint for jackson-dataformat-yaml The geode-core module declares jackson-dataformat-yaml as a dependency without specifying a version, relying on DependencyConstraints.groovy to provide it. However, DependencyConstraints.groovy was missing the version constraint for com.fasterxml.jackson.dataformat.* artifacts. This caused the published geode-core-2.0.0.pom to have jackson-dataformat-yaml with no tag, making the POM invalid according to Maven specification. Maven refuses to process ANY transitive dependencies from an invalid POM, which caused all dependencies (antlr, jopt-simple, micrometer-core, shiro-core, jakarta.transaction-api, geode-management, geode-deployment-legacy, rmiio) to not be pulled transitively. This fix adds the missing dependency constraint for jackson-dataformat-yaml, using jackson.version (2.17.0) to match other Jackson artifacts. Issue reported by Leon during 2.0.0.RC2 testing. --- .../apache/geode/gradle/plugins/DependencyConstraints.groovy | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/build-tools/geode-dependency-management/src/main/groovy/org/apache/geode/gradle/plugins/DependencyConstraints.groovy b/build-tools/geode-dependency-management/src/main/groovy/org/apache/geode/gradle/plugins/DependencyConstraints.groovy index 972b5da06057..352fc1bdcc42 100644 --- a/build-tools/geode-dependency-management/src/main/groovy/org/apache/geode/gradle/plugins/DependencyConstraints.groovy +++ b/build-tools/geode-dependency-management/src/main/groovy/org/apache/geode/gradle/plugins/DependencyConstraints.groovy @@ -232,6 +232,10 @@ class DependencyConstraints { entry('jackson-datatype-jsr310') } + dependencySet(group: 'com.fasterxml.jackson.dataformat', version: get('jackson.version')) { + entry('jackson-dataformat-yaml') + } + dependencySet(group: 'com.jayway.jsonpath', version: '2.7.0') { entry('json-path-assert') entry('json-path')