You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by ji...@apache.org on 2022/06/08 22:42:32 UTC

[geode] branch feature/GEODE-7665 updated (e2411ffe4d -> 0a3041ef66)

This is an automated email from the ASF dual-hosted git repository.

jinmeiliao pushed a change to branch feature/GEODE-7665
in repository https://gitbox.apache.org/repos/asf/geode.git


 discard e2411ffe4d Rebase missed code changes in DistributedClearOperation
 discard 5d8cd7b0e7 rebase to develop
 discard 0fb010443a GEODE-9194: Feature/region stats update (#6430)
 discard 55d37f8b0e GEODE-9194: Missing file is causing trouble (#6574)
 discard 5fef11a8ab GEODE-9195: Remove PR clear local locking (#6410)
 discard 690146bb51 GEODE-9132: Fix locking in PRClearCreateIndexDUnitTest
 discard 7597335edd GEODE-9132: Use factory method to avoid escaped reference
 discard 08a36883fd GEODE-9132: Always acquire write lock for PR clear
 discard 167b3edbe6 GEODE-9132: PartitionedRegionClearWithConcurrentOperationsDUnitTest cleanup 3
 discard 195bf3481a GEODE-9132: PartitionedRegionClearWithConcurrentOperationsDUnitTest cleanup 2
 discard 9728386968 GEODE-9132: PartitionedRegionClearWithConcurrentOperationsDUnitTest cleanup 1
 discard 212b3f03e4 Fixup AnalyzeCoreSerializablesJUnitTest for PartitionedRegionPartialClearException
 discard 029c8789e1 GEODE-9132: Remove ClearPRMessage from sanctionedDataSerializables.txt
 discard 44a1f26ede GEODE-9132: Cleanup PartitionedRegionPartialClearException
 discard d0e6001875 GEODE-9132: Undelete unnecessary uses of final
 discard 6914727d2e GEODE-9132: Remove unused DSFID constants
 discard 678aef4aa7 GEODE-9132: Cleanup PartitionedRegionClearMessage
 discard eb3a5b5f0d GEODE-9132: Fixup PartitionResponse constructors
 discard 97010e22e6 GEODE-9132: Delete ClearPRMessage
 discard 4cd1c00f15 GEODE-7674: Clear on PR with lucene index should throw exception (#6317)
 discard 65d1c1d6ea GEODE-7683: introduce BR.cmnClearRegion
     add c77f262c4f GEODE-9948: Implement LINSERT Command (#7392)
     add d44df3751b GEODE-10138: Add Versioning Support for Radish LPUSH (#7459)
     add 8bf5a814ed GEODE-10129: Forward opens/exports to child JVMs (#7457)
     add 07a1aacc92 GEODE-10145: Organize Dockerfile to work around alpine compat issues (#7466)
     add f4d173ba53 GEODE-10123: Improve "create region" checks (#7443)
     add b3e261842b GEODE-10101: Replace 1.14.3 with 1.14.4 as old version (#7460)
     add 08617a24de Revert "GEODE-10097: Avoid Thread.sleep for reauthentication in MessageDispatcher (#7416)" (#7470)
     add d5e3663a89 GEODE-10149: Don't reset custom radish baseline on a patch release (#7472)
     add 6b43b76e3d GEODE-10048: Add framework for Redis events and BLPOP command (#7408)
     add d3d6915d40 GEODE-10150: alter runtime command and change loglevel command docs bug & improvements (#7474)
     add 817860c649 GEODE-10145: Java tools (such as javac) need to stay on the PATH (#7482)
     add c17509653d GEODE-10127: Use correct hostname in WAN with LB test
     add dca393f976 GEODE-10108: Remove extra enum written in ReplaceByteArrayAtOffset (#7477)
     add 3df624801c GEODE-10079: Create PR pipelines for all support versions (#7485)
     add ae25733028 GEODE-10134: Add JDK 17 proxy classes to serialization accept list (#7480)
     add a26c169cf5 GEODE-9738: Refactored the rolling upgrade test (#7331)
     add ac3dbecadb GEODE-10163: upgradeTest serialization issues (#7488)
     add 1f668a2fa9 GEODE-9946: Add Radish LREM command (#7431)
     add e88d57da17 GEODE-9969: Fix unescaping the region name with underscore (#7320)
     add 9b2351029a GEODE-10164: Revert wording change in rebalance result (#7490)
     add 09ea8560b8 GEODE-10172: User Guide: Escape braces and angle brackets for format consistency (#7495)
     add feb2f8755a GEODE-10133: change sizeof to handle UnsupportedOperationException (#7484)
     add 4b2f368be1 GEODE-9983: Implement RPOPLPUSH command (#7467)
     add 5aa6b625fe GEODE-10171: AbstractRedisData version being incremented for no-op operations can lead to corruption (#7496)
     add dfedcbd409 GEODE-10140: Opens/exports for QueryResultFormatter tests (#7481)
     add 5272cbb75b user guide: typo repair in troubleshooting section (#7508)
     add 41844a5128 GEODE-10179: Bump jackson-databind to 2.13.2.1 (#7500)
     add d8e010d572 GEODE-10166: Move tests to correct directory (#7491)
     add fef6b16391 GEODE-10119: Handle SSLHandshakeException on JDK17 (#7475)
     add b5d6917275 GEODE-10182: Remove no longer needed null check. (#7504)
     add 86b5f7b2ce GEODE-10127: Adds test to preserve correct marshalling behavior. (#7461)
     add 7c010278df GEODE-10190: Improve runntime of MSetIntegrationTest and RenameIntegratinoTest (#7511)
     add a350ed22d9 GEODE-10087: Enhance off-heap fragmentation visibility. (#7407)
     add 3fd631a22f GEODE-10151: Make geode-for-redis optional for a geode server
     add 31a2e8eae4 GEODE-10136: Make Function.getId() handle null canonical name (#7505)
     add a887842575 GEODE-10158: fix critical-offheap-threshold interaction with QueryMonitor (#7483)
     add f3b9636b7a GEODE-10162: Try to find and set version tag if needed (#7487)
     add e1327539fc GEODE-10180: endpoint validation for the gateway using the legacy configuration (#7502)
     add 88281735a4 GEODE-9568-User-Guide-script-keeps-generated-files (#7518)
     add 6806179b67 GEODE-9955: Add RPUSHX command (#7507)
     add cebf1f4fd9 GEODE-10196: now checks if msg contains "Connection reset" (#7528)
     add 649616091b GEODE-10201: Bump spring from 5.3.16 to 5.3.18 (#7524)
     add 59af2c8386 GEODE-10141: remove test expectation of toString format (#7525)
     add fb17fe41ad GEODE-10171: Update versioning for no-op operations (#7527)
     add c1f3402df7 GEM-3405 Correct Java API method (#7534)
     add 745e66dc13 GEODE‑10179: Bump jackson-databind from 2.13.2.1 to 2.13.2.2 (#7526)
     add 3a8044aeec GEODE-10191: Radish RENAME and RESTORE create notification events (#7537)
     add 5dce03c913 GEODE-10125: Switch Radish data structures to use DataSerializable (#7512)
     add 4a73cb726d Add @pivotal-jbarrett to CODEOWNERS (#7539)
     add b5e710e779 GEODE-10199: Make retried putIfAbsent work (#7520)
     add 1d2f4a66da GEODE-9568 Update Bookbindery gem (#7541)
     add 143ffb48ea GEODE-9854: Orphaned .drf file causing memory leak (#7234)
     add ac98e81a81 GEODE-10213: Remove kirklund from several codeowner areas (#7547)
     add e5dd4cff54 GEODE-10127: Improve consistency of marshal/unmarshal calls. (#7463)
     add 3cc3bdb826 GEODE-9953: Implement LTRIM Command (#7403)
     add 83a8230144 GEODE-10116: Enable Redis TCL tests for Lists (#7521)
     add ead41c0221 GEODE-10211: Correctly check persistence on accessor (#7546)
     add 7870f01449 GEODE-10106: Handle NPE in QueueManagerImpl (#7471)
     add ee1c412d8a GEODE-10126: Replace Geode for Redis properties with system properties (#7478)
     add f1d5a25877 GEODE-10198: Fix LINSERT's case-sensitivity for arguments (#7552)
     add c246736345 GEODE-10053: Use stored DistributionConfig to create SSL configurations (#7366)
     add de91e33052 GEODE-10216: Add test for existence of VM stats (#7551)
     add 4cae7ac076 GEODE-10160: fixes SizeableByteArrayList sizing (#7519)
     add 141d43dc67 GEODE-10121: Fix transactional redis commands (#7513)
     add 30bd1cef01 GEODE-9704: Ensure that register interest is called before ready for events (#7442)
     add 75ea5f7f6f GEODE-9991: Refactor for consistency and add tests. (#7533)
     add f110b9be35 GEODE-10046: Bump 3rd-party dependency versions (#7557)
     add 44293ffa54 GEODE-10127: Corrects NullPointerException in hashCode(). (#7559)
     add 982f846fb5 GEODE-10214: Improve speed of JvmSizeUtils.roundUpSize (#7548)
     add d2535394a8 GEODE-10122: P2P Messaging Handles TLS KeyUpdate Message  (#7449)
     add 5a698f55e0 GEODE-10203: SerialVersionUID added. (#7529)
     add 3889df2803 GEODE-10077: Avoid callbacks in wan-copy region (#7391)
     add 4989b9ae82 GEODE-10221: Fix sizing when creating a RedisList copy (#7568)
     add 73f3dfdb22 GEODE-10127: Corrects serialization backwards compatibility issues.
     add c71b70d6a0 GEODE-10127: Reduces verbosity of log messages.
     add 19d5d25455 SocketException is now also handled by messenger.handleJGroupsIOException (#7530)
     add 934f517e92 Revert "GEODE-10126: Replace Geode for Redis properties with system properties (#7478)" (#7576)
     add 4fbc35c29e GEODE-10097: Avoid Thread.sleep for re-auth in MessageDispatcher (#7556)
     add 16020446df GEODE-10225: Gfsh start commands add exports on JDK 11+ (#7572)
     add 2456b89b26 GEODE-10157: Add Radish Delta Unit Tests (#7558)
     add 7965968003 GEODE-10204: Add Test Coverage for SizeableByteArrayList (#7566)
     add ce975a0c1c GEODE-10232: reformat list for more reliable rendering (#7581)
     add 223c5d8bdd GEODE-10230: PDX UPDATE/DELETE in Mgmt REST API (#7578)
     add 8b5ff7c03d GEODE-10234: Do not generate tailKey if parallel wan not enabled. (#7583)
     add b2c1b09b2d GEODE-10222: Handle null memberID in GII (#7569)
     add cf39ace35f GEODE-6588: Cleanup missing @Deprecated (#7545)
     add ee3fb5b985 GEODE-9512: close receiver connection if membership check timed out (#7409)
     add f7e1cae282 GEODE-10193: Replace openhft compiler with geode-junit compiler (#7580)
     add 15898b039b GEODE-10146: Make GradleBuildWithGeodeCoreAcceptanceTest run on JDK 17 (#7570)
     add 08c32c386a GEODE-10235: fix --maxHeap for java 17 (#7585)
     add acc60cd3cf GEODE-8228: Refactored to AssertJ.
     add 051f9cc730 GEODE-8228: Cleanup static analyzer in WANTestBase.
     add 7514b7c53c GEODE-8228: Await on stats.
     add 9a86b74f0e GEODE-8228: Rename tests to current convention.
     add 09b8b46ef2 GEODE-8228: Use assertThat without embedded comparisons.
     add 0e6d8377b4 GEODE-9759: replaces double-hyphens with ‑‑ (#7560)
     add 32ef396ef6 Revert "Revert "GEODE-10126: Replace Geode for Redis properties with system properties (#7478)" (#7576)" (#7586)
     add 092ebbfef3 GEODE-10035: fix BufferPool sys prop logic (#7587)
     add 447897ce5f GEODE-10185: fix MemoryOverheadIntegrationTest for jdk17 (#7591)
     add 9faaf49189 GEODE-10223: Fix BlockingCommandListnerTest to be less flaky. (#7592)
     add 4f74e6de9d GEODE-10238: add open for jetty9 on java 17 (#7593)
     add ab5010005f GEODE-10023: Fix javadocs (#7594)
     add d54083c7d7 GEODE-10197: fix test for jdk17
     add f7eb7359a2 GEODE-10023: do not @link to type params (#7601)
     add 39e3a89b9e GEODE-10161: Remove unnecessary synchronization from RedisList (#7579)
     add 89a6112844 GEODE-10246: fix OutOfMemoryDUnitTest for jdk17 (#7606)
     add e362324d21 GEODE-10251: Make DescribedExternalResource report all exceptions (#7609)
     add 5ebf30773e GEODE-10245: Upgrade classgraph 4.8.143 -> 4.8.145 (#7605)
     add 28dbac1a86 GEODE-10229: GII image should fill disk region RVV's exceptions. (#7602)
     add 740d5e5675 GEODE-10243: Fail early if old client auth expires (#7603)
     add ad615d16cc GEODE-9466: change offheap to not use Bits.unaligned (#7611)
     add 78d4e56293 GEODE-10254: Use original hostname if host is null. (#7618)
     add b594c842b7 GEODE-10209: Use AvailablePortHelper in InternalCacheForClientAccessDistributedTest (#7613)
     add 23e554bbe6 GEODE-10249: Adds BufferPoolMXBean stats. (#7607)
     add 718aafeb35 GEODE-10248: Adding a new Suspicious Strings exception (#7612)
     add e87ea66ac9 GEODE-10258: Assert at least 1 invocation (#7624)
     add ae17ba4adc GEODE-10020: Introduction of option to gradually activate pinging (#7517)
     add 2df64047e2 GEODE-10184: Verify the status file is accessible before handling the request. (#7582)
     add 3f14431eae GEODE-10263: add opens required by geode features (#7632)
     add f117a59548 GEODE-10260: make sure message is added before they are processed. (#7628)
     add 6d7f3530bb GEODE-10260: refactor out Filter interface to use Predicate (#7627)
     add 5f1d358db0 Bugfix/GEODE-10228 DurableClientTestCase.testDurableHAFailover is failing (#7608)
     add 50f5d6c468 GEODE-10266: update SeveralGatewayReceiversWithSamePortAndHostnameFor… (#7633)
     add 62cd12c7f0 GEODE-9484: Improve sending message to multy destinations (#7381)
     add f7fa244c9f Revert "GEODE-10249: Adds BufferPoolMXBean stats. (#7607)" (#7638)
     add 8536dffe39 GEODE-10264: remove 'connect to the server from your application' section (#7641)
     add 731143bf71 GEODE-10263: add additional import for VMStats50 (#7637)
     add 2a2d18af22 GEODE-10274: Install GCP ops-agent in CI images (#7642)
     add 6f57745ce6 GEODE-10242: Colocated buckets share primary move lock (#7630)
     add ff9b3be5e3 GEODE-10215: Document warning for parallel gws (#7623)
     add a81c884b85 GEODE-10275: Bump spring from 5.3.18 to 5.3.19 (#7647)
     add b27d6a4e47 GEODE-10046: Bump 3rd-party dependency versions (#7650)
     add 8dabaab77e GEODE-9390: Guarding membership addition code paths to omit membership duplicates (#7639)
     add 1890e3b87b GEODE-10272: Handle RejectedExecutionException during shutdown. (#7651)
     add 08b4a7b6a9 GEODE-10278: Remove the geode-for-redis module
     add 0ad4c8a9f6 Revert "GEODE-9484: Improve sending message to multy destinations (#7381)" (#7655)
     add 95180e4143 GEODE-10206: clean up product references to CMS (#7646)
     add a06e29419e GEODE‑10046: fix classgraph version in LICENSE (#7663)
     add 352f1d7f3a GEODE-10089: Roll develop to 1.16.0 (#7668)
     add d4b80d2727 GEODE-10284: Add partition-listener option to gfsh create region command (#7666)
     add 2cec8e0c45 Enable GitHub CodeQL workflow
     add 9fbd35a8f9 GEODE-10282: Migrate from springfox to springdoc (#7659)
     add e88ed8392a GEODE-10288: Define JDK 8, 11, 17 homes for upgrade tests (#7675)
     add 64d07164ed GEODE-10293: Modify .asf.yaml to require CodeQL, drop LGTM (#7674)
     add 729680cea2 GEODE-10289: Argument file for JDK 17 (#7673)
     add 5843feeb38 GEODE-10288: Fix property assignment syntax (#7678)
     add 509c0c6c91 GEODE-10283: Remove problematic buildSrc project, replacing with includeBuild projects (#7600)
     add e25fba2a13 GEODE-10271: ConnectionProxyJUnitTest cleanup (#7652)
     add 485411b5f6 GEODE-10299: update examples for creating dynamic regions (#7681)
     add 768767cf2b GEODE-10302: Increase upgrade test timeout to 4h (#7683)
     add 486e195ece GEODE-10303: Increase memory for windows-gfsh-distributed-test (#7685)
     add 0ed7793518 GEODE-10307: Doc changes needed for enable security-manager property (#7687)
     add 602f99cf99 GEODE-10302: Increase call stack timeout for upgrade tests (#7691)
     add 20844a8494 GEODE-10306 Fixing an order issue that can lead to problems when stopping (#7682)
     add 4f4af2a303 GEODE-10294: Compare invalid token during putIfAbsent retry. (#7679)
     add 6ec299497c GEODE-10309: Enable parallel tests for windows-gfsh-distributed-test (#7689)
     add e835c8c4fc GEODE-10257: Upgrade tests can upgrade Java (#7686)
     add e1860051f9 GEODE-10286: handle CancelException in PersistenceAdvisor.close (#7677)
     add cbd8795bc3 GEODE-10313: User Guide: Add javadocs template variable (#7696)
     add 3d6354cb6b GEODE-10290: GII requester should remove departed members (#7670)
     add 868e1ac189 GEODE-10115: fix javadoc (#7698)
     add cb5703dca3 GEODE-10315: remove unneeded add-opens (#7699)
     add b84d9c7f94 Revert "GEODE-10294: Compare invalid token during putIfAbsent retry. (#7679)" (#7704)
     add a9edcc5d19 GEODE-10319: Clear meters when closing the meter registry (#7705)
     add 4d5f84c27a GEODE-10310: Add disable reatempt on CacheClose (#7690)
     add 9c5c2bf666 update CODEOWNERS: restore min two owners per area and fix other warnings (#7714)
     add 372e6d4300 GEODE-10320: Bump micrometer from 1.8.5 to 1.9.0 (#7706)
     add b207304b98 GEODE-10322: Run various Analyze Serialiable tests from IntelliJ (#7711)
     add fdb972ecce Removing myself from CODEOWNERS (#7708)
     add 3ae2218cfa GEODE-9987: Refactored/Removal of deprecated API (#7303)
     add 1e873a670e GEODE-10297: Create SSLContext using default protocols (#7680)
     add 7e052cde43 GEODE-10318: do not add duplicate entries in the locators list (#7703)
     add b89fc2ca2f GEODE-10328: close data store stats on cache close (#7716)
     add 3b887e10aa GEODE-10275: Bump spring from 5.3.19 to 5.3.20 (#7718)
     add 9154cfc7ed GEODE-10226: Added monitoring of async writer (#7667)
     add 18f0e9c55c GEODE-10020: For Ping task avoid registering new destination endpoint (#7515)
     add 774505e7c7 GEODE-10327: Overhaul GfshRule to kill processes and save artifacts for failures (#7571)
     add 0d58250b23 GEODE-10277: For destroyed region don`t check size (#7653)
     add 5c0d523866 GEODE-10311: fix a flaky test (#7709)
     add c464ece1e1 Revert "GEODE-10327: Overhaul GfshRule to kill processes and save artifacts for failures (#7571)" (#7728)
     add 356e361708 GEODE-10341: add note that snapshot includes in-cache and overflow entries (#7729)
     add 47c50f8e8f GEODE-10343: add ability to opt-in to windows-jdk8 and windows-jdk17 pr checks (#7736)
     add d54bd89336 GEODE-10334: Refactor distributed tests (#7722)
     add 757840792a Revert "GEODE-10020: For Ping task avoid registering new destination endpoint (#7515)" (#7741)
     add eedbe293d4 GEODE-10312: Fix the v1/v3 mismatch. (#7720)
     add 96113d137b GEODE-10309: Enable parallel tests for windows tests (#7743)
     add e75e228e66 GEODE-10308: Close the cache after stopping the Tomcat container (#7739)
     add ea48e7f7c0 GEODE-10294: Compare invalid token during putIfAbsent retry. (#7738)
     add 992208e76e GEODE-6588: Fixed mismatch of placeholders and arguments (#7375)
     add bfa8dde945 GEODE-10305: Change locator and server dirs (#7730)
     add 994857fd01 GEODE-10327: Update geode-dunit and geode-junit codeowners (#7748)
     add 3f8f8db595 GEODE-10327: Overhaul GfshRule to kill processes and save artifacts (#7731)
     add b093aaa63f Revert "GEODE-10327: Overhaul GfshRule to kill processes and save artifacts (#7731)" (#7750)
     add 384e5f7bd7 GEODE-10347: Refactor PartitionedRegionStatsDUnitTest (#7744)
     add 5eb8d4af45 GEODE-10309: Give more memory to windows-core-integration-test (#7755)
     add 03875b8eac GEODE-10348: Fix documentation on conflation (#7746)
     add 9039035725 GEODE-9711: Refactored DUnit to DistributedTest (#6970)
     add 2da67758b7 GEODE-10309: fixup: Give more memory to windows-core-integration-test (#7757)
     add b16dafa712 GEODE-10106: Use local ref to queueConnection. (#7740)
     add 1cc9494cb7 GEODE-10357: add gesterzhou as code owner for logging components (#7764)
     add e0aac20901 GEODE-10355: Bump spring-security from 5.6.3 to 5.6.5 (#7761)
     add 495f3b0cff GEODE-10327: Overhaul GfshRule to kill processes and save artifacts (#7758)
     add e370d2fb6c GEODE-10301: support LocalDate and JodaTime (#7737)
     add 300a1596ae GEODE-10342: Add current jars to HTTP Module for Tomcat instructions (#7745)
     add 968331758c GEODE-10356: Corrected the comment (#7762)
     add af5810650c Short-circuit CI checks for PRs that don't touch buildable files (#7763)
     add 728467cfd7 GEODE-10352: Update Ruby version in Geode doc preview tool (#7753)
     add d1e21db47f GEODE-10346: Correct description of batch-time-interval in doc. (#7742)
     add 7ccdc8297b GEODE-10155: Avoid threads hanging when function execution times-out (#7493)
     add b7d00dd1d0 GEODE-10304: locator thread should not exit after reconnecting (#7697)
     add 3df1e76ddb GEODE-8977: change ThreadMonitor to reduce how long it does a "stop the world" ThreadDump vm op (#7751)
     add 0700975d24 GEODE-10280: add Status Message to Status Server Command (#7662)
     add fc57331474 GEODE-10365: Add referenced but missing components to table (#7775)
     add 395c56b4d8 GEODE-10342: Simplify copying jars (#7778)
     add 4d2c2e7a8d GEODE-10089: update LICENSE due to redis removal, change to springdoc, and inclusion of joda-time (#7783)
     add 425bdb8e26 GEODE-10068: Make WanCopyRegionFunctionService thread pool configurab… (#7424)
     add b20a6b0c13 GEODE-10321: Acceptance test for Geode access to JDK internals (#7772)
     new 28d31d89de GEODE-7683: introduce BR.cmnClearRegion
     new fd886ca93c GEODE-7674: Clear on PR with lucene index should throw exception (#6317)
     new 198a362392 GEODE-9132: Delete ClearPRMessage
     new 919bbc2df2 GEODE-9132: Fixup PartitionResponse constructors
     new f0062cf216 GEODE-9132: Cleanup PartitionedRegionClearMessage
     new a4eedde17a GEODE-9132: Remove unused DSFID constants
     new 4a9e5b6de8 GEODE-9132: Undelete unnecessary uses of final
     new 67b646d58c GEODE-9132: Cleanup PartitionedRegionPartialClearException
     new f2fdd6963a GEODE-9132: Remove ClearPRMessage from sanctionedDataSerializables.txt
     new f595900e5b Fixup AnalyzeCoreSerializablesJUnitTest for PartitionedRegionPartialClearException
     new a22e9b5045 GEODE-9132: PartitionedRegionClearWithConcurrentOperationsDUnitTest cleanup 1
     new 3ffb9c327d GEODE-9132: PartitionedRegionClearWithConcurrentOperationsDUnitTest cleanup 2
     new b7c5189c2a GEODE-9132: PartitionedRegionClearWithConcurrentOperationsDUnitTest cleanup 3
     new ac800e0af6 GEODE-9132: Always acquire write lock for PR clear
     new 40715edb97 GEODE-9132: Use factory method to avoid escaped reference
     new f7bbb1db55 GEODE-9132: Fix locking in PRClearCreateIndexDUnitTest
     new ac859431ef GEODE-9195: Remove PR clear local locking (#6410)
     new d26b867ec1 GEODE-9194: Missing file is causing trouble (#6574)
     new b8e20b76e0 GEODE-9194: Feature/region stats update (#6430)
     new 5f9b9c0141 rebase to develop
     new 6e31e9b57b Rebase missed code changes in DistributedClearOperation
     new 0a3041ef66 rebase to develop

This update added new revisions after undoing existing revisions.
That is to say, some revisions that were in the old version of the
branch are not in the new version.  This situation occurs
when a user --force pushes a change and generates a repository
containing something like this:

 * -- * -- B -- O -- O -- O   (e2411ffe4d)
            \
             N -- N -- N   refs/heads/feature/GEODE-7665 (0a3041ef66)

You should already have received notification emails for all of the O
revisions, and so the following emails describe only the N revisions
from the common base, B.

Any revisions marked "omit" are not gone; other references still
refer to them.  Any revisions marked "discard" are gone forever.

The 22 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .asf.yaml                                          |    8 +-
 .github/workflows/codeql.yml                       |   97 +
 CODEOWNERS                                         |  203 +-
 LICENSE                                            |    2 -
 README.md                                          |    1 -
 boms/geode-all-bom/build.gradle                    |    5 +-
 .../src/test/resources/expected-pom.xml            |  139 +-
 boms/geode-client-bom/build.gradle                 |    8 +-
 .../geode-annotation-processor/build.gradle        |   56 +
 .../geode-annotation-processor/settings.gradle     |   18 +
 .../javac/EnsureCorrectRunsWithProcessor.java      |    0
 .../services/javax.annotation.processing.Processor |    0
 .../org/apache/geode/javac/CompilerException.java  |    0
 .../org/apache/geode/javac/SimpleClassFile.java    |    0
 .../org/apache/geode/javac/SimpleFileManager.java  |    0
 .../org/apache/geode/javac/SimpleSourceFile.java   |    0
 .../geode/javac/TestAnnotationProcessor.java       |    0
 .../java/org/apache/geode/javac/TestCompiler.java  |    0
 build-tools/geode-build-tools/build.gradle         |   51 +
 build-tools/geode-build-tools/settings.gradle      |   18 +
 .../geode/gradle/plugins/BuildToolsPlugin.groovy   |   24 +
 .../geode/gradle/plugins/PasswordDialog.groovy     |   45 +
 .../gradle/plugins/TestPropertiesWriter.groovy     |   36 +
 .../geode-dependency-management/build.gradle       |   49 +
 .../geode-dependency-management/settings.gradle    |   18 +
 .../gradle/plugins/DependencyConstraints.groovy    |  287 +++
 .../plugins/DependencyConstraintsPlugin.groovy     |   27 +
 .../gradle/plugins/DependencySetHandler.groovy     |    0
 build-tools/geode-japicmp/build.gradle             |   51 +
 build-tools/geode-japicmp/settings.gradle          |   18 +
 .../japicmp/AllowMajorBreakingChanges.groovy       |    0
 .../gradle/japicmp/GeodeApiRegressionRule.groovy   |    0
 .../gradle/japicmp/GeodeSpiRegressionRule.groovy   |    0
 .../geode/gradle/japicmp/JapicmpPlugin.groovy      |   29 +
 .../gradle/japicmp/ParentIsExperimental.groovy     |    0
 .../src/main/resources/japicmp_exceptions.json     |   13 +
 build-tools/geode-repeat-test/build.gradle         |   52 +
 build-tools/geode-repeat-test/settings.gradle      |   18 +
 .../geode/gradle/testing/repeat/RepeatTest.groovy  |   71 +
 .../gradle/testing/repeat/RepeatTestPlugin.groovy  |   27 +
 .../ExecutionTrackingTestClassProcessor.java       |    0
 .../ExecutionTrackingTestResultProcessor.java      |    0
 .../gradle/testing/repeat/RepeatTestExecuter.java  |    0
 .../gradle/testing/repeat/RepeatTestTest.groovy    |   30 +
 build-tools/geode-testing-isolation/build.gradle   |   48 +
 .../geode-testing-isolation/settings.gradle        |   18 +
 .../apache/geode/gradle/testing/Executers.groovy   |    0
 .../org/apache/geode/gradle/testing/Workers.groovy |   48 +
 .../testing/isolation/IsolatedTestPlugin.groovy    |   86 +
 .../testing/isolation/CompletableProcess.java      |    0
 .../geode/gradle/testing/isolation/PortRange.java  |    0
 .../gradle/testing/isolation/PortRangeContext.java |    0
 .../isolation/PortRangeProcessLauncher.java        |    0
 .../isolation/WorkingDirectoryIsolator.java        |    0
 .../testing/process/AdjustableProcessLauncher.java |    0
 .../process/LauncherProxyWorkerProcessBuilder.java |    0
 .../process/LauncherProxyWorkerProcessFactory.java |    0
 .../gradle/testing/process/ProcessLauncher.java    |    0
 .../geode/gradle/testing/process/Reflection.java   |    0
 .../geode/gradle/test/isolation/PortRangeTest.java |   82 +
 .../isolation/WorkingDirectoryIsolatorTest.java    |   46 +
 build-tools/scripts/build.gradle                   |   37 +
 build-tools/scripts/settings.gradle                |   39 +
 .../scripts/src/main/groovy/check-pom.gradle       |  182 ++
 .../scripts/src/main/groovy/code-analysis.gradle   |   93 +
 .../src/main/groovy}/dependency-resolution.gradle  |    0
 .../src/main/groovy/geode-japicmp-task.gradle      |   94 +
 .../scripts/src/main/groovy/geode-java.gradle      |  193 ++
 .../scripts/src/main/groovy/geode-pmd.gradle       |   35 +
 .../src/main/groovy/geode-publish-artifacts.gradle |    0
 .../src/main/groovy/geode-publish-common.gradle    |  114 +
 .../src/main/groovy/geode-publish-java.gradle      |   33 +
 .../src/main/groovy/geode-publish-war.gradle       |   32 +
 .../scripts/src/main/groovy/geode-rat.gradle       |  194 ++
 .../scripts/src/main/groovy/geode-sonar.gradle     |   33 +
 .../scripts/src/main/groovy/geode-test.gradle      |  351 +++
 build-tools/scripts/src/main/groovy/ide.gradle     |   78 +
 .../scripts/src/main/groovy/javaVersions.gradle    |   79 +
 build-tools/scripts/src/main/groovy/jmh.gradle     |   72 +
 build-tools/scripts/src/main/groovy/lint.gradle    |   31 +
 .../src/main/groovy/multi-process-test.gradle      |   85 +
 .../platform-subproject-configuration.gradle       |   21 +
 .../src/main/groovy}/resolve-dependencies.gradle   |    0
 .../scripts/src/main/groovy/spotless.gradle        |  175 ++
 .../standard-subproject-configuration.gradle       |   38 +
 .../scripts/src/main/groovy}/warnings.gradle       |    0
 build.gradle                                       |   21 +-
 buildSrc/build.gradle                              |   55 -
 .../org/apache/geode/gradle/PasswordDialog.groovy  |   41 -
 .../geode/gradle/TestPropertiesWriter.groovy       |   33 -
 .../gradle/plugins/DependencyConstraints.groovy    |  298 ---
 .../org/apache/geode/gradle/testing/Workers.groovy |   47 -
 .../testing/isolation/IsolatedTestPlugin.groovy    |   87 -
 .../geode/gradle/testing/repeat/RepeatTest.groovy  |   60 -
 .../geode-dependency-constraints.properties        |    1 -
 .../gradle-plugins/geode-isolated-test.properties  |    1 -
 .../src/main/resources/japicmp_exceptions.json     |    9 -
 .../geode/gradle/test/isolation/PortRangeTest.java |   85 -
 .../isolation/WorkingDirectoryIsolatorTest.java    |   47 -
 ci/images/alpine-tools/Dockerfile                  |   20 +-
 ci/images/google-geode-builder/scripts/setup.sh    |    6 +-
 ci/images/google-windows-geode-builder/packer.json |   34 +-
 ci/pipelines/geode-build/jinja.template.yml        |    2 +-
 ci/pipelines/images/jinja.template.yml             |   38 +-
 ci/pipelines/meta/deploy_meta.sh                   |    2 +-
 ci/pipelines/pull-request/jinja.template.yml       |   32 +-
 ci/pipelines/shared/jinja.variables.yml            |   60 +-
 ci/pipelines/shared/utilities.sh                   |    2 +-
 ci/scripts/archive_results.sh                      |    2 +-
 ci/scripts/create_instance.sh                      |    2 +-
 ci/scripts/delete_instance.sh                      |    2 +-
 ci/scripts/execute_build.sh                        |    2 +-
 ci/scripts/execute_redis_tests.sh                  |   85 -
 ci/scripts/execute_tests.sh                        |   16 +-
 ci/scripts/repeat-new-tests.sh                     |    2 +-
 ci/scripts/rsync_code_down.sh                      |    2 +-
 ci/scripts/rsync_code_up.sh                        |    2 +-
 ci/scripts/shared_utilities.sh                     |   20 +-
 dev-tools/dependencies/bump.sh                     |    2 +-
 dev-tools/docker/docs/Dockerfile                   |   18 +-
 dev-tools/release/create_support_branches.sh       |    4 +-
 dev-tools/release/license_review.sh                |   23 +-
 dev-tools/release/promote_rc.sh                    |   14 +-
 extensions/geode-modules-assembly/build.gradle     |    6 +-
 .../geode-modules-session-internal/build.gradle    |    4 +-
 .../session/internal/common/CacheProperty.java     |    4 +-
 extensions/geode-modules-session/build.gradle      |    4 +-
 .../session/filter/SessionCachingFilter.java       |    2 +
 extensions/geode-modules-test/build.gradle         |    4 +-
 .../modules/session/AbstractSessionsTest.java      |   26 +-
 extensions/geode-modules-tomcat7/build.gradle      |    6 +-
 extensions/geode-modules-tomcat8/build.gradle      |    8 +-
 .../Tomcat8SessionsClientServerDUnitTest.java      |    4 +-
 extensions/geode-modules-tomcat9/build.gradle      |    8 +-
 extensions/geode-modules/build.gradle              |    7 +-
 .../modules/session/bootstrap/AbstractCache.java   |    5 +-
 .../catalina/AbstractCacheLifecycleListener.java   |    3 +
 .../catalina/AbstractCommitSessionValve.java       |    1 +
 .../session/catalina/DeltaSessionManager.java      |    1 -
 .../catalina/DeltaSessionManagerConfiguration.java |    4 +
 .../modules/session/catalina/SessionManager.java   |    2 +
 .../catalina/Tomcat6DeltaSessionManager.java       |    1 +
 .../modules/util/ResourceManagerValidator.java     |   12 +-
 .../src/test/resources/expected-pom.xml            |    5 +
 extensions/session-testing-war/build.gradle        |    7 +-
 geode-assembly/build.gradle                        |   26 +-
 geode-assembly/geode-assembly-test/build.gradle    |    4 +-
 .../rest/internal/web/controllers/Customer.java    |    2 +-
 .../rest/internal/web/controllers/Gender.java      |    2 +-
 .../internal/web/controllers/GetAllEntries.java    |    2 +-
 .../web/controllers/GetDeliveredOrders.java        |    2 +-
 .../rest/internal/web/controllers/GetRegions.java  |    2 +-
 .../geode/rest/internal/web/controllers/Item.java  |    2 +-
 .../web/controllers/NoArgumentFunction.java        |    9 +-
 .../geode/rest/internal/web/controllers/Order.java |    2 +-
 .../rest/internal/web/controllers/Person.java      |    2 +-
 .../org/apache/geode/session/tests/Client.java     |   33 +-
 .../geode/session/tests/ContainerInstall.java      |  200 +-
 .../geode/session/tests/ContainerManager.java      |   30 +-
 .../geode/session/tests/ServerContainer.java       |  153 +-
 .../geode/session/tests/TomcatContainer.java       |   49 +-
 .../apache/geode/session/tests/TomcatInstall.java  |  121 +-
 .../geode/test/junit/rules/GeodeDevRestClient.java |    2 +-
 .../MissingDiskStoreAcceptanceTest.java            |   31 +-
 ...gDiskStoreAfterServerRestartAcceptanceTest.java |  148 ++
 ...iversWithSamePortAndHostnameForSendersTest.java |   95 +-
 .../org/apache/geode/jdk/JdkEncapsulationTest.java |  124 +
 .../geode/jdk/TraverseEncapsulatedJdkObject.java   |   52 +
 .../launchers/ServerStartupNotificationTest.java   |   40 +-
 .../geode/launchers/ServerStartupOnlineTest.java   |   44 +-
 ...rStartupRedundancyRecoveryNotificationTest.java |   48 +-
 ...ServerStartupValueRecoveryNotificationTest.java |   61 +-
 .../LocatorWithCustomLogConfigAcceptanceTest.java  |   43 +-
 .../ServerWithCustomLogConfigAcceptanceTest.java   |   37 +-
 .../cli/commands/ConfigureEvictionThroughGfsh.java |  196 +-
 .../cli/commands/DeployWithLargeJarTest.java       |   50 +-
 .../cli/commands/DestroyIndexIfExistsTest.java     |   37 +-
 .../GfshStartLocatorLogAcceptanceTest.java         |   37 +-
 .../cli/commands/ImportClusterConfigTest.java      |   26 +-
 ...scribeConfigAreFullyRedactedAcceptanceTest.java |   73 +-
 .../cli/commands/PutCommandWithJsonTest.java       |   35 +-
 .../commands/RebalanceCommandAcceptanceTest.java   |  201 ++
 .../cli/commands/StartLocatorAcceptanceTest.java   |   44 +-
 .../commands/StartServerCommandAcceptanceTest.java |  138 +-
 .../cli/commands/StatusLocatorRealGfshTest.java    |   41 +-
 .../cli/commands/StopServerAcceptanceTest.java     |   42 +-
 .../StopServerWithSecurityAcceptanceTest.java      |   88 +-
 .../cli/shell/GfshDisconnectWithinScript.java      |   20 +-
 .../shell/StatusLocatorExitCodeAcceptanceTest.java |  144 +-
 .../shell/StatusServerExitCodeAcceptanceTest.java  |   95 +-
 .../GradleBuildWithGeodeCoreAcceptanceTest.java    |   14 +-
 .../rest/RegionManagementAcceptanceTest.java       |   34 +-
 ...tandaloneClientManagementAPIAcceptanceTest.java |  119 +-
 .../apache/geode/metrics/CacheGetsTimerTest.java   |   48 +-
 .../geode/metrics/GatewayReceiverMetricsTest.java  |   76 +-
 .../geode/metrics/MemberTypeCommonTagsTest.java    |   25 +-
 .../apache/geode/metrics/MicrometerBinderTest.java |   27 +-
 .../geode/metrics/RegionEntriesGaugeTest.java      |   76 +-
 .../FunctionExecutionsTimerClusterTest.java        |   62 +-
 .../FunctionExecutionsTimerLonerTest.java          |   45 +-
 .../FunctionExecutionsTimerNoResultTest.java       |   37 +-
 .../geode/modules/DeployJarAcceptanceTest.java     |  406 ++--
 .../apache/geode/rules/GfshRuleExampleTest.java    |   56 +
 ...artLocatorGlobalSerialFilterAcceptanceTest.java |   11 +-
 .../StartLocatorJmxSerialFilterAcceptanceTest.java |   11 +-
 ...tartServerGlobalSerialFilterAcceptanceTest.java |   30 +-
 .../StartServerJmxSerialFilterAcceptanceTest.java  |   11 +-
 .../apache/geode/ssl/CertificateRotationTest.java  |  115 +-
 .../geode-list-gateway-receivers-server1.gfsh      |   20 -
 .../geode-list-gateway-receivers-server2.gfsh      |   20 -
 .../cache/wan/scripts/geode-starter-create.gfsh    |   20 -
 .../cache/wan/scripts/geode-starter-locator.gfsh   |   19 -
 .../cache/wan/scripts/geode-starter-server1.gfsh   |   19 -
 .../cache/wan/scripts/geode-starter-server2.gfsh   |   19 -
 .../management/JQFilterVerificationDUnitTest.java  |   22 +-
 ...eveloperRestSecurityConfigurationDUnitTest.java |    8 +-
 ...nagementRestSecurityConfigurationDUnitTest.java |    8 +-
 .../apache/geode/session/tests/CargoTestBase.java  |    2 +-
 .../session/tests/GenericAppServerContainer.java   |   35 +-
 .../session/tests/GenericAppServerInstall.java     |   23 +-
 .../Tomcat8ClientServerCustomCacheXmlTest.java     |    2 +-
 .../session/tests/TomcatClientServerTest.java      |    7 +-
 .../StartLocatorCommandIntegrationTest.java        |   27 +-
 .../StartServerCommandIntegrationTest.java         |   13 +-
 ...aggerManagementVerificationIntegrationTest.java |    4 +-
 .../DevRestSwaggerVerificationIntegrationTest.java |    4 +-
 .../integrationTest/resources/assembly_content.txt |   71 +-
 .../integrationTest/resources/expected_jars.txt    |   43 +-
 .../resources/gfsh_dependency_classpath.txt        |  160 +-
 geode-assembly/src/main/dist/LICENSE               |   10 +-
 .../config/open-all-jdk-packages-linux-openjdk-17  |  892 +++++++
 .../cli/commands/StartLocatorCommandTest.java      |  365 +--
 .../cli/commands/StartServerCommandTest.java       |  598 +++--
 .../internal/cli/commands/VerifyCommandLine.java   |   80 +
 .../DeploymentManagementUpgradeTest.java           |  105 +-
 .../management/OperationManagementUpgradeTest.java |  115 +-
 .../RollingUpgradeWithGfshDUnitTest.java           |  130 +-
 .../management/RollingUpgradeWithSslDUnitTest.java |  137 +-
 .../cli/commands/ConnectCommandUpgradeTest.java    |   93 +-
 .../web/controllers/RestAPICompatibilityTest.java  |   40 +-
 .../Tomcat8ClientServerRollingUpgradeTest.java     |  213 +-
 ...omcatSessionBackwardsCompatibilityTestBase.java |   46 +-
 .../test/junit/rules/GfshExecutorVersionTest.java  |   53 +
 .../test/junit/rules/GfshRuleUpgradeTest.java      |   85 -
 geode-book/Gemfile.lock                            |    2 +-
 geode-book/README.md                               |   26 +-
 geode-book/config.yml                              |   11 +-
 .../source/subnavs/geode-subnav.erb                |    3 -
 geode-book/redirects.rb                            |    4 +-
 geode-common/build.gradle                          |   13 +-
 .../org/apache/geode/annotations/Experimental.java |    6 +-
 .../org/apache/geode/annotations/Immutable.java    |    6 +-
 .../geode/annotations/VisibleForTesting.java       |    6 +-
 .../annotations/internal/MakeNotSerializable.java  |   34 +
 .../internal/SerializableCompatibility.java        |   33 +
 .../geode/internal/lang/utils/ClassUtils.java      |   14 +-
 .../geode/internal/version/ComponentVersion.java   |    2 +-
 .../internal/version/DistributionVersion.java      |    2 +-
 .../java/org/apache/geode/lang/Identifiable.java   |    4 +-
 .../geode/util/internal/GeodeJsonMapper.java       |   10 +
 .../geode/internal/lang/utils/ClassUtilsTest.java  |    2 +-
 geode-common/src/test/resources/expected-pom.xml   |   10 +
 geode-concurrency-test/build.gradle                |    9 +-
 .../test/concurrency/ConcurrentTestRunner.java     |    4 +-
 .../geode/test/concurrency/ParallelExecutor.java   |    6 +-
 .../org/apache/geode/test/concurrency/Runner.java  |    2 +-
 geode-connectors/build.gradle                      |    8 +-
 .../jdbc/JdbcPooledDataSourceFactory.java          |   12 +-
 geode-core/build.gradle                            |   29 +-
 .../cache/RegionExpirationDistributedTest.java     |    2 +-
 .../ClientServerRegisterInterestsDUnitTest.java    |  169 +-
 ...ryClassCastExceptionFailureDistributedTest.java |   84 +
 .../DistributedMulticastRegionDUnitTest.java       |  370 ---
 .../DistributedMulticastRegionDistributedTest.java |  255 ++
 ...tedMulticastRegionWithUDPSecurityDUnitTest.java |   38 -
 ...ticastRegionWithUDPSecurityDistributedTest.java |   43 +
 .../geode/cache30/DynamicRegionDUnitTest.java      |    2 +-
 .../apache/geode/cache30/ReconnectDUnitTest.java   |  573 ++---
 .../geode/distributed/HostedLocatorsDUnitTest.java |  431 ++--
 .../geode/distributed/ServerLauncherDUnitTest.java |   10 +-
 .../DistributionStatsNodesDistributedTest.java     |  120 +
 .../internal/P2PMessagingConcurrencyDUnitTest.java |    2 +-
 ...P2pMessagingSslTlsKeyUpdateDistributedTest.java |  367 +++
 .../internal/locks/DLockGrantorHelper.java         |    3 +-
 .../ClearDuringNetSearchOplogRegressionTest.java   |   40 +-
 .../internal/cache/DistributedCacheTestCase.java   |    1 +
 .../geode/internal/cache/GIIDeltaDUnitTest.java    |   39 +-
 .../cache/HAOverflowMemObjectSizerDUnitTest.java   |  288 ---
 .../HAOverflowMemObjectSizerDistributedTest.java   |  291 +++
 ...nternalCacheForClientAccessDistributedTest.java |  180 ++
 ...PartitionedRegionRestartRebalanceDUnitTest.java |  133 +
 ...nedRegionSingleHopWithServerGroupDUnitTest.java |   10 +-
 .../cache/PartitionedRegionStatsDUnitTest.java     |  370 ---
 .../PartitionedRegionStatsDistributedTest.java     |  399 +++
 ...egionFunctionExecutionNoSingleHopDUnitTest.java | 1117 ---------
 ...unctionExecutionNoSingleHopDistributedTest.java | 1096 +++++++++
 .../cache/execute/PRClientServerTestBase.java      |  351 +--
 .../geode/internal/cache/execute/TimeKeeper.java   |    2 +-
 .../geode/internal/cache/ha/FailoverDUnitTest.java |  328 ---
 .../internal/cache/ha/FailoverDistributedTest.java |  328 +++
 .../geode/internal/cache/ha/HAClearDUnitTest.java  |  623 -----
 .../internal/cache/ha/HAClearDistributedTest.java  |  623 +++++
 .../internal/cache/ha/HAConflationDUnitTest.java   |  426 ----
 .../cache/ha/HAConflationDistributedTest.java      |  427 ++++
 .../cache/ha/HAEventIdPropagationDUnitTest.java    |  811 -------
 .../ha/HAEventIdPropagationDistributedTest.java    |  811 +++++++
 .../geode/internal/cache/ha/HAGIIDUnitTest.java    |  491 ----
 .../internal/cache/ha/HAGIIDistributedTest.java    |  492 ++++
 .../cache/ha/HARQueueNewImplDUnitTest.java         | 1128 ---------
 .../cache/ha/HARQueueNewImplDistributedTest.java   | 1133 +++++++++
 ...RegionQueueExpiryRegressionDistributedTest.java |  196 ++
 .../ha/HARegionQueueExpiryRegressionTest.java      |  196 --
 ...onedRegionCacheCloseNoRetryDistributedTest.java |  288 +++
 ...tColocatedPartitionedRegionDistributedTest.java |    2 +-
 .../tier/sockets/ClientConflationDUnitTest.java    |  529 ----
 .../sockets/ClientConflationDistributedTest.java   |  529 ++++
 .../sockets/ClientInterestNotifyDUnitTest.java     |  575 -----
 .../ClientInterestNotifyDistributedTest.java       |  576 +++++
 .../cache/tier/sockets/ConflationDUnitTest.java    |  792 ------
 .../tier/sockets/ConflationDistributedTest.java    |  792 ++++++
 .../sockets/DurableClientBug39997DUnitTest.java    |  138 --
 ...bleClientNoServerAvailabileDistributedTest.java |   98 +
 .../tier/sockets/DurableClientStatsDUnitTest.java  |  232 +-
 .../tier/sockets/DurableRegistrationDUnitTest.java |  802 ------
 .../DurableRegistrationDistributedTest.java        |  702 ++++++
 .../CompressionCacheListenerDUnitTest.java         |    5 -
 .../CompressionRegionConfigDUnitTest.java          |    5 -
 .../CompressionRegionFactoryDUnitTest.java         |    5 -
 .../compression/CompressionStatsDUnitTest.java     |    5 -
 .../internal/jta/dunit/LoginTimeOutDUnitTest.java  |    8 +-
 .../statistics/StatisticsDistributedTest.java      |  188 +-
 .../tcp/ConnectionCloseSSLTLSDUnitTest.java        |    8 +-
 .../geode/internal/tcp/OffHeapByteSourceTest.java  |   62 +
 .../MemberMXBeanAttributesDistributedTest.java     |   51 +-
 .../geode/management/QueryDataDUnitTest.java       |    2 +-
 .../geode/management/QueryPdxDataDUnitTest.java    |   34 +-
 .../ClusterConfigDeployJarDUnitTest.java           |   13 +-
 .../ClusterConfigImportDUnitTest.java              |   13 +-
 .../ClusterConfigStartMemberDUnitTest.java         |   16 +-
 .../internal/pulse/TestLocatorsDUnitTest.java      |   11 +-
 .../geode/security/AuthExpirationDUnitTest.java    |  333 ---
 .../security/AuthExpirationDistributedTest.java    |  335 +++
 .../internal/BindDistributedSystemJUnitTest.java   |    1 -
 .../internal/CacheHealthEvaluatorJUnitTest.java    |    2 +-
 .../cache/RetryPutIfAbsentIntegrationTest.java     |   99 +-
 .../internal/QueueManagerIntegrationTest.java      |  936 +++++++
 .../client/internal/QueueManagerJUnitTest.java     |  858 -------
 .../cache30/CacheXmlNotFoundRegressionTest.java    |    2 +-
 .../LocatorLauncherLocalIntegrationTest.java       |   22 +
 .../internal/LocatorIntegrationTest.java           |   61 +
 ...ObjectThatAreNoLongerNeededIntegrationTest.java |  449 ++++
 .../EnforceUniqueHostForLonerIntegrationTest.java  |    2 +-
 .../cache/PartitionedRegionCreationJUnitTest.java  |    4 +-
 ...itionedRegionSingleNodeOperationsJUnitTest.java |    6 +-
 .../ha/BlockingHARQAddOperationJUnitTest.java      |    4 +-
 .../sockets/ConnectionProxyIntegrationTest.java    |  395 +++
 .../tier/sockets/ConnectionProxyJUnitTest.java     |  771 ------
 .../cache/xmlcache/CacheXmlParserJUnitTest.java    |    2 -
 .../internal/net/NioSslEngineKeyUpdateTest.java    |  497 ++++
 .../internal/net/SSLSocketIntegrationTest.java     |    1 -
 .../DistributedSystemMBeanIntegrationTest.java     |   35 +-
 .../codeAnalysis/sanctionedDataSerializables.txt   |    8 +-
 .../geode/internal/JvmSizeUtilsBenchmark.java      |   78 +
 .../src/main/java/org/apache/geode/CopyHelper.java |    2 +
 .../java/org/apache/geode/DataSerializable.java    |   13 +-
 .../main/java/org/apache/geode/DataSerializer.java |  380 ++-
 .../src/main/java/org/apache/geode/Delta.java      |    9 +
 .../apache/geode/ForcedDisconnectException.java    |    2 +
 .../org/apache/geode/GemFireCacheException.java    |    7 +
 .../org/apache/geode/GemFireCheckedException.java  |    9 +
 .../org/apache/geode/GemFireConfigException.java   |    5 +
 .../java/org/apache/geode/GemFireException.java    |   10 +
 .../java/org/apache/geode/GemFireIOException.java  |    3 +
 .../java/org/apache/geode/GemFireRethrowable.java  |    1 +
 .../apache/geode/IncompatibleSystemException.java  |    2 +
 .../main/java/org/apache/geode/Instantiator.java   |   14 +
 .../org/apache/geode/InternalGemFireException.java |    5 +
 .../org/apache/geode/InvalidValueException.java    |    5 +
 .../src/main/java/org/apache/geode/LogWriter.java  |   76 +
 .../java/org/apache/geode/NoSystemException.java   |    5 +
 .../java/org/apache/geode/StatisticDescriptor.java |   14 +
 .../src/main/java/org/apache/geode/Statistics.java |   75 +
 .../java/org/apache/geode/StatisticsFactory.java   |   33 +
 .../main/java/org/apache/geode/StatisticsType.java |   10 +
 .../org/apache/geode/StatisticsTypeFactory.java    |   76 +
 .../org/apache/geode/SystemConnectException.java   |    2 +
 .../main/java/org/apache/geode/SystemFailure.java  |   14 +-
 .../org/apache/geode/SystemIsRunningException.java |    2 +
 .../java/org/apache/geode/ToDataException.java     |    5 +
 .../org/apache/geode/UncreatedSystemException.java |    5 +
 .../org/apache/geode/UnmodifiableException.java    |    2 +
 .../org/apache/geode/UnstartedSystemException.java |    5 +
 .../java/org/apache/geode/admin/AdminConfig.java   |    5 +-
 .../apache/geode/admin/AdminDistributedSystem.java |   83 +-
 .../geode/admin/AdminDistributedSystemFactory.java |    6 +
 .../org/apache/geode/admin/AdminXmlException.java  |    5 +
 .../main/java/org/apache/geode/admin/Alert.java    |   29 +-
 .../java/org/apache/geode/admin/AlertLevel.java    |   12 +-
 .../java/org/apache/geode/admin/AlertListener.java |    2 +
 .../java/org/apache/geode/admin/BackupStatus.java  |    4 +
 .../org/apache/geode/admin/CacheHealthConfig.java  |   31 +-
 .../java/org/apache/geode/admin/CacheServer.java   |    1 +
 .../main/java/org/apache/geode/admin/CacheVm.java  |    2 +
 .../java/org/apache/geode/admin/CacheVmConfig.java |   11 +
 .../apache/geode/admin/ConfigurationParameter.java |   66 +-
 .../geode/admin/DistributedSystemConfig.java       |  272 ++-
 .../geode/admin/DistributedSystemHealthConfig.java |   10 +-
 .../apache/geode/admin/DistributionLocator.java    |    4 +
 .../geode/admin/DistributionLocatorConfig.java     |   12 +
 .../java/org/apache/geode/admin/GemFireHealth.java |   22 +
 .../apache/geode/admin/GemFireHealthConfig.java    |    7 +
 .../java/org/apache/geode/admin/ManagedEntity.java |    4 +
 .../apache/geode/admin/ManagedEntityConfig.java    |   24 +
 .../org/apache/geode/admin/MemberHealthConfig.java |   25 +-
 .../java/org/apache/geode/admin/SystemMember.java  |   58 +-
 .../geode/admin/SystemMemberBridgeServer.java      |   32 +-
 .../org/apache/geode/admin/SystemMemberCache.java  |   34 +
 .../apache/geode/admin/SystemMemberCacheEvent.java |    2 +
 .../geode/admin/SystemMemberCacheServer.java       |   25 +-
 .../org/apache/geode/admin/SystemMemberRegion.java |   87 +-
 .../geode/admin/SystemMemberRegionEvent.java       |    2 +
 .../org/apache/geode/admin/SystemMemberType.java   |   25 +-
 .../apache/geode/admin/SystemMembershipEvent.java  |    2 +
 .../geode/admin/SystemMembershipListener.java      |   12 +-
 .../admin/internal/AdminDistributedSystemImpl.java |    5 +-
 .../admin/internal/CacheHealthConfigImpl.java      |    2 +-
 .../admin/internal/DistributionLocatorImpl.java    |   12 +-
 .../java/org/apache/geode/admin/jmx/Agent.java     |   23 +
 .../org/apache/geode/admin/jmx/AgentConfig.java    |  202 +-
 .../org/apache/geode/admin/jmx/AgentFactory.java   |    6 +
 .../geode/admin/jmx/internal/AgentConfigImpl.java  |    4 +-
 .../apache/geode/admin/jmx/internal/AgentImpl.java |    3 +-
 .../geode/admin/jmx/internal/AgentLauncher.java    |   14 +-
 .../admin/jmx/internal/GenerateMBeanHTML.java      |    4 +-
 .../org/apache/geode/cache/AttributesFactory.java  |   72 +-
 .../org/apache/geode/cache/AttributesMutator.java  |   10 +
 .../main/java/org/apache/geode/cache/Cache.java    |   58 +
 .../java/org/apache/geode/cache/CacheEvent.java    |    1 +
 .../org/apache/geode/cache/CacheException.java     |   15 +-
 .../apache/geode/cache/CacheExistsException.java   |    3 +
 .../java/org/apache/geode/cache/CacheFactory.java  |   16 +-
 .../java/org/apache/geode/cache/CacheListener.java |   15 +-
 .../java/org/apache/geode/cache/CacheLoader.java   |    6 +-
 .../org/apache/geode/cache/CacheStatistics.java    |    2 +-
 .../geode/cache/CacheTransactionManager.java       |    4 +
 .../org/apache/geode/cache/CacheXmlException.java  |    5 +
 .../java/org/apache/geode/cache/DataPolicy.java    |   16 +-
 .../java/org/apache/geode/cache/Declarable.java    |    1 +
 .../apache/geode/cache/DiskAccessException.java    |    2 +
 .../java/org/apache/geode/cache/DiskStore.java     |    5 +-
 .../geode/cache/DiskWriteAttributesFactory.java    |    2 +
 .../cache/DuplicatePrimaryPartitionException.java  |    8 +-
 .../apache/geode/cache/DynamicRegionFactory.java   |   28 +-
 .../java/org/apache/geode/cache/EntryEvent.java    |    2 +
 .../apache/geode/cache/EntryExistsException.java   |    5 +
 .../org/apache/geode/cache/EntryOperation.java     |    4 +
 .../org/apache/geode/cache/EvictionAction.java     |    7 +-
 .../org/apache/geode/cache/EvictionAlgorithm.java  |   17 +-
 .../org/apache/geode/cache/EvictionAttributes.java |   58 +-
 .../org/apache/geode/cache/ExpirationAction.java   |    7 +-
 .../geode/cache/FixedPartitionAttributes.java      |   14 +-
 .../apache/geode/cache/FixedPartitionResolver.java |   45 +-
 .../java/org/apache/geode/cache/GemFireCache.java  |   37 +-
 .../org/apache/geode/cache/InterestPolicy.java     |    7 +-
 .../geode/cache/InterestRegistrationListener.java  |    4 +-
 .../apache/geode/cache/InterestResultPolicy.java   |   13 +-
 .../java/org/apache/geode/cache/LossAction.java    |   39 +-
 .../apache/geode/cache/MembershipAttributes.java   |   22 +-
 .../java/org/apache/geode/cache/MirrorType.java    |   27 +-
 .../java/org/apache/geode/cache/Operation.java     |   53 +-
 .../apache/geode/cache/PartitionAttributes.java    |   13 +-
 .../geode/cache/PartitionAttributesFactory.java    |   42 +-
 .../org/apache/geode/cache/PartitionResolver.java  |   27 +-
 .../cache/PartitionedRegionStorageException.java   |    6 +-
 .../main/java/org/apache/geode/cache/Region.java   |  135 +-
 .../apache/geode/cache/RegionAccessException.java  |    5 +-
 .../org/apache/geode/cache/RegionAttributes.java   |   25 +
 .../geode/cache/RegionDestroyedException.java      |    2 +
 .../geode/cache/RegionDistributionException.java   |    5 +-
 .../java/org/apache/geode/cache/RegionEvent.java   |    2 +
 .../java/org/apache/geode/cache/RegionFactory.java |   34 +-
 .../geode/cache/RegionReinitializedException.java  |    2 +
 .../apache/geode/cache/RegionRoleException.java    |    1 +
 .../org/apache/geode/cache/RegionRoleListener.java |    1 +
 .../java/org/apache/geode/cache/RegionService.java |    5 +
 .../java/org/apache/geode/cache/RequiredRoles.java |    3 +
 .../org/apache/geode/cache/ResumptionAction.java   |   27 +-
 .../java/org/apache/geode/cache/RoleEvent.java     |    3 +
 .../java/org/apache/geode/cache/RoleException.java |    1 +
 .../main/java/org/apache/geode/cache/Scope.java    |    7 +-
 .../apache/geode/cache/SubscriptionAttributes.java |    4 +-
 .../org/apache/geode/cache/TransactionEvent.java   |    1 +
 .../org/apache/geode/cache/VersionException.java   |   15 +-
 .../apache/geode/cache/asyncqueue/AsyncEvent.java  |    5 +
 .../geode/cache/asyncqueue/AsyncEventListener.java |    2 +-
 .../geode/cache/asyncqueue/AsyncEventQueue.java    |   13 +-
 .../cache/asyncqueue/AsyncEventQueueFactory.java   |   26 +-
 .../org/apache/geode/cache/client/ClientCache.java |   11 +
 .../geode/cache/client/ClientCacheFactory.java     |   40 +-
 .../cache/client/ClientNotReadyException.java      |    1 +
 .../geode/cache/client/ClientRegionFactory.java    |    1 +
 .../java/org/apache/geode/cache/client/Pool.java   |   55 +-
 .../org/apache/geode/cache/client/PoolFactory.java |    8 +-
 .../apache/geode/cache/client/SocketFactory.java   |    1 +
 .../geode/cache/client/internal/AbstractOp.java    |    2 +-
 .../client/internal/ConnectionFactoryImpl.java     |    3 +-
 .../cache/client/internal/LiveServerPinger.java    |   41 +-
 .../cache/client/internal/QueueManagerImpl.java    |   79 +-
 .../cache/client/internal/QueueStateImpl.java      |    2 +-
 .../cache/client/internal/ReadyForEventsOp.java    |    4 +-
 .../client/internal/RegisterInterestListOp.java    |    4 +-
 .../client/internal/RegisterInterestTracker.java   |   52 +-
 .../geode/cache/client/internal/RemoveAllOp.java   |    2 +-
 .../cache/client/internal/ServerRegionProxy.java   |    2 +-
 .../client/internal/SingleHopClientExecutor.java   |    8 +-
 .../internal/locator/LocatorStatusRequest.java     |    2 +-
 .../internal/locator/LocatorStatusResponse.java    |    2 +-
 .../cache/client/proxy/ProxySocketFactories.java   |    3 +-
 .../geode/cache/configuration/CacheConfig.java     | 1056 ++++----
 .../configuration/CacheTransactionManagerType.java |   70 +-
 .../geode/cache/configuration/ClassNameType.java   |   20 +-
 .../geode/cache/configuration/DeclarableType.java  |   22 +-
 .../geode/cache/configuration/DiskDirType.java     |   18 +-
 .../geode/cache/configuration/DiskDirsType.java    |   20 +-
 .../geode/cache/configuration/DiskStoreType.java   |   58 +-
 .../configuration/DynamicRegionFactoryType.java    |   32 +-
 .../configuration/EnumActionDestroyOverflow.java   |   13 +-
 .../cache/configuration/EnumReadableWritable.java  |   13 +-
 .../cache/configuration/FunctionServiceType.java   |   43 +-
 .../cache/configuration/GatewayReceiverConfig.java |   49 +-
 .../cache/configuration/JndiBindingsType.java      |  264 +-
 .../geode/cache/configuration/ObjectType.java      |   28 +-
 .../geode/cache/configuration/ParameterType.java   |   24 +-
 .../apache/geode/cache/configuration/PdxType.java  |   59 +-
 .../apache/geode/cache/configuration/PoolType.java |  192 +-
 .../configuration/RegionAttributesDataPolicy.java  |   23 +-
 .../RegionAttributesIndexUpdateType.java           |   13 +-
 .../configuration/RegionAttributesMirrorType.java  |   15 +-
 .../cache/configuration/RegionAttributesScope.java |   17 +-
 .../cache/configuration/RegionAttributesType.java  | 1193 +++++----
 .../geode/cache/configuration/RegionConfig.java    |  354 +--
 .../cache/configuration/ResourceManagerType.java   |   28 +-
 .../SerializationRegistrationType.java             |  110 +-
 .../geode/cache/configuration/ServerType.java      |  175 +-
 .../geode/cache/control/RebalanceFactory.java      |   10 +-
 .../geode/cache/control/RebalanceOperation.java    |    4 +
 .../geode/cache/control/ResourceManager.java       |   17 +-
 .../cache/control/RestoreRedundancyOperation.java  |    7 +-
 .../org/apache/geode/cache/execute/Execution.java  |    2 +
 .../org/apache/geode/cache/execute/Function.java   |   24 +-
 .../geode/cache/execute/FunctionAdapter.java       |    4 +-
 .../geode/cache/execute/FunctionContext.java       |    3 +-
 .../geode/cache/execute/FunctionException.java     |    9 +-
 .../geode/cache/execute/FunctionService.java       |   36 +-
 .../geode/cache/execute/RegionFunctionContext.java |    5 +-
 .../geode/cache/execute/ResultCollector.java       |    6 +-
 .../apache/geode/cache/execute/ResultSender.java   |    4 +
 .../cache/operations/CloseCQOperationContext.java  |    1 +
 .../cache/operations/DestroyOperationContext.java  |    1 +
 .../operations/ExecuteCQOperationContext.java      |    7 +-
 .../ExecuteFunctionOperationContext.java           |    1 +
 .../operations/GetDurableCQsOperationContext.java  |    1 +
 .../cache/operations/GetOperationContext.java      |    1 +
 .../cache/operations/InterestOperationContext.java |    1 +
 .../geode/cache/operations/InterestType.java       |    9 +
 .../operations/InvalidateOperationContext.java     |    1 +
 .../cache/operations/KeyOperationContext.java      |    1 +
 .../cache/operations/KeySetOperationContext.java   |    1 +
 .../cache/operations/KeyValueOperationContext.java |    1 +
 .../geode/cache/operations/OperationContext.java   |    9 +
 .../cache/operations/PutAllOperationContext.java   |    8 +
 .../cache/operations/PutOperationContext.java      |    1 +
 .../cache/operations/QueryOperationContext.java    |    6 +-
 .../operations/RegionClearOperationContext.java    |    1 +
 .../operations/RegionCreateOperationContext.java   |    1 +
 .../operations/RegionDestroyOperationContext.java  |    1 +
 .../cache/operations/RegionOperationContext.java   |    1 +
 .../RegisterInterestOperationContext.java          |    1 +
 .../operations/RemoveAllOperationContext.java      |    4 +
 .../cache/operations/StopCQOperationContext.java   |    1 +
 .../UnregisterInterestOperationContext.java        |    1 +
 .../internal/GetOperationContextImpl.java          |    1 +
 .../cache/partition/PartitionListenerAdapter.java  |    4 +-
 .../partition/PartitionNotAvailableException.java  |   10 +-
 .../cache/partition/PartitionRegionHelper.java     |   21 +-
 .../persistence/PartitionOfflineException.java     |    3 +
 .../geode/cache/persistence/PersistentID.java      |    6 +
 .../org/apache/geode/cache/query/Aggregator.java   |    2 +
 .../org/apache/geode/cache/query/CqListener.java   |    4 +
 .../java/org/apache/geode/cache/query/CqQuery.java |    5 +-
 .../org/apache/geode/cache/query/CqResults.java    |    2 +-
 .../geode/cache/query/CqServiceStatistics.java     |    1 +
 .../java/org/apache/geode/cache/query/CqState.java |    8 +
 .../java/org/apache/geode/cache/query/Index.java   |   14 +
 .../apache/geode/cache/query/IndexStatistics.java  |   23 +
 .../org/apache/geode/cache/query/IndexType.java    |    3 +-
 .../cache/query/MultiIndexCreationException.java   |    3 +-
 .../java/org/apache/geode/cache/query/Query.java   |    4 +-
 .../org/apache/geode/cache/query/QueryService.java |   32 +-
 .../apache/geode/cache/query/QueryStatistics.java  |    4 +
 .../apache/geode/cache/query/SelectResults.java    |    9 +-
 .../java/org/apache/geode/cache/query/Struct.java  |    2 +
 .../configuration/QueryConfigService.java          |  118 +-
 .../security/JavaBeanAccessorMethodAuthorizer.java |   15 +-
 .../query/security/MethodInvocationAuthorizer.java |    9 +-
 .../query/security/RegExMethodAuthorizer.java      |   15 +-
 .../query/security/RestrictedMethodAuthorizer.java |   15 +-
 .../security/UnrestrictedMethodAuthorizer.java     |   15 +-
 .../geode/cache/query/types/CollectionType.java    |    2 +
 .../apache/geode/cache/query/types/MapType.java    |    2 +
 .../apache/geode/cache/query/types/ObjectType.java |   14 +-
 .../apache/geode/cache/query/types/StructType.java |    2 +
 .../org/apache/geode/cache/server/CacheServer.java |   32 +-
 .../cache/server/ClientSubscriptionConfig.java     |   13 +-
 .../org/apache/geode/cache/server/ServerLoad.java  |    8 +
 .../apache/geode/cache/server/ServerLoadProbe.java |    6 +-
 .../apache/geode/cache/server/ServerMetrics.java   |    8 +
 .../geode/cache/snapshot/CacheSnapshotService.java |    4 +-
 .../cache/snapshot/RegionSnapshotService.java      |    4 +-
 .../geode/cache/snapshot/SnapshotOptions.java      |    2 +-
 .../geode/cache/util/CacheListenerAdapter.java     |    4 +-
 .../java/org/apache/geode/cache/util/Gateway.java  |    2 +-
 .../geode/cache/util/GatewayConflictHelper.java    |    6 +-
 .../geode/cache/util/GatewayConflictResolver.java  |    3 +-
 .../cache/util/RegionRoleListenerAdapter.java      |    1 +
 .../apache/geode/cache/wan/GatewayEventFilter.java |    4 +-
 .../apache/geode/cache/wan/GatewayReceiver.java    |   15 +-
 .../geode/cache/wan/GatewayReceiverFactory.java    |   11 +
 .../org/apache/geode/cache/wan/GatewaySender.java  |   13 +-
 .../geode/cache/wan/GatewaySenderFactory.java      |   27 +-
 .../apache/geode/compression/SnappyCompressor.java |    3 +
 .../apache/geode/distributed/AbstractLauncher.java |    5 +-
 .../geode/distributed/ClientSocketFactory.java     |    1 +
 .../ConfigurationPersistenceService.java           |    2 +
 .../geode/distributed/ConfigurationProperties.java | 1404 ++++++-----
 .../geode/distributed/DistributedLockService.java  |   14 +-
 .../geode/distributed/DistributedMember.java       |   13 +
 .../geode/distributed/DistributedSystem.java       |   36 +-
 .../geode/distributed/DurableClientAttributes.java |    2 +
 .../geode/distributed/LeaseExpiredException.java   |    2 +
 .../java/org/apache/geode/distributed/Locator.java |   30 +-
 .../apache/geode/distributed/LocatorLauncher.java  |   80 +-
 .../java/org/apache/geode/distributed/Role.java    |    1 +
 .../apache/geode/distributed/ServerLauncher.java   |   37 +
 .../internal/AbstractDistributionConfig.java       |   28 +-
 .../internal/ClusterDistributionManager.java       |  158 +-
 .../distributed/internal/DistributionAdvisor.java  |   36 +-
 .../distributed/internal/DistributionConfig.java   |  109 +-
 .../internal/DistributionConfigImpl.java           |   80 +-
 .../distributed/internal/DistributionManager.java  |    1 +
 .../distributed/internal/DistributionMessage.java  |    6 +-
 .../internal/InternalDistributedSystem.java        |   12 +-
 .../distributed/internal/InternalLocator.java      |  186 +-
 .../distributed/internal/LocatorLoadSnapshot.java  |    3 +-
 .../distributed/internal/ProcessorKeeper21.java    |    2 +-
 .../distributed/internal/locks/DLockGrantor.java   |    4 +-
 .../internal/membership/InternalRole.java          |    7 +-
 .../unsafe/RegisterSignalHandlerSupport.java       |    2 +-
 .../java/org/apache/geode/i18n/LogWriterI18n.java  |  130 +
 .../main/java/org/apache/geode/i18n/StringId.java  |    5 +
 .../org/apache/geode/internal/JvmSizeUtils.java    |   13 +-
 .../java/org/apache/geode/internal/NanoTimer.java  |    2 +-
 .../org/apache/geode/internal/admin/StatAlert.java |    2 +-
 .../admin/remote/DistributionLocatorId.java        |  463 ++--
 .../internal/admin/remote/RemoteApplicationVM.java |    2 +-
 .../internal/admin/remote/RemoteGemFireVM.java     |    2 +-
 .../admin/remote/RemoteTransportConfig.java        |   62 +-
 .../geode/internal/cache/AbstractRegionMap.java    |   10 +-
 .../apache/geode/internal/cache/BucketAdvisor.java |   43 +-
 .../apache/geode/internal/cache/BucketRegion.java  |   46 +-
 .../geode/internal/cache/BucketRegionQueue.java    |    6 +-
 .../geode/internal/cache/CacheServerImpl.java      |   21 +-
 .../geode/internal/cache/DiskStoreAttributes.java  |    2 +-
 .../apache/geode/internal/cache/DiskStoreImpl.java |  121 +-
 .../geode/internal/cache/DistributedRegion.java    |   30 +-
 .../geode/internal/cache/EntryExpiryTask.java      |    5 +-
 .../apache/geode/internal/cache/FilterProfile.java |   35 +-
 .../geode/internal/cache/GemFireCacheImpl.java     |   21 +-
 .../apache/geode/internal/cache/GridAdvisor.java   |    5 +-
 .../internal/cache/InitialImageOperation.java      |   62 +-
 .../apache/geode/internal/cache/InternalCache.java |    2 -
 .../cache/InternalCacheForClientAccess.java        |    5 -
 .../geode/internal/cache/InternalRegion.java       |    4 +
 .../apache/geode/internal/cache/LocalRegion.java   |    8 +-
 .../org/apache/geode/internal/cache/Oplog.java     |   69 +-
 .../geode/internal/cache/PartitionedRegion.java    |   53 +-
 .../internal/cache/PartitionedRegionDataStore.java |   12 +-
 .../internal/cache/PartitionedRegionHelper.java    |    2 +
 .../internal/cache/PrimaryBucketLockException.java |    4 +-
 .../internal/cache/UpdateAttributesProcessor.java  |    4 +-
 .../geode/internal/cache/UpdateOperation.java      |   13 +-
 .../internal/cache/control/HeapMemoryMonitor.java  |   10 +-
 .../cache/control/OffHeapMemoryMonitor.java        |    9 +-
 .../cache/execute/FunctionExecutionService.java    |    2 +-
 .../cache/execute/InternalFunctionException.java   |    2 +-
 .../PartitionedRegionFunctionResultSender.java     |   77 +-
 .../ServerToClientFunctionResultSender.java        |   10 +-
 .../ServerToClientFunctionResultSender65.java      |    2 +-
 .../cache/locks/TXLessorDepartureHandler.java      |    5 +-
 .../geode/internal/cache/map/RegionMapPut.java     |   21 +-
 .../operations/ContainsKeyOperationContext.java    |    1 +
 .../cache/partitioned/ContainsKeyValueMessage.java |    2 +-
 .../internal/cache/partitioned/FlushMessage.java   |    4 +-
 .../cache/partitioned/PartitionMessage.java        |   14 +
 .../PartitionedRegionFunctionStreamingMessage.java |    2 +-
 .../internal/cache/partitioned/PutMessage.java     |   12 +-
 .../internal/cache/partitioned/RegionAdvisor.java  |    5 +-
 .../internal/cache/partitioned/SizeMessage.java    |    2 +-
 .../cache/persistence/PersistenceAdvisorImpl.java  |   19 +-
 .../internal/cache/tier/sockets/AcceptorImpl.java  |    2 +-
 .../cache/tier/sockets/CacheClientProxy.java       |    4 +-
 .../cache/tier/sockets/MessageDispatcher.java      |  100 +-
 .../tier/sockets/RandomSubjectIdGenerator.java     |    5 +-
 .../cache/tier/sockets/SubjectIdGenerator.java     |    4 +-
 .../internal/cache/tier/sockets/command/Put70.java |   17 +-
 .../internal/cache/tier/sockets/command/Size.java  |    2 +-
 .../geode/internal/cache/tx/RemoteSizeMessage.java |    2 +-
 .../internal/cache/versions/DiskVersionTag.java    |    6 +-
 .../cache/versions/RegionVersionHolder.java        |    4 +-
 .../cache/versions/RegionVersionVector.java        |    4 +
 .../geode/internal/cache/versions/VersionTag.java  |    4 +-
 .../wan/parallel/ParallelGatewaySenderQueue.java   |    9 +
 .../serial/SerialGatewaySenderEventProcessor.java  |    9 +-
 .../cache/wan/serial/SerialGatewaySenderQueue.java |    3 +-
 .../internal/cache/xmlcache/CacheCreation.java     |    5 -
 .../cache/xmlcache/ClientHaQueueCreation.java      |    2 +
 .../cache/xmlcache/RegionAttributesCreation.java   |    1 +
 .../org/apache/geode/internal/concurrent/AL.java   |    1 +
 .../concurrent/CompactConcurrentHashSet2.java      |    2 +-
 .../internal/datasource/DataSourceFactory.java     |    2 +-
 .../apache/geode/internal/jndi/JNDIInvoker.java    |    6 +-
 .../geode/internal/jta/GlobalTransaction.java      |    2 +-
 .../geode/internal/jta/TransactionManagerImpl.java |    2 +-
 .../geode/internal/jta/UserTransactionImpl.java    |    2 +-
 .../org/apache/geode/internal/jta/XidImpl.java     |    2 +-
 .../org/apache/geode/internal/lang/Filter.java     |    2 +-
 .../apache/geode/internal/lang/InOutParameter.java |   14 +-
 .../org/apache/geode/internal/lang/Initable.java   |    2 +-
 .../geode/internal/lang/MutableIdentifiable.java   |    4 +-
 .../apache/geode/internal/lang/ObjectUtils.java    |   10 +-
 .../org/apache/geode/internal/lang/Orderable.java  |    4 +-
 .../org/apache/geode/internal/lang/Ordered.java    |    6 +-
 .../apache/geode/internal/lang/StringUtils.java    |    8 +-
 .../geode/internal/lang/SystemPropertyHelper.java  |    8 +
 .../apache/geode/internal/lang/ThrowableUtils.java |    2 +-
 .../geode/internal/logging/log4j/LogMarker.java    |    1 +
 .../internal/monitoring/ThreadsMonitoring.java     |    4 +-
 .../internal/monitoring/ThreadsMonitoringImpl.java |    4 +
 .../monitoring/ThreadsMonitoringProcess.java       |   78 +-
 .../monitoring/executor/AbstractExecutor.java      |    4 +
 .../executor/AsyncWriterExecutorGroup.java         |   23 +
 .../monitoring/executor/SuspendableExecutor.java   |    9 +
 .../org/apache/geode/internal/net/BufferPool.java  |   10 +-
 .../apache/geode/internal/net/NioSslEngine.java    |   69 +-
 .../org/apache/geode/internal/net/SSLConfig.java   |   40 +-
 .../internal/net/SSLConfigurationFactory.java      |    2 +
 .../org/apache/geode/internal/net/SSLUtil.java     |   48 +-
 .../apache/geode/internal/net/SocketCreator.java   |  171 +-
 .../org/apache/geode/internal/net/SocketUtils.java |    6 +-
 .../internal/net/filewatch/PollingFileWatcher.java |    2 +-
 .../geode/internal/offheap/FreeListManager.java    |   47 +-
 .../internal/offheap/MemoryAllocatorImpl.java      |   45 +-
 .../geode/internal/offheap/OffHeapMemoryStats.java |    4 +
 .../geode/internal/offheap/OffHeapStorage.java     |   31 +-
 .../offheap/OffHeapStoredObjectAddressStack.java   |   11 +
 .../geode/internal/process/AttachProcessUtils.java |    4 +-
 .../internal/process/ControlFileWatchdog.java      |   24 +-
 .../internal/process/FileControllableProcess.java  |   15 +-
 .../internal/process/LocalProcessLauncher.java     |    9 +-
 .../geode/internal/process/NativeProcessUtils.java |    7 +-
 .../apache/geode/internal/process/ProcessType.java |    6 +
 .../geode/internal/process/ProcessUtils.java       |   29 +-
 .../internal/process/ProcessUtilsProvider.java     |   29 +
 .../geode/internal/size/ObjectGraphSizer.java      |   33 +-
 .../geode/internal/size/ObjectTraverser.java       |  136 +-
 .../internal/size/ReflectionSingleObjectSizer.java |  100 +-
 .../statistics/IgnoreResourceException.java        |    2 +-
 .../internal/statistics/ResourceInstance.java      |    2 +-
 .../geode/internal/statistics/ResourceType.java    |    2 +-
 .../geode/internal/statistics/SampleCollector.java |    6 +-
 .../geode/internal/statistics/SampleHandler.java   |    2 +-
 .../internal/statistics/StatArchiveDescriptor.java |    4 +-
 .../internal/statistics/StatArchiveHandler.java    |   12 +-
 .../geode/internal/statistics/ValueMonitor.java    |    2 +-
 .../geode/internal/tcp/ByteBufferInputStream.java  |   27 +-
 .../org/apache/geode/internal/tcp/Connection.java  |   28 +-
 .../apache/geode/internal/tcp/ServerDelegate.java  |    2 +-
 .../org/apache/geode/internal/util/ArrayUtils.java |    8 +-
 .../geode/internal/util/CollectionUtils.java       |   18 +-
 .../apache/geode/internal/util/DriverJarUtils.java |    2 +-
 .../org/apache/geode/internal/util/IOUtils.java    |   26 +-
 .../internal/util/SunAPINotFoundException.java     |    2 +-
 .../geode/lang/AttachAPINotFoundException.java     |    8 +-
 .../geode/management/AsyncEventQueueMXBean.java    |   24 +-
 .../apache/geode/management/CacheServerMXBean.java |  121 +-
 .../geode/management/ClientHealthStatus.java       |   52 +-
 .../apache/geode/management/DiskBackupResult.java  |    9 +-
 .../apache/geode/management/DiskBackupStatus.java  |    6 +
 .../org/apache/geode/management/DiskMetrics.java   |   24 +
 .../apache/geode/management/DiskStoreMXBean.java   |   38 +-
 .../management/DistributedLockServiceMXBean.java   |   15 +-
 .../geode/management/DistributedRegionMXBean.java  |   94 +
 .../geode/management/DistributedSystemMXBean.java  |  167 +-
 .../geode/management/EvictionAttributesData.java   |   10 +-
 .../management/FixedPartitionAttributesData.java   |    9 +-
 .../geode/management/GatewayReceiverMXBean.java    |   71 +
 .../geode/management/GatewaySenderMXBean.java      |   65 +-
 .../apache/geode/management/GemFireProperties.java |    3 +
 .../org/apache/geode/management/JVMMetrics.java    |   22 +
 .../org/apache/geode/management/LocatorMXBean.java |   14 +
 .../apache/geode/management/LockServiceMXBean.java |   15 +-
 .../geode/management/ManagementException.java      |    2 +-
 .../apache/geode/management/ManagementService.java |   35 +-
 .../org/apache/geode/management/ManagerMXBean.java |    8 +
 .../org/apache/geode/management/MemberMXBean.java  |  282 ++-
 .../geode/management/MembershipAttributesData.java |    7 +
 .../apache/geode/management/NetworkMetrics.java    |    8 +
 .../org/apache/geode/management/OSMetrics.java     |   46 +-
 .../geode/management/PartitionAttributesData.java  |   33 +
 .../geode/management/PersistentMemberDetails.java  |   11 +-
 .../geode/management/RegionAttributesData.java     |   78 +-
 .../org/apache/geode/management/RegionMXBean.java  |  120 +-
 .../apache/geode/management/ServerLoadData.java    |   13 +
 .../management/internal/JmxManagerAdvisor.java     |    7 +-
 .../internal/MonitoringRegionCacheListener.java    |    2 +-
 .../internal/SystemManagementService.java          |   12 +-
 .../api/LocatorClusterManagementService.java       |   72 +-
 .../management/internal/beans/MemberMBean.java     |   12 +
 .../internal/beans/MemberMBeanBridge.java          |   30 +
 .../functions/GetClusterConfigurationFunction.java |    1 +
 .../validators/DeploymentValidator.java            |    5 +-
 .../validators/DiskStoreValidator.java             |    4 +-
 .../validators/GatewayReceiverConfigValidator.java |   30 +-
 .../configuration/validators/IndexValidator.java   |    4 +
 .../validators/RegionConfigValidator.java          |    2 +
 .../geode/management/internal/i18n/CliStrings.java |    4 +
 .../internal/web/domain/QueryParameterSource.java  |    2 +-
 .../SerializableObjectHttpMessageConverter.java    |    2 +-
 .../membership/ClientMembershipEvent.java          |    8 +-
 .../membership/ClientMembershipListener.java       |    6 +
 .../management/membership/MembershipEvent.java     |    2 +
 .../management/membership/MembershipListener.java  |   13 +-
 .../UniversalMembershipListenerAdapter.java        |   26 +-
 .../geode/metrics/MetricsPublishingService.java    |    1 -
 .../InternalDistributedSystemMetricsService.java   |    3 +-
 .../main/java/org/apache/geode/pdx/FieldType.java  |   11 +-
 .../java/org/apache/geode/pdx/JSONFormatter.java   |    7 +-
 .../org/apache/geode/pdx/PdxInstanceFactory.java   |    4 +
 .../java/org/apache/geode/pdx/PdxSerializer.java   |    2 +-
 .../main/java/org/apache/geode/pdx/PdxWriter.java  |   16 +-
 .../geode/pdx/ReflectionBasedAutoSerializer.java   |   13 +-
 .../apache/geode/pdx/internal/PdxInputStream.java  |    4 -
 .../internal/WeakConcurrentIdentityHashMap.java    |    5 -
 .../org/apache/geode/security/AccessControl.java   |    1 +
 .../org/apache/geode/security/AuthInitialize.java  |    6 +-
 .../org/apache/geode/security/Authenticator.java   |    1 +
 .../apache/geode/security/ResourcePermission.java  |   17 +
 .../org/apache/geode/security/SecurityManager.java |    1 -
 .../org/apache/geode/services/result/Result.java   |    9 +-
 .../geode/services/result/ServiceResult.java       |    7 +-
 .../apache/geode/services/result/impl/Failure.java |   10 +-
 .../apache/geode/services/result/impl/Success.java |    6 +-
 .../sanctioned-geode-core-serializables.txt        |    4 +-
 .../client/internal/LiveServerPingerTest.java      |   78 +
 .../client/internal/QueueManagerImplTest.java      |   37 +
 .../locator/LocatorStatusResponseJUnitTest.java    |    2 +-
 .../apache/geode/cache/execute/FunctionTest.java   |   85 +
 .../apache/geode/distributed/ServerStateTest.java  |  204 ++
 .../internal/DistributionConfigImplTest.java       |    8 +-
 .../distributed/internal/InternalLocatorTest.java  |   53 +
 .../internal/ServerLocatorJUnitTest.java           |    4 +-
 .../geode/internal/JvmSizeUtilsJUnitTest.java      |   38 +
 .../remote/DistributionLocatorIdJUnitTest.java     |   76 -
 .../admin/remote/DistributionLocatorIdTest.java    |  157 ++
 .../internal/cache/AbstractRegionMapTest.java      |    6 +-
 .../cache/AbstractRegionMapTxApplyDestroyTest.java |   38 +-
 .../geode/internal/cache/BucketAdvisorTest.java    |   32 +-
 .../geode/internal/cache/BucketRegionTest.java     |   24 +
 .../cache/DiskStoreImplValueRecoveryTest.java      |   14 +
 .../internal/cache/DistributedRegionTest.java      |  158 +-
 .../geode/internal/cache/FlusherThreadTest.java    |   17 +
 .../geode/internal/cache/GemFireCacheImplTest.java |  101 +-
 .../internal/cache/InitialImageOperationTest.java  |  193 ++
 .../internal/cache/LocalRegionUpdateUnitTest.java  |  149 ++
 .../cache/PartitionedRegionHelperJUnitTest.java    |   40 +-
 .../internal/cache/PartitionedRegionTest.java      |   21 +-
 .../PartitionedRegionFunctionResultSenderTest.java |  174 ++
 .../cache/ha/EventIdOptimizationJUnitTest.java     |    2 +-
 .../geode/internal/cache/map/RegionMapPutTest.java |   30 +-
 .../persistence/PersistenceAdvisorImplTest.java    |   20 +-
 .../cache/tier/sockets/MessageDispatcherTest.java  |    8 +-
 .../cache/tier/sockets/MessageJUnitTest.java       |    2 +-
 .../cache/tier/sockets/command/Put70Test.java      |   91 +-
 .../versions/RegionVersionHolderJUnitTest.java     |   48 +
 .../cache/xmlcache/AbstractEntityResolverTest.java |    6 +-
 .../internal/lang/InOutParameterJUnitTest.java     |    2 +-
 .../geode/internal/lang/ObjectUtilsJUnitTest.java  |    2 +-
 .../geode/internal/lang/StringUtilsJUnitTest.java  |    2 +-
 .../geode/internal/lang/SystemUtilsJUnitTest.java  |    2 +-
 .../monitoring/ThreadsMonitoringImplJUnitTest.java |  149 --
 .../monitoring/ThreadsMonitoringImplTest.java      |  200 ++
 .../monitoring/ThreadsMonitoringJUnitTest.java     |    6 +-
 .../ThreadsMonitoringProcessJUnitTest.java         |   87 -
 .../monitoring/ThreadsMonitoringProcessTest.java   |  153 ++
 .../executor/AbstractExecutorGroupJUnitTest.java   |    2 +-
 .../executor/SuspendableExecutorTest.java          |   11 +
 .../apache/geode/internal/net/BufferPoolTest.java  |   82 +-
 .../geode/internal/net/NioSslEngineTest.java       |   40 +-
 .../apache/geode/internal/net/SSLConfigTest.java   |   49 +
 .../internal/net/SSLConfigurationFactoryTest.java  |  156 +-
 .../org/apache/geode/internal/net/SSLUtilTest.java |   98 +-
 .../geode/internal/net/SocketCreatorTest.java      |  247 +-
 .../geode/internal/net/SocketUtilsJUnitTest.java   |    2 +-
 .../OffHeapStorageNonRuntimeStatsJUnitTest.java    |   72 +
 .../internal/process/NativeProcessUtilsTest.java   |   17 +-
 .../internal/size/ObjectTraverserJUnitTest.java    |   35 +-
 .../size/ReflectionObjectSizerJUnitTest.java       |    2 +-
 .../size/ReflectionSingleObjectSizerTest.java      |   78 +
 .../internal/tcp/ConnectionTransmissionTest.java   |  257 ++
 .../internal/util/CollectionUtilsJUnitTest.java    |    2 +-
 .../geode/internal/util/IOUtilsJUnitTest.java      |    4 +-
 .../api/LocatorClusterManagementServiceTest.java   |  101 +-
 .../configuration/utils/XmlUtilsJUnitTest.java     |    2 +-
 .../validators/DeploymentValidatorTest.java        |    8 +-
 .../validators/DiskStoreValidatorTest.java         |    9 +
 .../GatewayReceiverConfigValidatorTest.java        |   15 +-
 .../validators/IndexValidatorTest.java             |    8 +
 .../validators/RegionConfigValidatorTest.java      |    9 +
 .../internal/json/QueryResultFormatterTest.java    |   10 +-
 ...lizableObjectHttpMessageConverterJUnitTest.java |    2 +-
 geode-core/src/test/resources/expected-pom.xml     |    2 +-
 .../geode/ClusterCommunicationsDUnitTest.java      |   23 +-
 ...sterConfigurationFunctionCompatibilityTest.java |   96 +
 .../internal/cache/TxCommitMessageBCTestBase.java  |   27 +-
 .../RollingUpgrade2DUnitTestBase.java              |   44 +-
 .../rollingupgrade/RollingUpgradeClients.java      |    8 +-
 .../RollingUpgradeConcurrentPutsReplicated.java    |    8 +-
 ...ateIndexesMixedServersOnPartitionedRegions.java |    2 +-
 ...ltiIndexesMixedServersOnPartitionedRegions.java |    2 +-
 .../rollingupgrade/RollingUpgradeDUnitTest.java    |  774 ------
 .../RollingUpgradeDistributedTest.java             |  274 +++
 ...gradeHARegionNameOnDifferentServerVersions.java |    6 +-
 .../RollingUpgradeNonHAFunction.java               |    4 +-
 ...lingUpgradeOldMemberCantJoinRolledLocators.java |    2 +-
 ...nPartitionedRedundantRegionDistributedTest.java |   40 +
 ...OnPersistentReplicateRegionDistributedTest.java |   38 +
 ...ngUpgradeOnReplicatedRegionDistributedTest.java |   38 +
 ...UpgradeOplogMagicSeqBackwardCompactibility.java |    8 +-
 ...gradePutAndGetMixedServerPartitionedRegion.java |    2 +-
 ...pgradePutAndGetMixedServersReplicateRegion.java |    2 +-
 ...gradeQueryMixedServersOnPartitionedRegions.java |    2 +-
 ...pgradeQueryMixedServersOnReplicatedRegions.java |    2 +-
 .../RollingUpgradeRollLocatorWithTwoServers.java   |    6 +-
 .../RollingUpgradeRollLocatorsWithOldServer.java   |    6 +-
 ...erversOnPartitionedRegion_dataserializable.java |   27 -
 ...ServersOnPersistentRegion_dataserializable.java |   26 -
 ...ServersOnReplicatedRegion_dataserializable.java |   26 -
 ...LocatorWithMultipleServersReplicatedRegion.java |    6 +-
 .../rollingupgrade/RollingUpgradeTracePRQuery.java |    4 +-
 .../RollingUpgradeVerifyXmlEntity.java             |    4 +-
 .../internal/net/SocketCreatorUpgradeTest.java     |  176 +-
 .../AuthExpirationBackwardCompatibleDUnitTest.java |   82 +-
 .../AuthExpirationTransactionUpgradeTest.java      |   58 +-
 .../apache/geode/security/ClientAuthDUnitTest.java |   31 +-
 .../security/ClientAuthenticationDUnitTest.java    |   26 +-
 .../ClientAuthenticationPart2DUnitTest.java        |   27 +-
 .../security/ClientAuthenticationTestCase.java     |   17 +-
 ...tAuthorizationLegacyConfigurationDUnitTest.java |   17 +-
 ...aAuthorizationUsingLegacySecurityDUnitTest.java |   43 +-
 ...onUsingLegacySecurityWithFailoverDUnitTest.java |   45 +-
 geode-cq/build.gradle                              |    7 +-
 .../geode/cache/query/cq/CQDistributedTest.java    |   71 +-
 .../cache/PRDeltaPropagationDUnitTest.java         | 1205 ---------
 .../cache/PRDeltaPropagationDistributedTest.java   | 1205 +++++++++
 .../internal/cache/ha/CQListGIIDUnitTest.java      |  728 ------
 .../cache/ha/CQListGIIDistributedTest.java         |  735 ++++++
 .../internal/cache/ha/HADispatcherDUnitTest.java   |  471 ----
 .../cache/ha/HADispatcherDistributedTest.java      |  472 ++++
 .../tier/sockets/DurableClientCQDUnitTest.java     |  315 ++-
 .../sockets/DurableClientHAQueuedDUnitTest.java    |   20 +-
 .../tier/sockets/DurableClientSimpleDUnitTest.java |  425 ++--
 .../cache/tier/sockets/DurableClientTestBase.java  |  314 ++-
 .../cache/tier/sockets/DurableClientTestCase.java  |  254 +-
 .../tier/sockets/ClientServerMiscBCDUnitTest.java  |   58 +-
 .../security/ClientAuthorizationCQDUnitTest.java   |   26 +-
 .../geode-deployment-legacy/build.gradle           |   13 +-
 .../cluster_config/gfsh_persist.html.md.erb        |    8 +-
 .../extending_the_autoserializer.html.md.erb       |    2 +-
 .../gemfire_data_serialization.html.md.erb         |    2 +-
 .../use_pdx_high_level_steps.html.md.erb           |    2 +-
 ...figuring_gateway_concurrency_levels.html.md.erb |    2 +-
 .../conflate_multisite_gateway_queue.html.md.erb   |    4 +-
 ...ementing_write_behind_event_handler.html.md.erb |    4 +-
 .../function_exec/function_execution.html.md.erb   |    2 +-
 .../how_function_execution_works.html.md.erb       |    8 +-
 .../configuring_bucket_for_pr.html.md.erb          |    2 +-
 .../using_query_bind_parameters.html.md.erb        |    2 +-
 .../query_index/maintaining_indexes.html.md.erb    |    2 +-
 .../query_select/the_select_statement.html.md.erb  |    2 +-
 .../query_grammar_and_reserved_words.html.md.erb   |    2 +-
 .../querying_partitioned_regions.html.md.erb       |    6 +-
 .../querying_basics/running_a_query.html.md.erb    |    4 +-
 .../dynamic_region_creation.html.md.erb            |  133 +-
 .../15_minute_quickstart_gfsh.html.md.erb          |    2 +-
 .../getting_started/intro_to_clients.html.md.erb   |   32 -
 .../querying_quick_reference.html.md.erb           |    6 +-
 geode-docs/images/MultiSite-4.gif                  |  Bin 4991 -> 0 bytes
 geode-docs/images_svg/MultiSite-4.svg              |    4 +
 .../exporting_a_snapshot.html.md.erb               |    5 +-
 .../compacting_disk_stores.html.md.erb             |    2 +-
 .../management_system_overview.html.md.erb         |    4 +-
 .../failure_detection.html.md.erb                  |    8 +-
 .../managing/security/enable_security.html.md.erb  |   37 +-
 .../implementing_authorization.html.md.erb         |    2 +-
 .../managing/security/implementing_ssl.html.md.erb |    2 +
 .../log_messages_and_solutions.html.md.erb         |    2 +-
 geode-docs/reference/topics/cache_xml.html.md.erb  |    4 +-
 .../topics/gemfire_properties.html.md.erb          |   20 -
 .../memory_requirements_for_cache_data.html.md.erb |    2 +-
 geode-docs/rest_apps/rest_functions.html.md.erb    |    2 +-
 geode-docs/rest_apps/rest_queries.html.md.erb      |    6 +-
 geode-docs/rest_apps/rest_regions.html.md.erb      |   26 +-
 geode-docs/tools_modules/book_intro.html.md.erb    |    8 -
 .../tools_modules/geode_for_redis.html.md.erb      |  256 --
 .../gfsh/command-pages/alter.html.md.erb           |  130 +-
 .../gfsh/command-pages/backup.html.md.erb          |    6 +-
 .../gfsh/command-pages/change.html.md.erb          |   14 +-
 .../gfsh/command-pages/close.html.md.erb           |   14 +-
 .../gfsh/command-pages/compact.html.md.erb         |   14 +-
 .../gfsh/command-pages/configure.html.md.erb       |   10 +-
 .../gfsh/command-pages/connect.html.md.erb         |   32 +-
 .../gfsh/command-pages/create.html.md.erb          |  291 +--
 .../gfsh/command-pages/define.html.md.erb          |    6 +-
 .../gfsh/command-pages/deploy.html.md.erb          |    4 +-
 .../gfsh/command-pages/describe.html.md.erb        |   24 +-
 .../gfsh/command-pages/destroy.html.md.erb         |   26 +-
 .../gfsh/command-pages/echo.html.md.erb            |    2 +-
 .../gfsh/command-pages/execute.html.md.erb         |   14 +-
 .../gfsh/command-pages/export.html.md.erb          |   46 +-
 .../gfsh/command-pages/gc.html.md.erb              |    4 +-
 .../gfsh/command-pages/get.html.md.erb             |    8 +-
 .../gfsh/command-pages/history.html.md.erb         |    4 +-
 .../gfsh/command-pages/import.html.md.erb          |    8 +-
 .../gfsh/command-pages/list.html.md.erb            |   26 +-
 .../gfsh/command-pages/load-balance.html.md.erb    |    2 +-
 .../gfsh/command-pages/locate.html.md.erb          |    8 +-
 .../gfsh/command-pages/netstat.html.md.erb         |    6 +-
 .../gfsh/command-pages/pause.html.md.erb           |    6 +-
 .../gfsh/command-pages/pdx.html.md.erb             |    6 +-
 .../gfsh/command-pages/put.html.md.erb             |   10 +-
 .../gfsh/command-pages/rebalance.html.md.erb       |    8 +-
 .../gfsh/command-pages/remove.html.md.erb          |    6 +-
 .../gfsh/command-pages/resume.html.md.erb          |   12 +-
 .../gfsh/command-pages/revoke.html.md.erb          |    2 +-
 .../gfsh/command-pages/run.html.md.erb             |    9 +-
 .../gfsh/command-pages/search.html.md.erb          |    8 +-
 .../gfsh/command-pages/sh.html.md.erb              |    4 +-
 .../gfsh/command-pages/show.html.md.erb            |   24 +-
 .../gfsh/command-pages/shutdown.html.md.erb        |    4 +-
 .../gfsh/command-pages/sleep.html.md.erb           |    2 +-
 .../gfsh/command-pages/start.html.md.erb           |  162 +-
 .../gfsh/command-pages/status.html.md.erb          |   18 +-
 .../gfsh/command-pages/stop.html.md.erb            |   12 +-
 .../gfsh/command-pages/undeploy.html.md.erb        |    4 +-
 .../gfsh/command-pages/validate.html.md.erb        |    4 +-
 .../gfsh/command-pages/version.html.md.erb         |    2 +-
 .../http_session_mgmt/quick_start.html.md.erb      |    4 +-
 .../tomcat_installing_the_module.html.md.erb       |   31 +-
 .../tomcat_setting_up_the_module.html.md.erb       |    2 +-
 .../using_bind_addresses.html.md.erb               |    4 +-
 geode-dunit/build.gradle                           |    8 +-
 .../GetDefaultDiskStoreNameDistributedTest.java    |    3 +-
 .../cache/client/internal/LocatorTestBase.java     |    1 +
 .../apache/geode/cache/query/QueryTestUtils.java   |   16 +-
 .../geode/cache30/CacheSerializableRunnable.java   |    1 +
 .../org/apache/geode/cache30/CacheXmlTestCase.java |    8 +-
 .../apache/geode/cache30/ClientServerTestCase.java |   11 +-
 .../geode/cache30/MultiVMRegionTestCase.java       |   18 +-
 .../org/apache/geode/cache30/RegionTestCase.java   |   13 +-
 .../apache/geode/cache30/TestCacheCallback.java    |    4 +-
 .../apache/geode/cache30/TestCacheListener.java    |    1 +
 .../org/apache/geode/cache30/TestCacheWriter.java  |    2 +-
 .../geode/internal/cache/CommitFunction.java       |    8 +-
 .../cache/CustomerIDPartitionResolver.java         |   11 +-
 .../InternalCacheForClientAccessDUnitTest.java     |  178 --
 .../internal/cache/NestedTransactionFunction.java  |    6 +-
 .../geode/internal/cache/RollbackFunction.java     |    8 +-
 .../internal/cache/functions/TestFunction.java     |   23 +-
 .../cache/tier/sockets/CacheServerTestUtil.java    |   82 +-
 .../sockets/ClientServerMiscDUnitTestBase.java     |   31 +-
 .../tier/sockets/ConflationDUnitTestHelper.java    |   45 -
 .../sockets/ConflationDistributedTestHelper.java   |   45 +
 .../cache/wan/AsyncEventQueueTestBase.java         |    1 +
 .../org/apache/geode/management/MBeanUtil.java     |   32 +-
 .../geode/management/ManagementTestBase.java       |   10 +-
 ...tedQueryClassCastExceptionFailureDUnitTest.java |   83 -
 .../commands/QueryCommandIntegrationTestBase.java  |   13 +-
 .../commands/RebalanceCommandDistributedTest.java  |  200 --
 .../configuration/ClusterConfigTestBase.java       |   59 +-
 .../security/ClientAuthorizationTestCase.java      |   31 +-
 .../apache/geode/security/SecurityTestUtil.java    |    1 +
 .../apache/geode/security/SecurityTestUtils.java   |    2 +-
 .../generator/AuthzCredentialGenerator.java        |   11 +-
 .../security/generator/CredentialGenerator.java    |   16 +-
 .../geode/security/templates/XmlAuthorization.java |   12 +-
 .../apache/geode/test/dunit/AsyncInvocation.java   |    8 +-
 .../org/apache/geode/test/dunit/Blackboard.java    |   17 +-
 .../geode/test/dunit/DistributedTestUtils.java     |   11 +-
 .../java/org/apache/geode/test/dunit/Host.java     |   80 +-
 .../java/org/apache/geode/test/dunit/Invoke.java   |   10 +
 .../java/org/apache/geode/test/dunit/Jitter.java   |    2 +-
 .../apache/geode/test/dunit/LogWriterUtils.java    |    2 +
 .../org/apache/geode/test/dunit/RMIException.java  |   10 +-
 .../geode/test/dunit/SerializableCallable.java     |    2 +
 .../geode/test/dunit/SerializableRunnable.java     |    2 +
 .../geode/test/dunit/StoppableWaitCriterion.java   |    3 +-
 .../org/apache/geode/test/dunit/ThreadUtils.java   |    3 +
 .../main/java/org/apache/geode/test/dunit/VM.java  |  129 +-
 .../apache/geode/test/dunit/VMEventListener.java   |    3 +
 .../geode/test/dunit/VMEventListenerRegistry.java  |    4 +
 .../java/org/apache/geode/test/dunit/Wait.java     |   14 +-
 .../org/apache/geode/test/dunit/WaitCriterion.java |    3 +-
 .../dunit/cache/internal/JUnit4CacheTestCase.java  |    1 +
 .../geode/test/dunit/internal/ChildVMLauncher.java |    6 +-
 .../geode/test/dunit/internal/DUnitHost.java       |   41 +-
 .../dunit/internal/DistributedTestFixture.java     |    1 +
 .../dunit/internal/JUnit4DistributedTestCase.java  |   21 +-
 .../geode/test/dunit/internal/ProcessManager.java  |   50 +-
 .../geode/test/dunit/log4j/LogWriterLogger.java    |   13 +-
 .../apache/geode/test/dunit/rules/CacheRule.java   |   18 +-
 .../geode/test/dunit/rules/ClientCacheRule.java    |    8 +-
 .../geode/test/dunit/rules/ClusterStartupRule.java |   96 +-
 .../test/dunit/rules/DistributedCounters.java      |   35 +-
 .../test/dunit/rules/DistributedDiskDirRule.java   |    2 +-
 .../dunit/rules/DistributedErrorCollector.java     |   19 +-
 .../rules/DistributedExecutorServiceRule.java      |   29 +-
 .../geode/test/dunit/rules/DistributedMap.java     |   11 +-
 .../test/dunit/rules/DistributedReference.java     |   15 +-
 .../geode/test/dunit/rules/DistributedRule.java    |    2 +
 .../apache/geode/test/dunit/rules/MemberVM.java    |    6 +-
 .../geode/test/dunit/rules/RemoteInvoker.java      |   10 +-
 .../apache/geode/test/greplogs/LogConsumer.java    |   21 +-
 .../org/apache/geode/test/greplogs/Patterns.java   |    6 +-
 .../apache/geode/test/junit/rules/DiskDirRule.java |    2 +-
 .../geode/test/junit/rules/GfshCommandRule.java    |   15 +-
 .../geode/test/junit/rules/LocatorStarterRule.java |    2 -
 .../junit/rules/MBeanServerConnectionRule.java     |   26 +-
 .../geode/test/junit/rules/MemberStarterRule.java  |   37 +-
 .../geode/test/junit/rules/ServerStarterRule.java  |   11 +-
 .../sanctioned-geode-dunit-serializables.txt       |   12 +-
 .../geode/test/greplogs/LogConsumerTest.java       |   52 +
 geode-for-redis/README.md                          |  328 ---
 geode-for-redis/build.gradle                       |  136 --
 geode-for-redis/gfsh.png                           |  Bin 16270 -> 0 bytes
 ...CommandPipeliningNativeRedisAcceptanceTest.java |   33 -
 .../GeodeRedisServerStartupAcceptanceTest.java     |  217 --
 .../apache/geode/redis/NativeRedisClusterTest.java |  109 -
 ...eRedisServerStartupUsingGfshAcceptanceTest.java |  167 --
 .../GlobPatternNativeRedisAcceptanceTest.java      |   32 -
 .../executor/UnknownNativeRedisAcceptanceTest.java |   32 -
 .../cluster/ClusterNativeRedisAcceptanceTest.java  |   31 -
 .../connection/AuthNativeRedisAcceptanceTest.java  |   79 -
 .../ClientNativeRedisAcceptanceTest.java           |   34 -
 .../connection/EchoNativeRedisAcceptanceTest.java  |   37 -
 .../connection/PingNativeRedisAcceptanceTest.java  |   33 -
 .../SelectNativeRedisAcceptanceTest.java           |   33 -
 .../hash/HScanNativeRedisAcceptanceTest.java       |   35 -
 .../hash/HashesNativeRedisAcceptanceTest.java      |   36 -
 .../hash/HincrByFloatNativeRedisAccetanceTest.java |   36 -
 .../executor/key/DelNativeRedisAcceptanceTest.java |   37 -
 .../key/DumpRestoreNativeRedisAcceptanceTest.java  |   37 -
 .../key/ExistsNativeRedisAcceptanceTest.java       |   37 -
 .../key/ExpireAtNativeRedisAcceptanceTest.java     |   37 -
 .../key/ExpireNativeRedisAcceptanceTest.java       |   37 -
 .../key/KeysNativeRedisAcceptanceTest.java         |   36 -
 .../key/PExpireAtNativeRedisAcceptanceTest.java    |   37 -
 .../key/PTTLNativeRedisAcceptanceTest.java         |   37 -
 .../key/PersistNativeRedisAcceptanceTest.java      |   37 -
 .../key/PexpireNativeRedisAcceptanceTest.java      |   37 -
 .../key/RenameNXNativeRedisAcceptanceTest.java     |   36 -
 .../key/RenameNativeRedisAcceptanceTest.java       |   36 -
 .../key/ScanNativeRedisAcceptanceTest.java         |   37 -
 .../executor/key/TTLNativeRedisAcceptanceTest.java |   35 -
 .../key/TypeNativeRedisAcceptanceTest.java         |   35 -
 .../key/UnlinkNativeRedisAcceptanceTest.java       |   37 -
 .../list/LIndexNativeRedisAcceptanceTest.java      |   36 -
 .../list/LLenNativeRedisAcceptanceTest.java        |   37 -
 .../list/LPopNativeRedisAcceptanceTest.java        |   37 -
 .../list/LPushNativeRedisAcceptanceTest.java       |   37 -
 .../list/LPushxNativeRedisAcceptanceTest.java      |   37 -
 .../list/LRangeNativeRedisAcceptanceTest.java      |   36 -
 .../list/LSetNativeRedisAcceptanceTest.java        |   37 -
 .../list/RPopNativeRedisAcceptanceTest.java        |   36 -
 .../list/RPushNativeRedisAcceptanceTest.java       |   37 -
 .../LettucePubSubNativeRedisAcceptanceTest.java    |   32 -
 .../NativeRedisSubCommandsIntegrationTest.java     |   38 -
 .../pubsub/PubSubNativeRedisAcceptanceTest.java    |   88 -
 .../SubscriptionsNativeRedisAcceptanceTest.java    |   31 -
 .../server/DBSizeNativeRedisAcceptanceTest.java    |   32 -
 .../server/FlushAllNativeRedisAcceptanceTest.java  |   32 -
 .../server/FlushDBNativeRedisAcceptanceTest.java   |   32 -
 .../HitsMissesNativeRedisAcceptanceTest.java       |   31 -
 .../server/InfoNativeRedisAcceptanceTest.java      |   31 -
 .../server/InfoStatsNativeRedisAcceptanceTest.java |   41 -
 .../MemoryStatsNativeRedisAcceptanceTest.java      |   37 -
 .../server/SlowlogNativeRedisAcceptanceTest.java   |   31 -
 .../server/TimeNativeRedisAcceptanceTest.java      |   32 -
 .../set/SCardNativeRedisAcceptanceTest.java        |   34 -
 .../set/SDiffNativeRedisAcceptanceTest.java        |   37 -
 .../set/SDiffStoreNativeRedisAcceptanceTest.java   |   37 -
 .../set/SInterNativeRedisAcceptanceTest.java       |   37 -
 .../set/SInterStoreNativeRedisAcceptanceTest.java  |   37 -
 .../set/SIsMemberNativeRedisAcceptanceTest.java    |   36 -
 .../set/SMoveNativeRedisAcceptanceTest.java        |   37 -
 .../set/SPopNativeRedisAcceptanceTest.java         |   37 -
 .../set/SRandMemberNativeRedisAcceptanceTest.java  |   34 -
 .../set/SRemNativeRedisAcceptanceTest.java         |   37 -
 .../set/SScanNativeRedisAcceptanceTest.java        |   37 -
 .../set/SUnionNativeRedisAcceptanceTest.java       |   37 -
 .../set/SUnionStoreNativeRedisAcceptanceTest.java  |   36 -
 .../set/SetsNativeRedisAcceptanceTest.java         |   37 -
 .../sortedset/ZAddNativeRedisAcceptanceTest.java   |   36 -
 .../sortedset/ZCardNativeRedisAcceptanceTest.java  |   36 -
 .../sortedset/ZCountNativeRedisAcceptanceTest.java |   35 -
 .../ZIncrByNativeRedisIntegrationTest.java         |   35 -
 .../ZInterStoreNativeRedisAcceptanceTest.java      |   36 -
 .../ZLexCountNativeRedisAcceptanceTest.java        |   34 -
 .../ZPopMaxNativeRedisAcceptanceTest.java          |   36 -
 .../ZPopMinNativeRedisAcceptanceTest.java          |   36 -
 .../ZRangeByLexNativeRedisAcceptanceTest.java      |   34 -
 .../ZRangeByScoreNativeRedisAcceptanceTest.java    |   35 -
 .../sortedset/ZRangeNativeRedisAcceptanceTest.java |   36 -
 .../sortedset/ZRankNativeRedisAcceptanceTest.java  |   35 -
 .../sortedset/ZRemNativeRedisAcceptanceTest.java   |   34 -
 .../ZRemRangeByLexNativeRedisAcceptanceTest.java   |   34 -
 .../ZRemRangeByRankNativeRedisAcceptanceTest.java  |   35 -
 .../ZRemRangeByScoreNativeRedisAcceptanceTest.java |   35 -
 .../ZRevRangeByLexNativeRedisAcceptanceTest.java   |   34 -
 .../ZRevRangeByScoreNativeRedisAcceptanceTest.java |   36 -
 .../ZRevRangeNativeRedisAcceptanceTest.java        |   36 -
 .../ZRevRankNativeRedisAcceptanceTest.java         |   35 -
 .../sortedset/ZScanNativeRedisIntegrationTest.java |   35 -
 .../sortedset/ZScoreNativeRedisAcceptanceTest.java |   35 -
 .../ZUnionStoreNativeRedisAcceptanceTest.java      |   36 -
 .../string/AppendNativeRedisAcceptanceTest.java    |   35 -
 .../string/BitCountNativeRedisAcceptanceTest.java  |   35 -
 .../string/BitOpNativeRedisAcceptanceTest.java     |   35 -
 .../string/BitPosNativeRedisAcceptanceTest.java    |   31 -
 .../string/DecrByNativeRedisAcceptanceTest.java    |   35 -
 .../string/DecrNativeRedisAcceptanceTest.java      |   36 -
 .../string/GetBitNativeRedisAcceptanceTest.java    |   35 -
 .../string/GetNativeRedisAcceptanceTest.java       |   35 -
 .../string/GetRangeNativeRedisAcceptanceTest.java  |   36 -
 .../string/GetSetNativeRedisAcceptanceTest.java    |   36 -
 .../IncrByFloatNativeRedisAcceptanceTest.java      |   35 -
 .../string/IncrByNativeRedisAcceptanceTest.java    |   35 -
 .../string/IncrNativeRedisAcceptanceTest.java      |   36 -
 .../string/MGetNativeRedisAcceptanceTest.java      |   35 -
 .../string/MSetNXNativeRedisAcceptanceTest.java    |   36 -
 .../string/MSetNativeRedisAcceptanceTest.java      |   36 -
 .../string/PSetEXNativeRedisAcceptanceTest.java    |   36 -
 .../string/SetBitNativeRedisAcceptanceTest.java    |   36 -
 .../string/SetExNativeRedisAcceptanceTest.java     |   36 -
 .../string/SetNXNativeRedisAcceptanceTest.java     |   36 -
 .../string/SetNativeRedisAcceptanceTest.java       |   35 -
 .../string/SetRangeNativeRedisAcceptanceTest.java  |   36 -
 .../string/StringNativeRedisAcceptanceTest.java    |   36 -
 .../MemoryOverheadNativeRedisAcceptanceTest.java   |   64 -
 .../session/NativeRedisSessionAcceptanceTest.java  |   62 -
 ...NativeRedisSessionExpirationAcceptanceTest.java |   56 -
 .../resources/0001-configure-redis-tests.patch     | 2546 --------------------
 .../resources/testcontainers.properties            |   16 -
 .../java/org/apache/geode/NativeRedisTestRule.java |   94 -
 .../java/org/apache/geode/redis/ClusterNode.java   |   76 -
 .../java/org/apache/geode/redis/ClusterNodes.java  |  126 -
 .../geode/redis/ConcurrentLoopingThreads.java      |  191 --
 .../apache/geode/redis/GeodeRedisServerRule.java   |   86 -
 .../geode/redis/NativeRedisClusterTestRule.java    |  199 --
 .../apache/geode/redis/RedisIntegrationTest.java   |   42 -
 .../proxy/ClusterNodesResponseProcessor.java       |   65 -
 .../proxy/ClusterSlotsResponseProcessor.java       |  122 -
 .../geode/redis/internal/proxy/HostPort.java       |   61 -
 .../redis/internal/proxy/MovedResponseHandler.java |   64 -
 .../internal/proxy/NoopRedisResponseProcessor.java |   29 -
 .../geode/redis/internal/proxy/RedisProxy.java     |   88 -
 .../internal/proxy/RedisProxyInboundHandler.java   |  195 --
 .../internal/proxy/RedisProxyOutboundHandler.java  |   75 -
 .../internal/proxy/RedisResponseProcessor.java     |   24 -
 .../geode/redis/internal/ssl/TestSSLServer.java    | 1491 ------------
 .../geode/redis/mocks/MockBinarySubscriber.java    |   45 -
 .../apache/geode/redis/mocks/MockSubscriber.java   |  241 --
 .../test/dunit/rules/RedisClusterStartupRule.java  |  323 ---
 .../commonTest/resources/redis-cluster-compose.yml |   65 -
 .../geode/redis/CheckPrimaryBucketFunction.java    |  137 --
 .../geode/redis/ExpiringSecurityManager.java       |   57 -
 .../apache/geode/redis/OutOfMemoryDUnitTest.java   |  373 ---
 .../org/apache/geode/redis/RedisDistDUnitTest.java |  229 --
 .../java/org/apache/geode/redis/SSLDUnitTest.java  |  336 ---
 .../geode/redis/UserExpirationDUnitTest.java       |  113 -
 .../commands/executor/FlushAllDUnitTest.java       |  108 -
 .../internal/commands/executor/MovedDUnitTest.java |  172 --
 .../cluster/ClusterSlotsAndNodesDUnitTest.java     |  317 ---
 .../cluster/JedisAndLettuceClusterDUnitTest.java   |   85 -
 .../commands/executor/hash/HExistsDUnitTest.java   |  134 --
 .../commands/executor/hash/HGetDUnitTest.java      |   89 -
 .../commands/executor/hash/HKeysDUnitTest.java     |  156 --
 .../commands/executor/hash/HMgetDUnitTest.java     |   96 -
 .../commands/executor/hash/HMsetDUnitTest.java     |  231 --
 .../commands/executor/hash/HScanDunitTest.java     |  157 --
 .../commands/executor/hash/HSetNXDunitTest.java    |   85 -
 .../executor/hash/HashesAndCrashesDUnitTest.java   |  290 ---
 .../commands/executor/hash/HdelDUnitTest.java      |  164 --
 .../commands/executor/hash/HlenDUnitTest.java      |  164 --
 .../commands/executor/hash/HsetDUnitTest.java      |  232 --
 .../commands/executor/hash/HstrlenDUnitTest.java   |   97 -
 .../commands/executor/hash/HvalsDUnitTest.java     |   96 -
 .../key/AbstractRenameRedirectionsDUnitTest.java   |  110 -
 .../commands/executor/key/ExpireDUnitTest.java     |  179 --
 .../NativeRedisRenameRedirectionsDUnitTest.java    |   36 -
 .../commands/executor/key/PersistDUnitTest.java    |  114 -
 .../key/RadishRenameRedirectionsDUnitTest.java     |   45 -
 .../commands/executor/key/RenameDUnitTest.java     |  337 ---
 .../commands/executor/list/LPopDUnitTest.java      |  181 --
 .../commands/executor/list/LPushDUnitTest.java     |  201 --
 .../commands/executor/list/RPopDUnitTest.java      |  181 --
 .../commands/executor/list/RPushDUnitTest.java     |  213 --
 .../executor/pubsub/PubSubConcurrentDUnitTest.java |  295 ---
 .../commands/executor/pubsub/PubSubDUnitTest.java  |  490 ----
 .../commands/executor/set/SaddDUnitTest.java       |  150 --
 .../commands/executor/set/SremDUnitTest.java       |  173 --
 .../commands/executor/sortedset/ZAddDUnitTest.java |  128 -
 .../sortedset/ZAddIncrOptionDUnitTest.java         |  230 --
 .../commands/executor/sortedset/ZRemDUnitTest.java |  275 ---
 .../sortedset/ZRemRangeByLexDUnitTest.java         |  277 ---
 .../sortedset/ZRemRangeByRankDUnitTest.java        |  257 --
 .../sortedset/ZRemRangeByScoreDUnitTest.java       |  258 --
 .../commands/executor/string/MSetDUnitTest.java    |  193 --
 .../commands/executor/string/MSetNXDUnitTest.java  |  183 --
 .../commands/executor/string/StringsDUnitTest.java |  380 ---
 .../geode/redis/internal/data/DeltaDUnitTest.java  |  206 --
 .../data/PartitionedRegionStatsUpdateTest.java     |  467 ----
 .../auth/AuthWhileServersRestartDUnitTest.java     |  134 --
 .../StringsKillMultipleServersDUnitTest.java       |  120 -
 .../cluster/RedisPartitionResolverDUnitTest.java   |  128 -
 .../geode/redis/session/RedisSessionDUnitTest.java |  157 --
 .../geode/redis/session/SessionDUnitTest.java      |  253 --
 .../redis/session/SessionExpirationDUnitTest.java  |  177 --
 .../redis/session/SessionsAndCrashesDUnitTest.java |  225 --
 .../RedisSpringTestApplication.java                |   26 -
 .../SessionController.java                         |   71 -
 .../config/SessionListener.java                    |   49 -
 .../config/WebMvcConfig.java                       |   62 -
 .../AnalyzeRedisSerializablesIntegrationTest.java  |   37 -
 .../AbstractCommandPipeliningIntegrationTest.java  |  128 -
 .../redis/CommandPipeliningIntegrationTest.java    |   29 -
 .../geode/redis/ConcurrentLoopingThreadsTest.java  |  148 --
 .../redis/RedisCommandArgumentsTestHelper.java     |  130 -
 .../org/apache/geode/redis/RedisTestHelper.java    |   44 -
 .../geode/redis/internal/GeodeServerRunTest.java   |   39 -
 ...ctionedSerializablesServiceIntegrationTest.java |   40 -
 .../AbstractGlobPatternIntegrationTest.java        |  292 ---
 .../executor/AbstractUnknownIntegrationTest.java   |   64 -
 .../executor/GlobPatternIntegrationTest.java       |   32 -
 .../commands/executor/UnknownIntegrationTest.java  |   40 -
 .../cluster/AbstractClusterIntegrationTest.java    |   99 -
 .../executor/cluster/ClusterIntegrationTest.java   |   46 -
 .../common/UnsupportedCommandsIntegrationTest.java |   82 -
 .../connection/AbstractAuthIntegrationTest.java    |  287 ---
 .../connection/AbstractClientIntegrationTest.java  |  136 --
 .../connection/AbstractEchoIntegrationTest.java    |   56 -
 .../connection/AbstractPingIntegrationTest.java    |   74 -
 .../connection/AbstractSelectIntegrationTest.java  |   56 -
 .../executor/connection/AuthIntegrationTest.java   |  323 ---
 .../executor/connection/ClientIntegrationTest.java |   40 -
 .../executor/connection/EchoIntegrationTest.java   |   33 -
 .../executor/connection/PingIntegrationTest.java   |   33 -
 .../executor/connection/QuitIntegrationTest.java   |   83 -
 .../executor/connection/SelectIntegrationTest.java |   44 -
 .../hash/AbstractHScanIntegrationTest.java         |  607 -----
 .../hash/AbstractHashesIntegrationTest.java        |  893 -------
 .../hash/AbstractHincrByFloatIntegrationTest.java  |  183 --
 .../executor/hash/HScanIntegrationTest.java        |   49 -
 .../executor/hash/HashesIntegrationTest.java       |   31 -
 .../executor/hash/HincrByFloatIntegrationTest.java |   32 -
 .../executor/key/AbstractDelIntegrationTest.java   |  118 -
 .../key/AbstractDumpRestoreIntegrationTest.java    |  263 --
 .../key/AbstractExistsIntegrationTest.java         |  190 --
 .../key/AbstractExpireAtIntegrationTest.java       |  129 -
 .../key/AbstractExpireIntegrationTest.java         |  354 ---
 .../executor/key/AbstractKeysIntegrationTest.java  |  125 -
 .../key/AbstractPExpireAtIntegrationTest.java      |   72 -
 .../executor/key/AbstractPTTLIntegrationTest.java  |   65 -
 .../key/AbstractPersistIntegrationTest.java        |  144 --
 .../key/AbstractPexpireIntegrationTest.java        |  108 -
 .../key/AbstractRenameIntegrationTest.java         |  435 ----
 .../key/AbstractRenameNXIntegrationTest.java       |  445 ----
 .../executor/key/AbstractScanIntegrationTest.java  |  303 ---
 .../executor/key/AbstractTTLIntegrationTest.java   |   83 -
 .../executor/key/AbstractTypeIntegrationTest.java  |   78 -
 .../key/AbstractUnlinkIntegrationTest.java         |  118 -
 .../commands/executor/key/DelIntegrationTest.java  |   32 -
 .../executor/key/DumpRestoreIntegrationTest.java   |   69 -
 .../executor/key/ExistsIntegrationTest.java        |   32 -
 .../executor/key/ExpireAtIntegrationTest.java      |   32 -
 .../executor/key/ExpireIntegrationTest.java        |   32 -
 .../commands/executor/key/KeysIntegrationTest.java |   33 -
 .../executor/key/PExpireAtIntegrationTest.java     |   32 -
 .../commands/executor/key/PTTLIntegrationTest.java |   32 -
 .../executor/key/PersistIntegrationTest.java       |   31 -
 .../executor/key/PexpireIntegrationTest.java       |   32 -
 .../executor/key/RenameIntegrationTest.java        |   32 -
 .../executor/key/RenameNXIntegrationTest.java      |   32 -
 .../commands/executor/key/ScanIntegrationTest.java |   56 -
 .../commands/executor/key/TTLIntegrationTest.java  |   32 -
 .../commands/executor/key/TypeIntegrationTest.java |   33 -
 .../executor/key/UnlinkIntegrationTest.java        |   32 -
 .../list/AbstractLIndexIntegrationTest.java        |  145 --
 .../executor/list/AbstractLLenIntegrationTest.java |  104 -
 .../executor/list/AbstractLPopIntegrationTest.java |  113 -
 .../list/AbstractLPushIntegrationTest.java         |  118 -
 .../list/AbstractLPushxIntegrationTest.java        |  132 -
 .../list/AbstractLRangeIntegrationTest.java        |  186 --
 .../executor/list/AbstractLSetIntegrationTest.java |  195 --
 .../executor/list/AbstractRPopIntegrationTest.java |  121 -
 .../list/AbstractRPushIntegrationTest.java         |   95 -
 .../executor/list/LIndexIntegrationTest.java       |   30 -
 .../executor/list/LLenIntegrationTest.java         |   31 -
 .../executor/list/LPopIntegrationTest.java         |   43 -
 .../executor/list/LPushIntegrationTest.java        |   30 -
 .../executor/list/LPushxIntegrationTest.java       |   30 -
 .../executor/list/LRangeIntegrationTest.java       |   30 -
 .../executor/list/LSetIntegrationTest.java         |   30 -
 .../executor/list/RPopIntegrationTest.java         |   43 -
 .../executor/list/RPushIntegrationTest.java        |   30 -
 .../AbstractLettucePubSubIntegrationTest.java      |  384 ---
 .../pubsub/AbstractPubSubIntegrationTest.java      |  981 --------
 .../pubsub/AbstractSubCommandsIntegrationTest.java |  379 ---
 .../AbstractSubscriptionsIntegrationTest.java      |  198 --
 .../pubsub/LettucePubSubIntegrationTest.java       |   32 -
 .../executor/pubsub/PubSubIntegrationTest.java     |   31 -
 .../pubsub/SubCommandsIntegrationTest.java         |   33 -
 .../pubsub/SubscriptionsIntegrationTest.java       |   53 -
 .../server/AbstractDBSizeIntegrationTest.java      |   53 -
 .../server/AbstractFlushAllIntegrationTest.java    |   67 -
 .../server/AbstractFlushDBIntegrationTest.java     |   59 -
 .../server/AbstractHitsMissesIntegrationTest.java  |  689 ------
 .../server/AbstractInfoIntegrationTest.java        |  295 ---
 .../server/AbstractInfoStatsIntegrationTest.java   |  353 ---
 .../AbstractRedisMemoryStatsIntegrationTest.java   |   91 -
 .../server/AbstractSlowlogIntegrationTest.java     |  148 --
 .../server/AbstractTimeIntegrationTest.java        |   74 -
 .../executor/server/CommandIntegrationTest.java    |  191 --
 .../executor/server/DBSizeIntegrationTest.java     |   32 -
 .../executor/server/FlushAllIntegrationTest.java   |   39 -
 .../executor/server/FlushDBIntegrationTest.java    |   33 -
 .../executor/server/HitsMissesIntegrationTest.java |   32 -
 .../executor/server/InfoIntegrationTest.java       |   46 -
 .../executor/server/InfoStatsIntegrationTest.java  |   39 -
 .../executor/server/LolWutIntegrationTest.java     |  140 --
 .../server/MemoryStatsIntegrationTest.java         |   30 -
 .../executor/server/ShutdownIntegrationTest.java   |   65 -
 .../executor/server/SlowlogIntegrationTest.java    |   34 -
 .../executor/server/TimeIntegrationTest.java       |   32 -
 .../executor/set/AbstractSCardIntegrationTest.java |  105 -
 .../executor/set/AbstractSDiffIntegrationTest.java |  235 --
 .../set/AbstractSDiffStoreIntegrationTest.java     |  235 --
 .../set/AbstractSInterIntegrationTest.java         |  191 --
 .../set/AbstractSInterStoreIntegrationTest.java    |  237 --
 .../set/AbstractSIsMemberIntegrationTest.java      |  109 -
 .../executor/set/AbstractSMoveIntegrationTest.java |  243 --
 .../executor/set/AbstractSPopIntegrationTest.java  |  196 --
 .../set/AbstractSRandMemberIntegrationTest.java    |  165 --
 .../executor/set/AbstractSRemIntegrationTest.java  |  182 --
 .../executor/set/AbstractSScanIntegrationTest.java |  469 ----
 .../set/AbstractSUnionIntegrationTest.java         |  189 --
 .../set/AbstractSUnionStoreIntegrationTest.java    |  243 --
 .../executor/set/AbstractSetsIntegrationTest.java  |  126 -
 .../executor/set/SCardIntegrationTest.java         |   29 -
 .../executor/set/SDiffIntegrationTest.java         |   31 -
 .../executor/set/SDiffStoreIntegrationTest.java    |   31 -
 .../executor/set/SInterIntegrationTest.java        |   31 -
 .../executor/set/SInterStoreIntegrationTest.java   |   31 -
 .../executor/set/SIsMemberIntegrationTest.java     |   31 -
 .../executor/set/SMoveIntegrationTest.java         |   31 -
 .../commands/executor/set/SPopIntegrationTest.java |   31 -
 .../executor/set/SRandMemberIntegrationTest.java   |   29 -
 .../commands/executor/set/SRemIntegrationTest.java |   31 -
 .../executor/set/SScanIntegrationTest.java         |   65 -
 .../executor/set/SUnionIntegrationTest.java        |   31 -
 .../executor/set/SUnionStoreIntegrationTest.java   |   31 -
 .../commands/executor/set/SetsIntegrationTest.java |   31 -
 .../sortedset/AbstractZAddIntegrationTest.java     |  484 ----
 .../sortedset/AbstractZCardIntegrationTest.java    |   88 -
 .../sortedset/AbstractZCountIntegrationTest.java   |  207 --
 .../sortedset/AbstractZIncrByIntegrationTest.java  |  311 ---
 .../AbstractZInterStoreIntegrationTest.java        |  841 -------
 .../AbstractZLexCountIntegrationTest.java          |  247 --
 .../sortedset/AbstractZPopMaxIntegrationTest.java  |  164 --
 .../sortedset/AbstractZPopMinIntegrationTest.java  |  177 --
 .../AbstractZRangeByLexIntegrationTest.java        |  432 ----
 .../AbstractZRangeByScoreIntegrationTest.java      |  391 ---
 .../sortedset/AbstractZRangeIntegrationTest.java   |  158 --
 .../sortedset/AbstractZRankIntegrationTest.java    |  247 --
 .../sortedset/AbstractZRemIntegrationTest.java     |  152 --
 .../AbstractZRemRangeByLexIntegrationTest.java     |  317 ---
 .../AbstractZRemRangeByRankIntegrationTest.java    |  205 --
 .../AbstractZRemRangeByScoreIntegrationTest.java   |  271 ---
 .../AbstractZRevRangeByLexIntegrationTest.java     |  441 ----
 .../AbstractZRevRangeByScoreIntegrationTest.java   |  381 ---
 .../AbstractZRevRangeIntegrationTest.java          |  199 --
 .../sortedset/AbstractZRevRankIntegrationTest.java |  141 --
 .../sortedset/AbstractZScanIntegrationTest.java    |  559 -----
 .../sortedset/AbstractZScoreIntegrationTest.java   |   97 -
 .../AbstractZUnionStoreIntegrationTest.java        |  536 -----
 .../executor/sortedset/ZAddIntegrationTest.java    |   31 -
 .../executor/sortedset/ZCardIntegrationTest.java   |   31 -
 .../executor/sortedset/ZCountIntegrationTest.java  |   30 -
 .../executor/sortedset/ZIncrByIntegrationTest.java |   30 -
 .../sortedset/ZInterStoreIntegrationTest.java      |   31 -
 .../sortedset/ZLexCountIntegrationTest.java        |   30 -
 .../executor/sortedset/ZPopMaxIntegrationTest.java |   31 -
 .../executor/sortedset/ZPopMinIntegrationTest.java |   31 -
 .../sortedset/ZRangeByLexIntegrationTest.java      |   30 -
 .../sortedset/ZRangeByScoreIntegrationTest.java    |   30 -
 .../executor/sortedset/ZRangeIntegrationTest.java  |   31 -
 .../executor/sortedset/ZRankIntegrationTest.java   |   31 -
 .../executor/sortedset/ZRemIntegrationTest.java    |   29 -
 .../sortedset/ZRemRangeByLexIntegrationTest.java   |   30 -
 .../sortedset/ZRemRangeByRankIntegrationTest.java  |   29 -
 .../sortedset/ZRemRangeByScoreIntegrationTest.java |   29 -
 .../sortedset/ZRevRangeByLexIntegrationTest.java   |   30 -
 .../sortedset/ZRevRangeByScoreIntegrationTest.java |   30 -
 .../sortedset/ZRevRangeIntegrationTest.java        |   31 -
 .../sortedset/ZRevRankIntegrationTest.java         |   30 -
 .../executor/sortedset/ZScanIntegrationTest.java   |   47 -
 .../executor/sortedset/ZScoreIntegrationTest.java  |   31 -
 .../sortedset/ZUnionStoreIntegrationTest.java      |   31 -
 .../string/AbstractAppendIntegrationTest.java      |  136 --
 .../string/AbstractBitCountIntegrationTest.java    |  112 -
 .../string/AbstractBitOpIntegrationTest.java       |  218 --
 .../string/AbstractBitPosIntegrationTest.java      |  183 --
 .../string/AbstractDecrByIntegrationTest.java      |  162 --
 .../string/AbstractDecrIntegrationTest.java        |   89 -
 .../string/AbstractGetBitIntegrationTest.java      |   89 -
 .../string/AbstractGetIntegrationTest.java         |   93 -
 .../string/AbstractGetRangeIntegrationTest.java    |  265 --
 .../string/AbstractGetSetIntegrationTest.java      |  134 --
 .../string/AbstractIncrByFloatIntegrationTest.java |  183 --
 .../string/AbstractIncrByIntegrationTest.java      |  137 --
 .../string/AbstractIncrIntegrationTest.java        |  121 -
 .../AbstractLettuceAppendIntegrationTest.java      |   61 -
 .../string/AbstractMGetIntegrationTest.java        |   97 -
 .../string/AbstractMSetIntegrationTest.java        |  159 --
 .../string/AbstractMSetNXIntegrationTest.java      |  172 --
 .../string/AbstractPSetEXIntegrationTest.java      |   73 -
 .../string/AbstractSetBitIntegrationTest.java      |  106 -
 .../string/AbstractSetEXIntegrationTest.java       |   71 -
 .../string/AbstractSetIntegrationTest.java         |  545 -----
 .../string/AbstractSetNXIntegrationTest.java       |  106 -
 .../string/AbstractSetRangeIntegrationTest.java    |  117 -
 .../string/AbstractStringIntegrationTest.java      |  154 --
 .../executor/string/AppendIntegrationTest.java     |   31 -
 .../executor/string/BitCountIntegrationTest.java   |   31 -
 .../executor/string/BitOpIntegrationTest.java      |   31 -
 .../executor/string/BitPosIntegrationTest.java     |   32 -
 .../executor/string/DecrByIntegrationTest.java     |   31 -
 .../executor/string/DecrIntegrationTest.java       |   31 -
 .../executor/string/GetBitIntegrationTest.java     |   31 -
 .../executor/string/GetIntegrationTest.java        |   31 -
 .../executor/string/GetRangeIntegrationTest.java   |   31 -
 .../executor/string/GetSetIntegrationTest.java     |   31 -
 .../string/IncrByFloatIntegrationTest.java         |   31 -
 .../executor/string/IncrByIntegrationTest.java     |   31 -
 .../executor/string/IncrIntegrationTest.java       |   31 -
 .../string/LettuceAppendIntegrationTest.java       |   31 -
 .../executor/string/MGetIntegrationTest.java       |   31 -
 .../executor/string/MSetIntegrationTest.java       |   31 -
 .../executor/string/MSetNXIntegrationTest.java     |   31 -
 .../executor/string/PSetEXIntegrationTest.java     |   31 -
 .../executor/string/SetBitIntegrationTest.java     |   31 -
 .../executor/string/SetEXIntegrationTest.java      |   31 -
 .../executor/string/SetIntegrationTest.java        |   31 -
 .../executor/string/SetNXIntegrationTest.java      |   31 -
 .../executor/string/SetRangeIntegrationTest.java   |   31 -
 .../executor/string/StringIntegrationTest.java     |   31 -
 .../AbstractMemoryOverheadIntegrationTest.java     |  327 ---
 .../data/MemoryOverheadIntegrationTest.java        |  108 -
 .../pubsub/SubscriptionsIntegrationTest.java       |  140 --
 .../LockingStripedCoordinatorIntegrationTest.java  |   67 -
 .../statistics/GeodeRedisStatsIntegrationTest.java |   57 -
 .../apache/geode/codeAnalysis/excludedClasses.txt  |   20 -
 .../codeAnalysis/sanctionedDataSerializables.txt   |   40 -
 .../collections/OrderedStatisticTreeBenchmark.java |   71 -
 .../data/collections/RedisHashMapBenchmark.java    |   71 -
 .../geode/redis/internal/GeodeRedisServer.java     |  161 --
 .../geode/redis/internal/GeodeRedisService.java    |  121 -
 .../geode/redis/internal/RedisConstants.java       |  107 -
 .../geode/redis/internal/RedisException.java       |   42 -
 .../geode/redis/internal/RedisProperties.java      |  105 -
 .../geode/redis/internal/commands/Command.java     |  234 --
 .../commands/RedisCommandSupportLevel.java         |   23 -
 .../redis/internal/commands/RedisCommandType.java  |  602 -----
 .../internal/commands/executor/BaseSetOptions.java |   57 -
 .../commands/executor/CommandExecutor.java         |   39 -
 .../internal/commands/executor/GlobPattern.java    |  134 --
 .../internal/commands/executor/RedisResponse.java  |  226 --
 .../commands/executor/UnknownExecutor.java         |   41 -
 .../internal/commands/executor/cluster/CRC16.java  |   79 -
 .../commands/executor/cluster/ClusterExecutor.java |  196 --
 .../executor/cluster/RedisPartitionResolver.java   |   35 -
 .../commands/executor/connection/AuthExecutor.java |   65 -
 .../executor/connection/ClientExecutor.java        |   81 -
 .../commands/executor/connection/EchoExecutor.java |   31 -
 .../commands/executor/connection/PingExecutor.java |   58 -
 .../commands/executor/connection/QuitExecutor.java |   32 -
 .../executor/connection/SelectExecutor.java        |   36 -
 .../commands/executor/hash/HDelExecutor.java       |   61 -
 .../commands/executor/hash/HExistsExecutor.java    |   55 -
 .../commands/executor/hash/HGetAllExecutor.java    |   55 -
 .../commands/executor/hash/HGetExecutor.java       |   55 -
 .../commands/executor/hash/HIncrByExecutor.java    |   77 -
 .../executor/hash/HIncrByFloatExecutor.java        |   79 -
 .../commands/executor/hash/HKeysExecutor.java      |   54 -
 .../commands/executor/hash/HLenExecutor.java       |   49 -
 .../commands/executor/hash/HMGetExecutor.java      |   57 -
 .../commands/executor/hash/HMSetExecutor.java      |   64 -
 .../commands/executor/hash/HScanExecutor.java      |   42 -
 .../commands/executor/hash/HSetExecutor.java       |   62 -
 .../commands/executor/hash/HSetNXExecutor.java     |   41 -
 .../commands/executor/hash/HStrLenExecutor.java    |   39 -
 .../commands/executor/hash/HValsExecutor.java      |   63 -
 .../executor/key/AbstractRenameExecutor.java       |   77 -
 .../executor/key/AbstractScanExecutor.java         |  129 -
 .../commands/executor/key/DelExecutor.java         |   48 -
 .../commands/executor/key/DumpExecutor.java        |   41 -
 .../commands/executor/key/ExistsExecutor.java      |   47 -
 .../commands/executor/key/ExpireAtExecutor.java    |   61 -
 .../commands/executor/key/ExpireExecutor.java      |   66 -
 .../commands/executor/key/KeysExecutor.java        |   54 -
 .../commands/executor/key/PExpireAtExecutor.java   |   26 -
 .../commands/executor/key/PExpireExecutor.java     |   26 -
 .../commands/executor/key/PTTLExecutor.java        |   27 -
 .../commands/executor/key/PersistExecutor.java     |   37 -
 .../commands/executor/key/RenameExecutor.java      |   48 -
 .../commands/executor/key/RenameNXExecutor.java    |   47 -
 .../commands/executor/key/RestoreExecutor.java     |  110 -
 .../commands/executor/key/RestoreOptions.java      |   42 -
 .../commands/executor/key/ScanExecutor.java        |  147 --
 .../commands/executor/key/TTLExecutor.java         |   61 -
 .../commands/executor/key/TypeExecutor.java        |   41 -
 .../commands/executor/list/LIndexExecutor.java     |   55 -
 .../commands/executor/list/LLenExecutor.java       |   38 -
 .../commands/executor/list/LPopExecutor.java       |   39 -
 .../commands/executor/list/LPushExecutor.java      |   47 -
 .../commands/executor/list/LPushXExecutor.java     |   23 -
 .../commands/executor/list/LRangeExecutor.java     |   48 -
 .../commands/executor/list/LSetExecutor.java       |   53 -
 .../commands/executor/list/RPopExecutor.java       |   37 -
 .../commands/executor/list/RPushExecutor.java      |   47 -
 .../executor/pubsub/PsubscribeExecutor.java        |   45 -
 .../commands/executor/pubsub/PubSubExecutor.java   |   73 -
 .../commands/executor/pubsub/PublishExecutor.java  |   40 -
 .../executor/pubsub/PunsubscribeExecutor.java      |   37 -
 .../executor/pubsub/SubscribeExecutor.java         |   70 -
 .../executor/pubsub/UnsubscribeExecutor.java       |   37 -
 .../executor/server/CommandCommandExecutor.java    |   91 -
 .../commands/executor/server/DBSizeExecutor.java   |   33 -
 .../commands/executor/server/FlushAllExecutor.java |   41 -
 .../commands/executor/server/InfoExecutor.java     |  201 --
 .../commands/executor/server/LolWutExecutor.java   |  180 --
 .../commands/executor/server/SlowlogExecutor.java  |   46 -
 .../commands/executor/server/TimeExecutor.java     |   35 -
 .../commands/executor/set/SAddExecutor.java        |   42 -
 .../commands/executor/set/SCardExecutor.java       |   33 -
 .../commands/executor/set/SDiffExecutor.java       |   32 -
 .../commands/executor/set/SDiffStoreExecutor.java  |   31 -
 .../commands/executor/set/SInterExecutor.java      |   31 -
 .../commands/executor/set/SInterStoreExecutor.java |   32 -
 .../commands/executor/set/SIsMemberExecutor.java   |   36 -
 .../commands/executor/set/SMembersExecutor.java    |   36 -
 .../commands/executor/set/SMoveExecutor.java       |   44 -
 .../commands/executor/set/SPopExecutor.java        |   50 -
 .../commands/executor/set/SRandMemberExecutor.java |   43 -
 .../commands/executor/set/SRemExecutor.java        |   43 -
 .../commands/executor/set/SScanExecutor.java       |   43 -
 .../commands/executor/set/SUnionExecutor.java      |   31 -
 .../commands/executor/set/SUnionStoreExecutor.java |   30 -
 .../commands/executor/set/SetOpExecutor.java       |   65 -
 .../commands/executor/set/SetRandomExecutor.java   |   65 -
 .../sortedset/AbstractSortedSetRangeExecutor.java  |   53 -
 .../sortedset/AbstractSortedSetRangeOptions.java   |  167 --
 .../executor/sortedset/AbstractZPopExecutor.java   |   52 -
 .../executor/sortedset/AbstractZRankExecutor.java  |   46 -
 .../sortedset/SortedSetLexRangeOptions.java        |  116 -
 .../sortedset/SortedSetRankRangeOptions.java       |   97 -
 .../sortedset/SortedSetScoreRangeOptions.java      |   82 -
 .../commands/executor/sortedset/ZAddExecutor.java  |  146 --
 .../commands/executor/sortedset/ZAddOptions.java   |   45 -
 .../commands/executor/sortedset/ZAggregator.java   |   47 -
 .../commands/executor/sortedset/ZCardExecutor.java |   33 -
 .../executor/sortedset/ZCountExecutor.java         |   36 -
 .../executor/sortedset/ZIncrByExecutor.java        |   52 -
 .../executor/sortedset/ZInterStoreExecutor.java    |   45 -
 .../commands/executor/sortedset/ZKeyWeight.java    |   44 -
 .../executor/sortedset/ZLexCountExecutor.java      |   35 -
 .../executor/sortedset/ZPopMaxExecutor.java        |   31 -
 .../executor/sortedset/ZPopMinExecutor.java        |   31 -
 .../executor/sortedset/ZRangeByLexExecutor.java    |   48 -
 .../executor/sortedset/ZRangeByScoreExecutor.java  |   48 -
 .../executor/sortedset/ZRangeExecutor.java         |   47 -
 .../commands/executor/sortedset/ZRankExecutor.java |   24 -
 .../commands/executor/sortedset/ZRemExecutor.java  |   41 -
 .../executor/sortedset/ZRemRangeByLexExecutor.java |   34 -
 .../sortedset/ZRemRangeByRankExecutor.java         |   35 -
 .../sortedset/ZRemRangeByScoreExecutor.java        |   34 -
 .../executor/sortedset/ZRevRangeByLexExecutor.java |   36 -
 .../sortedset/ZRevRangeByScoreExecutor.java        |   37 -
 .../executor/sortedset/ZRevRangeExecutor.java      |   37 -
 .../executor/sortedset/ZRevRankExecutor.java       |   24 -
 .../commands/executor/sortedset/ZScanExecutor.java |   42 -
 .../executor/sortedset/ZScoreExecutor.java         |   37 -
 .../executor/sortedset/ZStoreExecutor.java         |  123 -
 .../executor/sortedset/ZUnionStoreExecutor.java    |   45 -
 .../executor/string/AbstractMSetExecutor.java      |   89 -
 .../commands/executor/string/AppendExecutor.java   |   44 -
 .../commands/executor/string/BitCountExecutor.java |   57 -
 .../commands/executor/string/BitOpExecutor.java    |  180 --
 .../commands/executor/string/BitPosExecutor.java   |   80 -
 .../commands/executor/string/DecrByExecutor.java   |   55 -
 .../commands/executor/string/DecrExecutor.java     |   36 -
 .../commands/executor/string/GetBitExecutor.java   |   51 -
 .../commands/executor/string/GetExecutor.java      |   36 -
 .../commands/executor/string/GetRangeExecutor.java |   62 -
 .../commands/executor/string/GetSetExecutor.java   |   45 -
 .../commands/executor/string/IncrByExecutor.java   |   56 -
 .../executor/string/IncrByFloatExecutor.java       |   70 -
 .../commands/executor/string/IncrExecutor.java     |   37 -
 .../commands/executor/string/MGetExecutor.java     |   44 -
 .../commands/executor/string/MSetExecutor.java     |   49 -
 .../commands/executor/string/MSetNXExecutor.java   |   51 -
 .../commands/executor/string/PSetEXExecutor.java   |   24 -
 .../commands/executor/string/SetBitExecutor.java   |   72 -
 .../commands/executor/string/SetEXExecutor.java    |   70 -
 .../commands/executor/string/SetExecutor.java      |  228 --
 .../commands/executor/string/SetNXExecutor.java    |   47 -
 .../commands/executor/string/SetOptions.java       |   43 -
 .../commands/executor/string/SetRangeExecutor.java |   64 -
 .../commands/executor/string/StrlenExecutor.java   |   34 -
 .../parameters/ClusterParameterRequirements.java   |   39 -
 .../internal/commands/parameters/Parameter.java    |  163 --
 .../RedisParametersMismatchException.java          |   24 -
 .../parameters/SlowlogParameterRequirements.java   |   73 -
 .../redis/internal/data/AbstractRedisData.java     |  435 ----
 .../geode/redis/internal/data/KeyHashUtil.java     |   63 -
 .../geode/redis/internal/data/NullRedisData.java   |  143 --
 .../internal/data/NullRedisDataStructures.java     |   24 -
 .../geode/redis/internal/data/NullRedisHash.java   |   63 -
 .../geode/redis/internal/data/NullRedisList.java   |   84 -
 .../geode/redis/internal/data/NullRedisSet.java    |   75 -
 .../redis/internal/data/NullRedisSortedSet.java    |  149 --
 .../geode/redis/internal/data/NullRedisString.java |  143 --
 .../internal/data/RedisCrossSlotException.java     |   26 -
 .../geode/redis/internal/data/RedisData.java       |  114 -
 .../internal/data/RedisDataMovedException.java     |   31 -
 .../geode/redis/internal/data/RedisDataType.java   |   51 -
 .../data/RedisDataTypeMismatchException.java       |   32 -
 .../geode/redis/internal/data/RedisHash.java       |  400 ---
 .../apache/geode/redis/internal/data/RedisKey.java |  106 -
 .../internal/data/RedisKeyExistsException.java     |   34 -
 .../geode/redis/internal/data/RedisList.java       |  349 ---
 .../apache/geode/redis/internal/data/RedisSet.java |  551 -----
 .../geode/redis/internal/data/RedisSortedSet.java  |  945 --------
 .../geode/redis/internal/data/RedisString.java     |  497 ----
 .../data/collections/Bytes2ObjectOpenHashMap.java  | 1300 ----------
 .../data/collections/OrderStatisticsSet.java       |   76 -
 .../data/collections/OrderStatisticsTree.java      |  850 -------
 .../data/collections/SizeableByteArrayList.java    |  129 -
 ...bleBytes2ObjectOpenCustomHashMapWithCursor.java |  202 --
 .../SizeableObjectOpenCustomHashSetWithCursor.java |  205 --
 .../internal/data/collections/package-info.java    |   23 -
 .../data/delta/AddByteArrayDoublePairs.java        |   71 -
 .../internal/data/delta/AddByteArrayPairs.java     |   71 -
 .../redis/internal/data/delta/AddByteArrays.java   |   68 -
 .../internal/data/delta/AddByteArraysTail.java     |   64 -
 .../redis/internal/data/delta/AppendByteArray.java |   50 -
 .../geode/redis/internal/data/delta/DeltaInfo.java |   48 -
 .../geode/redis/internal/data/delta/DeltaType.java |   48 -
 .../internal/data/delta/RemoveByteArrays.java      |   74 -
 .../internal/data/delta/RemoveElementsByIndex.java |   66 -
 .../data/delta/ReplaceByteArrayAtOffset.java       |   56 -
 .../data/delta/ReplaceByteArrayDoublePairs.java    |   67 -
 .../internal/data/delta/ReplaceByteArrays.java     |   62 -
 .../internal/data/delta/ReplaceByteAtOffset.java   |   53 -
 .../redis/internal/data/delta/SetByteArray.java    |   52 -
 .../data/delta/SetByteArrayAndTimestamp.java       |   58 -
 .../redis/internal/data/delta/SetTimestamp.java    |   49 -
 .../redis/internal/netty/ByteToCommandDecoder.java |  230 --
 .../apache/geode/redis/internal/netty/Client.java  |  206 --
 .../apache/geode/redis/internal/netty/Coder.java   |  670 ------
 .../geode/redis/internal/netty/CoderException.java |   37 -
 .../internal/netty/ExecutionHandlerContext.java    |  514 ----
 .../redis/internal/netty/NettyRedisServer.java     |  287 ---
 .../netty/RedisCommandParserException.java         |   41 -
 .../redis/internal/netty/StringBytesGlossary.java  |  266 --
 .../pubsub/AbstractSubscriptionManager.java        |  238 --
 .../pubsub/ChannelSubscriptionManager.java         |   60 -
 .../internal/pubsub/ClientSubscriptionManager.java |   58 -
 .../pubsub/ClientSubscriptionManagerImpl.java      |   78 -
 .../pubsub/PatternSubscriptionManager.java         |  133 -
 .../apache/geode/redis/internal/pubsub/PubSub.java |  115 -
 .../geode/redis/internal/pubsub/PubSubImpl.java    |  113 -
 .../geode/redis/internal/pubsub/Publisher.java     |  528 ----
 .../redis/internal/pubsub/SubscribeResult.java     |   47 -
 .../geode/redis/internal/pubsub/Subscription.java  |   40 -
 .../redis/internal/pubsub/SubscriptionImpl.java    |  102 -
 .../redis/internal/pubsub/SubscriptionManager.java |   72 -
 .../geode/redis/internal/pubsub/Subscriptions.java |  266 --
 .../internal/services/ActiveExpirationManager.java |   91 -
 .../RedisSanctionedSerializablesService.java       |   27 -
 .../redis/internal/services/RegionProvider.java    |  345 ---
 .../internal/services/cluster/RedisMemberInfo.java |  107 -
 .../cluster/RedisMemberInfoRetrievalFunction.java  |   88 -
 .../internal/services/cluster/SlotAdvisor.java     |  191 --
 .../locking/LockingStripedCoordinator.java         |   87 -
 .../services/locking/RedisSecurityService.java     |   68 -
 .../internal/services/locking/StripedCallable.java |   30 -
 .../services/locking/StripedCoordinator.java       |   44 -
 .../services/locking/StripedExecutorService.java   |  511 ----
 .../internal/services/locking/StripedObject.java   |   31 -
 .../internal/services/locking/StripedRunnable.java |   28 -
 .../redis/internal/statistics/GeodeRedisStats.java |  320 ---
 .../redis/internal/statistics/RedisStats.java      |  255 --
 .../org.apache.geode.internal.cache.CacheService   |   16 -
 ...serialization.DataSerializableFixedIdRegistrant |   16 -
 ...alization.filter.SanctionedSerializablesService |   15 -
 .../sanctioned-geode-for-redis-serializables.txt   |    8 -
 geode-for-redis/src/performanceTest/benchmark.sh   |   95 -
 .../src/performanceTest/environment-setup.sh       |  124 -
 .../src/performanceTest/execute-operation.sh       |   59 -
 geode-for-redis/src/performanceTest/shacompare.sh  |   61 -
 .../src/performanceTest/summarize-batch-results.sh |   72 -
 .../performanceTest/summarize-operation-results.sh |   61 -
 .../geode/redis/internal/RedisCommandTypeTest.java |   38 -
 .../geode/redis/internal/RedisPropertiesTest.java  |  169 --
 .../commands/executor/GlobPatternTest.java         |   88 -
 .../commands/executor/cluster/CRC16JUnitTest.java  |   54 -
 .../executor/connection/AuthExecutorTest.java      |   66 -
 .../executor/sortedset/ZScanExecutorTest.java      |   37 -
 .../geode/redis/internal/data/KeyHashUtilTest.java |   81 -
 .../geode/redis/internal/data/RedisHashTest.java   |  484 ----
 .../redis/internal/data/RedisKeyJUnitTest.java     |   40 -
 .../geode/redis/internal/data/RedisListTest.java   |  119 -
 .../geode/redis/internal/data/RedisSetTest.java    |  563 -----
 .../redis/internal/data/RedisSortedSetTest.java    |  938 --------
 .../internal/data/RedisStringQuickCheckTest.java   |   83 -
 .../geode/redis/internal/data/RedisStringTest.java |  543 -----
 .../data/collections/OrderStatisticsTreeTest.java  |  783 ------
 .../OrderedStatisticTreeQuickCheckTest.java        |  143 --
 .../collections/SizeableByteArrayListTest.java     |   68 -
 ...tOpenCustomHashMapWithCursorQuickCheckTest.java |   92 -
 ...ytes2ObjectOpenCustomHashMapWithCursorTest.java |  395 ---
 ...eableObjectOpenCustomHashSetWithCursorTest.java |  284 ---
 .../geode/redis/internal/netty/ClientTest.java     |  199 --
 .../geode/redis/internal/netty/CoderTest.java      |  276 ---
 .../redis/internal/netty/CommandJUnitTest.java     |  114 -
 .../netty/ExecutionHandlerContextTest.java         |  110 -
 .../pubsub/ChannelSubscriptionManagerTest.java     |  104 -
 .../pubsub/ClientSubscriptionManagerImplTest.java  |   94 -
 .../pubsub/PatternSubscriptionManagerTest.java     |  169 --
 .../redis/internal/pubsub/PubSubImplTest.java      |   52 -
 .../geode/redis/internal/pubsub/PublisherTest.java |  196 --
 .../internal/pubsub/SubscriptionImplTest.java      |   75 -
 .../pubsub/SubscriptionManagerTestBase.java        |  163 --
 .../internal/pubsub/SubscriptionsJUnitTest.java    |  412 ----
 .../services/LockingStripedCoordinatorTest.java    |   74 -
 .../services/RedisSecurityServiceTest.java         |   92 -
 .../internal/services/RegionProviderTest.java      |   74 -
 .../services/StripedExecutorServiceJUnitTest.java  |  329 ---
 .../RedisMemberInfoRetrievalFunctionTest.java      |  153 --
 .../services/cluster/RedisMemberInfoTest.java      |   93 -
 .../src/test/resources/expected-pom.xml            |  105 -
 geode-gfsh/build.gradle                            |   13 +-
 .../geode/gfsh/GfshWithSslAcceptanceTest.java      |   78 +-
 .../cli/commands/CreateRegionCommandDUnitTest.java |   32 +-
 .../commands/CreateRegionSecurityDUnitTest.java    |    2 +-
 .../GfshParserAutoCompletionIntegrationTest.java   |    2 +-
 .../cli/commands/GetCommandIntegrationTest.java    |   19 +-
 .../cli/commands/StartMemberUtilsTest.java         |  106 +-
 .../apache/geode/management/cli/CliMetaData.java   |   24 +-
 .../management/cli/CommandProcessingException.java |    8 +-
 .../geode/management/cli/CommandService.java       |    8 +-
 .../geode/management/cli/CommandStatement.java     |    5 +
 .../apache/geode/management/cli/GfshCommand.java   |   35 +-
 .../org/apache/geode/management/cli/Result.java    |   10 +
 .../cli/UpdateAllConfigurationGroupsMarker.java    |    2 +-
 .../management/internal/cli/CommandRequest.java    |    2 +-
 .../internal/cli/commands/CreateRegionCommand.java |   97 +-
 .../internal/cli/commands/MemberJvmOptions.java    |   92 +
 .../internal/cli/commands/RebalanceCommand.java    |    4 +-
 .../internal/cli/commands/ShowMetricsCommand.java  |    7 +
 .../internal/cli/commands/StartLocatorCommand.java |    1 +
 .../internal/cli/commands/StartMemberUtils.java    |   12 +-
 .../internal/cli/commands/StartServerCommand.java  |    1 +
 .../internal/cli/domain/DataCommandResult.java     |    5 +-
 .../internal/cli/domain/DiskStoreDetails.java      |    2 +-
 .../internal/cli/domain/IndexDetails.java          |    2 +-
 .../cli/functions/DataCommandFunction.java         |    3 +-
 .../internal/cli/functions/DeployFunction.java     |    2 +-
 .../functions/ListAsyncEventQueuesFunction.java    |    2 +-
 .../cli/functions/ListDiskStoresFunction.java      |    2 +-
 .../cli/functions/ListDurableCqNamesFunction.java  |    2 +-
 .../internal/cli/functions/ListIndexFunction.java  |    2 +-
 .../internal/cli/result/model/ResultModel.java     |    8 +-
 .../internal/cli/shell/MXBeanProvider.java         |    4 +-
 .../internal/cli/shell/OperationInvoker.java       |   22 +-
 .../cli/shell/unsafe/GfshSignalHandler.java        |    2 +-
 .../cli/util/JConsoleNotFoundException.java        |    2 +-
 .../cli/util/VisualVmNotFoundException.java        |    2 +-
 .../internal/web/http/support/HttpRequester.java   |    4 +-
 .../internal/web/shell/MBeanAccessException.java   |    2 +-
 .../web/shell/support/HttpInvocationHandler.java   |    2 +-
 .../web/shell/support/HttpMBeanProxyFactory.java   |    2 +-
 .../cli/commands/ListIndexCommandJUnitTest.java    |    2 +-
 .../cli/commands/MemberJvmOptionsTest.java         |   71 +
 geode-gfsh/src/test/resources/expected-pom.xml     |    2 +-
 .../management/ConfigurationCompatibilityTest.java |   33 +-
 .../geode/management/GfshCompatibilityTest.java    |   36 +-
 .../GfshRebalanceCommandCompatibilityTest.java     |   35 +-
 geode-http-service/build.gradle                    |    9 +-
 geode-jmh/build.gradle                             |   11 +-
 geode-junit/build.gradle                           |    8 +-
 .../apache/geode/codeAnalysis/excludedClasses.txt  |    1 +
 .../src/main/java/com/examples/ds/Company.java     |    2 +-
 .../java/org/apache/geode/cache/query/Utils.java   |    8 +-
 .../org/apache/geode/cache/query/data/Address.java |    2 +-
 .../org/apache/geode/cache/query/data/City.java    |    2 +-
 .../org/apache/geode/cache/query/data/Country.java |    3 +-
 .../apache/geode/cache/query/data/District.java    |    2 +-
 .../apache/geode/cache/query/data/Employee.java    |    2 +-
 .../org/apache/geode/cache/query/data/Manager.java |    2 +-
 .../org/apache/geode/cache/query/data/Numbers.java |    2 +-
 .../org/apache/geode/cache/query/data/PhoneNo.java |    2 +-
 .../org/apache/geode/cache/query/data/Quote.java   |    2 +-
 .../apache/geode/cache/query/data/Restricted.java  |    2 +-
 .../org/apache/geode/cache/query/data/State.java   |    2 +-
 .../org/apache/geode/cache/query/data/Street.java  |    2 +-
 .../org/apache/geode/cache/query/data/Vehicle.java |    2 +-
 .../org/apache/geode/cache/query/data/Village.java |    2 +-
 .../query/functional/StructSetOrResultsSet.java    |   63 +-
 .../org/apache/geode/cache/ssl/CertStores.java     |   25 +-
 .../geode/cache/ssl/CertificateMaterial.java       |    2 +-
 .../apache/geode/cache/util/TxEventTestUtil.java   |    4 +
 .../AnalyzeDataSerializablesTestBase.java          |   12 +-
 .../geode/codeAnalysis/ClassAndMethodDetails.java  |    2 +-
 .../codeAnalysis/ClassAndVariableDetails.java      |    4 +-
 .../geode/codeAnalysis/CompiledClassUtils.java     |   10 +-
 .../geode/codeAnalysis/decode/CompiledClass.java   |    2 +-
 .../geode/codeAnalysis/decode/CompiledField.java   |    4 +-
 .../geode/codeAnalysis/decode/CompiledMethod.java  |    4 +-
 .../geode/codeAnalysis/decode/cp/CpClass.java      |    2 +-
 .../geode/codeAnalysis/decode/cp/CpUtf8.java       |    4 +-
 .../cache/PartitionedRegionTestHelper.java         |    8 +-
 .../internal/cache/wan/MyAsyncEventListener.java   |   15 +-
 .../geode/internal/cache/wan/QueueListener.java    |   50 +-
 .../internal/offheap/NullOffHeapMemoryStats.java   |    8 +
 .../apache/geode/management/model/Employee.java    |   10 +
 .../geode/test/awaitility/GeodeAwaitility.java     |    4 +-
 .../apache/geode/test/compiler/ClassBuilder.java   |    1 +
 .../geode/test/compiler/InMemoryClassFile.java     |    3 +
 .../test/compiler/InMemoryClassFileLoader.java     |   38 +
 .../geode/test/compiler/InMemoryFileManager.java   |    3 +
 .../geode/test/compiler/InMemoryJavaCompiler.java  |    1 -
 .../geode/test/compiler/InMemorySourceFile.java    |    4 +-
 .../org/apache/geode/test/compiler/JarBuilder.java |    4 +-
 .../test/concurrent/CPUContentionService.java      |    2 +-
 .../java/org/apache/geode/test/fake/Fakes.java     |    6 +-
 .../apache/geode/test/golden/GoldenComparator.java |    2 +-
 .../apache/geode/test/golden/GoldenTestCase.java   |   12 +-
 .../golden/PassWithExpectedProblemTestCase.java    |    2 +-
 .../test/junit/assertions/CommandResultAssert.java |   28 +-
 .../assertions/TabularResultModelAnyRowAssert.java |    8 +-
 .../junit/assertions/TabularResultModelAssert.java |   14 +-
 .../assertions/TabularResultModelColumnAssert.java |   10 +-
 .../assertions/TabularResultModelRowAssert.java    |    2 +-
 .../assertions/TabularResultModelSliceAssert.java  |   14 +-
 .../geode/test/junit/categories/RedisTest.java     |   21 -
 .../geode/test/junit/rules/ClassAnalysisRule.java  |    6 +-
 .../geode/test/junit/rules/CloseableReference.java |    3 +-
 .../geode/test/junit/rules/ConcurrencyRule.java    |   10 +-
 .../junit/rules/DescribedExternalResource.java     |   18 +-
 .../test/junit/rules/ExecutorServiceRule.java      |   41 +-
 .../test/junit/rules/ExpectedTimeoutRule.java      |   14 +-
 .../org/apache/geode/test/junit/rules/Folder.java  |   51 +
 .../geode/test/junit/rules/FolderFactory.java      |   38 +
 .../apache/geode/test/junit/rules/FolderRule.java  |   66 +
 .../geode/test/junit/rules/GfshParserRule.java     |    7 +-
 .../apache/geode/test/junit/rules/RandomRule.java  |    7 +-
 .../test/junit/rules/ResourceReporterRule.java     |  100 +
 .../apache/geode/test/junit/rules/RetryRule.java   |    8 +-
 .../apache/geode/test/junit/rules/RuleList.java    |    2 +
 .../geode/test/junit/rules/gfsh/GfshContext.java   |  305 +++
 .../geode/test/junit/rules/gfsh/GfshExecution.java |  222 +-
 .../geode/test/junit/rules/gfsh/GfshExecutor.java  |   33 +
 .../geode/test/junit/rules/gfsh/GfshRule.java      |  274 +--
 .../geode/test/junit/rules/gfsh/GfshScript.java    |   27 +-
 .../geode/test/junit/rules/gfsh/GfshStopper.java   |   93 +
 .../serializable/SerializableTemporaryFolder.java  |   23 +-
 .../CategoryWithParameterizedRunnerFactory.java    |    4 +-
 .../test/junit/runners/GeodeParamsRunner.java      |    2 +-
 .../geode/test/junit/runners/SuiteBlockRunner.java |    1 +
 .../geode/test/process/JavaModuleHelper.java       |   34 +
 .../geode/test/process/ProcessOutputReader.java    |    2 +-
 .../geode/test/process/ProcessStreamReader.java    |    2 +-
 .../apache/geode/test/process/ProcessWrapper.java  |    4 +-
 .../java/org/apache/geode/test/util/JarUtils.java  |   59 +
 .../org/apache/geode/test/util/ResourceUtils.java  |   66 +-
 .../org/apache/geode/test/version/JavaVersion.java |   75 +
 .../apache/geode/test/version/JavaVersions.java    |  144 ++
 .../org/apache/geode/test/version/TestVersion.java |   22 +-
 .../apache/geode/test/version/TestVersions.java    |   64 +
 .../apache/geode/test/version/VersionManager.java  |   18 +-
 .../apache/geode/test/version/VmConfiguration.java |  113 +
 .../geode/test/version/VmConfigurations.java       |  104 +
 .../org/apache/geode/util/FilterSerializables.java |   35 +
 .../java/org/apache/geode/util/JSR166TestCase.java |   18 +-
 .../java/org/apache/geode/util/test/TestUtil.java  |    2 +
 .../java/parReg/query/unittest/NewPortfolio.java   |    8 +-
 .../main/java/parReg/query/unittest/Position.java  |    8 +-
 geode-junit/src/main/java/perffmwk/Formatter.java  |   19 +-
 .../sanctioned-geode-junit-serializables.txt       |    3 +
 .../junit/rules/DescribedExternalResourceTest.java |   57 +
 .../SerializableExternalResourceTest.java          |    8 +-
 .../serializable/SerializableTestNameTest.java     |    8 +-
 .../serializable/SerializableTestWatcherTest.java  |    8 +-
 .../serializable/SerializableTimeoutTest.java      |    8 +-
 .../geode/test/process/JavaModuleHelperTest.java   |  134 ++
 geode-junit/src/test/resources/expected-pom.xml    |    5 +
 geode-log4j/build.gradle                           |   12 +-
 geode-logging/build.gradle                         |    9 +-
 .../api/message/GemFireParameterizedMessage.java   |   18 +-
 .../GemFireParameterizedMessageFactory.java        |    8 +-
 geode-lucene/build.gradle                          |    8 +-
 geode-lucene/geode-lucene-test/build.gradle        |    4 +-
 .../cache/lucene/test/IndexRepositorySpy.java      |    6 +-
 .../cache/lucene/test/LuceneTestUtilities.java     |    4 +-
 .../org/apache/geode/cache/lucene/LuceneIndex.java |    7 +-
 .../geode/cache/lucene/LuceneIndexFactory.java     |    5 +
 .../org/apache/geode/cache/lucene/LuceneQuery.java |    4 -
 .../geode/cache/lucene/LuceneQueryFactory.java     |    9 +-
 .../geode/cache/lucene/LuceneQueryProvider.java    |    2 +-
 .../geode/cache/lucene/LuceneSerializer.java       |    1 +
 .../apache/geode/cache/lucene/LuceneService.java   |   21 +-
 .../cache/lucene/PageableLuceneQueryResults.java   |    2 +-
 .../cli/functions/LuceneCreateIndexFunction.java   |    2 +-
 .../cli/functions/LuceneDescribeIndexFunction.java |    2 +-
 .../cli/functions/LuceneListIndexFunction.java     |    2 +-
 .../cli/functions/LuceneSearchIndexFunction.java   |    2 +-
 .../lucene/management/LuceneIndexMetrics.java      |   25 +
 .../lucene/management/configuration/Index.java     |   66 +-
 .../LuceneSearchWithRollingUpgradeDUnit.java       |   57 +-
 ...ultAfterTwoLocatorsWithTwoServersAreRolled.java |    8 +-
 ...tResultsAfterClientAndServersAreRolledOver.java |    8 +-
 ...ntAndServersAreRolledOverAllBucketsCreated.java |    8 +-
 ...sultsAfterServersRollOverOnPartitionRegion.java |    2 +-
 ...ServersRollOverOnPersistentPartitionRegion.java |    2 +-
 ...ccessfulWhenAllServersRollToCurrentVersion.java |   20 +-
 geode-management/build.gradle                      |   13 +-
 .../management/api/ClusterManagementException.java |   14 +-
 .../api/ClusterManagementListOperationsResult.java |    4 +
 .../api/ClusterManagementListResult.java           |    6 +
 .../api/ClusterManagementOperationResult.java      |   22 +
 .../api/ClusterManagementRealizationException.java |    6 +
 .../api/ClusterManagementRealizationResult.java    |   10 +-
 .../management/api/ClusterManagementResult.java    |   20 +-
 .../management/api/ClusterManagementService.java   |    7 +
 .../api/ClusterManagementServiceTransport.java     |   12 +-
 .../geode/management/api/EntityGroupInfo.java      |   10 +
 .../geode/management/api/RealizationResult.java    |   15 +
 .../internal/ClientClusterManagementService.java   |    4 +-
 .../configuration/AbstractConfiguration.java       |    8 +-
 .../geode/management/configuration/ClassName.java  |    1 +
 .../geode/management/configuration/Deployment.java |   12 +-
 .../management/configuration/GatewayReceiver.java  |   25 +
 .../geode/management/configuration/Index.java      |    2 +
 .../geode/management/configuration/Links.java      |    3 +
 .../apache/geode/management/configuration/Pdx.java |   28 +-
 .../management/operation/RebalanceOperation.java   |   26 +-
 .../operation/RestoreRedundancyRequest.java        |   33 +-
 .../geode/management/runtime/OperationResult.java  |    4 +
 .../management/runtime/RebalanceRegionResult.java  |   22 +
 .../geode/management/runtime/RebalanceResult.java  |    2 +
 .../runtime/RestoreRedundancyResults.java          |    5 +-
 geode-membership/build.gradle                      |    7 +-
 .../membership/gms/GMSMemberDataJUnitTest.java     |    3 +-
 .../internal/membership/gms/GMSUtilTest.java       |  152 --
 .../gms/LocatorConfigurationParserTest.java        |  154 ++
 .../gms/membership/GMSJoinLeaveJUnitTest.java      |    8 +-
 .../membership/api/LocatorConfigurationParser.java |  142 ++
 .../internal/membership/gms/GMSUtil.java           |  117 +-
 .../membership/gms/locator/GMSLocator.java         |    4 +-
 .../membership/gms/membership/GMSJoinLeave.java    |   10 +-
 .../membership/gms/messenger/JGroupsMessenger.java |    4 +-
 .../membership/gms/messenger/Transport.java        |    4 +-
 geode-memcached/build.gradle                       |    7 +-
 .../apache/geode/internal/memcached/Command.java   |    2 +-
 .../internal/memcached/commands/GetCommand.java    |    8 +-
 .../memcached/commands/IncrementCommand.java       |    2 +-
 .../internal/memcached/commands/QuitCommand.java   |    4 +-
 .../memcached/commands/ReplaceCommand.java         |    4 +-
 .../internal/memcached/commands/SetCommand.java    |    2 +-
 .../internal/memcached/commands/StatsCommand.java  |    2 +-
 .../memcached/commands/StorageCommand.java         |    6 +-
 geode-old-client-support/build.gradle              |    8 +-
 .../com/gemstone/gemfire/GemFireException.java     |   10 +
 .../gemstone/gemfire/OldClientSupportProvider.java |    2 +-
 .../execute/EmtpyRegionFunctionException.java      |    1 +
 .../gemfire/cache/execute/FunctionException.java   |    8 +
 .../execute/FunctionInvocationTargetException.java |    1 +
 geode-old-versions/build.gradle                    |    6 +-
 geode-pulse/build.gradle                           |   12 +-
 geode-pulse/geode-pulse-test/build.gradle          |    6 +-
 .../internal/security/GemFireAuthentication.java   |    1 -
 .../tools/pulse/tests/junit/BaseServiceTest.java   |    4 +-
 .../junit/ClusterSelectedRegionServiceTest.java    |   16 +-
 .../tests/junit/MemberGatewayHubServiceTest.java   |   16 +-
 geode-rebalancer/build.gradle                      |   10 +-
 .../org/apache/geode/cache/util/AutoBalancer.java  |    3 +
 geode-serialization/build.gradle                   |    9 +-
 .../internal/serialization/BasicSerializable.java  |    2 +-
 .../serialization/DataSerializableFixedID.java     |   12 +-
 .../geode/internal/serialization/KnownVersion.java |   11 +-
 .../geode/internal/serialization/Versioning.java   |    4 +-
 .../SanctionedSerializablesFilterPattern.java      |    1 +
 geode-server-all/build.gradle                      |   16 +-
 .../resources/dependency_classpath.txt             |  162 +-
 .../src/test/resources/expected-pom.xml            |    7 +-
 geode-tcp-server/build.gradle                      |    9 +-
 .../internal/tcpserver/HostAddress.java            |    2 +-
 .../internal/tcpserver/InfoResponse.java           |    1 +
 .../internal/tcpserver/VersionResponse.java        |    2 +-
 .../TcpServerProductVersionUpgradeTest.java        |   12 +-
 geode-unsafe/build.gradle                          |    7 +-
 geode-wan/build.gradle                             |    7 +-
 .../commands/WanCopyRegionCommandDUnitTest.java    | 1527 ------------
 .../WanCopyRegionCommandDistributedTest.java       | 1553 ++++++++++++
 .../cache/wan/CacheClientNotifierDUnitTest.java    |  282 ---
 .../wan/CacheClientNotifierDistributedTest.java    |  282 +++
 .../cache/wan/Simple2CacheServerDUnitTest.java     |  172 --
 .../wan/Simple2CacheServerDistributedTest.java     |  173 ++
 .../geode/internal/cache/wan/WANTestBase.java      |  921 ++++---
 .../ConcurrentParallelGatewaySenderDUnitTest.java  |  721 ------
 ...urrentParallelGatewaySenderDistributedTest.java |  721 ++++++
 ...rrentParallelGatewaySenderOffHeapDUnitTest.java |   35 -
 ...arallelGatewaySenderOffHeapDistributedTest.java |   35 +
 ...llelGatewaySenderOperation2DistributedTest.java |  711 ++++++
 ...ParallelGatewaySenderOperation_2_DUnitTest.java |  735 ------
 .../cache/wan/misc/WANSSLDistributedTest.java      |  633 +++++
 ...ewaySenderOperation2OffHeapDistributedTest.java |   34 +
 ...lGatewaySenderOperation_2_OffHeapDUnitTest.java |   34 -
 ...ewaySenderOperation2OffHeapDistributedTest.java |   34 +
 ...lGatewaySenderOperation_2_OffHeapDUnitTest.java |   34 -
 ...lelGatewaySenderOperationsOffHeapDUnitTest.java |   31 -
 ...ewaySenderOperationsOffHeapDistributedTest.java |   31 +
 .../ParallelWANConflationOffHeapDUnitTest.java     |   35 -
 ...arallelWANConflationOffHeapDistributedTest.java |   36 +
 ...ANPropagationConcurrentOpsOffHeapDUnitTest.java |   36 -
 ...agationConcurrentOpsOffHeapDistributedTest.java |   36 +
 .../SerialGatewaySenderQueueOffHeapDUnitTest.java  |   35 -
 ...alGatewaySenderQueueOffHeapDistributedTest.java |   36 +
 ...rallelGatewaySenderAlertThresholdDUnitTest.java |  192 --
 ...GatewaySenderAlertThresholdDistributedTest.java |  190 ++
 ...llelGatewaySenderOperation2DistributedTest.java |   43 +
 ...ParallelGatewaySenderOperation_2_DUnitTest.java |   43 -
 .../ParallelGatewaySenderOperationsDUnitTest.java  | 1631 -------------
 ...llelGatewaySenderOperationsDistributedTest.java | 1618 +++++++++++++
 .../parallel/ParallelWANConflationDUnitTest.java   |  513 ----
 .../ParallelWANConflationDistributedTest.java      |  669 +++++
 ...ANPersistenceEnabledGatewaySenderDUnitTest.java |  102 +
 ...rallelWANPropagationConcurrentOpsDUnitTest.java |  268 ---
 ...WANPropagationConcurrentOpsDistributedTest.java |  268 +++
 .../wan/parallel/ParallelWANStatsDUnitTest.java    | 1461 -----------
 .../parallel/ParallelWANStatsDistributedTest.java  | 1464 +++++++++++
 .../serial/SerialGatewaySenderQueueDUnitTest.java  |  547 -----
 .../SerialGatewaySenderQueueDistributedTest.java   |  541 +++++
 .../wan/serial/SerialWANConflationDUnitTest.java   |  350 ---
 .../serial/SerialWANConflationDistributedTest.java |  346 +++
 .../cache/wan/serial/SerialWANStatsDUnitTest.java  |  951 --------
 .../wan/serial/SerialWANStatsDistributedTest.java  |  946 ++++++++
 .../wan/internal/AbstractRemoteGatewaySender.java  |    4 +-
 .../wan/internal/WanCopyRegionFunctionService.java |   17 +-
 .../internal/client/locator/LocatorDiscovery.java  |   19 +-
 .../wan/internal/client/locator/LocatorHelper.java |   22 +-
 .../locator/LocatorMembershipListenerImpl.java     |    2 +-
 .../client/locator/WanLocatorDiscovererImpl.java   |   31 +-
 .../internal/WanCopyRegionFunctionServiceTest.java |   54 +-
 .../client/locator/LocatorDiscoveryTest.java       |    1 +
 .../internal/client/locator/LocatorHelperTest.java |  162 ++
 .../locator/LocatorMembershipListenerTest.java     |    6 +-
 ...ateGatewaySenderMixedSiteOneCurrentSiteTwo.java |   19 +-
 .../cache/wan/WANRollingUpgradeDUnitTest.java      |   24 +-
 ...eEventProcessingMixedSiteOneCurrentSiteTwo.java |   15 +-
 ...gradeEventProcessingMixedSiteOneOldSiteTwo.java |   21 +-
 ...adeEventProcessingOldSiteOneCurrentSiteTwo.java |   15 +-
 ...ipleReceiversDefinedInClusterConfiguration.java |   49 +-
 .../WANRollingUpgradeNewSenderProcessOldEvent.java |   21 +-
 ...tReprocessedAfterCurrentSiteMemberFailover.java |   13 +-
 ...fterCurrentSiteMemberFailoverWithOldClient.java |   15 +-
 ...tsNotReprocessedAfterOldSiteMemberFailover.java |   15 +-
 ...eCacheServerProfileToMembersOlderThan1dot5.java |    4 +-
 ...ANRollingUpgradeVerifyGatewaySenderProfile.java |   12 +-
 geode-web-api/build.gradle                         |   21 +-
 .../rest/internal/web/controllers/Customer.java    |    2 +-
 .../web/controllers/EchoArgumentFunction.java      |    9 +-
 .../geode/rest/internal/web/controllers/Item.java  |    2 +-
 .../geode/rest/internal/web/controllers/Order.java |    2 +-
 .../geode/test/matchers/JsonEquivalence.java       |    2 +-
 .../web/controllers/BaseControllerAdvice.java      |   18 +-
 .../web/controllers/CommonCrudController.java      |   78 +-
 .../web/controllers/FunctionAccessController.java  |   38 +-
 .../web/controllers/PdxBasedCrudController.java    |  122 +-
 .../web/controllers/QueryAccessController.java     |   93 +-
 .../web/controllers/support/QueryResultTypes.java  |    2 +-
 .../web/controllers/support/RegionEntryData.java   |    2 +-
 .../exception/DataTypeNotSupportedException.java   |    2 +-
 .../web/exception/GemfireRestException.java        |    2 +-
 .../web/exception/MalformedJsonException.java      |    2 +-
 .../web/exception/RegionNotFoundException.java     |    2 +-
 .../web/exception/ResourceNotFoundException.java   |    2 +-
 .../web/security/RestSecurityConfiguration.java    |    8 +-
 .../internal/web/swagger/config/SwaggerConfig.java |   91 +-
 .../geode/rest/internal/web/util/ArrayUtils.java   |    2 +-
 .../rest/internal/web/util/DateTimeUtils.java      |    2 +-
 .../rest/internal/web/util/IdentifiableUtils.java  |    2 +-
 .../geode/rest/internal/web/util/JsonWriter.java   |    2 +-
 .../geode/rest/internal/web/util/NumberUtils.java  |    2 +-
 .../rest/internal/web/util/ValidationUtils.java    |    2 +-
 .../src/main/resources/swagger.properties          |    3 +-
 .../src/main/webapp/WEB-INF/geode-servlet.xml      |    1 +
 geode-web-management/build.gradle                  |   22 +-
 ...usterManagementSecurityRestIntegrationTest.java |    5 +
 .../internal/rest/PdxIntegrationTest.java          |  146 +-
 .../DeploymentManagementController.java            |   23 +-
 .../rest/controllers/DiskStoreController.java      |   24 +-
 .../rest/controllers/DocLinksController.java       |    4 +-
 .../controllers/GatewayManagementController.java   |   18 +-
 .../controllers/ManagementControllerAdvice.java    |    2 +-
 .../controllers/MemberManagementController.java    |   10 +-
 .../rest/controllers/PdxManagementController.java  |   37 +-
 .../rest/controllers/PingManagementController.java |    5 +-
 .../controllers/RebalanceOperationController.java  |    8 +-
 .../controllers/RegionManagementController.java    |   47 +-
 .../RestoreRedundancyOperationController.java      |    8 +-
 .../rest/security/RestSecurityConfiguration.java   |    8 +-
 .../internal/rest/swagger/SwaggerConfig.java       |  110 +-
 .../main/resources/swagger-management.properties   |    3 +-
 .../src/main/webapp/WEB-INF/management-servlet.xml |    1 +
 geode-web/build.gradle                             |   12 +-
 .../support/LoginHandlerInterceptor.java           |    2 +-
 ...rverSerializableObjectHttpMessageConverter.java |    2 +-
 .../internal/web/io/MultipartFileAdapter.java      |    2 +-
 .../web/io/MultipartFileResourceAdapter.java       |    2 +-
 .../management/internal/web/util/UriUtils.java     |   26 +-
 .../web/domain/QueryParameterSourceJUnitTest.java  |    2 +-
 gradle.properties                                  |    2 +-
 gradle/check-pom.gradle                            |  181 --
 gradle/code-analysis.gradle                        |   98 -
 gradle/ide.gradle                                  |   76 -
 gradle/japicmp.gradle                              |   95 -
 gradle/java.gradle                                 |  196 --
 gradle/javaVersions.gradle                         |   77 -
 gradle/jmh.gradle                                  |   70 -
 gradle/lint.gradle                                 |   29 -
 gradle/multi-process-test.gradle                   |   71 -
 gradle/pmd.gradle                                  |   31 -
 gradle/publish-common.gradle                       |  111 -
 gradle/publish-java.gradle                         |   30 -
 gradle/publish-war.gradle                          |   30 -
 gradle/rat.gradle                                  |  191 --
 gradle/sonar.gradle                                |   31 -
 gradle/spotless.gradle                             |  173 --
 gradle/standard-subproject-configuration.gradle    |   36 -
 gradle/test.gradle                                 |  310 ---
 settings.gradle                                    |   24 +-
 static-analysis/build.gradle                       |    6 +-
 static-analysis/pmd-rules/build.gradle             |    6 +-
 2285 files changed, 57266 insertions(+), 127726 deletions(-)
 create mode 100644 .github/workflows/codeql.yml
 create mode 100644 build-tools/geode-annotation-processor/build.gradle
 create mode 100644 build-tools/geode-annotation-processor/settings.gradle
 rename {buildSrc => build-tools/geode-annotation-processor}/src/main/java/org/apache/geode/javac/EnsureCorrectRunsWithProcessor.java (100%)
 rename {buildSrc => build-tools/geode-annotation-processor}/src/main/resources/META-INF/services/javax.annotation.processing.Processor (100%)
 rename {buildSrc => build-tools/geode-annotation-processor}/src/test/java/org/apache/geode/javac/CompilerException.java (100%)
 rename {buildSrc => build-tools/geode-annotation-processor}/src/test/java/org/apache/geode/javac/SimpleClassFile.java (100%)
 rename {buildSrc => build-tools/geode-annotation-processor}/src/test/java/org/apache/geode/javac/SimpleFileManager.java (100%)
 rename {buildSrc => build-tools/geode-annotation-processor}/src/test/java/org/apache/geode/javac/SimpleSourceFile.java (100%)
 rename {buildSrc => build-tools/geode-annotation-processor}/src/test/java/org/apache/geode/javac/TestAnnotationProcessor.java (100%)
 rename {buildSrc => build-tools/geode-annotation-processor}/src/test/java/org/apache/geode/javac/TestCompiler.java (100%)
 create mode 100644 build-tools/geode-build-tools/build.gradle
 create mode 100644 build-tools/geode-build-tools/settings.gradle
 create mode 100644 build-tools/geode-build-tools/src/main/groovy/org/apache/geode/gradle/plugins/BuildToolsPlugin.groovy
 create mode 100644 build-tools/geode-build-tools/src/main/groovy/org/apache/geode/gradle/plugins/PasswordDialog.groovy
 create mode 100644 build-tools/geode-build-tools/src/main/groovy/org/apache/geode/gradle/plugins/TestPropertiesWriter.groovy
 create mode 100644 build-tools/geode-dependency-management/build.gradle
 create mode 100644 build-tools/geode-dependency-management/settings.gradle
 create mode 100644 build-tools/geode-dependency-management/src/main/groovy/org/apache/geode/gradle/plugins/DependencyConstraints.groovy
 create mode 100644 build-tools/geode-dependency-management/src/main/groovy/org/apache/geode/gradle/plugins/DependencyConstraintsPlugin.groovy
 rename {buildSrc => build-tools/geode-dependency-management}/src/main/groovy/org/apache/geode/gradle/plugins/DependencySetHandler.groovy (100%)
 create mode 100644 build-tools/geode-japicmp/build.gradle
 create mode 100644 build-tools/geode-japicmp/settings.gradle
 rename {buildSrc => build-tools/geode-japicmp}/src/main/groovy/org/apache/geode/gradle/japicmp/AllowMajorBreakingChanges.groovy (100%)
 rename {buildSrc => build-tools/geode-japicmp}/src/main/groovy/org/apache/geode/gradle/japicmp/GeodeApiRegressionRule.groovy (100%)
 rename {buildSrc => build-tools/geode-japicmp}/src/main/groovy/org/apache/geode/gradle/japicmp/GeodeSpiRegressionRule.groovy (100%)
 create mode 100644 build-tools/geode-japicmp/src/main/groovy/org/apache/geode/gradle/japicmp/JapicmpPlugin.groovy
 rename {buildSrc => build-tools/geode-japicmp}/src/main/groovy/org/apache/geode/gradle/japicmp/ParentIsExperimental.groovy (100%)
 create mode 100755 build-tools/geode-japicmp/src/main/resources/japicmp_exceptions.json
 create mode 100644 build-tools/geode-repeat-test/build.gradle
 create mode 100644 build-tools/geode-repeat-test/settings.gradle
 create mode 100644 build-tools/geode-repeat-test/src/main/groovy/org/apache/geode/gradle/testing/repeat/RepeatTest.groovy
 create mode 100644 build-tools/geode-repeat-test/src/main/groovy/org/apache/geode/gradle/testing/repeat/RepeatTestPlugin.groovy
 rename {buildSrc => build-tools/geode-repeat-test}/src/main/java/org/apache/geode/gradle/testing/repeat/ExecutionTrackingTestClassProcessor.java (100%)
 rename {buildSrc => build-tools/geode-repeat-test}/src/main/java/org/apache/geode/gradle/testing/repeat/ExecutionTrackingTestResultProcessor.java (100%)
 rename {buildSrc => build-tools/geode-repeat-test}/src/main/java/org/apache/geode/gradle/testing/repeat/RepeatTestExecuter.java (100%)
 create mode 100644 build-tools/geode-repeat-test/src/test/groovy/org/apache/geode/gradle/testing/repeat/RepeatTestTest.groovy
 create mode 100644 build-tools/geode-testing-isolation/build.gradle
 create mode 100644 build-tools/geode-testing-isolation/settings.gradle
 rename {buildSrc => build-tools/geode-testing-isolation}/src/main/groovy/org/apache/geode/gradle/testing/Executers.groovy (100%)
 create mode 100644 build-tools/geode-testing-isolation/src/main/groovy/org/apache/geode/gradle/testing/Workers.groovy
 create mode 100644 build-tools/geode-testing-isolation/src/main/groovy/org/apache/geode/gradle/testing/isolation/IsolatedTestPlugin.groovy
 rename {buildSrc => build-tools/geode-testing-isolation}/src/main/java/org/apache/geode/gradle/testing/isolation/CompletableProcess.java (100%)
 rename {buildSrc => build-tools/geode-testing-isolation}/src/main/java/org/apache/geode/gradle/testing/isolation/PortRange.java (100%)
 rename {buildSrc => build-tools/geode-testing-isolation}/src/main/java/org/apache/geode/gradle/testing/isolation/PortRangeContext.java (100%)
 rename {buildSrc => build-tools/geode-testing-isolation}/src/main/java/org/apache/geode/gradle/testing/isolation/PortRangeProcessLauncher.java (100%)
 rename {buildSrc => build-tools/geode-testing-isolation}/src/main/java/org/apache/geode/gradle/testing/isolation/WorkingDirectoryIsolator.java (100%)
 rename {buildSrc => build-tools/geode-testing-isolation}/src/main/java/org/apache/geode/gradle/testing/process/AdjustableProcessLauncher.java (100%)
 rename {buildSrc => build-tools/geode-testing-isolation}/src/main/java/org/apache/geode/gradle/testing/process/LauncherProxyWorkerProcessBuilder.java (100%)
 rename {buildSrc => build-tools/geode-testing-isolation}/src/main/java/org/apache/geode/gradle/testing/process/LauncherProxyWorkerProcessFactory.java (100%)
 rename {buildSrc => build-tools/geode-testing-isolation}/src/main/java/org/apache/geode/gradle/testing/process/ProcessLauncher.java (100%)
 rename {buildSrc => build-tools/geode-testing-isolation}/src/main/java/org/apache/geode/gradle/testing/process/Reflection.java (100%)
 create mode 100644 build-tools/geode-testing-isolation/src/test/java/org/apache/geode/gradle/test/isolation/PortRangeTest.java
 create mode 100644 build-tools/geode-testing-isolation/src/test/java/org/apache/geode/gradle/testing/isolation/WorkingDirectoryIsolatorTest.java
 create mode 100644 build-tools/scripts/build.gradle
 create mode 100644 build-tools/scripts/settings.gradle
 create mode 100644 build-tools/scripts/src/main/groovy/check-pom.gradle
 create mode 100644 build-tools/scripts/src/main/groovy/code-analysis.gradle
 rename {gradle => build-tools/scripts/src/main/groovy}/dependency-resolution.gradle (100%)
 create mode 100644 build-tools/scripts/src/main/groovy/geode-japicmp-task.gradle
 create mode 100644 build-tools/scripts/src/main/groovy/geode-java.gradle
 create mode 100644 build-tools/scripts/src/main/groovy/geode-pmd.gradle
 rename gradle/publish-artifacts.gradle => build-tools/scripts/src/main/groovy/geode-publish-artifacts.gradle (100%)
 create mode 100644 build-tools/scripts/src/main/groovy/geode-publish-common.gradle
 create mode 100644 build-tools/scripts/src/main/groovy/geode-publish-java.gradle
 create mode 100644 build-tools/scripts/src/main/groovy/geode-publish-war.gradle
 create mode 100644 build-tools/scripts/src/main/groovy/geode-rat.gradle
 create mode 100644 build-tools/scripts/src/main/groovy/geode-sonar.gradle
 create mode 100644 build-tools/scripts/src/main/groovy/geode-test.gradle
 create mode 100644 build-tools/scripts/src/main/groovy/ide.gradle
 create mode 100644 build-tools/scripts/src/main/groovy/javaVersions.gradle
 create mode 100644 build-tools/scripts/src/main/groovy/jmh.gradle
 create mode 100644 build-tools/scripts/src/main/groovy/lint.gradle
 create mode 100644 build-tools/scripts/src/main/groovy/multi-process-test.gradle
 create mode 100644 build-tools/scripts/src/main/groovy/platform-subproject-configuration.gradle
 rename {gradle => build-tools/scripts/src/main/groovy}/resolve-dependencies.gradle (100%)
 create mode 100644 build-tools/scripts/src/main/groovy/spotless.gradle
 create mode 100644 build-tools/scripts/src/main/groovy/standard-subproject-configuration.gradle
 rename {gradle => build-tools/scripts/src/main/groovy}/warnings.gradle (100%)
 delete mode 100644 buildSrc/build.gradle
 delete mode 100644 buildSrc/src/main/groovy/org/apache/geode/gradle/PasswordDialog.groovy
 delete mode 100644 buildSrc/src/main/groovy/org/apache/geode/gradle/TestPropertiesWriter.groovy
 delete mode 100644 buildSrc/src/main/groovy/org/apache/geode/gradle/plugins/DependencyConstraints.groovy
 delete mode 100644 buildSrc/src/main/groovy/org/apache/geode/gradle/testing/Workers.groovy
 delete mode 100644 buildSrc/src/main/groovy/org/apache/geode/gradle/testing/isolation/IsolatedTestPlugin.groovy
 delete mode 100644 buildSrc/src/main/groovy/org/apache/geode/gradle/testing/repeat/RepeatTest.groovy
 delete mode 100644 buildSrc/src/main/resources/META-INF/gradle-plugins/geode-dependency-constraints.properties
 delete mode 100644 buildSrc/src/main/resources/META-INF/gradle-plugins/geode-isolated-test.properties
 delete mode 100755 buildSrc/src/main/resources/japicmp_exceptions.json
 delete mode 100644 buildSrc/src/test/java/org/apache/geode/gradle/test/isolation/PortRangeTest.java
 delete mode 100644 buildSrc/src/test/java/org/apache/geode/gradle/testing/isolation/WorkingDirectoryIsolatorTest.java
 delete mode 100755 ci/scripts/execute_redis_tests.sh
 create mode 100644 geode-assembly/src/acceptanceTest/java/org/apache/geode/cache/persistence/MissingDiskStoreAfterServerRestartAcceptanceTest.java
 create mode 100644 geode-assembly/src/acceptanceTest/java/org/apache/geode/jdk/JdkEncapsulationTest.java
 create mode 100644 geode-assembly/src/acceptanceTest/java/org/apache/geode/jdk/TraverseEncapsulatedJdkObject.java
 create mode 100644 geode-assembly/src/acceptanceTest/java/org/apache/geode/management/internal/cli/commands/RebalanceCommandAcceptanceTest.java
 create mode 100644 geode-assembly/src/acceptanceTest/java/org/apache/geode/rules/GfshRuleExampleTest.java
 delete mode 100644 geode-assembly/src/acceptanceTest/resources/org/apache/geode/cache/wan/scripts/geode-list-gateway-receivers-server1.gfsh
 delete mode 100644 geode-assembly/src/acceptanceTest/resources/org/apache/geode/cache/wan/scripts/geode-list-gateway-receivers-server2.gfsh
 delete mode 100644 geode-assembly/src/acceptanceTest/resources/org/apache/geode/cache/wan/scripts/geode-starter-create.gfsh
 delete mode 100644 geode-assembly/src/acceptanceTest/resources/org/apache/geode/cache/wan/scripts/geode-starter-locator.gfsh
 delete mode 100644 geode-assembly/src/acceptanceTest/resources/org/apache/geode/cache/wan/scripts/geode-starter-server1.gfsh
 delete mode 100644 geode-assembly/src/acceptanceTest/resources/org/apache/geode/cache/wan/scripts/geode-starter-server2.gfsh
 create mode 100644 geode-assembly/src/main/dist/config/open-all-jdk-packages-linux-openjdk-17
 create mode 100644 geode-assembly/src/test/java/org/apache/geode/management/internal/cli/commands/VerifyCommandLine.java
 create mode 100644 geode-assembly/src/upgradeTest/java/org/apache/geode/test/junit/rules/GfshExecutorVersionTest.java
 delete mode 100644 geode-assembly/src/upgradeTest/java/org/apache/geode/test/junit/rules/GfshRuleUpgradeTest.java
 create mode 100644 geode-common/src/main/java/org/apache/geode/annotations/internal/MakeNotSerializable.java
 create mode 100644 geode-common/src/main/java/org/apache/geode/annotations/internal/SerializableCompatibility.java
 create mode 100644 geode-core/src/distributedTest/java/org/apache/geode/cache/query/dunit/NestedQueryClassCastExceptionFailureDistributedTest.java
 delete mode 100755 geode-core/src/distributedTest/java/org/apache/geode/cache30/DistributedMulticastRegionDUnitTest.java
 create mode 100755 geode-core/src/distributedTest/java/org/apache/geode/cache30/DistributedMulticastRegionDistributedTest.java
 delete mode 100644 geode-core/src/distributedTest/java/org/apache/geode/cache30/DistributedMulticastRegionWithUDPSecurityDUnitTest.java
 create mode 100644 geode-core/src/distributedTest/java/org/apache/geode/cache30/DistributedMulticastRegionWithUDPSecurityDistributedTest.java
 create mode 100644 geode-core/src/distributedTest/java/org/apache/geode/distributed/internal/DistributionStatsNodesDistributedTest.java
 create mode 100644 geode-core/src/distributedTest/java/org/apache/geode/distributed/internal/P2pMessagingSslTlsKeyUpdateDistributedTest.java
 delete mode 100755 geode-core/src/distributedTest/java/org/apache/geode/internal/cache/HAOverflowMemObjectSizerDUnitTest.java
 create mode 100755 geode-core/src/distributedTest/java/org/apache/geode/internal/cache/HAOverflowMemObjectSizerDistributedTest.java
 create mode 100644 geode-core/src/distributedTest/java/org/apache/geode/internal/cache/InternalCacheForClientAccessDistributedTest.java
 create mode 100644 geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionRestartRebalanceDUnitTest.java
 delete mode 100644 geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionStatsDUnitTest.java
 create mode 100644 geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionStatsDistributedTest.java
 delete mode 100644 geode-core/src/distributedTest/java/org/apache/geode/internal/cache/execute/PRClientServerRegionFunctionExecutionNoSingleHopDUnitTest.java
 create mode 100644 geode-core/src/distributedTest/java/org/apache/geode/internal/cache/execute/PRClientServerRegionFunctionExecutionNoSingleHopDistributedTest.java
 delete mode 100755 geode-core/src/distributedTest/java/org/apache/geode/internal/cache/ha/FailoverDUnitTest.java
 create mode 100755 geode-core/src/distributedTest/java/org/apache/geode/internal/cache/ha/FailoverDistributedTest.java
 delete mode 100755 geode-core/src/distributedTest/java/org/apache/geode/internal/cache/ha/HAClearDUnitTest.java
 create mode 100755 geode-core/src/distributedTest/java/org/apache/geode/internal/cache/ha/HAClearDistributedTest.java
 delete mode 100755 geode-core/src/distributedTest/java/org/apache/geode/internal/cache/ha/HAConflationDUnitTest.java
 create mode 100755 geode-core/src/distributedTest/java/org/apache/geode/internal/cache/ha/HAConflationDistributedTest.java
 delete mode 100755 geode-core/src/distributedTest/java/org/apache/geode/internal/cache/ha/HAEventIdPropagationDUnitTest.java
 create mode 100755 geode-core/src/distributedTest/java/org/apache/geode/internal/cache/ha/HAEventIdPropagationDistributedTest.java
 delete mode 100755 geode-core/src/distributedTest/java/org/apache/geode/internal/cache/ha/HAGIIDUnitTest.java
 create mode 100755 geode-core/src/distributedTest/java/org/apache/geode/internal/cache/ha/HAGIIDistributedTest.java
 delete mode 100755 geode-core/src/distributedTest/java/org/apache/geode/internal/cache/ha/HARQueueNewImplDUnitTest.java
 create mode 100755 geode-core/src/distributedTest/java/org/apache/geode/internal/cache/ha/HARQueueNewImplDistributedTest.java
 create mode 100755 geode-core/src/distributedTest/java/org/apache/geode/internal/cache/ha/HARegionQueueExpiryRegressionDistributedTest.java
 delete mode 100755 geode-core/src/distributedTest/java/org/apache/geode/internal/cache/ha/HARegionQueueExpiryRegressionTest.java
 create mode 100644 geode-core/src/distributedTest/java/org/apache/geode/internal/cache/partitioned/PartitionedRegionCacheCloseNoRetryDistributedTest.java
 delete mode 100755 geode-core/src/distributedTest/java/org/apache/geode/internal/cache/tier/sockets/ClientConflationDUnitTest.java
 create mode 100755 geode-core/src/distributedTest/java/org/apache/geode/internal/cache/tier/sockets/ClientConflationDistributedTest.java
 delete mode 100755 geode-core/src/distributedTest/java/org/apache/geode/internal/cache/tier/sockets/ClientInterestNotifyDUnitTest.java
 create mode 100755 geode-core/src/distributedTest/java/org/apache/geode/internal/cache/tier/sockets/ClientInterestNotifyDistributedTest.java
 delete mode 100755 geode-core/src/distributedTest/java/org/apache/geode/internal/cache/tier/sockets/ConflationDUnitTest.java
 create mode 100755 geode-core/src/distributedTest/java/org/apache/geode/internal/cache/tier/sockets/ConflationDistributedTest.java
 delete mode 100644 geode-core/src/distributedTest/java/org/apache/geode/internal/cache/tier/sockets/DurableClientBug39997DUnitTest.java
 create mode 100644 geode-core/src/distributedTest/java/org/apache/geode/internal/cache/tier/sockets/DurableClientNoServerAvailabileDistributedTest.java
 delete mode 100644 geode-core/src/distributedTest/java/org/apache/geode/internal/cache/tier/sockets/DurableRegistrationDUnitTest.java
 create mode 100644 geode-core/src/distributedTest/java/org/apache/geode/internal/cache/tier/sockets/DurableRegistrationDistributedTest.java
 create mode 100644 geode-core/src/distributedTest/java/org/apache/geode/internal/tcp/OffHeapByteSourceTest.java
 delete mode 100644 geode-core/src/distributedTest/java/org/apache/geode/security/AuthExpirationDUnitTest.java
 create mode 100644 geode-core/src/distributedTest/java/org/apache/geode/security/AuthExpirationDistributedTest.java
 create mode 100644 geode-core/src/integrationTest/java/org/apache/geode/cache/client/internal/QueueManagerIntegrationTest.java
 delete mode 100644 geode-core/src/integrationTest/java/org/apache/geode/cache/client/internal/QueueManagerJUnitTest.java
 create mode 100644 geode-core/src/integrationTest/java/org/apache/geode/distributed/internal/LocatorIntegrationTest.java
 create mode 100644 geode-core/src/integrationTest/java/org/apache/geode/internal/cache/DiskRegionCompactorClearsObjectThatAreNoLongerNeededIntegrationTest.java
 create mode 100644 geode-core/src/integrationTest/java/org/apache/geode/internal/cache/tier/sockets/ConnectionProxyIntegrationTest.java
 delete mode 100644 geode-core/src/integrationTest/java/org/apache/geode/internal/cache/tier/sockets/ConnectionProxyJUnitTest.java
 create mode 100644 geode-core/src/integrationTest/java/org/apache/geode/internal/net/NioSslEngineKeyUpdateTest.java
 create mode 100644 geode-core/src/jmh/java/org/apache/geode/internal/JvmSizeUtilsBenchmark.java
 create mode 100644 geode-core/src/main/java/org/apache/geode/internal/monitoring/executor/AsyncWriterExecutorGroup.java
 create mode 100644 geode-core/src/main/java/org/apache/geode/internal/process/ProcessUtilsProvider.java
 create mode 100644 geode-core/src/test/java/org/apache/geode/cache/client/internal/LiveServerPingerTest.java
 create mode 100644 geode-core/src/test/java/org/apache/geode/cache/execute/FunctionTest.java
 create mode 100644 geode-core/src/test/java/org/apache/geode/distributed/ServerStateTest.java
 create mode 100644 geode-core/src/test/java/org/apache/geode/internal/JvmSizeUtilsJUnitTest.java
 delete mode 100644 geode-core/src/test/java/org/apache/geode/internal/admin/remote/DistributionLocatorIdJUnitTest.java
 create mode 100644 geode-core/src/test/java/org/apache/geode/internal/admin/remote/DistributionLocatorIdTest.java
 create mode 100644 geode-core/src/test/java/org/apache/geode/internal/cache/LocalRegionUpdateUnitTest.java
 create mode 100644 geode-core/src/test/java/org/apache/geode/internal/cache/execute/PartitionedRegionFunctionResultSenderTest.java
 delete mode 100644 geode-core/src/test/java/org/apache/geode/internal/monitoring/ThreadsMonitoringImplJUnitTest.java
 create mode 100644 geode-core/src/test/java/org/apache/geode/internal/monitoring/ThreadsMonitoringImplTest.java
 delete mode 100644 geode-core/src/test/java/org/apache/geode/internal/monitoring/ThreadsMonitoringProcessJUnitTest.java
 create mode 100644 geode-core/src/test/java/org/apache/geode/internal/monitoring/ThreadsMonitoringProcessTest.java
 create mode 100755 geode-core/src/test/java/org/apache/geode/internal/offheap/OffHeapStorageNonRuntimeStatsJUnitTest.java
 create mode 100644 geode-core/src/test/java/org/apache/geode/internal/size/ReflectionSingleObjectSizerTest.java
 create mode 100644 geode-core/src/test/java/org/apache/geode/internal/tcp/ConnectionTransmissionTest.java
 create mode 100644 geode-core/src/upgradeTest/java/org/apache/geode/internal/cache/GetClusterConfigurationFunctionCompatibilityTest.java
 delete mode 100644 geode-core/src/upgradeTest/java/org/apache/geode/internal/cache/rollingupgrade/RollingUpgradeDUnitTest.java
 create mode 100644 geode-core/src/upgradeTest/java/org/apache/geode/internal/cache/rollingupgrade/RollingUpgradeDistributedTest.java
 create mode 100644 geode-core/src/upgradeTest/java/org/apache/geode/internal/cache/rollingupgrade/RollingUpgradeOnPartitionedRedundantRegionDistributedTest.java
 create mode 100644 geode-core/src/upgradeTest/java/org/apache/geode/internal/cache/rollingupgrade/RollingUpgradeOnPersistentReplicateRegionDistributedTest.java
 create mode 100644 geode-core/src/upgradeTest/java/org/apache/geode/internal/cache/rollingupgrade/RollingUpgradeOnReplicatedRegionDistributedTest.java
 delete mode 100644 geode-core/src/upgradeTest/java/org/apache/geode/internal/cache/rollingupgrade/RollingUpgradeRollServersOnPartitionedRegion_dataserializable.java
 delete mode 100644 geode-core/src/upgradeTest/java/org/apache/geode/internal/cache/rollingupgrade/RollingUpgradeRollServersOnPersistentRegion_dataserializable.java
 delete mode 100644 geode-core/src/upgradeTest/java/org/apache/geode/internal/cache/rollingupgrade/RollingUpgradeRollServersOnReplicatedRegion_dataserializable.java
 delete mode 100755 geode-cq/src/distributedTest/java/org/apache/geode/internal/cache/PRDeltaPropagationDUnitTest.java
 create mode 100755 geode-cq/src/distributedTest/java/org/apache/geode/internal/cache/PRDeltaPropagationDistributedTest.java
 delete mode 100755 geode-cq/src/distributedTest/java/org/apache/geode/internal/cache/ha/CQListGIIDUnitTest.java
 create mode 100755 geode-cq/src/distributedTest/java/org/apache/geode/internal/cache/ha/CQListGIIDistributedTest.java
 delete mode 100755 geode-cq/src/distributedTest/java/org/apache/geode/internal/cache/ha/HADispatcherDUnitTest.java
 create mode 100755 geode-cq/src/distributedTest/java/org/apache/geode/internal/cache/ha/HADispatcherDistributedTest.java
 delete mode 100644 geode-docs/images/MultiSite-4.gif
 create mode 100644 geode-docs/images_svg/MultiSite-4.svg
 delete mode 100644 geode-docs/tools_modules/geode_for_redis.html.md.erb
 delete mode 100644 geode-dunit/src/main/java/org/apache/geode/internal/cache/InternalCacheForClientAccessDUnitTest.java
 delete mode 100755 geode-dunit/src/main/java/org/apache/geode/internal/cache/tier/sockets/ConflationDUnitTestHelper.java
 create mode 100755 geode-dunit/src/main/java/org/apache/geode/internal/cache/tier/sockets/ConflationDistributedTestHelper.java
 delete mode 100644 geode-dunit/src/main/java/org/apache/geode/management/internal/cli/commands/NestedQueryClassCastExceptionFailureDUnitTest.java
 delete mode 100644 geode-dunit/src/main/java/org/apache/geode/management/internal/cli/commands/RebalanceCommandDistributedTest.java
 delete mode 100644 geode-for-redis/README.md
 delete mode 100644 geode-for-redis/build.gradle
 delete mode 100644 geode-for-redis/gfsh.png
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/CommandPipeliningNativeRedisAcceptanceTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/GeodeRedisServerStartupAcceptanceTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/NativeRedisClusterTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/GeodeRedisServerStartupUsingGfshAcceptanceTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/GlobPatternNativeRedisAcceptanceTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/UnknownNativeRedisAcceptanceTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/cluster/ClusterNativeRedisAcceptanceTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/connection/AuthNativeRedisAcceptanceTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/connection/ClientNativeRedisAcceptanceTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/connection/EchoNativeRedisAcceptanceTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/connection/PingNativeRedisAcceptanceTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/connection/SelectNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/hash/HScanNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/hash/HashesNativeRedisAcceptanceTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/hash/HincrByFloatNativeRedisAccetanceTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/key/DelNativeRedisAcceptanceTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/key/DumpRestoreNativeRedisAcceptanceTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/key/ExistsNativeRedisAcceptanceTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/key/ExpireAtNativeRedisAcceptanceTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/key/ExpireNativeRedisAcceptanceTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/key/KeysNativeRedisAcceptanceTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/key/PExpireAtNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/key/PTTLNativeRedisAcceptanceTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/key/PersistNativeRedisAcceptanceTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/key/PexpireNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/key/RenameNXNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/key/RenameNativeRedisAcceptanceTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/key/ScanNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/key/TTLNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/key/TypeNativeRedisAcceptanceTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/key/UnlinkNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/list/LIndexNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/list/LLenNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/list/LPopNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/list/LPushNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/list/LPushxNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/list/LRangeNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/list/LSetNativeRedisAcceptanceTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/list/RPopNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/list/RPushNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/pubsub/LettucePubSubNativeRedisAcceptanceTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/pubsub/NativeRedisSubCommandsIntegrationTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/pubsub/PubSubNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/pubsub/SubscriptionsNativeRedisAcceptanceTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/server/DBSizeNativeRedisAcceptanceTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/server/FlushAllNativeRedisAcceptanceTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/server/FlushDBNativeRedisAcceptanceTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/server/HitsMissesNativeRedisAcceptanceTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/server/InfoNativeRedisAcceptanceTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/server/InfoStatsNativeRedisAcceptanceTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/server/MemoryStatsNativeRedisAcceptanceTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/server/SlowlogNativeRedisAcceptanceTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/server/TimeNativeRedisAcceptanceTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/set/SCardNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/set/SDiffNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/set/SDiffStoreNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/set/SInterNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/set/SInterStoreNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/set/SIsMemberNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/set/SMoveNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/set/SPopNativeRedisAcceptanceTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/set/SRandMemberNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/set/SRemNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/set/SScanNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/set/SUnionNativeRedisAcceptanceTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/set/SUnionStoreNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/set/SetsNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZAddNativeRedisAcceptanceTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZCardNativeRedisAcceptanceTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZCountNativeRedisAcceptanceTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZIncrByNativeRedisIntegrationTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZInterStoreNativeRedisAcceptanceTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZLexCountNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZPopMaxNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZPopMinNativeRedisAcceptanceTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZRangeByLexNativeRedisAcceptanceTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZRangeByScoreNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZRangeNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZRankNativeRedisAcceptanceTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZRemNativeRedisAcceptanceTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZRemRangeByLexNativeRedisAcceptanceTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZRemRangeByRankNativeRedisAcceptanceTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZRemRangeByScoreNativeRedisAcceptanceTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZRevRangeByLexNativeRedisAcceptanceTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZRevRangeByScoreNativeRedisAcceptanceTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZRevRangeNativeRedisAcceptanceTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZRevRankNativeRedisAcceptanceTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZScanNativeRedisIntegrationTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZScoreNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZUnionStoreNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/string/AppendNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/string/BitCountNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/string/BitOpNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/string/BitPosNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/string/DecrByNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/string/DecrNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/string/GetBitNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/string/GetNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/string/GetRangeNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/string/GetSetNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/string/IncrByFloatNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/string/IncrByNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/string/IncrNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/string/MGetNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/string/MSetNXNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/string/MSetNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/string/PSetEXNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/string/SetBitNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/string/SetExNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/string/SetNXNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/string/SetNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/string/SetRangeNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/string/StringNativeRedisAcceptanceTest.java
 delete mode 100755 geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/data/MemoryOverheadNativeRedisAcceptanceTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/session/NativeRedisSessionAcceptanceTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/java/session/NativeRedisSessionExpirationAcceptanceTest.java
 delete mode 100644 geode-for-redis/src/acceptanceTest/resources/0001-configure-redis-tests.patch
 delete mode 100644 geode-for-redis/src/acceptanceTest/resources/testcontainers.properties
 delete mode 100644 geode-for-redis/src/commonTest/java/org/apache/geode/NativeRedisTestRule.java
 delete mode 100644 geode-for-redis/src/commonTest/java/org/apache/geode/redis/ClusterNode.java
 delete mode 100644 geode-for-redis/src/commonTest/java/org/apache/geode/redis/ClusterNodes.java
 delete mode 100644 geode-for-redis/src/commonTest/java/org/apache/geode/redis/ConcurrentLoopingThreads.java
 delete mode 100644 geode-for-redis/src/commonTest/java/org/apache/geode/redis/GeodeRedisServerRule.java
 delete mode 100644 geode-for-redis/src/commonTest/java/org/apache/geode/redis/NativeRedisClusterTestRule.java
 delete mode 100644 geode-for-redis/src/commonTest/java/org/apache/geode/redis/RedisIntegrationTest.java
 delete mode 100644 geode-for-redis/src/commonTest/java/org/apache/geode/redis/internal/proxy/ClusterNodesResponseProcessor.java
 delete mode 100644 geode-for-redis/src/commonTest/java/org/apache/geode/redis/internal/proxy/ClusterSlotsResponseProcessor.java
 delete mode 100644 geode-for-redis/src/commonTest/java/org/apache/geode/redis/internal/proxy/HostPort.java
 delete mode 100644 geode-for-redis/src/commonTest/java/org/apache/geode/redis/internal/proxy/MovedResponseHandler.java
 delete mode 100644 geode-for-redis/src/commonTest/java/org/apache/geode/redis/internal/proxy/NoopRedisResponseProcessor.java
 delete mode 100644 geode-for-redis/src/commonTest/java/org/apache/geode/redis/internal/proxy/RedisProxy.java
 delete mode 100644 geode-for-redis/src/commonTest/java/org/apache/geode/redis/internal/proxy/RedisProxyInboundHandler.java
 delete mode 100644 geode-for-redis/src/commonTest/java/org/apache/geode/redis/internal/proxy/RedisProxyOutboundHandler.java
 delete mode 100644 geode-for-redis/src/commonTest/java/org/apache/geode/redis/internal/proxy/RedisResponseProcessor.java
 delete mode 100644 geode-for-redis/src/commonTest/java/org/apache/geode/redis/internal/ssl/TestSSLServer.java
 delete mode 100644 geode-for-redis/src/commonTest/java/org/apache/geode/redis/mocks/MockBinarySubscriber.java
 delete mode 100644 geode-for-redis/src/commonTest/java/org/apache/geode/redis/mocks/MockSubscriber.java
 delete mode 100644 geode-for-redis/src/commonTest/java/org/apache/geode/test/dunit/rules/RedisClusterStartupRule.java
 delete mode 100644 geode-for-redis/src/commonTest/resources/redis-cluster-compose.yml
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/CheckPrimaryBucketFunction.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/ExpiringSecurityManager.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/OutOfMemoryDUnitTest.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/RedisDistDUnitTest.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/SSLDUnitTest.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/UserExpirationDUnitTest.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/internal/commands/executor/FlushAllDUnitTest.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/internal/commands/executor/MovedDUnitTest.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/internal/commands/executor/cluster/ClusterSlotsAndNodesDUnitTest.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/internal/commands/executor/cluster/JedisAndLettuceClusterDUnitTest.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/internal/commands/executor/hash/HExistsDUnitTest.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/internal/commands/executor/hash/HGetDUnitTest.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/internal/commands/executor/hash/HKeysDUnitTest.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/internal/commands/executor/hash/HMgetDUnitTest.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/internal/commands/executor/hash/HMsetDUnitTest.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/internal/commands/executor/hash/HScanDunitTest.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/internal/commands/executor/hash/HSetNXDunitTest.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/internal/commands/executor/hash/HashesAndCrashesDUnitTest.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/internal/commands/executor/hash/HdelDUnitTest.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/internal/commands/executor/hash/HlenDUnitTest.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/internal/commands/executor/hash/HsetDUnitTest.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/internal/commands/executor/hash/HstrlenDUnitTest.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/internal/commands/executor/hash/HvalsDUnitTest.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/internal/commands/executor/key/AbstractRenameRedirectionsDUnitTest.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/internal/commands/executor/key/ExpireDUnitTest.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/internal/commands/executor/key/NativeRedisRenameRedirectionsDUnitTest.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/internal/commands/executor/key/PersistDUnitTest.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/internal/commands/executor/key/RadishRenameRedirectionsDUnitTest.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/internal/commands/executor/key/RenameDUnitTest.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/internal/commands/executor/list/LPopDUnitTest.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/internal/commands/executor/list/LPushDUnitTest.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/internal/commands/executor/list/RPopDUnitTest.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/internal/commands/executor/list/RPushDUnitTest.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/internal/commands/executor/pubsub/PubSubConcurrentDUnitTest.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/internal/commands/executor/pubsub/PubSubDUnitTest.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/internal/commands/executor/set/SaddDUnitTest.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/internal/commands/executor/set/SremDUnitTest.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZAddDUnitTest.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZAddIncrOptionDUnitTest.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZRemDUnitTest.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZRemRangeByLexDUnitTest.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZRemRangeByRankDUnitTest.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZRemRangeByScoreDUnitTest.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/internal/commands/executor/string/MSetDUnitTest.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/internal/commands/executor/string/MSetNXDUnitTest.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/internal/commands/executor/string/StringsDUnitTest.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/internal/data/DeltaDUnitTest.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/internal/data/PartitionedRegionStatsUpdateTest.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/internal/executor/auth/AuthWhileServersRestartDUnitTest.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/internal/executor/string/StringsKillMultipleServersDUnitTest.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/internal/services/cluster/RedisPartitionResolverDUnitTest.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/session/RedisSessionDUnitTest.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/session/SessionDUnitTest.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/session/SessionExpirationDUnitTest.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/session/SessionsAndCrashesDUnitTest.java
 delete mode 100755 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/session/springRedisTestApplication/RedisSpringTestApplication.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/session/springRedisTestApplication/SessionController.java
 delete mode 100644 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/session/springRedisTestApplication/config/SessionListener.java
 delete mode 100755 geode-for-redis/src/distributedTest/java/org/apache/geode/redis/session/springRedisTestApplication/config/WebMvcConfig.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeRedisSerializablesIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/AbstractCommandPipeliningIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/CommandPipeliningIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/ConcurrentLoopingThreadsTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/RedisCommandArgumentsTestHelper.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/RedisTestHelper.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/GeodeServerRunTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/RedisSanctionedSerializablesServiceIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/AbstractGlobPatternIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/AbstractUnknownIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/GlobPatternIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/UnknownIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/cluster/AbstractClusterIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/cluster/ClusterIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/common/UnsupportedCommandsIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/connection/AbstractAuthIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/connection/AbstractClientIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/connection/AbstractEchoIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/connection/AbstractPingIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/connection/AbstractSelectIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/connection/AuthIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/connection/ClientIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/connection/EchoIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/connection/PingIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/connection/QuitIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/connection/SelectIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/hash/AbstractHScanIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/hash/AbstractHashesIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/hash/AbstractHincrByFloatIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/hash/HScanIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/hash/HashesIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/hash/HincrByFloatIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/key/AbstractDelIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/key/AbstractDumpRestoreIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/key/AbstractExistsIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/key/AbstractExpireAtIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/key/AbstractExpireIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/key/AbstractKeysIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/key/AbstractPExpireAtIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/key/AbstractPTTLIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/key/AbstractPersistIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/key/AbstractPexpireIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/key/AbstractRenameIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/key/AbstractRenameNXIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/key/AbstractScanIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/key/AbstractTTLIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/key/AbstractTypeIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/key/AbstractUnlinkIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/key/DelIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/key/DumpRestoreIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/key/ExistsIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/key/ExpireAtIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/key/ExpireIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/key/KeysIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/key/PExpireAtIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/key/PTTLIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/key/PersistIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/key/PexpireIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/key/RenameIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/key/RenameNXIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/key/ScanIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/key/TTLIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/key/TypeIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/key/UnlinkIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/list/AbstractLIndexIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/list/AbstractLLenIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/list/AbstractLPopIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/list/AbstractLPushIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/list/AbstractLPushxIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/list/AbstractLRangeIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/list/AbstractLSetIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/list/AbstractRPopIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/list/AbstractRPushIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/list/LIndexIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/list/LLenIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/list/LPopIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/list/LPushIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/list/LPushxIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/list/LRangeIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/list/LSetIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/list/RPopIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/list/RPushIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/pubsub/AbstractLettucePubSubIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/pubsub/AbstractPubSubIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/pubsub/AbstractSubCommandsIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/pubsub/AbstractSubscriptionsIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/pubsub/LettucePubSubIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/pubsub/PubSubIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/pubsub/SubCommandsIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/pubsub/SubscriptionsIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/server/AbstractDBSizeIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/server/AbstractFlushAllIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/server/AbstractFlushDBIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/server/AbstractHitsMissesIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/server/AbstractInfoIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/server/AbstractInfoStatsIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/server/AbstractRedisMemoryStatsIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/server/AbstractSlowlogIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/server/AbstractTimeIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/server/CommandIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/server/DBSizeIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/server/FlushAllIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/server/FlushDBIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/server/HitsMissesIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/server/InfoIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/server/InfoStatsIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/server/LolWutIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/server/MemoryStatsIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/server/ShutdownIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/server/SlowlogIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/server/TimeIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/set/AbstractSCardIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/set/AbstractSDiffIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/set/AbstractSDiffStoreIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/set/AbstractSInterIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/set/AbstractSInterStoreIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/set/AbstractSIsMemberIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/set/AbstractSMoveIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/set/AbstractSPopIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/set/AbstractSRandMemberIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/set/AbstractSRemIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/set/AbstractSScanIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/set/AbstractSUnionIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/set/AbstractSUnionStoreIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/set/AbstractSetsIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/set/SCardIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/set/SDiffIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/set/SDiffStoreIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/set/SInterIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/set/SInterStoreIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/set/SIsMemberIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/set/SMoveIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/set/SPopIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/set/SRandMemberIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/set/SRemIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/set/SScanIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/set/SUnionIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/set/SUnionStoreIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/set/SetsIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/AbstractZAddIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/AbstractZCardIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/AbstractZCountIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/AbstractZIncrByIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/AbstractZInterStoreIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/AbstractZLexCountIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/AbstractZPopMaxIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/AbstractZPopMinIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/AbstractZRangeByLexIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/AbstractZRangeByScoreIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/AbstractZRangeIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/AbstractZRankIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/AbstractZRemIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/AbstractZRemRangeByLexIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/AbstractZRemRangeByRankIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/AbstractZRemRangeByScoreIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/AbstractZRevRangeByLexIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/AbstractZRevRangeByScoreIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/AbstractZRevRangeIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/AbstractZRevRankIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/AbstractZScanIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/AbstractZScoreIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/AbstractZUnionStoreIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZAddIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZCardIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZCountIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZIncrByIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZInterStoreIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZLexCountIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZPopMaxIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZPopMinIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZRangeByLexIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZRangeByScoreIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZRangeIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZRankIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZRemIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZRemRangeByLexIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZRemRangeByRankIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZRemRangeByScoreIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZRevRangeByLexIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZRevRangeByScoreIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZRevRangeIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZRevRankIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZScanIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZScoreIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZUnionStoreIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/string/AbstractAppendIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/string/AbstractBitCountIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/string/AbstractBitOpIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/string/AbstractBitPosIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/string/AbstractDecrByIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/string/AbstractDecrIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/string/AbstractGetBitIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/string/AbstractGetIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/string/AbstractGetRangeIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/string/AbstractGetSetIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/string/AbstractIncrByFloatIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/string/AbstractIncrByIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/string/AbstractIncrIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/string/AbstractLettuceAppendIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/string/AbstractMGetIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/string/AbstractMSetIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/string/AbstractMSetNXIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/string/AbstractPSetEXIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/string/AbstractSetBitIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/string/AbstractSetEXIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/string/AbstractSetIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/string/AbstractSetNXIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/string/AbstractSetRangeIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/string/AbstractStringIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/string/AppendIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/string/BitCountIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/string/BitOpIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/string/BitPosIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/string/DecrByIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/string/DecrIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/string/GetBitIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/string/GetIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/string/GetRangeIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/string/GetSetIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/string/IncrByFloatIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/string/IncrByIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/string/IncrIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/string/LettuceAppendIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/string/MGetIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/string/MSetIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/string/MSetNXIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/string/PSetEXIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/string/SetBitIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/string/SetEXIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/string/SetIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/string/SetNXIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/string/SetRangeIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/string/StringIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/data/AbstractMemoryOverheadIntegrationTest.java
 delete mode 100755 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/data/MemoryOverheadIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/pubsub/SubscriptionsIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/services/LockingStripedCoordinatorIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/statistics/GeodeRedisStatsIntegrationTest.java
 delete mode 100644 geode-for-redis/src/integrationTest/resources/org/apache/geode/codeAnalysis/excludedClasses.txt
 delete mode 100644 geode-for-redis/src/integrationTest/resources/org/apache/geode/codeAnalysis/sanctionedDataSerializables.txt
 delete mode 100644 geode-for-redis/src/jmh/java/org/apache/geode/redis/internal/data/collections/OrderedStatisticTreeBenchmark.java
 delete mode 100644 geode-for-redis/src/jmh/java/org/apache/geode/redis/internal/data/collections/RedisHashMapBenchmark.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/GeodeRedisServer.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/GeodeRedisService.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/RedisConstants.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/RedisException.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/RedisProperties.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/Command.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/RedisCommandSupportLevel.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/RedisCommandType.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/BaseSetOptions.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/CommandExecutor.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/GlobPattern.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/RedisResponse.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/UnknownExecutor.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/cluster/CRC16.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/cluster/ClusterExecutor.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/cluster/RedisPartitionResolver.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/connection/AuthExecutor.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/connection/ClientExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/connection/EchoExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/connection/PingExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/connection/QuitExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/connection/SelectExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/hash/HDelExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/hash/HExistsExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/hash/HGetAllExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/hash/HGetExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/hash/HIncrByExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/hash/HIncrByFloatExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/hash/HKeysExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/hash/HLenExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/hash/HMGetExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/hash/HMSetExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/hash/HScanExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/hash/HSetExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/hash/HSetNXExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/hash/HStrLenExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/hash/HValsExecutor.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/key/AbstractRenameExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/key/AbstractScanExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/key/DelExecutor.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/key/DumpExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/key/ExistsExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/key/ExpireAtExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/key/ExpireExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/key/KeysExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/key/PExpireAtExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/key/PExpireExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/key/PTTLExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/key/PersistExecutor.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/key/RenameExecutor.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/key/RenameNXExecutor.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/key/RestoreExecutor.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/key/RestoreOptions.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/key/ScanExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/key/TTLExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/key/TypeExecutor.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/list/LIndexExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/list/LLenExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/list/LPopExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/list/LPushExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/list/LPushXExecutor.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/list/LRangeExecutor.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/list/LSetExecutor.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/list/RPopExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/list/RPushExecutor.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/pubsub/PsubscribeExecutor.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/pubsub/PubSubExecutor.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/pubsub/PublishExecutor.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/pubsub/PunsubscribeExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/pubsub/SubscribeExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/pubsub/UnsubscribeExecutor.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/server/CommandCommandExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/server/DBSizeExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/server/FlushAllExecutor.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/server/InfoExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/server/LolWutExecutor.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/server/SlowlogExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/server/TimeExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/set/SAddExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/set/SCardExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/set/SDiffExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/set/SDiffStoreExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/set/SInterExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/set/SInterStoreExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/set/SIsMemberExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/set/SMembersExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/set/SMoveExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/set/SPopExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/set/SRandMemberExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/set/SRemExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/set/SScanExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/set/SUnionExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/set/SUnionStoreExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/set/SetOpExecutor.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/set/SetRandomExecutor.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/sortedset/AbstractSortedSetRangeExecutor.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/sortedset/AbstractSortedSetRangeOptions.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/sortedset/AbstractZPopExecutor.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/sortedset/AbstractZRankExecutor.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/sortedset/SortedSetLexRangeOptions.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/sortedset/SortedSetRankRangeOptions.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/sortedset/SortedSetScoreRangeOptions.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZAddExecutor.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZAddOptions.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZAggregator.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZCardExecutor.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZCountExecutor.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZIncrByExecutor.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZInterStoreExecutor.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZKeyWeight.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZLexCountExecutor.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZPopMaxExecutor.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZPopMinExecutor.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZRangeByLexExecutor.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZRangeByScoreExecutor.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZRangeExecutor.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZRankExecutor.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZRemExecutor.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZRemRangeByLexExecutor.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZRemRangeByRankExecutor.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZRemRangeByScoreExecutor.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZRevRangeByLexExecutor.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZRevRangeByScoreExecutor.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZRevRangeExecutor.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZRevRankExecutor.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZScanExecutor.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZScoreExecutor.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZStoreExecutor.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZUnionStoreExecutor.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/string/AbstractMSetExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/string/AppendExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/string/BitCountExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/string/BitOpExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/string/BitPosExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/string/DecrByExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/string/DecrExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/string/GetBitExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/string/GetExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/string/GetRangeExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/string/GetSetExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/string/IncrByExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/string/IncrByFloatExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/string/IncrExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/string/MGetExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/string/MSetExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/string/MSetNXExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/string/PSetEXExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/string/SetBitExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/string/SetEXExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/string/SetExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/string/SetNXExecutor.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/string/SetOptions.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/string/SetRangeExecutor.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/string/StrlenExecutor.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/parameters/ClusterParameterRequirements.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/parameters/Parameter.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/parameters/RedisParametersMismatchException.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/parameters/SlowlogParameterRequirements.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/AbstractRedisData.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/KeyHashUtil.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/NullRedisData.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/NullRedisDataStructures.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/NullRedisHash.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/NullRedisList.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/NullRedisSet.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/NullRedisSortedSet.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/NullRedisString.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/RedisCrossSlotException.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/RedisData.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/RedisDataMovedException.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/RedisDataType.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/RedisDataTypeMismatchException.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/RedisHash.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/RedisKey.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/RedisKeyExistsException.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/RedisList.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/RedisSet.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/RedisSortedSet.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/RedisString.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/collections/Bytes2ObjectOpenHashMap.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/collections/OrderStatisticsSet.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/collections/OrderStatisticsTree.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/collections/SizeableByteArrayList.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/collections/SizeableBytes2ObjectOpenCustomHashMapWithCursor.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/collections/SizeableObjectOpenCustomHashSetWithCursor.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/collections/package-info.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/delta/AddByteArrayDoublePairs.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/delta/AddByteArrayPairs.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/delta/AddByteArrays.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/delta/AddByteArraysTail.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/delta/AppendByteArray.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/delta/DeltaInfo.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/delta/DeltaType.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/delta/RemoveByteArrays.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/delta/RemoveElementsByIndex.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/delta/ReplaceByteArrayAtOffset.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/delta/ReplaceByteArrayDoublePairs.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/delta/ReplaceByteArrays.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/delta/ReplaceByteAtOffset.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/delta/SetByteArray.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/delta/SetByteArrayAndTimestamp.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/delta/SetTimestamp.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/netty/ByteToCommandDecoder.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/netty/Client.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/netty/Coder.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/netty/CoderException.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/netty/ExecutionHandlerContext.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/netty/NettyRedisServer.java
 delete mode 100755 geode-for-redis/src/main/java/org/apache/geode/redis/internal/netty/RedisCommandParserException.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/netty/StringBytesGlossary.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/pubsub/AbstractSubscriptionManager.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/pubsub/ChannelSubscriptionManager.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/pubsub/ClientSubscriptionManager.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/pubsub/ClientSubscriptionManagerImpl.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/pubsub/PatternSubscriptionManager.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/pubsub/PubSub.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/pubsub/PubSubImpl.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/pubsub/Publisher.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/pubsub/SubscribeResult.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/pubsub/Subscription.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/pubsub/SubscriptionImpl.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/pubsub/SubscriptionManager.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/pubsub/Subscriptions.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/services/ActiveExpirationManager.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/services/RedisSanctionedSerializablesService.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/services/RegionProvider.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/services/cluster/RedisMemberInfo.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/services/cluster/RedisMemberInfoRetrievalFunction.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/services/cluster/SlotAdvisor.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/services/locking/LockingStripedCoordinator.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/services/locking/RedisSecurityService.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/services/locking/StripedCallable.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/services/locking/StripedCoordinator.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/services/locking/StripedExecutorService.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/services/locking/StripedObject.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/services/locking/StripedRunnable.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/statistics/GeodeRedisStats.java
 delete mode 100644 geode-for-redis/src/main/java/org/apache/geode/redis/internal/statistics/RedisStats.java
 delete mode 100644 geode-for-redis/src/main/resources/META-INF/services/org.apache.geode.internal.cache.CacheService
 delete mode 100644 geode-for-redis/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.DataSerializableFixedIdRegistrant
 delete mode 100644 geode-for-redis/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.filter.SanctionedSerializablesService
 delete mode 100755 geode-for-redis/src/main/resources/org/apache/geode/redis/internal/services/sanctioned-geode-for-redis-serializables.txt
 delete mode 100755 geode-for-redis/src/performanceTest/benchmark.sh
 delete mode 100755 geode-for-redis/src/performanceTest/environment-setup.sh
 delete mode 100755 geode-for-redis/src/performanceTest/execute-operation.sh
 delete mode 100755 geode-for-redis/src/performanceTest/shacompare.sh
 delete mode 100755 geode-for-redis/src/performanceTest/summarize-batch-results.sh
 delete mode 100755 geode-for-redis/src/performanceTest/summarize-operation-results.sh
 delete mode 100644 geode-for-redis/src/test/java/org/apache/geode/redis/internal/RedisCommandTypeTest.java
 delete mode 100644 geode-for-redis/src/test/java/org/apache/geode/redis/internal/RedisPropertiesTest.java
 delete mode 100644 geode-for-redis/src/test/java/org/apache/geode/redis/internal/commands/executor/GlobPatternTest.java
 delete mode 100644 geode-for-redis/src/test/java/org/apache/geode/redis/internal/commands/executor/cluster/CRC16JUnitTest.java
 delete mode 100644 geode-for-redis/src/test/java/org/apache/geode/redis/internal/commands/executor/connection/AuthExecutorTest.java
 delete mode 100644 geode-for-redis/src/test/java/org/apache/geode/redis/internal/commands/executor/sortedset/ZScanExecutorTest.java
 delete mode 100644 geode-for-redis/src/test/java/org/apache/geode/redis/internal/data/KeyHashUtilTest.java
 delete mode 100644 geode-for-redis/src/test/java/org/apache/geode/redis/internal/data/RedisHashTest.java
 delete mode 100644 geode-for-redis/src/test/java/org/apache/geode/redis/internal/data/RedisKeyJUnitTest.java
 delete mode 100644 geode-for-redis/src/test/java/org/apache/geode/redis/internal/data/RedisListTest.java
 delete mode 100644 geode-for-redis/src/test/java/org/apache/geode/redis/internal/data/RedisSetTest.java
 delete mode 100644 geode-for-redis/src/test/java/org/apache/geode/redis/internal/data/RedisSortedSetTest.java
 delete mode 100644 geode-for-redis/src/test/java/org/apache/geode/redis/internal/data/RedisStringQuickCheckTest.java
 delete mode 100644 geode-for-redis/src/test/java/org/apache/geode/redis/internal/data/RedisStringTest.java
 delete mode 100644 geode-for-redis/src/test/java/org/apache/geode/redis/internal/data/collections/OrderStatisticsTreeTest.java
 delete mode 100644 geode-for-redis/src/test/java/org/apache/geode/redis/internal/data/collections/OrderedStatisticTreeQuickCheckTest.java
 delete mode 100644 geode-for-redis/src/test/java/org/apache/geode/redis/internal/data/collections/SizeableByteArrayListTest.java
 delete mode 100644 geode-for-redis/src/test/java/org/apache/geode/redis/internal/data/collections/SizeableBytes2ObjectOpenCustomHashMapWithCursorQuickCheckTest.java
 delete mode 100644 geode-for-redis/src/test/java/org/apache/geode/redis/internal/data/collections/SizeableBytes2ObjectOpenCustomHashMapWithCursorTest.java
 delete mode 100644 geode-for-redis/src/test/java/org/apache/geode/redis/internal/data/collections/SizeableObjectOpenCustomHashSetWithCursorTest.java
 delete mode 100644 geode-for-redis/src/test/java/org/apache/geode/redis/internal/netty/ClientTest.java
 delete mode 100644 geode-for-redis/src/test/java/org/apache/geode/redis/internal/netty/CoderTest.java
 delete mode 100644 geode-for-redis/src/test/java/org/apache/geode/redis/internal/netty/CommandJUnitTest.java
 delete mode 100644 geode-for-redis/src/test/java/org/apache/geode/redis/internal/netty/ExecutionHandlerContextTest.java
 delete mode 100644 geode-for-redis/src/test/java/org/apache/geode/redis/internal/pubsub/ChannelSubscriptionManagerTest.java
 delete mode 100644 geode-for-redis/src/test/java/org/apache/geode/redis/internal/pubsub/ClientSubscriptionManagerImplTest.java
 delete mode 100644 geode-for-redis/src/test/java/org/apache/geode/redis/internal/pubsub/PatternSubscriptionManagerTest.java
 delete mode 100644 geode-for-redis/src/test/java/org/apache/geode/redis/internal/pubsub/PubSubImplTest.java
 delete mode 100644 geode-for-redis/src/test/java/org/apache/geode/redis/internal/pubsub/PublisherTest.java
 delete mode 100644 geode-for-redis/src/test/java/org/apache/geode/redis/internal/pubsub/SubscriptionImplTest.java
 delete mode 100644 geode-for-redis/src/test/java/org/apache/geode/redis/internal/pubsub/SubscriptionManagerTestBase.java
 delete mode 100644 geode-for-redis/src/test/java/org/apache/geode/redis/internal/pubsub/SubscriptionsJUnitTest.java
 delete mode 100644 geode-for-redis/src/test/java/org/apache/geode/redis/internal/services/LockingStripedCoordinatorTest.java
 delete mode 100644 geode-for-redis/src/test/java/org/apache/geode/redis/internal/services/RedisSecurityServiceTest.java
 delete mode 100644 geode-for-redis/src/test/java/org/apache/geode/redis/internal/services/RegionProviderTest.java
 delete mode 100644 geode-for-redis/src/test/java/org/apache/geode/redis/internal/services/StripedExecutorServiceJUnitTest.java
 delete mode 100644 geode-for-redis/src/test/java/org/apache/geode/redis/internal/services/cluster/RedisMemberInfoRetrievalFunctionTest.java
 delete mode 100644 geode-for-redis/src/test/java/org/apache/geode/redis/internal/services/cluster/RedisMemberInfoTest.java
 delete mode 100644 geode-for-redis/src/test/resources/expected-pom.xml
 create mode 100644 geode-gfsh/src/main/java/org/apache/geode/management/internal/cli/commands/MemberJvmOptions.java
 create mode 100644 geode-gfsh/src/test/java/org/apache/geode/management/internal/cli/commands/MemberJvmOptionsTest.java
 create mode 100644 geode-junit/src/main/java/org/apache/geode/test/compiler/InMemoryClassFileLoader.java
 delete mode 100755 geode-junit/src/main/java/org/apache/geode/test/junit/categories/RedisTest.java
 create mode 100644 geode-junit/src/main/java/org/apache/geode/test/junit/rules/Folder.java
 create mode 100644 geode-junit/src/main/java/org/apache/geode/test/junit/rules/FolderFactory.java
 create mode 100644 geode-junit/src/main/java/org/apache/geode/test/junit/rules/FolderRule.java
 create mode 100644 geode-junit/src/main/java/org/apache/geode/test/junit/rules/ResourceReporterRule.java
 create mode 100644 geode-junit/src/main/java/org/apache/geode/test/junit/rules/gfsh/GfshContext.java
 create mode 100644 geode-junit/src/main/java/org/apache/geode/test/junit/rules/gfsh/GfshExecutor.java
 create mode 100644 geode-junit/src/main/java/org/apache/geode/test/junit/rules/gfsh/GfshStopper.java
 create mode 100644 geode-junit/src/main/java/org/apache/geode/test/process/JavaModuleHelper.java
 create mode 100644 geode-junit/src/main/java/org/apache/geode/test/util/JarUtils.java
 create mode 100644 geode-junit/src/main/java/org/apache/geode/test/version/JavaVersion.java
 create mode 100644 geode-junit/src/main/java/org/apache/geode/test/version/JavaVersions.java
 create mode 100644 geode-junit/src/main/java/org/apache/geode/test/version/TestVersions.java
 create mode 100644 geode-junit/src/main/java/org/apache/geode/test/version/VmConfiguration.java
 create mode 100644 geode-junit/src/main/java/org/apache/geode/test/version/VmConfigurations.java
 create mode 100644 geode-junit/src/main/java/org/apache/geode/util/FilterSerializables.java
 create mode 100644 geode-junit/src/test/java/org/apache/geode/test/junit/rules/DescribedExternalResourceTest.java
 create mode 100644 geode-junit/src/test/java/org/apache/geode/test/process/JavaModuleHelperTest.java
 delete mode 100644 geode-membership/src/integrationTest/java/org/apache/geode/distributed/internal/membership/gms/GMSUtilTest.java
 create mode 100644 geode-membership/src/integrationTest/java/org/apache/geode/distributed/internal/membership/gms/LocatorConfigurationParserTest.java
 create mode 100644 geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/api/LocatorConfigurationParser.java
 delete mode 100644 geode-wan/src/distributedTest/java/org/apache/geode/cache/wan/internal/cli/commands/WanCopyRegionCommandDUnitTest.java
 create mode 100644 geode-wan/src/distributedTest/java/org/apache/geode/cache/wan/internal/cli/commands/WanCopyRegionCommandDistributedTest.java
 delete mode 100644 geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/CacheClientNotifierDUnitTest.java
 create mode 100644 geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/CacheClientNotifierDistributedTest.java
 delete mode 100644 geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/Simple2CacheServerDUnitTest.java
 create mode 100644 geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/Simple2CacheServerDistributedTest.java
 delete mode 100644 geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/concurrent/ConcurrentParallelGatewaySenderDUnitTest.java
 create mode 100644 geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/concurrent/ConcurrentParallelGatewaySenderDistributedTest.java
 delete mode 100644 geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/concurrent/ConcurrentParallelGatewaySenderOffHeapDUnitTest.java
 create mode 100644 geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/concurrent/ConcurrentParallelGatewaySenderOffHeapDistributedTest.java
 create mode 100644 geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/concurrent/ConcurrentParallelGatewaySenderOperation2DistributedTest.java
 delete mode 100644 geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/concurrent/ConcurrentParallelGatewaySenderOperation_2_DUnitTest.java
 create mode 100644 geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/misc/WANSSLDistributedTest.java
 create mode 100644 geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/offheap/ConcurrentParallelGatewaySenderOperation2OffHeapDistributedTest.java
 delete mode 100644 geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/offheap/ConcurrentParallelGatewaySenderOperation_2_OffHeapDUnitTest.java
 create mode 100644 geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/offheap/ParallelGatewaySenderOperation2OffHeapDistributedTest.java
 delete mode 100644 geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/offheap/ParallelGatewaySenderOperation_2_OffHeapDUnitTest.java
 delete mode 100644 geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/offheap/ParallelGatewaySenderOperationsOffHeapDUnitTest.java
 create mode 100644 geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/offheap/ParallelGatewaySenderOperationsOffHeapDistributedTest.java
 delete mode 100644 geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/offheap/ParallelWANConflationOffHeapDUnitTest.java
 create mode 100644 geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/offheap/ParallelWANConflationOffHeapDistributedTest.java
 delete mode 100644 geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/offheap/ParallelWANPropagationConcurrentOpsOffHeapDUnitTest.java
 create mode 100644 geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/offheap/ParallelWANPropagationConcurrentOpsOffHeapDistributedTest.java
 delete mode 100644 geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/offheap/SerialGatewaySenderQueueOffHeapDUnitTest.java
 create mode 100644 geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/offheap/SerialGatewaySenderQueueOffHeapDistributedTest.java
 delete mode 100644 geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/parallel/ParallelGatewaySenderAlertThresholdDUnitTest.java
 create mode 100644 geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/parallel/ParallelGatewaySenderAlertThresholdDistributedTest.java
 create mode 100644 geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/parallel/ParallelGatewaySenderOperation2DistributedTest.java
 delete mode 100644 geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/parallel/ParallelGatewaySenderOperation_2_DUnitTest.java
 delete mode 100644 geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/parallel/ParallelGatewaySenderOperationsDUnitTest.java
 create mode 100644 geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/parallel/ParallelGatewaySenderOperationsDistributedTest.java
 delete mode 100644 geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/parallel/ParallelWANConflationDUnitTest.java
 create mode 100644 geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/parallel/ParallelWANConflationDistributedTest.java
 delete mode 100644 geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/parallel/ParallelWANPropagationConcurrentOpsDUnitTest.java
 create mode 100644 geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/parallel/ParallelWANPropagationConcurrentOpsDistributedTest.java
 delete mode 100644 geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/parallel/ParallelWANStatsDUnitTest.java
 create mode 100644 geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/parallel/ParallelWANStatsDistributedTest.java
 delete mode 100644 geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/serial/SerialGatewaySenderQueueDUnitTest.java
 create mode 100644 geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/serial/SerialGatewaySenderQueueDistributedTest.java
 delete mode 100644 geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/serial/SerialWANConflationDUnitTest.java
 create mode 100644 geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/serial/SerialWANConflationDistributedTest.java
 delete mode 100644 geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/serial/SerialWANStatsDUnitTest.java
 create mode 100644 geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/serial/SerialWANStatsDistributedTest.java
 create mode 100644 geode-wan/src/test/java/org/apache/geode/cache/wan/internal/client/locator/LocatorHelperTest.java
 delete mode 100644 gradle/check-pom.gradle
 delete mode 100644 gradle/code-analysis.gradle
 delete mode 100644 gradle/ide.gradle
 delete mode 100644 gradle/japicmp.gradle
 delete mode 100644 gradle/java.gradle
 delete mode 100644 gradle/javaVersions.gradle
 delete mode 100644 gradle/jmh.gradle
 delete mode 100644 gradle/lint.gradle
 delete mode 100644 gradle/multi-process-test.gradle
 delete mode 100644 gradle/pmd.gradle
 delete mode 100644 gradle/publish-common.gradle
 delete mode 100644 gradle/publish-java.gradle
 delete mode 100644 gradle/publish-war.gradle
 delete mode 100644 gradle/rat.gradle
 delete mode 100644 gradle/sonar.gradle
 delete mode 100644 gradle/spotless.gradle
 delete mode 100644 gradle/standard-subproject-configuration.gradle
 delete mode 100644 gradle/test.gradle


[geode] 16/22: GEODE-9132: Fix locking in PRClearCreateIndexDUnitTest

Posted by ji...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

jinmeiliao pushed a commit to branch feature/GEODE-7665
in repository https://gitbox.apache.org/repos/asf/geode.git

commit f7bbb1db557051b223c7d67b04dcbd7328c77cf3
Author: Kirk Lund <kl...@apache.org>
AuthorDate: Thu Apr 22 11:43:10 2021 -0700

    GEODE-9132: Fix locking in PRClearCreateIndexDUnitTest
---
 .../geode/cache/query/partitioned/PRClearCreateIndexDUnitTest.java    | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/geode-core/src/distributedTest/java/org/apache/geode/cache/query/partitioned/PRClearCreateIndexDUnitTest.java b/geode-core/src/distributedTest/java/org/apache/geode/cache/query/partitioned/PRClearCreateIndexDUnitTest.java
index 423932d6d4..f4f2105ea7 100644
--- a/geode-core/src/distributedTest/java/org/apache/geode/cache/query/partitioned/PRClearCreateIndexDUnitTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/cache/query/partitioned/PRClearCreateIndexDUnitTest.java
@@ -103,7 +103,7 @@ public class PRClearCreateIndexDUnitTest implements Serializable {
 
     // assert that secondary member received these messages
     primary.invoke(() -> verifyEvents(false, false, false, false));
-    secondary.invoke(() -> verifyEvents(false, true, true, true));
+    secondary.invoke(() -> verifyEvents(true, true, true, true));
   }
 
   @Test
@@ -117,7 +117,7 @@ public class PRClearCreateIndexDUnitTest implements Serializable {
     clear.get();
 
     // assert that secondary member received these messages
-    primary.invoke(() -> verifyEvents(false, true, false, false));
+    primary.invoke(() -> verifyEvents(true, true, false, false));
     secondary.invoke(() -> verifyEvents(false, false, true, true));
   }
 


[geode] 19/22: GEODE-9194: Feature/region stats update (#6430)

Posted by ji...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

jinmeiliao pushed a commit to branch feature/GEODE-7665
in repository https://gitbox.apache.org/repos/asf/geode.git

commit b8e20b76e00c034dd6890b287c8e6bea5fe91b72
Author: mhansonp <ha...@vmware.com>
AuthorDate: Tue Jul 13 09:34:54 2021 -0700

    GEODE-9194: Feature/region stats update (#6430)
    
    * GEODE-9194: add PR Region Clear statistics
---
 .../cache/RegionClearStatsDistributedTest.java     |  13 +-
 .../cache/PartitionedRegionClearDUnitTest.java     | 139 ++++++++-------
 ...tionedRegionLocalMaxMemoryOffHeapDUnitTest.java |   2 +-
 .../partitioned/PRQueryCacheClosedJUnitTest.java   |  14 +-
 .../cache/query/partitioned/PRQueryJUnitTest.java  |  47 ++---
 .../partitioned/PRQueryRegionClosedJUnitTest.java  |  16 +-
 .../PRQueryRegionDestroyedJUnitTest.java           |   5 +-
 .../geode/internal/cache/ColocatedPRJUnitTest.java |   4 +-
 .../cache/PartitionedRegionCreationJUnitTest.java  |   4 +-
 .../cache/PartitionedRegionStatsJUnitTest.java     | 198 ++++++++++++++++++++-
 .../geode/internal/cache/AbstractRegion.java       |   2 +
 .../geode/internal/cache/AbstractRegionMap.java    | 167 +++++++++--------
 .../apache/geode/internal/cache/BucketRegion.java  |  24 ++-
 .../geode/internal/cache/CachePerfStats.java       |  79 ++++----
 .../geode/internal/cache/DummyCachePerfStats.java  |  10 ++
 .../geode/internal/cache/GemFireCacheImpl.java     |  15 +-
 .../apache/geode/internal/cache/LocalRegion.java   |  17 +-
 .../geode/internal/cache/PartitionedRegion.java    |  31 +++-
 .../internal/cache/PartitionedRegionClear.java     |  24 +--
 .../internal/cache/PartitionedRegionStats.java     |  47 +++++
 .../geode/internal/cache/RegionPerfStats.java      |  25 ++-
 .../apache/geode/internal/cache/RegionStats.java   |   4 +-
 .../geode/internal/cache/CachePerfStatsTest.java   |  64 +++----
 .../internal/cache/PartitionedRegionTest.java      |  13 +-
 .../cache/PartitionedRegionTestHelper.java         | 128 ++++++-------
 25 files changed, 667 insertions(+), 425 deletions(-)

diff --git a/geode-core/src/distributedTest/java/org/apache/geode/cache/RegionClearStatsDistributedTest.java b/geode-core/src/distributedTest/java/org/apache/geode/cache/RegionClearStatsDistributedTest.java
index e0214b7c7d..888a9966ff 100755
--- a/geode-core/src/distributedTest/java/org/apache/geode/cache/RegionClearStatsDistributedTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/cache/RegionClearStatsDistributedTest.java
@@ -38,7 +38,6 @@ import org.apache.geode.test.dunit.rules.DistributedRule;
 /**
  * verifies the count of clear operation
  */
-@SuppressWarnings("serial")
 public class RegionClearStatsDistributedTest implements Serializable {
 
   private static final String REGION_NAME = RegionClearStatsDistributedTest.class.getSimpleName();
@@ -58,7 +57,7 @@ public class RegionClearStatsDistributedTest implements Serializable {
   public CacheRule cacheRule = new CacheRule();
 
   @Before
-  public void setUp() throws Exception {
+  public void setUp() {
     server1 = getVM(0);
     client1 = getVM(1);
   }
@@ -96,7 +95,7 @@ public class RegionClearStatsDistributedTest implements Serializable {
   private int createCache(DataPolicy dataPolicy) throws IOException {
     cacheRule.createCache();
 
-    AttributesFactory factory = new AttributesFactory();
+    AttributesFactory<String, String> factory = new AttributesFactory<>();
     factory.setScope(Scope.DISTRIBUTED_ACK);
     factory.setDataPolicy(dataPolicy);
 
@@ -129,7 +128,7 @@ public class RegionClearStatsDistributedTest implements Serializable {
             .setMinConnections(1).setReadTimeout(20000).setPingInterval(10000).setRetryAttempts(1)
             .create(getClass().getSimpleName());
 
-    AttributesFactory factory = new AttributesFactory();
+    AttributesFactory<String, String> factory = new AttributesFactory<>();
     factory.setScope(Scope.DISTRIBUTED_ACK);
     factory.setPoolName(pool.getName());
 
@@ -148,7 +147,7 @@ public class RegionClearStatsDistributedTest implements Serializable {
             .setMinConnections(1).setReadTimeout(20000).setPingInterval(10000).setRetryAttempts(1)
             .create(getClass().getSimpleName());
 
-    AttributesFactory factory = new AttributesFactory();
+    AttributesFactory<String, String> factory = new AttributesFactory<>();
     factory.setScope(Scope.DISTRIBUTED_ACK);
     factory.setPoolName(pool.getName());
     factory.setDataPolicy(DataPolicy.PERSISTENT_REPLICATE);
@@ -157,7 +156,7 @@ public class RegionClearStatsDistributedTest implements Serializable {
   }
 
   private void doPutsAndClear() {
-    Region region = cacheRule.getCache().getRegion(REGION_NAME);
+    Region<String, String> region = cacheRule.getCache().getRegion(REGION_NAME);
 
     region.put(KEY1, VALUE1);
     region.put(KEY2, VALUE2);
@@ -169,7 +168,7 @@ public class RegionClearStatsDistributedTest implements Serializable {
   }
 
   private void validateClearCountStat() {
-    assertThat(cacheRule.getCache().getCachePerfStats().getRegionClearCount())
+    assertThat(cacheRule.getCache().getCachePerfStats().getClearCount())
         .isEqualTo(EXPECTED_CLEAR_COUNT_STAT_VALUE);
   }
 }
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionClearDUnitTest.java b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionClearDUnitTest.java
index b8719266b3..64fb284bcb 100644
--- a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionClearDUnitTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionClearDUnitTest.java
@@ -14,6 +14,7 @@
  */
 package org.apache.geode.internal.cache;
 
+import static org.apache.geode.distributed.ConfigurationProperties.ENABLE_TIME_STATISTICS;
 import static org.apache.geode.internal.Assert.fail;
 import static org.apache.geode.test.dunit.rules.ClusterStartupRule.getCache;
 import static org.apache.geode.test.dunit.rules.ClusterStartupRule.getClientCache;
@@ -40,10 +41,13 @@ import org.apache.geode.cache.RegionFactory;
 import org.apache.geode.cache.RegionShortcut;
 import org.apache.geode.cache.client.ClientRegionShortcut;
 import org.apache.geode.cache.util.CacheWriterAdapter;
+import org.apache.geode.test.dunit.Invoke;
 import org.apache.geode.test.dunit.SerializableCallableIF;
 import org.apache.geode.test.dunit.rules.ClientVM;
 import org.apache.geode.test.dunit.rules.ClusterStartupRule;
+import org.apache.geode.test.dunit.rules.DistributedRestoreSystemProperties;
 import org.apache.geode.test.dunit.rules.MemberVM;
+import org.apache.geode.util.internal.GeodeGlossary;
 
 public class PartitionedRegionClearDUnitTest implements Serializable {
   protected static final String REGION_NAME = "testPR";
@@ -60,10 +64,17 @@ public class PartitionedRegionClearDUnitTest implements Serializable {
   @Rule
   public ClusterStartupRule cluster = new ClusterStartupRule(7);
 
+  @Rule
+  public DistributedRestoreSystemProperties distributedRestoreSystemProperties =
+      new DistributedRestoreSystemProperties();
+
   @Before
   public void setUp() throws Exception {
+    Invoke.invokeInEveryVM(
+        () -> System.setProperty(GeodeGlossary.GEMFIRE_PREFIX + "enable-time-statistics", "true"));
     locator = cluster.startLocatorVM(0);
     locatorPort = locator.getPort();
+    getProperties().setProperty(ENABLE_TIME_STATISTICS, "true");
     dataStore1 = cluster.startServerVM(1, getProperties(), locatorPort);
     dataStore2 = cluster.startServerVM(2, getProperties(), locatorPort);
     dataStore3 = cluster.startServerVM(3, getProperties(), locatorPort);
@@ -79,11 +90,10 @@ public class PartitionedRegionClearDUnitTest implements Serializable {
   }
 
   protected Properties getProperties() {
-    Properties properties = new Properties();
-    return properties;
+    return new Properties();
   }
 
-  private Region getRegion(boolean isClient) {
+  private <K, V> Region<K, V> getRegion(boolean isClient) {
     if (isClient) {
       return getClientCache().getRegion(REGION_NAME);
     } else {
@@ -96,15 +106,16 @@ public class PartitionedRegionClearDUnitTest implements Serializable {
   }
 
   private void initClientCache() {
-    Region region = getClientCache().createClientRegionFactory(ClientRegionShortcut.CACHING_PROXY)
-        .create(REGION_NAME);
+    Region<Object, Object> region =
+        getClientCache().createClientRegionFactory(ClientRegionShortcut.CACHING_PROXY)
+            .create(REGION_NAME);
     region.registerInterestForAllKeys(InterestResultPolicy.KEYS);
   }
 
   private void initDataStore(boolean withWriter) {
-    RegionFactory factory = getCache().createRegionFactory(getRegionShortCut())
+    RegionFactory<Object, Object> factory = getCache().createRegionFactory(getRegionShortCut())
         .setPartitionAttributes(
-            new PartitionAttributesFactory().setTotalNumBuckets(TOTAL_BUCKET_NUM).create());
+            new PartitionAttributesFactory<>().setTotalNumBuckets(TOTAL_BUCKET_NUM).create());
     if (withWriter) {
       factory.setCacheWriter(new CountingCacheWriter());
     }
@@ -128,10 +139,10 @@ public class PartitionedRegionClearDUnitTest implements Serializable {
         fail("Wrong region type:" + shortcut);
       }
     }
-    RegionFactory factory = getCache().createRegionFactory(shortcut)
+    RegionFactory<Object, Object> factory = getCache().createRegionFactory(shortcut)
         .setPartitionAttributes(
-            new PartitionAttributesFactory().setTotalNumBuckets(10).setLocalMaxMemory(0).create())
-        .setPartitionAttributes(new PartitionAttributesFactory().setTotalNumBuckets(10).create());
+            new PartitionAttributesFactory<>().setTotalNumBuckets(10).setLocalMaxMemory(0).create())
+        .setPartitionAttributes(new PartitionAttributesFactory<>().setTotalNumBuckets(10).create());
     if (withWriter) {
       factory.setCacheWriter(new CountingCacheWriter());
     }
@@ -140,9 +151,9 @@ public class PartitionedRegionClearDUnitTest implements Serializable {
     destroysByRegion = new HashMap<>();
   }
 
-  private void feed(boolean isClient) {
-    Region region = getRegion(isClient);
-    IntStream.range(0, NUM_ENTRIES).forEach(i -> region.put(i, "value" + i));
+  private void putRecords(boolean isClient, int numEntries) {
+    Region<Object, Object> region = getRegion(isClient);
+    IntStream.range(0, numEntries).forEach(i -> region.put(i, "value" + i));
   }
 
   private void verifyServerRegionSize(int expectedNum) {
@@ -160,43 +171,28 @@ public class PartitionedRegionClearDUnitTest implements Serializable {
 
       for (BucketRegion bucket : region.getDataStore().getAllLocalBucketRegions()) {
         if (clearCount == 0) {
-          clearCount = bucket.getCachePerfStats().getBucketClearCount();
+          clearCount = bucket.getPartitionedRegion().getPrStats().getBucketClearCount();
         }
-        assertThat(bucket.getCachePerfStats().getBucketClearCount()).isEqualTo(bucketCount);
+        assertThat(bucket.getPartitionedRegion().getPrStats().getBucketClearCount())
+            .isEqualTo(bucketCount);
       }
 
-      CachePerfStats stats = region.getRegionCachePerfStats();
-
-      assertThat(stats.getRegionClearCount()).isEqualTo(1);
-      assertThat(stats.getPartitionedRegionClearLocalDuration())
-          .isGreaterThan(0);
+      CachePerfStats stats = region.getCachePerfStats();
       if (isCoordinator) {
-        assertThat(stats.getPartitionedRegionClearTotalDuration())
-            .isGreaterThan(0);
-      } else {
-        assertThat(stats.getPartitionedRegionClearTotalDuration())
-            .isEqualTo(0);
+        assertThat(stats.getClearCount()).isEqualTo(1);
       }
     });
   }
 
   private void verifyClientRegionSize(int expectedNum) {
     client1.invoke(() -> verifyRegionSize(true, expectedNum));
-    // TODO: notify register clients
-    // client2.invoke(()->verifyRegionSize(true, expectedNum));
   }
 
-  SerializableCallableIF<Integer> getWriterClears = () -> {
-    int clears =
-        clearsByRegion.get(REGION_NAME) == null ? 0 : clearsByRegion.get(REGION_NAME).get();
-    return clears;
-  };
+  SerializableCallableIF<Integer> getWriterClears =
+      () -> clearsByRegion.get(REGION_NAME) == null ? 0 : clearsByRegion.get(REGION_NAME).get();
 
-  SerializableCallableIF<Integer> getWriterDestroys = () -> {
-    int destroys =
-        destroysByRegion.get(REGION_NAME) == null ? 0 : destroysByRegion.get(REGION_NAME).get();
-    return destroys;
-  };
+  SerializableCallableIF<Integer> getWriterDestroys =
+      () -> destroysByRegion.get(REGION_NAME) == null ? 0 : destroysByRegion.get(REGION_NAME).get();
 
   SerializableCallableIF<Integer> getBucketRegionWriterClears = () -> {
     int clears = 0;
@@ -225,11 +221,11 @@ public class PartitionedRegionClearDUnitTest implements Serializable {
     accessor.invoke(() -> initAccessor(accessorWithWriter));
     // make sure only datastore3 has cacheWriter
     dataStore1.invoke(() -> {
-      Region region = getRegion(false);
+      Region<Object, Object> region = getRegion(false);
       region.getAttributesMutator().setCacheWriter(null);
     });
     dataStore2.invoke(() -> {
-      Region region = getRegion(false);
+      Region<Object, Object> region = getRegion(false);
       region.getAttributesMutator().setCacheWriter(null);
     });
   }
@@ -240,14 +236,14 @@ public class PartitionedRegionClearDUnitTest implements Serializable {
     client1.invoke(this::initClientCache);
     client2.invoke(this::initClientCache);
 
-    accessor.invoke(() -> feed(false));
+    accessor.invoke(() -> putRecords(false, NUM_ENTRIES));
     verifyServerRegionSize(NUM_ENTRIES);
     dataStore3.invoke(() -> getRegion(false).clear());
     verifyServerRegionSize(0);
 
     // do the region destroy to compare that the same callbacks will be triggered
     dataStore3.invoke(() -> {
-      Region region = getRegion(false);
+      Region<Object, Object> region = getRegion(false);
       region.destroyRegion();
     });
 
@@ -271,14 +267,14 @@ public class PartitionedRegionClearDUnitTest implements Serializable {
     client1.invoke(this::initClientCache);
     client2.invoke(this::initClientCache);
 
-    accessor.invoke(() -> feed(false));
+    accessor.invoke(() -> putRecords(false, NUM_ENTRIES));
     verifyServerRegionSize(NUM_ENTRIES);
     dataStore1.invoke(() -> getRegion(false).clear());
     verifyServerRegionSize(0);
 
     // do the region destroy to compare that the same callbacks will be triggered
     dataStore1.invoke(() -> {
-      Region region = getRegion(false);
+      Region<Object, Object> region = getRegion(false);
       region.destroyRegion();
     });
 
@@ -302,14 +298,14 @@ public class PartitionedRegionClearDUnitTest implements Serializable {
     client1.invoke(this::initClientCache);
     client2.invoke(this::initClientCache);
 
-    accessor.invoke(() -> feed(false));
+    accessor.invoke(() -> putRecords(false, NUM_ENTRIES));
     verifyServerRegionSize(NUM_ENTRIES);
     accessor.invoke(() -> getRegion(false).clear());
     verifyServerRegionSize(0);
 
     // do the region destroy to compare that the same callbacks will be triggered
     accessor.invoke(() -> {
-      Region region = getRegion(false);
+      Region<Object, Object> region = getRegion(false);
       region.destroyRegion();
     });
 
@@ -333,14 +329,14 @@ public class PartitionedRegionClearDUnitTest implements Serializable {
     client1.invoke(this::initClientCache);
     client2.invoke(this::initClientCache);
 
-    accessor.invoke(() -> feed(false));
+    accessor.invoke(() -> putRecords(false, NUM_ENTRIES));
     verifyServerRegionSize(NUM_ENTRIES);
     accessor.invoke(() -> getRegion(false).clear());
     verifyServerRegionSize(0);
 
     // do the region destroy to compare that the same callbacks will be triggered
     accessor.invoke(() -> {
-      Region region = getRegion(false);
+      Region<Object, Object> region = getRegion(false);
       region.destroyRegion();
     });
 
@@ -369,12 +365,12 @@ public class PartitionedRegionClearDUnitTest implements Serializable {
       PartitionedRegion region = (PartitionedRegion) getRegion(false);
 
       for (BucketRegion bucket : region.getDataStore().getAllLocalBucketRegions()) {
-        long clearCount = bucket.getCachePerfStats().getRegionClearCount();
+        long clearCount = bucket.getCachePerfStats().getClearCount();
         assertThat(clearCount).isEqualTo(0);
       }
     });
 
-    accessor.invoke(() -> feed(false));
+    accessor.invoke(() -> putRecords(false, NUM_ENTRIES));
     verifyServerRegionSize(NUM_ENTRIES);
     dataStore1.invoke(() -> getRegion(false).clear());
     verifyServerRegionSize(0);
@@ -388,11 +384,7 @@ public class PartitionedRegionClearDUnitTest implements Serializable {
     // The accessor shouldn't increment the region clear count
     accessor.invoke(() -> {
       PartitionedRegion region = (PartitionedRegion) getRegion(false);
-
-      assertThat(region.getRegionCachePerfStats()).isNull();
-      assertThat(region.getCachePerfStats().getRegionClearCount()).isEqualTo(0);
-      assertThat(region.getCachePerfStats().getPartitionedRegionClearLocalDuration()).isEqualTo(0);
-      assertThat(region.getCachePerfStats().getPartitionedRegionClearTotalDuration()).isEqualTo(0);
+      assertThat(region.getCachePerfStats().getClearCount()).isZero();
     });
   }
 
@@ -402,7 +394,7 @@ public class PartitionedRegionClearDUnitTest implements Serializable {
     client1.invoke(this::initClientCache);
     client2.invoke(this::initClientCache);
 
-    client1.invoke(() -> feed(true));
+    client1.invoke(() -> putRecords(true, NUM_ENTRIES));
     verifyClientRegionSize(NUM_ENTRIES);
     verifyServerRegionSize(NUM_ENTRIES);
 
@@ -412,7 +404,7 @@ public class PartitionedRegionClearDUnitTest implements Serializable {
 
     // do the region destroy to compare that the same callbacks will be triggered
     client1.invoke(() -> {
-      Region region = getRegion(true);
+      Region<Object, Object> region = getRegion(true);
       region.destroyRegion();
     });
 
@@ -430,13 +422,38 @@ public class PartitionedRegionClearDUnitTest implements Serializable {
         .isEqualTo(0);
   }
 
+  @Test
+  public void testClearCount() {
+    configureServers(false, true);
+    client1.invoke(this::initClientCache);
+    client2.invoke(this::initClientCache);
+
+    accessor.invoke(() -> putRecords(false, NUM_ENTRIES));
+    verifyServerRegionSize(NUM_ENTRIES);
+    dataStore1.invoke(() -> {
+      PartitionedRegion partitionedRegion = (PartitionedRegion) getRegion(false);
+      assertThat(partitionedRegion.getCachePerfStats().getClearCount()).isEqualTo(0L);
+    });
+    dataStore1.invoke(() -> getRegion(false).clear());
+    verifyServerRegionSize(0);
+    dataStore1.invoke(() -> {
+      PartitionedRegion partitionedRegion = (PartitionedRegion) getRegion(false);
+      assertThat(partitionedRegion.getCachePerfStats().getClearCount()).isEqualTo(1L);
+    });
+
+    verifyDatastoreStats(dataStore1, true);
+    verifyDatastoreStats(dataStore2, false);
+    verifyDatastoreStats(dataStore3, false);
+  }
+
+
   public static HashMap<String, AtomicInteger> clearsByRegion = new HashMap<>();
   public static HashMap<String, AtomicInteger> destroysByRegion = new HashMap<>();
 
-  private static class CountingCacheWriter extends CacheWriterAdapter {
+  private static class CountingCacheWriter extends CacheWriterAdapter<Object, Object> {
     @Override
-    public void beforeRegionClear(RegionEvent event) throws CacheWriterException {
-      Region region = event.getRegion();
+    public void beforeRegionClear(RegionEvent<Object, Object> event) throws CacheWriterException {
+      Region<Object, Object> region = event.getRegion();
       AtomicInteger clears = clearsByRegion.get(region.getName());
       if (clears == null) {
         clears = new AtomicInteger(1);
@@ -449,8 +466,8 @@ public class PartitionedRegionClearDUnitTest implements Serializable {
     }
 
     @Override
-    public void beforeRegionDestroy(RegionEvent event) throws CacheWriterException {
-      Region region = event.getRegion();
+    public void beforeRegionDestroy(RegionEvent<Object, Object> event) throws CacheWriterException {
+      Region<Object, Object> region = event.getRegion();
       AtomicInteger destroys = destroysByRegion.get(region.getName());
       if (destroys == null) {
         destroys = new AtomicInteger(1);
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionLocalMaxMemoryOffHeapDUnitTest.java b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionLocalMaxMemoryOffHeapDUnitTest.java
index ef1baa22b1..a1481eaa7a 100755
--- a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionLocalMaxMemoryOffHeapDUnitTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionLocalMaxMemoryOffHeapDUnitTest.java
@@ -61,7 +61,7 @@ public class PartitionedRegionLocalMaxMemoryOffHeapDUnitTest
       long recoveryDelay, EvictionAttributes evictionAttributes) {
     RegionAttributes<?, ?> regionAttributes = PartitionedRegionTestHelper.createRegionAttrsForPR(
         redundancy, localMaxMemory, recoveryDelay, evictionAttributes, null);
-    AttributesFactory attributesFactory = new AttributesFactory(regionAttributes);
+    AttributesFactory<?, ?> attributesFactory = new AttributesFactory<>(regionAttributes);
     attributesFactory.setOffHeap(true);
     return attributesFactory.create();
   }
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/cache/query/partitioned/PRQueryCacheClosedJUnitTest.java b/geode-core/src/integrationTest/java/org/apache/geode/cache/query/partitioned/PRQueryCacheClosedJUnitTest.java
index 018491f120..c777158916 100755
--- a/geode-core/src/integrationTest/java/org/apache/geode/cache/query/partitioned/PRQueryCacheClosedJUnitTest.java
+++ b/geode-core/src/integrationTest/java/org/apache/geode/cache/query/partitioned/PRQueryCacheClosedJUnitTest.java
@@ -85,7 +85,7 @@ public class PRQueryCacheClosedJUnitTest {
    *
    */
   @Test
-  public void testQueryOnSingleDataStoreWithCacheClose() throws Exception {
+  public void testQueryOnSingleDataStoreWithCacheClose() {
 
     logger.info(
         "PRQueryRegionDestroyedJUnitTest#testQueryOnSingleDataStoreWithCacheClose: Test Started  ");
@@ -93,10 +93,11 @@ public class PRQueryCacheClosedJUnitTest {
     logger.info(
         "PRQueryRegionDestroyedJUnitTest#testQueryOnSingleDataStoreWithCacheClose: creating PR Region ");
 
-    final Region region =
+    final Region<Integer, PortfolioData> region =
         PartitionedRegionTestHelper.createPartitionedRegion(regionName, localMaxMemory, redundancy);
 
-    final Region localRegion = PartitionedRegionTestHelper.createLocalRegion(localRegionName);
+    final Region<Integer, PortfolioData> localRegion =
+        PartitionedRegionTestHelper.createLocalRegion(localRegionName);
 
     final StringBuilder errorBuf = new StringBuilder();
 
@@ -131,9 +132,9 @@ public class PRQueryCacheClosedJUnitTest {
 
           try {
 
-            SelectResults resSetPR = region.query(s);
+            SelectResults<PortfolioData> resSetPR = region.query(s);
 
-            SelectResults resSetLocal = localRegion.query(s);
+            SelectResults<PortfolioData> resSetLocal = localRegion.query(s);
 
             String failureString =
                 PartitionedRegionTestHelper.compareResultSets(resSetPR, resSetLocal);
@@ -212,7 +213,6 @@ public class PRQueryCacheClosedJUnitTest {
       fail(
           "PRQueryCacheClosedJUnitTest#testQueryOnSingleDataStoreWithCacheClose: Test failed because of exception "
               + e);
-
     }
 
     logger.info("PRQueryCacheClosedJUnitTest#testQueryOnSingleDataStoreWithCacheClose: Test Ended");
@@ -223,7 +223,7 @@ public class PRQueryCacheClosedJUnitTest {
    * Populates the region with the Objects stores in the data Object array.
    *
    */
-  private void populateData(Region region, Object[] data) {
+  private void populateData(Region<Integer, PortfolioData> region, PortfolioData[] data) {
     logger.info("PRQueryCacheClosedJUnitTest#populateData: Populating Data in the PR Region ");
     for (int j = 0; j < data.length; j++) {
       region.put(j, data[j]);
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/cache/query/partitioned/PRQueryJUnitTest.java b/geode-core/src/integrationTest/java/org/apache/geode/cache/query/partitioned/PRQueryJUnitTest.java
index 4a2ee90c0f..00c78fddaa 100644
--- a/geode-core/src/integrationTest/java/org/apache/geode/cache/query/partitioned/PRQueryJUnitTest.java
+++ b/geode-core/src/integrationTest/java/org/apache/geode/cache/query/partitioned/PRQueryJUnitTest.java
@@ -25,16 +25,15 @@ import org.junit.Test;
 import org.junit.experimental.categories.Category;
 
 import org.apache.geode.LogWriter;
-import org.apache.geode.cache.Cache;
 import org.apache.geode.cache.Region;
-import org.apache.geode.cache.RegionShortcut;
-import org.apache.geode.cache.query.CacheUtils;
 import org.apache.geode.cache.query.Query;
 import org.apache.geode.cache.query.QueryService;
 import org.apache.geode.cache.query.SelectResults;
 import org.apache.geode.cache.query.data.PortfolioData;
 import org.apache.geode.internal.Assert;
+import org.apache.geode.internal.cache.InternalCache;
 import org.apache.geode.internal.cache.PartitionedRegionTestHelper;
+import org.apache.geode.pdx.PdxInstance;
 import org.apache.geode.test.junit.categories.OQLQueryTest;
 
 /**
@@ -44,15 +43,16 @@ import org.apache.geode.test.junit.categories.OQLQueryTest;
  */
 @Category({OQLQueryTest.class})
 public class PRQueryJUnitTest {
-  String regionName = "portfolios";
+  final String regionName = "portfolios";
 
   LogWriter logger = null;
 
   @Before
-  public void setUp() throws Exception {
+  public void setUp() {
     if (logger == null) {
       logger = PartitionedRegionTestHelper.getLogger();
     }
+
   }
 
   /**
@@ -63,7 +63,8 @@ public class PRQueryJUnitTest {
    */
   @Test
   public void testQueryOnSingleDataStore() throws Exception {
-    Region region = PartitionedRegionTestHelper.createPartitionedRegion(regionName, "100", 0);
+    Region<Integer, Object> region =
+        PartitionedRegionTestHelper.createPartitionedRegion(regionName, "100", 0);
     PortfolioData[] portfolios = new PortfolioData[100];
     for (int j = 0; j < 100; j++) {
       portfolios[j] = new PortfolioData(j);
@@ -72,7 +73,7 @@ public class PRQueryJUnitTest {
       populateData(region, portfolios);
 
       String queryString = "ID < 5";
-      SelectResults resSet = region.query(queryString);
+      SelectResults<PortfolioData> resSet = region.query(queryString);
       Assert.assertTrue(resSet.size() == 5);
 
       queryString = "ID > 5 and ID <=15";
@@ -85,24 +86,26 @@ public class PRQueryJUnitTest {
 
   @Test
   public void testQueryWithNullProjectionValue() throws Exception {
-    Region region = PartitionedRegionTestHelper.createPartitionedRegion(regionName, "100", 0);
+    Region<String, HashMap<String, String>> region =
+        PartitionedRegionTestHelper.createPartitionedRegion(regionName, "100", 0);
     int size = 10;
-    HashMap value = null;
+    HashMap<String, String> value;
     for (int j = 0; j < size; j++) {
-      value = new HashMap();
+      value = new HashMap<>();
       value.put("account" + j, "account" + j);
       region.put("" + j, value);
     }
 
     String queryString = "Select p.get('account') from " + SEPARATOR + region.getName() + " p ";
-    Query query = region.getCache().getQueryService().newQuery(queryString);
-    SelectResults sr = (SelectResults) query.execute();
+    Query query = PartitionedRegionTestHelper.getCache().getQueryService().newQuery(queryString);
+    SelectResults<HashMap<String, String>> sr =
+        (SelectResults<HashMap<String, String>>) query.execute();
     Assert.assertTrue(sr.size() == size);
 
     try {
       queryString = "Select p.get('acc') from " + SEPARATOR + region.getName() + " p ";
-      query = region.getCache().getQueryService().newQuery(queryString);
-      sr = (SelectResults) query.execute();
+      query = PartitionedRegionTestHelper.getCache().getQueryService().newQuery(queryString);
+      sr = (SelectResults<HashMap<String, String>>) query.execute();
       Assert.assertTrue(sr.size() == 10);
       for (Object r : sr.asList()) {
         if (r != null) {
@@ -116,7 +119,8 @@ public class PRQueryJUnitTest {
 
   @Test
   public void testOrderByQuery() throws Exception {
-    Region region = PartitionedRegionTestHelper.createPartitionedRegion(regionName, "100", 0);
+    Region<Integer, Object> region =
+        PartitionedRegionTestHelper.createPartitionedRegion(regionName, "100", 0);
     String[] values = new String[100];
     for (int j = 0; j < 100; j++) {
       values[j] = "" + j;
@@ -127,7 +131,7 @@ public class PRQueryJUnitTest {
 
       String queryString =
           "Select distinct p from " + SEPARATOR + region.getName() + " p order by p";
-      Query query = region.getCache().getQueryService().newQuery(queryString);
+      Query query = PartitionedRegionTestHelper.getCache().getQueryService().newQuery(queryString);
       SelectResults sr = (SelectResults) query.execute();
 
       Assert.assertTrue(sr.size() == 100);
@@ -138,9 +142,12 @@ public class PRQueryJUnitTest {
 
   @Test
   public void testNestedPRQuery() throws Exception {
-    Cache cache = CacheUtils.getCache();
-    QueryService queryService = CacheUtils.getCache().getQueryService();
-    Region region = cache.createRegionFactory(RegionShortcut.PARTITION).create("TEST_REGION");
+
+    Region<String, PdxInstance> region =
+        PartitionedRegionTestHelper.createPartitionedRegion("TEST_REGION");
+
+    InternalCache cache = PartitionedRegionTestHelper.getCache();
+    QueryService queryService = cache.getQueryService();
     Query query = queryService.newQuery(
         "SELECT distinct COUNT(*) FROM (SELECT DISTINCT tr.id, tr.domain FROM " + SEPARATOR
             + "TEST_REGION tr)");
@@ -178,7 +185,7 @@ public class PRQueryJUnitTest {
    * Populates the region with the Objects stores in the data Object array.
    *
    */
-  private void populateData(Region region, Object[] data) {
+  private void populateData(Region<Integer, Object> region, Object[] data) {
     for (int j = 0; j < data.length; j++) {
       region.put(j, data[j]);
     }
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/cache/query/partitioned/PRQueryRegionClosedJUnitTest.java b/geode-core/src/integrationTest/java/org/apache/geode/cache/query/partitioned/PRQueryRegionClosedJUnitTest.java
index 094aaa6c57..8fb0155608 100755
--- a/geode-core/src/integrationTest/java/org/apache/geode/cache/query/partitioned/PRQueryRegionClosedJUnitTest.java
+++ b/geode-core/src/integrationTest/java/org/apache/geode/cache/query/partitioned/PRQueryRegionClosedJUnitTest.java
@@ -55,8 +55,6 @@ public class PRQueryRegionClosedJUnitTest {
   boolean encounteredException = false;
   static final int delayQuery = 1000;
 
-
-
   @Before
   public void setUp() throws Exception {
     if (logger == null) {
@@ -75,16 +73,17 @@ public class PRQueryRegionClosedJUnitTest {
    *
    */
   @Test
-  public void testQueryingWithRegionClose() throws Exception {
+  public void testQueryingWithRegionClose() {
 
     logger.info("PRQueryRegionClosedJUnitTest#testQueryingWithRegionClose: Test Started  ");
 
     logger.info("PRQueryRegionClosedJUnitTest#testQueryingWithRegionClose: creating PR Region ");
 
-    final Region region =
+    final Region<Integer, PortfolioData> region =
         PartitionedRegionTestHelper.createPartitionedRegion(regionName, localMaxMemory, redundancy);
 
-    final Region localRegion = PartitionedRegionTestHelper.createLocalRegion(localRegionName);
+    final Region<Integer, PortfolioData> localRegion =
+        PartitionedRegionTestHelper.createLocalRegion(localRegionName);
 
     final StringBuilder errorBuf = new StringBuilder();
 
@@ -119,8 +118,8 @@ public class PRQueryRegionClosedJUnitTest {
 
           try {
 
-            SelectResults resSetPR = region.query(s);
-            SelectResults resSetLocal = localRegion.query(s);
+            SelectResults<PortfolioData> resSetPR = region.query(s);
+            SelectResults<PortfolioData> resSetLocal = localRegion.query(s);
             String failureString =
                 PartitionedRegionTestHelper.compareResultSets(resSetPR, resSetLocal);
             Thread.sleep(delayQuery);
@@ -155,7 +154,6 @@ public class PRQueryRegionClosedJUnitTest {
             StringWriter sw = new StringWriter();
             qe.printStackTrace(new PrintWriter(sw));
             errorBuf.append(sw);
-
           }
 
         }
@@ -215,7 +213,7 @@ public class PRQueryRegionClosedJUnitTest {
    * Populates the region with the Objects stores in the data Object array.
    *
    */
-  private void populateData(Region region, Object[] data) {
+  private void populateData(Region<Integer, PortfolioData> region, PortfolioData[] data) {
     logger.info("PRQueryRegionClosedJUnitTest#populateData: Populating Data in the PR Region ");
     for (int j = 0; j < data.length; j++) {
       region.put(j, data[j]);
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/cache/query/partitioned/PRQueryRegionDestroyedJUnitTest.java b/geode-core/src/integrationTest/java/org/apache/geode/cache/query/partitioned/PRQueryRegionDestroyedJUnitTest.java
index 0d0a7de252..683ae17e03 100755
--- a/geode-core/src/integrationTest/java/org/apache/geode/cache/query/partitioned/PRQueryRegionDestroyedJUnitTest.java
+++ b/geode-core/src/integrationTest/java/org/apache/geode/cache/query/partitioned/PRQueryRegionDestroyedJUnitTest.java
@@ -83,10 +83,11 @@ public class PRQueryRegionDestroyedJUnitTest {
 
     logger.info("PRQueryRegionDestroyedJUnitTest#testQueryOnSingleDataStore: creating PR Region ");
 
-    final Region region =
+    final Region<Integer, PortfolioData> region =
         PartitionedRegionTestHelper.createPartitionedRegion(regionName, localMaxMemory, redundancy);
 
-    final Region localRegion = PartitionedRegionTestHelper.createLocalRegion(localRegionName);
+    final Region<Integer, PortfolioData> localRegion =
+        PartitionedRegionTestHelper.createLocalRegion(localRegionName);
 
     final StringBuilder errorBuf = new StringBuilder();
 
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/internal/cache/ColocatedPRJUnitTest.java b/geode-core/src/integrationTest/java/org/apache/geode/internal/cache/ColocatedPRJUnitTest.java
index edf4ce94da..871249e252 100644
--- a/geode-core/src/integrationTest/java/org/apache/geode/internal/cache/ColocatedPRJUnitTest.java
+++ b/geode-core/src/integrationTest/java/org/apache/geode/internal/cache/ColocatedPRJUnitTest.java
@@ -31,13 +31,13 @@ public class ColocatedPRJUnitTest {
   @Test
   public void destroyColocatedPRCheckForLeak() {
     PartitionedRegion parent =
-        (PartitionedRegion) PartitionedRegionTestHelper.createPartionedRegion("PARENT");
+        (PartitionedRegion) PartitionedRegionTestHelper.createPartitionedRegion("PARENT");
     List<PartitionedRegion> colocatedList = parent.getColocatedByList();
     assertEquals(0, colocatedList.size());
     PartitionAttributes PRatts =
         new PartitionAttributesFactory().setColocatedWith(SEPARATOR + "PARENT").create();
     PartitionedRegion child =
-        (PartitionedRegion) PartitionedRegionTestHelper.createPartionedRegion("CHILD", PRatts);
+        (PartitionedRegion) PartitionedRegionTestHelper.createPartitionedRegion("CHILD", PRatts);
     assertTrue(colocatedList.contains(child));
     child.destroyRegion();
     assertFalse(colocatedList.contains(child));
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/internal/cache/PartitionedRegionCreationJUnitTest.java b/geode-core/src/integrationTest/java/org/apache/geode/internal/cache/PartitionedRegionCreationJUnitTest.java
index bc1428f5ea..d393bc1fed 100644
--- a/geode-core/src/integrationTest/java/org/apache/geode/internal/cache/PartitionedRegionCreationJUnitTest.java
+++ b/geode-core/src/integrationTest/java/org/apache/geode/internal/cache/PartitionedRegionCreationJUnitTest.java
@@ -274,7 +274,7 @@ public class PartitionedRegionCreationJUnitTest {
   @Test
   public void testPartionedRegionInitialization() throws RegionExistsException {
     String PRName = "testpartionedRegionInitialization";
-    PartitionedRegionTestHelper.createPartionedRegion(PRName);
+    PartitionedRegionTestHelper.createPartitionedRegion(PRName);
 
     Region root = (PartitionedRegionTestHelper
         .getExistingRegion(PartitionedRegionHelper.PR_ROOT_REGION_NAME));
@@ -371,7 +371,7 @@ public class PartitionedRegionCreationJUnitTest {
     public void run() {
       String prName = "PartitionedRegionCreationJUnitTest_" + getPRNumber();
       try {
-        Region region = PartitionedRegionTestHelper.createPartionedRegion(prName);
+        Region region = PartitionedRegionTestHelper.createPartitionedRegion(prName);
         PRRegionList.add(region);
         updatePRCreate();
       } catch (RegionExistsException rex) {
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/internal/cache/PartitionedRegionStatsJUnitTest.java b/geode-core/src/integrationTest/java/org/apache/geode/internal/cache/PartitionedRegionStatsJUnitTest.java
index 6b935d756a..e7da6b9736 100644
--- a/geode-core/src/integrationTest/java/org/apache/geode/internal/cache/PartitionedRegionStatsJUnitTest.java
+++ b/geode-core/src/integrationTest/java/org/apache/geode/internal/cache/PartitionedRegionStatsJUnitTest.java
@@ -15,14 +15,23 @@
 
 package org.apache.geode.internal.cache;
 
-import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
+import static org.apache.geode.internal.cache.PartitionedRegionStats.bucketClearsId;
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.anyLong;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
 import java.io.File;
 import java.io.IOException;
 import java.util.Random;
 import java.util.Set;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.stream.IntStream;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.logging.log4j.Logger;
@@ -35,10 +44,12 @@ import org.apache.geode.cache.Cache;
 import org.apache.geode.cache.DataPolicy;
 import org.apache.geode.cache.EvictionAction;
 import org.apache.geode.cache.EvictionAttributes;
+import org.apache.geode.cache.Operation;
 import org.apache.geode.cache.PartitionAttributesFactory;
 import org.apache.geode.cache.PartitionedRegionStorageException;
 import org.apache.geode.cache.RegionExistsException;
 import org.apache.geode.cache.RegionFactory;
+import org.apache.geode.internal.statistics.StatisticsClock;
 import org.apache.geode.logging.internal.log4j.api.LogService;
 
 /**
@@ -48,6 +59,7 @@ import org.apache.geode.logging.internal.log4j.api.LogService;
  */
 public class PartitionedRegionStatsJUnitTest {
   private static final File DISK_DIR = new File("PRStatsTest");
+  public static final int NUMBER_OF_BUCKETS = 13;
   Logger logger = null;
 
   @Before
@@ -61,12 +73,10 @@ public class PartitionedRegionStatsJUnitTest {
     FileUtils.deleteDirectory(DISK_DIR);
   }
 
-  private PartitionedRegion createPR(String name, int lmax) {
+  private PartitionedRegion createPRWithCache(String name, int lmax, Cache cache) {
     PartitionAttributesFactory<Object, Object> paf = new PartitionAttributesFactory<>();
-    paf.setLocalMaxMemory(lmax).setRedundantCopies(0).setTotalNumBuckets(13); // set low to
-                                                                              // reduce
-                                                                              // logging
-    Cache cache = PartitionedRegionTestHelper.createCache();
+    // set low to reduce logging
+    paf.setLocalMaxMemory(lmax).setRedundantCopies(0).setTotalNumBuckets(NUMBER_OF_BUCKETS);
     PartitionedRegion pr;
     try {
       RegionFactory<Object, Object> regionFactory = cache.createRegionFactory();
@@ -78,13 +88,21 @@ public class PartitionedRegionStatsJUnitTest {
     return pr;
   }
 
+  private PartitionedRegion createPR(String name, int lmax) {
+    PartitionAttributesFactory<Object, Object> paf = new PartitionAttributesFactory<>();
+    // set low to reduce logging
+    paf.setLocalMaxMemory(lmax).setRedundantCopies(0).setTotalNumBuckets(NUMBER_OF_BUCKETS);
+
+    Cache cache = PartitionedRegionTestHelper.createCache();
+    return createPRWithCache(name, lmax, cache);
+  }
+
   private PartitionedRegion createPRWithEviction(String name, int lmax,
       boolean diskSync,
       boolean persistent) {
     PartitionAttributesFactory<Object, Object> paf = new PartitionAttributesFactory<>();
-    paf.setLocalMaxMemory(lmax).setRedundantCopies(0).setTotalNumBuckets(13); // set low to
-                                                                              // reduce
-                                                                              // logging
+    paf.setLocalMaxMemory(lmax).setRedundantCopies(0).setTotalNumBuckets(NUMBER_OF_BUCKETS);
+
     Cache cache = PartitionedRegionTestHelper.createCache();
     RegionFactory<Object, Object> regionFactory = cache.createRegionFactory();
     regionFactory.setPartitionAttributes(paf.create());
@@ -485,4 +503,166 @@ public class PartitionedRegionStatsJUnitTest {
 
     return bytes;
   }
+
+  @Test
+  public void incBucketClearCountIncrementsClears() {
+    String regionName = "testStats";
+    int localMaxMemory = 100;
+    PartitionedRegion pr = createPR(regionName + 1, localMaxMemory);
+
+    final long startTime = pr.getPrStats().startBucketClear();
+    pr.getPrStats().endBucketClear(startTime);
+
+    assertThat(pr.getPrStats().getStats().getLong(bucketClearsId)).isEqualTo(1L);
+    assertThat(pr.getCachePerfStats().getClearCount()).isEqualTo(0L);
+  }
+
+  @Test
+  public void bucketClearsWrapsFromMaxLongToNegativeValue() {
+    String regionName = "testStats";
+    int localMaxMemory = 100;
+    PartitionedRegion pr = createPR(regionName + 1, localMaxMemory);
+    PartitionedRegionStats partitionedRegionStats = pr.getPrStats();
+    partitionedRegionStats.getStats().incLong(bucketClearsId, Long.MAX_VALUE);
+
+    final long startTime = 1L;
+    partitionedRegionStats.endBucketClear(startTime);
+    assertThat(partitionedRegionStats.getBucketClearCount()).isNegative();
+  }
+
+  @Test
+  public void testPartitionedRegionClearStats() {
+    String regionName = "testStats";
+    int localMaxMemory = 100;
+    PartitionedRegion pr = createPR(regionName + 1, localMaxMemory);
+
+    final int bucketMax = pr.getTotalNumberOfBuckets();
+    for (long i = 0L; i < 10000; i++) {
+      try {
+        pr.put(i, i);
+      } catch (PartitionedRegionStorageException ex) {
+        this.logger.warn(ex);
+      }
+    }
+
+    assertThat(pr.getPrStats().getTotalBucketCount()).isEqualTo(bucketMax);
+    assertThat(pr.size()).isEqualTo(10000);
+    pr.clear();
+    assertThat(pr.size()).isEqualTo(0);
+    assertThat(pr.getPrStats().getStats().getLong(bucketClearsId)).isEqualTo(bucketMax);
+  }
+
+  @Test
+  public void testBasicPartitionedRegionClearTimeStat() {
+    String regionName = "testStats";
+    int localMaxMemory = 100;
+    PartitionedRegion pr = createPR(regionName + 1, localMaxMemory);
+    assertThat(pr.getPrStats().getBucketClearTime()).isEqualTo(0L);
+
+    long startTime = pr.getPrStats().startBucketClear();
+    startTime -= 137L;
+    pr.getPrStats().endBucketClear(startTime);
+    assertThat(pr.getPrStats().getBucketClearTime()).isGreaterThanOrEqualTo(137L);
+  }
+
+  private void putRecords(PartitionedRegion pr) {
+    IntStream.range(0, 1000).forEach(i -> pr.put(i, i));
+  }
+
+
+  @Test
+  public void testFullPartitionedRegionClearTimeStat() {
+    String regionName = "testStats";
+    final int localMaxMemory = 700;
+    final int LOTS_OF_RECORDS = 1000;
+    AtomicLong fakeTime = new AtomicLong(System.nanoTime());
+
+    // If one optimizes the code and converts to a lambda spy will fail
+    @SuppressWarnings({"Anonymous2MethodRef", "Convert2Lambda"})
+    StatisticsClock statisticsClock = spy(new StatisticsClock() {
+      @Override
+      public long getTime() {
+        return fakeTime.getAndIncrement();
+      }
+    });
+    InternalCache cache = PartitionedRegionTestHelper.createCache();
+    when(cache.getStatisticsClock()).thenReturn(statisticsClock);
+    PartitionedRegion pr = spy(createPR(regionName + 1, localMaxMemory));
+    when(pr.getStatisticsClock()).thenReturn(statisticsClock);
+
+    putRecords(pr);
+
+    assertThat(pr.size()).isEqualTo(LOTS_OF_RECORDS);
+
+    assertThat(pr.getPrStats().getBucketClearCount()).isEqualTo(0L);
+
+    assertThat(pr.getPrStats().getBucketClearTime()).isEqualTo(0L);
+
+
+    pr.clear();
+
+    // We know the clock should be called 7189 times if everything is working as expected
+    verify(statisticsClock, times(7189)).getTime();
+
+    assertThat(pr.getPrStats().getBucketClearCount()).isGreaterThan(0L);
+    assertThat(pr.getPrStats().getBucketClearTime())
+        .describedAs(
+            "Bucket Clear Time should be the number of buckets "
+                + "because of the fake clock that just increments")
+        .isEqualTo(NUMBER_OF_BUCKETS);
+  }
+
+  @Test
+  public void testBasicPartitionedRegionClearsInProgressStat() {
+    String regionName = "testStats";
+    int localMaxMemory = 100;
+    PartitionedRegion pr = createPR(regionName + 1, localMaxMemory);
+    assertThat(pr.getPrStats().getBucketClearsInProgress()).isEqualTo(0L);
+
+    final long startTime = pr.getPrStats().startBucketClear();
+    assertThat(pr.getPrStats().getBucketClearsInProgress()).isEqualTo(1L);
+    pr.getPrStats().endBucketClear(startTime);
+    assertThat(pr.getPrStats().getBucketClearsInProgress()).isEqualTo(0L);
+  }
+
+  @Test
+  public void testFullPartitionedRegionClearsInProgressStat() {
+    String regionName = "testStats";
+    int localMaxMemory = 100;
+    PartitionedRegion pr = spy(createPR(regionName + 1, localMaxMemory));
+    for (long i = 0L; i < 100; i++) {
+      try {
+        pr.put(i, i);
+      } catch (PartitionedRegionStorageException ex) {
+        this.logger.warn(ex);
+      }
+    }
+    PartitionedRegionStats partitionedRegionStats = spy(pr.getPrStats());
+    when(pr.getPrStats()).thenReturn(partitionedRegionStats);
+
+    BucketRegion actualBucketRegion = pr.getBucketRegion(0L);
+    assertThat((Object) actualBucketRegion).isNotNull();
+    InternalRegionArguments arguments = mock(InternalRegionArguments.class);
+    when(arguments.getPartitionedRegion()).thenReturn(pr);
+    when(arguments.getBucketAdvisor()).thenReturn(actualBucketRegion.getBucketAdvisor());
+    when(arguments.getPartitionedRegionBucketRedundancy())
+        .thenReturn(actualBucketRegion.getRedundancyLevel());
+    when(arguments.isUsedForPartitionedRegionBucket()).thenReturn(true);
+
+    BucketRegion bucketRegion =
+        new BucketRegion(pr.getName(), pr.getBucketRegion(0L).getAttributes(), pr.getRoot(),
+            PartitionedRegionTestHelper.getCache(), arguments,
+            pr.getStatisticsClock());
+    bucketRegion = spy(bucketRegion);
+
+
+    assertThat(pr.size()).isEqualTo(100);
+    RegionEventImpl event = new RegionEventImpl(bucketRegion, Operation.REGION_CLEAR, null,
+        false, bucketRegion.getMyId(), bucketRegion.generateEventID());
+    bucketRegion.basicClear(event);
+    assertThat(bucketRegion.getPartitionedRegion().getPrStats().getBucketClearCount())
+        .isEqualTo(1L);
+    verify(partitionedRegionStats, times(1)).startBucketClear();
+    verify(partitionedRegionStats, times(1)).endBucketClear(anyLong());
+  }
 }
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/AbstractRegion.java b/geode-core/src/main/java/org/apache/geode/internal/cache/AbstractRegion.java
index 77b708339b..150232d636 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/AbstractRegion.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/AbstractRegion.java
@@ -505,6 +505,8 @@ public abstract class AbstractRegion implements InternalRegion, AttributesMutato
     checkForLimitedOrNoAccess();
     RegionEventImpl regionEvent = new RegionEventImpl(this, Operation.REGION_CLEAR, null, false,
         getMyId(), generateEventID());
+
+
     basicClear(regionEvent);
   }
 
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/AbstractRegionMap.java b/geode-core/src/main/java/org/apache/geode/internal/cache/AbstractRegionMap.java
index f0f533df50..06c6724ff7 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/AbstractRegionMap.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/AbstractRegionMap.java
@@ -14,6 +14,7 @@
  */
 package org.apache.geode.internal.cache;
 
+
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -318,20 +319,6 @@ public abstract class AbstractRegionMap extends BaseRegionMap
     }
   }
 
-  void incClearCount(LocalRegion lr) {
-    if (lr != null && !(lr instanceof HARegion)) {
-      CachePerfStats stats = lr.getCachePerfStats();
-      if (stats != null) {
-        if (lr.isUsedForPartitionedRegionBucket()) {
-          stats.incBucketClearCount();
-        } else {
-          stats.incRegionClearCount();
-        }
-
-      }
-    }
-  }
-
   private void _mapClear() {
     Executor executor = null;
     InternalCache cache = owner.getCache();
@@ -366,89 +353,95 @@ public abstract class AbstractRegionMap extends BaseRegionMap
     if (logger.isDebugEnabled()) {
       logger.debug("Clearing entries for {} rvv={}", _getOwner(), rvv);
     }
-    LocalRegion lr = _getOwner();
+    final LocalRegion lr = _getOwner();
     RegionVersionVector localRvv = lr.getVersionVector();
-    incClearCount(lr);
-    // lock for size calcs if the region might have tombstones
-    synchronized (lr.getSizeGuard()) {
-      if (rvv == null) {
-        int delta = 0;
-        try {
-          delta = sizeInVM(); // TODO soplog need to determine if stats should
-                              // reflect only size in memory or the complete thing
-        } catch (GemFireIOException e) {
-          // ignore rather than throwing an exception during cache close
-        }
-        int tombstones = lr.getTombstoneCount();
-        _mapClear();
-        _getOwner().updateSizeOnClearRegion(delta - tombstones);
-        _getOwner().incTombstoneCount(-tombstones);
-        if (delta != 0) {
-          incEntryCount(-delta);
-        }
-      } else {
-        int delta = 0;
-        int tombstones = 0;
-        VersionSource myId = _getOwner().getVersionMember();
-        if (localRvv != rvv) {
-          localRvv.recordGCVersions(rvv);
-        }
-        final boolean isTraceEnabled = logger.isTraceEnabled();
-        for (RegionEntry re : regionEntries()) {
-          synchronized (re) {
-            Token value = re.getValueAsToken();
-            // if it's already being removed or the entry is being created we leave it alone
-            if (value == Token.REMOVED_PHASE1 || value == Token.REMOVED_PHASE2) {
-              continue;
-            }
 
-            VersionSource id = re.getVersionStamp().getMemberID();
-            if (id == null) {
-              id = myId;
-            }
-            if (rvv.contains(id, re.getVersionStamp().getRegionVersion())) {
-              if (isTraceEnabled) {
-                logger.trace("region clear op is removing {} {}", re.getKey(),
-                    re.getVersionStamp());
+    final long startTime = lr.startClear();
+
+    try {
+      // lock for size calcs if the region might have tombstones
+      synchronized (lr.getSizeGuard()) {
+        if (rvv == null) {
+          int delta = 0;
+          try {
+            delta = sizeInVM(); // TODO soplog need to determine if stats should
+            // reflect only size in memory or the complete thing
+          } catch (GemFireIOException e) {
+            // ignore rather than throwing an exception during cache close
+          }
+          int tombstones = lr.getTombstoneCount();
+          _mapClear();
+          _getOwner().updateSizeOnClearRegion(delta - tombstones);
+          _getOwner().incTombstoneCount(-tombstones);
+          if (delta != 0) {
+            incEntryCount(-delta);
+          }
+        } else {
+          int delta = 0;
+          int tombstones = 0;
+          VersionSource myId = _getOwner().getVersionMember();
+          if (localRvv != rvv) {
+            localRvv.recordGCVersions(rvv);
+          }
+          final boolean isTraceEnabled = logger.isTraceEnabled();
+          for (RegionEntry re : regionEntries()) {
+            synchronized (re) {
+              Token value = re.getValueAsToken();
+              // if it's already being removed or the entry is being created we leave it alone
+              if (value == Token.REMOVED_PHASE1 || value == Token.REMOVED_PHASE2) {
+                continue;
               }
 
-              boolean tombstone = re.isTombstone();
-              // note: it.remove() did not reliably remove the entry so we use remove(K,V) here
-              if (getEntryMap().remove(re.getKey(), re)) {
-                if (OffHeapClearRequired.doesClearNeedToCheckForOffHeap()) {
-                  GatewaySenderEventImpl.release(re.getValue()); // OFFHEAP _getValue ok
-                }
-                // If this is an overflow only region, we need to free the entry on
-                // disk at this point.
-                try {
-                  re.removePhase1(lr, true);
-                } catch (RegionClearedException e) {
-                  // do nothing, it's already cleared.
+              VersionSource id = re.getVersionStamp().getMemberID();
+              if (id == null) {
+                id = myId;
+              }
+              if (rvv.contains(id, re.getVersionStamp().getRegionVersion())) {
+                if (isTraceEnabled) {
+                  logger.trace("region clear op is removing {} {}", re.getKey(),
+                      re.getVersionStamp());
                 }
-                re.removePhase2();
-                lruEntryDestroy(re);
-                if (tombstone) {
-                  _getOwner().incTombstoneCount(-1);
-                  tombstones += 1;
-                } else {
-                  delta += 1;
+
+                boolean tombstone = re.isTombstone();
+                // note: it.remove() did not reliably remove the entry so we use remove(K,V) here
+                if (getEntryMap().remove(re.getKey(), re)) {
+                  if (OffHeapClearRequired.doesClearNeedToCheckForOffHeap()) {
+                    GatewaySenderEventImpl.release(re.getValue()); // OFFHEAP _getValue ok
+                  }
+                  // If this is an overflow only region, we need to free the entry on
+                  // disk at this point.
+                  try {
+                    re.removePhase1(lr, true);
+                  } catch (RegionClearedException e) {
+                    // do nothing, it's already cleared.
+                  }
+                  re.removePhase2();
+                  lruEntryDestroy(re);
+                  if (tombstone) {
+                    _getOwner().incTombstoneCount(-1);
+                    tombstones += 1;
+                  } else {
+                    delta += 1;
+                  }
                 }
+              } else { // rvv does not contain this entry so it is retained
+                result.add(id);
               }
-            } else { // rvv does not contain this entry so it is retained
-              result.add(id);
             }
           }
-        }
-        _getOwner().updateSizeOnClearRegion(delta);
-        incEntryCount(-delta);
-        incEntryCount(-tombstones);
-        if (logger.isDebugEnabled()) {
-          logger.debug("Size after clearing = {}", getEntryMap().size());
-        }
-        if (isTraceEnabled && getEntryMap().size() < 20) {
-          _getOwner().dumpBackingMap();
+          _getOwner().updateSizeOnClearRegion(delta);
+          incEntryCount(-delta);
+          incEntryCount(-tombstones);
+          if (logger.isDebugEnabled()) {
+            logger.debug("Size after clearing = {}", getEntryMap().size());
+          }
+          if (isTraceEnabled && getEntryMap().size() < 20) {
+            _getOwner().dumpBackingMap();
+          }
         }
       }
+    } finally {
+      lr.endClear(startTime);
     }
     return result;
   }
@@ -676,7 +669,7 @@ public abstract class AbstractRegionMap extends BaseRegionMap
         }
         // incEntryCount is called for a tombstone because scheduleTombstone does entryCount--.
         incEntryCount(1); // we are creating an entry that was recovered from disk including
-                          // tombstone
+        // tombstone
       }
       lruEntryUpdate(newRe);
       needsCallback = true;
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/BucketRegion.java b/geode-core/src/main/java/org/apache/geode/internal/cache/BucketRegion.java
index 20ed54656f..4a55dfa01a 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/BucketRegion.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/BucketRegion.java
@@ -588,8 +588,8 @@ public class BucketRegion extends DistributedRegion implements Bucket {
     // get rvvLock
     Set<InternalDistributedMember> participants =
         getCacheDistributionAdvisor().adviseInvalidateRegion();
-
     try {
+
       obtainWriteLocksForClear(regionEvent, participants);
       // no need to dominate my own rvv.
       // Clear is on going here, there won't be GII for this member
@@ -2131,13 +2131,6 @@ public class BucketRegion extends DistributedRegion implements Bucket {
 
   @Override
   void updateSizeOnClearRegion(int sizeBeforeClear) {
-    // This method is only called when the bucket is destroyed. If we
-    // start supporting clear of partitioned regions, this logic needs to change
-    // we can't just set these counters to zero, because there could be
-    // concurrent operations that are also updating these stats. For example,
-    // a destroy could have already been applied to the map, and then updates
-    // the stat after we reset it, making the state negative.
-
     final PartitionedRegionDataStore prDs = partitionedRegion.getDataStore();
     long oldMemValue;
 
@@ -2589,4 +2582,19 @@ public class BucketRegion extends DistributedRegion implements Bucket {
     basicClear(regionEvent, false);
   }
 
+  @Override
+  public long startClear() {
+    return getPartitionedRegion().getPrStats().startBucketClear();
+  }
+
+  @Override
+  public void endClear(long startTime) {
+    getPartitionedRegion().getPrStats().endBucketClear(startTime);
+  }
+
+  @Override
+  public void clear() {
+    throw new UnsupportedOperationException("BucketRegion.clear should never be called");
+  }
+
 }
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/CachePerfStats.java b/geode-core/src/main/java/org/apache/geode/internal/cache/CachePerfStats.java
index 6f18b5540c..5a92124f00 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/CachePerfStats.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/CachePerfStats.java
@@ -118,11 +118,9 @@ public class CachePerfStats {
   static final int indexUpdateInProgressId;
   static final int indexUpdateCompletedId;
   static final int indexUpdateTimeId;
-  static final int bucketClearsId;
-  static final int regionClearsId;
-  static final int partitionedRegionClearLocalDurationId;
-  static final int partitionedRegionClearTotalDurationId;
-
+  static final int clearsId;
+  static final int clearTimeId;
+  static final int clearsInProgressId;
   private static final int indexInitializationInProgressId;
   private static final int indexInitializationCompletedId;
   private static final int indexInitializationTimeId;
@@ -292,14 +290,12 @@ public class CachePerfStats {
         "Current number of regions configured for reliablity that are missing required roles with Limited access";
     final String reliableRegionsMissingNoAccessDesc =
         "Current number of regions configured for reliablity that are missing required roles with No access";
-    final String regionClearsDesc =
+    final String clearsDesc =
         "The total number of times a clear has been done on this cache.";
-    final String bucketClearsDesc =
-        "The total number of times a clear has been done on this region and it's bucket regions";
-    final String partitionedRegionClearLocalDurationDesc =
-        "The time in nanoseconds partitioned region clear has been running for the region on this member";
-    final String partitionedRegionClearTotalDurationDesc =
-        "The time in nanoseconds partitioned region clear has been running for the region with this member as coordinator.";
+    final String clearTimeDesc =
+        "The total time spent performing clears in nanoseconds.";
+    final String clearsInProgressDesc =
+        "The number of clears currently in progress.";
     final String metaDataRefreshCountDesc =
         "Total number of times the meta data is refreshed due to hopping observed.";
     final String conflatedEventsDesc =
@@ -481,13 +477,10 @@ public class CachePerfStats {
             f.createLongCounter("retries",
                 "Number of times a concurrent destroy followed by a create has caused an entry operation to need to retry.",
                 "operations"),
-            f.createLongCounter("regionClears", regionClearsDesc, "operations"),
-            f.createLongCounter("bucketClears", bucketClearsDesc, "operations"),
-            f.createLongCounter("partitionedRegionClearLocalDuration",
-                partitionedRegionClearLocalDurationDesc, "nanoseconds"),
-            f.createLongCounter("partitionedRegionClearTotalDuration",
-                partitionedRegionClearTotalDurationDesc, "nanoseconds"),
-            f.createLongGauge("diskTasksWaiting",
+            f.createLongCounter("clears", clearsDesc, "operations"),
+            f.createLongGauge("clearsInProgress", clearsInProgressDesc, "operations"),
+            f.createLongCounter("clearTime", clearTimeDesc, "nanoseconds"),
+            f.createIntGauge("diskTasksWaiting",
                 "Current number of disk tasks (oplog compactions, asynchronous recoveries, etc) that are waiting for a thread to run the operation",
                 "operations"),
             f.createLongCounter("conflatedEvents", conflatedEventsDesc, "operations"),
@@ -630,11 +623,9 @@ public class CachePerfStats {
     eventsQueuedId = type.nameToId("eventsQueued");
 
     retriesId = type.nameToId("retries");
-    regionClearsId = type.nameToId("regionClears");
-    bucketClearsId = type.nameToId("bucketClears");
-    partitionedRegionClearLocalDurationId = type.nameToId("partitionedRegionClearLocalDuration");
-    partitionedRegionClearTotalDurationId = type.nameToId("partitionedRegionClearTotalDuration");
-
+    clearsId = type.nameToId("clears");
+    clearTimeId = type.nameToId("clearTime");
+    clearsInProgressId = type.nameToId("clearsInProgress");
     diskTasksWaitingId = type.nameToId("diskTasksWaiting");
     evictorJobsStartedId = type.nameToId("evictorJobsStarted");
     evictorJobsCompletedId = type.nameToId("evictorJobsCompleted");
@@ -1423,36 +1414,32 @@ public class CachePerfStats {
     };
   }
 
-  public long getRegionClearCount() {
-    return stats.getLong(regionClearsId);
-  }
-
-  public long getBucketClearCount() {
-    return stats.getLong(bucketClearsId);
-  }
-
-  public long getPartitionedRegionClearLocalDuration() {
-    return stats.getLong(partitionedRegionClearLocalDurationId);
+  public long getClearCount() {
+    return stats.getLong(clearsId);
   }
 
-  public long getPartitionedRegionClearTotalDuration() {
-    return stats.getLong(partitionedRegionClearTotalDurationId);
-  }
-
-  public void incRegionClearCount() {
-    stats.incLong(regionClearsId, 1L);
+  public long startClear() {
+    stats.incLong(clearsInProgressId, 1L);
+    return getTime();
   }
 
-  public void incBucketClearCount() {
-    stats.incLong(bucketClearsId, 1L);
+  public long endClear(long startTime) {
+    long timeTaken = 0L;
+    if (clock.isEnabled()) {
+      timeTaken = getTime() - startTime;
+      stats.incLong(clearTimeId, timeTaken);
+    }
+    stats.incLong(clearsInProgressId, -1L);
+    stats.incLong(clearsId, 1L);
+    return timeTaken;
   }
 
-  public void incPartitionedRegionClearLocalDuration(long durationNanos) {
-    stats.incLong(partitionedRegionClearLocalDurationId, durationNanos);
+  public long getClearTime() {
+    return stats.getLong(clearTimeId);
   }
 
-  public void incPartitionedRegionClearTotalDuration(long durationNanos) {
-    stats.incLong(partitionedRegionClearTotalDurationId, durationNanos);
+  public long getClearsInProgress() {
+    return stats.getLong(clearsInProgressId);
   }
 
   public long getConflatedEventsCount() {
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/DummyCachePerfStats.java b/geode-core/src/main/java/org/apache/geode/internal/cache/DummyCachePerfStats.java
index 1e3d30b150..3b6a7bb5c4 100755
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/DummyCachePerfStats.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/DummyCachePerfStats.java
@@ -374,4 +374,14 @@ public class DummyCachePerfStats extends CachePerfStats {
     };
   }
 
+  @Override
+  public long startClear() {
+    return 0L;
+  }
+
+  @Override
+  public long endClear(long startTime) {
+    return 0L;
+  }
+
 }
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/GemFireCacheImpl.java b/geode-core/src/main/java/org/apache/geode/internal/cache/GemFireCacheImpl.java
index e385581fbf..ddd6958030 100755
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/GemFireCacheImpl.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/GemFireCacheImpl.java
@@ -1006,9 +1006,9 @@ public class GemFireCacheImpl implements InternalCache, InternalClientCache, Has
       // Create the CacheStatistics
       statisticsClock = StatisticsClockFactory.clock(system.getConfig().getEnableTimeStatistics());
       cachePerfStats = cachePerfStatsFactory.create(
-          internalDistributedSystem.getStatisticsManager(), statisticsClock);
+          internalDistributedSystem.getStatisticsManager(), getStatisticsClock());
 
-      transactionManager = txManagerImplFactory.create(cachePerfStats, this, statisticsClock);
+      transactionManager = txManagerImplFactory.create(cachePerfStats, this, getStatisticsClock());
       dm.addMembershipListener(transactionManager);
 
       creationDate = new Date();
@@ -2097,7 +2097,7 @@ public class GemFireCacheImpl implements InternalCache, InternalClientCache, Has
     synchronized (heapEvictorLock) {
       stopper.checkCancelInProgress(null);
       if (heapEvictor == null) {
-        heapEvictor = heapEvictorFactory.create(this, statisticsClock);
+        heapEvictor = heapEvictorFactory.create(this, getStatisticsClock());
       }
       return heapEvictor;
     }
@@ -2109,7 +2109,7 @@ public class GemFireCacheImpl implements InternalCache, InternalClientCache, Has
     synchronized (offHeapEvictorLock) {
       stopper.checkCancelInProgress(null);
       if (offHeapEvictor == null) {
-        offHeapEvictor = new OffHeapEvictor(this, statisticsClock);
+        offHeapEvictor = new OffHeapEvictor(this, getStatisticsClock());
       }
       return offHeapEvictor;
     }
@@ -3052,7 +3052,7 @@ public class GemFireCacheImpl implements InternalCache, InternalClientCache, Has
               region = internalRegionArgs.getInternalMetaRegion();
             } else if (isPartitionedRegion) {
               region = new PartitionedRegion(name, attrs, null, this, internalRegionArgs,
-                  statisticsClock, ColocationLoggerFactory.create());
+                  getStatisticsClock(), ColocationLoggerFactory.create());
             } else {
               // Abstract region depends on the default pool existing so lazily initialize it
               // if necessary.
@@ -3061,10 +3061,11 @@ public class GemFireCacheImpl implements InternalCache, InternalClientCache, Has
               }
               if (attrs.getScope().isLocal()) {
                 region =
-                    new LocalRegion(name, attrs, null, this, internalRegionArgs, statisticsClock);
+                    new LocalRegion(name, attrs, null, this, internalRegionArgs,
+                        getStatisticsClock());
               } else {
                 region = new DistributedRegion(name, attrs, null, this, internalRegionArgs,
-                    statisticsClock);
+                    getStatisticsClock());
               }
             }
 
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/LocalRegion.java b/geode-core/src/main/java/org/apache/geode/internal/cache/LocalRegion.java
index 643c3605d7..fdad0225b7 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/LocalRegion.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/LocalRegion.java
@@ -8487,7 +8487,6 @@ public class LocalRegion extends AbstractRegion implements LoaderHelperFactory,
 
     RegionEventImpl event = new ClientRegionEventImpl(this, Operation.REGION_CLEAR, callbackArg,
         false, client.getDistributedMember(), client, eventId);
-
     basicClear(event, true);
   }
 
@@ -8681,7 +8680,12 @@ public class LocalRegion extends AbstractRegion implements LoaderHelperFactory,
   @Override
   void basicLocalClear(RegionEventImpl rEvent) {
     getDataView().checkSupportsRegionClear();
-    cmnClearRegion(rEvent, false/* cacheWrite */, false/* useRVV */);
+    final long startTime = startClear();
+    try {
+      cmnClearRegion(rEvent, false/* cacheWrite */, false/* useRVV */);
+    } finally {
+      endClear(startTime);
+    }
   }
 
   @Override
@@ -10926,6 +10930,15 @@ public class LocalRegion extends AbstractRegion implements LoaderHelperFactory,
     }
   }
 
+  public long startClear() {
+    return getCachePerfStats().startClear();
+  }
+
+  public void endClear(long startTime) {
+    getCachePerfStats().endClear(startTime);
+  }
+
+
   @Override
   public long getVersionForMember(VersionSource member) {
     throw new IllegalStateException("Operation only implemented for disk region");
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegion.java b/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegion.java
index 8419dc5969..e01325e5b8 100755
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegion.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegion.java
@@ -572,13 +572,6 @@ public class PartitionedRegion extends LocalRegion
     return partitionListeners;
   }
 
-  public CachePerfStats getRegionCachePerfStats() {
-    if (dataStore != null && dataStore.getAllLocalBucketRegions().size() > 0) {
-      BucketRegion bucket = dataStore.getAllLocalBucketRegions().iterator().next();
-      return bucket.getCachePerfStats();
-    }
-    return null;
-  }
 
   /**
    * Return canonical representation for a bucket (for logging)
@@ -8122,6 +8115,11 @@ public class PartitionedRegion extends LocalRegion
       maxTimeInRetry = maxTime;
     }
 
+    public RetryTimeKeeper(long maxTime) {
+      this.maxTimeInRetry = maxTime;
+    }
+
+
     /**
      * wait for {@link PartitionedRegionHelper#DEFAULT_WAIT_PER_RETRY_ITERATION}, updating the total
      * wait time. Use this method when the same node has been selected for consecutive attempts with
@@ -10184,11 +10182,26 @@ public class PartitionedRegion extends LocalRegion
     return partitionedRegionClear;
   }
 
+  @Override
+  public void endClear(long startTime) {
+    getCachePerfStats().endClear(startTime);
+  }
+
+  @Override
+  public long startClear() {
+    return getCachePerfStats().startClear();
+  }
+
   @Override
   void cmnClearRegion(RegionEventImpl regionEvent, boolean cacheWrite, boolean useRVV) {
     // Synchronized to avoid other threads invoking clear on this vm/node.
-    synchronized (clearLock) {
-      partitionedRegionClear.doClear(regionEvent, cacheWrite);
+    final long startTime = startClear();
+    try {
+      synchronized (clearLock) {
+        partitionedRegionClear.doClear(regionEvent, cacheWrite);
+      }
+    } finally {
+      endClear(startTime);
     }
   }
 
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionClear.java b/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionClear.java
index 8403306a4d..cd9cef26f4 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionClear.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionClear.java
@@ -19,6 +19,7 @@ import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
+import java.util.concurrent.TimeUnit;
 
 import org.apache.logging.log4j.Logger;
 
@@ -46,9 +47,7 @@ public class PartitionedRegionClear {
   private static final Logger logger = LogService.getLogger();
 
   protected static final String CLEAR_OPERATION = "_clearOperation";
-
-  private final int retryTime = 2 * 60 * 1000;
-
+  private static final long RETRY_TIME = TimeUnit.MINUTES.toMillis(2);
   private final PartitionedRegion partitionedRegion;
 
   private final DistributedLockService distributedLockService;
@@ -194,7 +193,7 @@ public class PartitionedRegionClear {
    */
   public Set<Integer> clearRegionLocal(RegionEventImpl regionEvent) {
     Set<Integer> clearedBuckets = new HashSet<>();
-    long clearStartTime = System.nanoTime();
+
     setMembershipChange(false);
     // Synchronized to handle the requester departure.
     synchronized (lockForListenerAndClientNotification) {
@@ -203,7 +202,7 @@ public class PartitionedRegionClear {
         try {
           boolean retry;
           do {
-            waitForPrimary(new PartitionedRegion.RetryTimeKeeper(retryTime));
+            waitForPrimary(new PartitionedRegion.RetryTimeKeeper(RETRY_TIME));
             RegionEventImpl bucketRegionEvent;
             for (BucketRegion localPrimaryBucketRegion : partitionedRegion.getDataStore()
                 .getAllLocalPrimaryBucketRegions()) {
@@ -228,11 +227,7 @@ public class PartitionedRegionClear {
           doAfterClear(regionEvent);
         } finally {
           partitionedRegion.getDataStore().unlockBucketCreationForRegionClear();
-          if (clearedBuckets.size() != 0 && partitionedRegion.getCachePerfStats() != null) {
-            partitionedRegion.getRegionCachePerfStats().incRegionClearCount();
-            partitionedRegion.getRegionCachePerfStats()
-                .incPartitionedRegionClearLocalDuration(System.nanoTime() - clearStartTime);
-          }
+
         }
       } else {
         // Non data-store with client queue and listener
@@ -435,14 +430,12 @@ public class PartitionedRegionClear {
 
   void doClear(RegionEventImpl regionEvent, boolean cacheWrite) {
     String lockName = CLEAR_OPERATION + partitionedRegion.getName();
-    long clearStartTime = 0;
 
     allServerVersionsSupportPartitionRegionClear();
 
     try {
       // distributed lock to make sure only one clear op is in progress in the cluster.
       acquireDistributedClearLock(lockName);
-      clearStartTime = System.nanoTime();
 
       // Force all primary buckets to be created before clear.
       assignAllPrimaryBuckets();
@@ -483,11 +476,6 @@ public class PartitionedRegionClear {
       }
     } finally {
       releaseDistributedClearLock(lockName);
-      CachePerfStats stats = partitionedRegion.getRegionCachePerfStats();
-      if (stats != null) {
-        partitionedRegion.getRegionCachePerfStats()
-            .incPartitionedRegionClearTotalDuration(System.nanoTime() - clearStartTime);
-      }
     }
   }
 
@@ -514,7 +502,7 @@ public class PartitionedRegionClear {
     }
   }
 
-  class LockForListenerAndClientNotification {
+  static class LockForListenerAndClientNotification {
 
     private boolean locked = false;
 
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionStats.java b/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionStats.java
index 8e2cf51006..3affce5d5b 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionStats.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionStats.java
@@ -176,8 +176,17 @@ public class PartitionedRegionStats {
   private static final int prMetaDataSentCountId;
 
   private static final int localMaxMemoryId;
+  static final int bucketClearsId;
+  static final int bucketClearTimeId;
+  static final int bucketClearsInProgressId;
 
   static {
+    final String bucketClearsDesc =
+        "The total number of times a bucket of this partitioned region has been cleared";
+    final String bucketClearTimeDesc =
+        "The total amount of time, in nanoseconds, spent clearing buckets on this partitioned region";
+    final String bucketClearsInProgressDesc =
+        "The current number bucket clears on this partitioned region that are in progress";
 
     StatisticsTypeFactory f = StatisticsTypeFactoryImpl.singleton();
     type = f.createType("PartitionedRegionStats",
@@ -426,6 +435,9 @@ public class PartitionedRegionStats {
 
             f.createLongGauge("localMaxMemory",
                 "local max memory in bytes for this region on this member", "bytes"),
+            f.createLongCounter("bucketClears", bucketClearsDesc, "operations"),
+            f.createLongCounter("bucketClearTime", bucketClearTimeDesc, "nanoseconds"),
+            f.createLongCounter("bucketClearsInProgress", bucketClearsInProgressDesc, "operations")
         });
 
     bucketCountId = type.nameToId("bucketCount");
@@ -530,6 +542,10 @@ public class PartitionedRegionStats {
     prMetaDataSentCountId = type.nameToId("prMetaDataSentCount");
 
     localMaxMemoryId = type.nameToId("localMaxMemory");
+
+    bucketClearsId = type.nameToId("bucketClears");
+    bucketClearsInProgressId = type.nameToId("bucketClearsInProgress");
+    bucketClearTimeId = type.nameToId("bucketClearTime");
   }
 
   private final Statistics stats;
@@ -1191,6 +1207,20 @@ public class PartitionedRegionStats {
     stats.incLong(putLocalTimeId, delta);
   }
 
+  public long startBucketClear() {
+    stats.incLong(bucketClearsInProgressId, 1L);
+    return clock.getTime();
+  }
+
+  public void endBucketClear(long start) {
+    stats.incLong(bucketClearsId, 1);
+    stats.incLong(bucketClearsInProgressId, -1L);
+    if (clock.isEnabled()) {
+      long delta = clock.getTime() - start;
+      stats.incLong(bucketClearTimeId, delta);
+    }
+  }
+
   public void incPRMetaDataSentCount() {
     stats.incLong(prMetaDataSentCountId, 1);
   }
@@ -1198,4 +1228,21 @@ public class PartitionedRegionStats {
   public long getPRMetaDataSentCount() {
     return stats.getLong(prMetaDataSentCountId);
   }
+
+  public long getBucketClearCount() {
+    return stats.getLong(bucketClearsId);
+  }
+
+  public void incBucketClearTime(Long nanoseconds) {
+    stats.incLong(bucketClearTimeId, nanoseconds);
+  }
+
+  public long getBucketClearTime() {
+    return stats.getLong(bucketClearTimeId);
+  }
+
+  public long getBucketClearsInProgress() {
+    return stats.getLong(bucketClearsInProgressId);
+  }
+
 }
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/RegionPerfStats.java b/geode-core/src/main/java/org/apache/geode/internal/cache/RegionPerfStats.java
index cfdc8b69bc..54c7e1d662 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/RegionPerfStats.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/RegionPerfStats.java
@@ -519,16 +519,29 @@ class RegionPerfStats extends CachePerfStats implements RegionStats {
     cachePerfStats.incEvictWorkTime(delta);
   }
 
+  private void startClearLocal() {
+    stats.incLong(clearsInProgressId, 1L);
+  }
+
+  private void endClearLocal(long timeTaken) {
+    stats.incLong(clearsInProgressId, -1L);
+    stats.incLong(clearsId, 1L);
+    if (clock.isEnabled()) {
+      stats.incLong(clearTimeId, timeTaken);
+    }
+  }
+
   @Override
-  public void incRegionClearCount() {
-    stats.incLong(regionClearsId, 1L);
-    cachePerfStats.incRegionClearCount();
+  public long startClear() {
+    startClearLocal();
+    return cachePerfStats.startClear();
   }
 
   @Override
-  public void incBucketClearCount() {
-    stats.incLong(bucketClearsId, 1L);
-    cachePerfStats.incBucketClearCount();
+  public long endClear(long startTime) {
+    long timeTaken = cachePerfStats.endClear(startTime);
+    endClearLocal(timeTaken);
+    return timeTaken;
   }
 
   @Override
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/RegionStats.java b/geode-core/src/main/java/org/apache/geode/internal/cache/RegionStats.java
index 8f1e0a4414..6898f6debc 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/RegionStats.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/RegionStats.java
@@ -135,9 +135,9 @@ public interface RegionStats {
 
   void incEvictWorkTime(long delta);
 
-  void incBucketClearCount();
+  long startClear();
 
-  void incRegionClearCount();
+  long endClear(long startTime);
 
   void incPRQueryRetries();
 
diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/CachePerfStatsTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/CachePerfStatsTest.java
index a80e6672df..c9b9126456 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/cache/CachePerfStatsTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/cache/CachePerfStatsTest.java
@@ -14,9 +14,10 @@
  */
 package org.apache.geode.internal.cache;
 
-import static org.apache.geode.internal.cache.CachePerfStats.bucketClearsId;
 import static org.apache.geode.internal.cache.CachePerfStats.cacheListenerCallsCompletedId;
 import static org.apache.geode.internal.cache.CachePerfStats.cacheWriterCallsCompletedId;
+import static org.apache.geode.internal.cache.CachePerfStats.clearTimeId;
+import static org.apache.geode.internal.cache.CachePerfStats.clearsId;
 import static org.apache.geode.internal.cache.CachePerfStats.createsId;
 import static org.apache.geode.internal.cache.CachePerfStats.deltaFailedUpdatesId;
 import static org.apache.geode.internal.cache.CachePerfStats.deltaFullValuesRequestedId;
@@ -43,14 +44,11 @@ import static org.apache.geode.internal.cache.CachePerfStats.loadsCompletedId;
 import static org.apache.geode.internal.cache.CachePerfStats.missesId;
 import static org.apache.geode.internal.cache.CachePerfStats.netloadsCompletedId;
 import static org.apache.geode.internal.cache.CachePerfStats.netsearchesCompletedId;
-import static org.apache.geode.internal.cache.CachePerfStats.partitionedRegionClearLocalDurationId;
-import static org.apache.geode.internal.cache.CachePerfStats.partitionedRegionClearTotalDurationId;
 import static org.apache.geode.internal.cache.CachePerfStats.previouslySeenEventsId;
 import static org.apache.geode.internal.cache.CachePerfStats.putAllsId;
 import static org.apache.geode.internal.cache.CachePerfStats.putTimeId;
 import static org.apache.geode.internal.cache.CachePerfStats.putsId;
 import static org.apache.geode.internal.cache.CachePerfStats.queryExecutionsId;
-import static org.apache.geode.internal.cache.CachePerfStats.regionClearsId;
 import static org.apache.geode.internal.cache.CachePerfStats.removeAllsId;
 import static org.apache.geode.internal.cache.CachePerfStats.retriesId;
 import static org.apache.geode.internal.cache.CachePerfStats.txCommitChangesId;
@@ -432,60 +430,30 @@ public class CachePerfStatsTest {
 
   @Test
   public void getClearsDelegatesToStatistics() {
-    statistics.incLong(regionClearsId, Long.MAX_VALUE);
+    statistics.incLong(clearsId, Long.MAX_VALUE);
 
-    assertThat(cachePerfStats.getRegionClearCount()).isEqualTo(Long.MAX_VALUE);
+    assertThat(cachePerfStats.getClearCount()).isEqualTo(Long.MAX_VALUE);
   }
 
   @Test
   public void incRegionClearCountIncrementsClears() {
-    cachePerfStats.incRegionClearCount();
+    cachePerfStats.stats.incLong(clearsId, 1L);
 
-    assertThat(statistics.getLong(regionClearsId)).isEqualTo(1L);
+    assertThat(statistics.getLong(clearsId)).isEqualTo(1L);
   }
 
-  @Test
-  public void incBucketClearCountIncrementsClears() {
-    cachePerfStats.incBucketClearCount();
-
-    assertThat(statistics.getLong(bucketClearsId)).isEqualTo(1L);
-  }
-
-  @Test
-  public void incPartitionedRegionClearLocalDurationIncrementsPartitionedRegionClearLocalDuration() {
-    cachePerfStats.incPartitionedRegionClearLocalDuration(100L);
-
-    assertThat(statistics.getLong(partitionedRegionClearLocalDurationId)).isEqualTo(100L);
-  }
-
-
-
-  @Test
-  public void incPartitionedRegionClearTotalDurationIncrementsPartitionedRegionClearTotalDuration() {
-    cachePerfStats.incPartitionedRegionClearTotalDuration(100L);
 
-    assertThat(statistics.getLong(partitionedRegionClearTotalDurationId)).isEqualTo(100L);
-  }
 
   /**
    * Characterization test: {@code clears} currently wraps to negative from max long value.
    */
   @Test
   public void regionClearsWrapsFromMaxLongToNegativeValue() {
-    statistics.incLong(regionClearsId, Long.MAX_VALUE);
-
-    cachePerfStats.incRegionClearCount();
-
-    assertThat(cachePerfStats.getRegionClearCount()).isNegative();
-  }
-
-  @Test
-  public void bucketClearsWrapsFromMaxLongToNegativeValue() {
-    statistics.incLong(bucketClearsId, Long.MAX_VALUE);
+    statistics.incLong(clearsId, Long.MAX_VALUE);
 
-    cachePerfStats.incBucketClearCount();
+    cachePerfStats.stats.incLong(clearsId, 1L);
 
-    assertThat(cachePerfStats.getBucketClearCount()).isNegative();
+    assertThat(cachePerfStats.getClearCount()).isNegative();
   }
 
   @Test
@@ -1282,4 +1250,18 @@ public class CachePerfStatsTest {
 
     assertThat(statistics.getLong(previouslySeenEventsId)).isEqualTo(1L);
   }
+
+  @Test
+  public void testBasicClearTime() {
+    assertThat(cachePerfStats.getStats().getLong(clearTimeId)).isEqualTo(0L);
+    assertThat(cachePerfStats.getClearTime()).isEqualTo(0L);
+
+    cachePerfStats.getStats().incLong(clearTimeId, 1L);
+    assertThat(cachePerfStats.getStats().getLong(clearTimeId)).isEqualTo(1L);
+    assertThat(cachePerfStats.getClearTime()).isEqualTo(1L);
+
+    cachePerfStats.stats.incLong(clearTimeId, 1L);
+    assertThat(cachePerfStats.getStats().getLong(clearTimeId)).isEqualTo(2L);
+    assertThat(cachePerfStats.getClearTime()).isEqualTo(2L);
+  }
 }
diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/PartitionedRegionTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/PartitionedRegionTest.java
index e952d4328b..4c24e7d8ed 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/cache/PartitionedRegionTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/cache/PartitionedRegionTest.java
@@ -96,9 +96,7 @@ public class PartitionedRegionTest {
   private InternalCache cache;
   private InternalDistributedSystem system;
   private DistributionManager distributionManager;
-  private InternalResourceManager resourceManager;
   private AttributesFactory attributesFactory;
-
   private PartitionedRegion partitionedRegion;
 
   private final String indexName = "index";
@@ -115,9 +113,9 @@ public class PartitionedRegionTest {
     InternalResourceManager resourceManager = mock(InternalResourceManager.class);
 
     cache = mock(InternalCache.class);
-    attributesFactory = new AttributesFactory();
+    attributesFactory = new AttributesFactory<>();
     attributesFactory.setPartitionAttributes(
-        new PartitionAttributesFactory().setTotalNumBuckets(1).setRedundantCopies(1).create());
+        new PartitionAttributesFactory<>().setTotalNumBuckets(1).setRedundantCopies(1).create());
 
     when(cache.getDistributedSystem())
         .thenReturn(system);
@@ -235,6 +233,7 @@ public class PartitionedRegionTest {
     verify(spyPartitionedRegion)
         .updatePRConfig(partitionRegionConfig, false);
 
+    assertThat(verifyOurNode).isNotNull();
     assertThat(verifyOurNode.isCacheLoaderAttached())
         .isEqualTo(cacheLoader != null);
     assertThat(verifyOurNode.isCacheWriterAttached())
@@ -255,7 +254,6 @@ public class PartitionedRegionTest {
     // ARRANGE
     EntryEventImpl clientEvent = mock(EntryEventImpl.class);
     InternalDistributedMember primaryMember = mock(InternalDistributedMember.class);
-    InternalDistributedMember secondaryMember = mock(InternalDistributedMember.class);
     PartitionedRegion spyPartitionedRegion = spy(partitionedRegion);
 
     when(clientEvent.getOperation())
@@ -280,7 +278,6 @@ public class PartitionedRegionTest {
   public void getBucketNodeForReadOrWriteReturnsSecondaryNodeForNonRegisterInterest() {
     // ARRANGE
     EntryEventImpl clientEvent = mock(EntryEventImpl.class);
-    InternalDistributedMember primaryMember = mock(InternalDistributedMember.class);
     InternalDistributedMember secondaryMember = mock(InternalDistributedMember.class);
     PartitionedRegion spyPartitionedRegion = spy(partitionedRegion);
 
@@ -305,7 +302,6 @@ public class PartitionedRegionTest {
   @Test
   public void getBucketNodeForReadOrWriteReturnsSecondaryNodeWhenClientEventIsNotPresent() {
     // ARRANGE
-    InternalDistributedMember primaryMember = mock(InternalDistributedMember.class);
     InternalDistributedMember secondaryMember = mock(InternalDistributedMember.class);
     PartitionedRegion spyPartitionedRegion = spy(partitionedRegion);
 
@@ -327,7 +323,6 @@ public class PartitionedRegionTest {
   @Test
   public void getBucketNodeForReadOrWriteReturnsSecondaryNodeWhenClientEventOperationIsNotPresent() {
     // ARRANGE
-    InternalDistributedMember primaryMember = mock(InternalDistributedMember.class);
     InternalDistributedMember secondaryMember = mock(InternalDistributedMember.class);
     PartitionedRegion spyPartitionedRegion = spy(partitionedRegion);
 
@@ -350,7 +345,6 @@ public class PartitionedRegionTest {
   public void updateBucketMapsForInterestRegistrationWithSetOfKeysFetchesPrimaryBucketsForRead() {
     // ARRANGE
     InternalDistributedMember primaryMember = mock(InternalDistributedMember.class);
-    InternalDistributedMember secondaryMember = mock(InternalDistributedMember.class);
     PartitionedRegion spyPartitionedRegion = spy(partitionedRegion);
 
     doReturn(primaryMember)
@@ -370,7 +364,6 @@ public class PartitionedRegionTest {
   public void updateBucketMapsForInterestRegistrationWithAllKeysFetchesPrimaryBucketsForRead() {
     // ARRANGE
     InternalDistributedMember primaryMember = mock(InternalDistributedMember.class);
-    InternalDistributedMember secondaryMember = mock(InternalDistributedMember.class);
     PartitionedRegion spyPartitionedRegion = spy(partitionedRegion);
 
     doReturn(primaryMember)
diff --git a/geode-junit/src/main/java/org/apache/geode/internal/cache/PartitionedRegionTestHelper.java b/geode-junit/src/main/java/org/apache/geode/internal/cache/PartitionedRegionTestHelper.java
index 87ee695d32..4c8054a024 100644
--- a/geode-junit/src/main/java/org/apache/geode/internal/cache/PartitionedRegionTestHelper.java
+++ b/geode-junit/src/main/java/org/apache/geode/internal/cache/PartitionedRegionTestHelper.java
@@ -14,8 +14,10 @@
  */
 package org.apache.geode.internal.cache;
 
+import static org.apache.geode.distributed.ConfigurationProperties.ENABLE_TIME_STATISTICS;
 import static org.apache.geode.distributed.ConfigurationProperties.LOCATORS;
 import static org.apache.geode.distributed.ConfigurationProperties.MCAST_PORT;
+import static org.mockito.Mockito.spy;
 
 import java.io.Serializable;
 import java.util.Objects;
@@ -35,10 +37,10 @@ import org.apache.geode.cache.PartitionResolver;
 import org.apache.geode.cache.Region;
 import org.apache.geode.cache.RegionAttributes;
 import org.apache.geode.cache.RegionExistsException;
+import org.apache.geode.cache.RegionFactory;
 import org.apache.geode.cache.Scope;
 import org.apache.geode.cache.query.SelectResults;
 import org.apache.geode.cache.query.types.ObjectType;
-import org.apache.geode.distributed.DistributedSystem;
 
 
 /**
@@ -52,29 +54,33 @@ public class PartitionedRegionTestHelper
 {
   static InternalCache cache = null;
 
+  public static InternalCache getCache() {
+    return cache;
+  }
+
   /**
    * This method creates a partitioned region with all the default values. The cache created is a
    * loner, so this is only suitable for single VM tests.
    *
    */
 
-  public static Region createPartionedRegion(String regionname) throws RegionExistsException {
-    return createPartionedRegion(regionname, new PartitionAttributesFactory().create());
+  public static <K, V> Region<K, V> createPartitionedRegion(String regionName)
+      throws RegionExistsException {
+    return createPartitionedRegion(regionName, new PartitionAttributesFactory<K, V>().create());
   }
 
   /**
    * This method creates a partitioned region with the given PR attributes. The cache created is a
    * loner, so this is only suitable for single VM tests.
    */
-  public static Region createPartionedRegion(String regionname, PartitionAttributes prattribs)
+  public static <K, V> Region<K, V> createPartitionedRegion(String regionName,
+      PartitionAttributes<K, V> partitionAttributes)
       throws RegionExistsException {
-    AttributesFactory attribFactory = new AttributesFactory();
-    attribFactory.setDataPolicy(DataPolicy.PARTITION);
-    attribFactory.setPartitionAttributes(prattribs);
-    RegionAttributes regionAttribs = attribFactory.create();
-
-    Region partitionedregion = createCache().createRegion(regionname, regionAttribs);
-    return partitionedregion;
+    createCache();
+    RegionFactory<K, V> regionFactory = cache.createRegionFactory();
+    regionFactory.setDataPolicy(DataPolicy.PARTITION);
+    regionFactory.setPartitionAttributes(partitionAttributes);
+    return regionFactory.create(regionName);
   }
 
 
@@ -83,14 +89,12 @@ public class PartitionedRegionTestHelper
    * so this is only suitable for single VM tests.
    */
 
-  public static Region createLocalRegion(String regionName) throws RegionExistsException {
-
-    AttributesFactory attr = new AttributesFactory();
-
-    attr.setScope(Scope.LOCAL);
-    Region localRegion = createCache().createRegion(regionName, attr.create());
-
-    return localRegion;
+  public static <K, V> Region<K, V> createLocalRegion(String regionName)
+      throws RegionExistsException {
+    createCache();
+    RegionFactory<K, V> regionFactory = cache.createRegionFactory();
+    regionFactory.setScope(Scope.LOCAL);
+    return regionFactory.create(regionName);
   }
 
   /**
@@ -98,8 +102,6 @@ public class PartitionedRegionTestHelper
    * SelectResults#CollectionType#ElementType()
    */
   public static String compareResultSets(SelectResults sr1, SelectResults sr2) {
-
-
     ObjectType type1, type2;
     String failureString = null;
     type1 = sr1.getCollectionType().getElementType();
@@ -117,13 +119,10 @@ public class PartitionedRegionTestHelper
     } else {
       getLogger().error("PartitionedRegionTestHelper#compareTwoQueryResults: Classes are : "
           + type1.getClass().getName() + " " + type2.getClass().getName());
-      failureString =
-          "PartitionedRegionTestHelper#compareResultSets: FAILED:Search result Type is different in both the cases"
-              + type1.getClass().getName() + " " + type2.getClass().getName();
-
       Assert.fail(
           "PartitionedRegionTestHelper#compareResultSets: FAILED:Search result Type is different in both the cases");
-      return failureString;
+      return "PartitionedRegionTestHelper#compareResultSets: FAILED:Search result Type is different in both the cases"
+          + type1.getClass().getName() + " " + type2.getClass().getName();
     }
     if ((sr1.size()) == (sr2.size())) {
       getLogger().info(
@@ -133,14 +132,15 @@ public class PartitionedRegionTestHelper
     } else {
       getLogger().error(
           "PartitionedRegionTestHelper#compareResultSets: FAILED:Search resultSet size are different in both the cases");
-      failureString =
-          "PartitionedRegionTestHelper#compareResultSets: FAILED:Search resultSet size are different in both the cases"
-              + sr1.size() + " " + sr2.size();
+
       Assert.fail(
           "PartitionedRegionTestHelper#compareResultSets: FAILED:Search resultSet size are different in both the cases");
 
+      return "PartitionedRegionTestHelper#compareResultSets: FAILED:Search resultSet size are different in both the cases"
+          + sr1.size() + " " + sr2.size();
+
     }
-    return failureString;
+    return null;
   }
 
   /**
@@ -155,13 +155,9 @@ public class PartitionedRegionTestHelper
    * The cache created is a loner, so this is only suitable for single VM tests.
    */
 
-  public static Region createPartitionedRegion(String regionName, String localMaxMemory,
+  public static <K, V> Region<K, V> createPartitionedRegion(String regionName,
+      String localMaxMemory,
       int redundancy) {
-    Region pr = null;
-    PartitionAttributes pa;
-    PartitionAttributesFactory paf = new PartitionAttributesFactory();
-    AttributesFactory af = new AttributesFactory();
-    RegionAttributes ra;
     // setting property
     // setting partition attributes to partitionAttributesFactory
     int lmax;
@@ -171,16 +167,19 @@ public class PartitionedRegionTestHelper
       throw new IllegalArgumentException(
           "localMaxMemory must be an integer (" + localMaxMemory + ")");
     }
-    pa = paf.setLocalMaxMemory(lmax).setRedundantCopies(redundancy).create();
-    // setting attribute factor
-    af.setPartitionAttributes(pa);
-    // creating region attributes
-    ra = af.create();
     cache = createCache();
+    RegionFactory<K, V> regionFactory = cache.createRegionFactory();
+    PartitionAttributesFactory<K, V> paf = new PartitionAttributesFactory<>();
+    paf.setLocalMaxMemory(lmax);
+    paf.setRedundantCopies(redundancy);
+    regionFactory.setPartitionAttributes(paf.create());
+
+    Region<K, V> pr;
+
     try {
-      pr = cache.createRegion(regionName, ra);
+      pr = regionFactory.create(regionName);
     } catch (RegionExistsException rex) {
-      pr = cache.getRegion(regionName);
+      pr = regionFactory.create(regionName);
     }
     return pr;
   }
@@ -190,8 +189,7 @@ public class PartitionedRegionTestHelper
    *
    */
   public static SerializableObject createPRSerializableObject(String name, int id) {
-    Object obj = new SerializableObject(name, id);
-    return (SerializableObject) obj;
+    return new SerializableObject(name, id);
 
   }
 
@@ -205,13 +203,12 @@ public class PartitionedRegionTestHelper
       Properties dsp = new Properties();
       dsp.setProperty(MCAST_PORT, "0");
       dsp.setProperty(LOCATORS, "");
-      DistributedSystem sys = DistributedSystem.connect(dsp);
+      dsp.setProperty(ENABLE_TIME_STATISTICS, "true");
+      CacheFactory cacheFactory = new CacheFactory(dsp);
       try {
-        cache = (InternalCache) CacheFactory.create(sys);
-      } catch (CacheExistsException exp) {
-        cache = (InternalCache) CacheFactory.getInstance(sys);
-      } catch (RegionExistsException rex) {
-        cache = (InternalCache) CacheFactory.getInstance(sys);
+        cache = spy((InternalCache) cacheFactory.create());
+      } catch (CacheExistsException | RegionExistsException exp) {
+        cache = spy((InternalCache) cacheFactory.create()); // hmm not happy here.
       }
     }
     return cache;
@@ -233,7 +230,7 @@ public class PartitionedRegionTestHelper
    * This method is used to return existing region.
    *
    */
-  public static Region getExistingRegion(String PRName) {
+  public static <K, V> Region<K, V> getExistingRegion(String PRName) {
     createCache();
     return cache.getRegion(PRName);
   }
@@ -247,34 +244,28 @@ public class PartitionedRegionTestHelper
     return createCache().getLogger();
   }
 
-  public static RegionAttributes createRegionAttrsForPR(int red, int localMaxMem) {
+  public static <K, V> RegionAttributes<K, V> createRegionAttrsForPR(int red, int localMaxMem) {
     return createRegionAttrsForPR(red, localMaxMem,
         PartitionAttributesFactory.RECOVERY_DELAY_DEFAULT);
   }
 
-  public static RegionAttributes createRegionAttrsForPR(int red, int localMaxMem,
-      PartitionResolver resolver) {
-    return createRegionAttrsForPR(red, localMaxMem,
-        PartitionAttributesFactory.RECOVERY_DELAY_DEFAULT, null, resolver);
-  }
-
   /**
-   * This function creates Region attributes with provided scope,redundancy and localmaxMemory
+   * This function creates Region attributes with provided scope,redundancy and localMaxMemory
    */
-  public static RegionAttributes createRegionAttrsForPR(int red, int localMaxMem,
+  public static <K, V> RegionAttributes<K, V> createRegionAttrsForPR(int red, int localMaxMem,
       long recoveryDelay) {
     return createRegionAttrsForPR(red, localMaxMem, recoveryDelay, null, null);
   }
 
   /**
-   * This function creates Region attributes with provided scope,redundancy and localmaxMemory
+   * This function creates Region attributes with provided scope,redundancy and localMaxMemory
    */
-  public static RegionAttributes createRegionAttrsForPR(int red, int localMaxMem,
-      long recoveryDelay, EvictionAttributes evictionAttrs, PartitionResolver resolver) {
+  public static <K, V> RegionAttributes<K, V> createRegionAttrsForPR(int red, int localMaxMem,
+      long recoveryDelay, EvictionAttributes evictionAttrs, PartitionResolver<K, V> resolver) {
 
-    AttributesFactory attr = new AttributesFactory();
+    AttributesFactory<K, V> attr = new AttributesFactory<>();
     attr.setDataPolicy(DataPolicy.PARTITION);
-    PartitionAttributesFactory paf = new PartitionAttributesFactory();
+    PartitionAttributesFactory<K, V> paf = new PartitionAttributesFactory<>();
     paf.setRedundantCopies(red).setLocalMaxMemory(localMaxMem).setRecoveryDelay(recoveryDelay);
     if (resolver != null) {
       paf.setPartitionResolver(resolver);
@@ -284,7 +275,6 @@ public class PartitionedRegionTestHelper
     attr.setEvictionAttributes(evictionAttrs);
     return attr.create();
   }
-
 }
 
 
@@ -293,9 +283,9 @@ public class PartitionedRegionTestHelper
  */
 
 class SerializableObject implements Serializable {
-  String str;
+  final String str;
 
-  int i;
+  final int i;
 
   public SerializableObject(String str, int i) {
     this.str = str;


[geode] 08/22: GEODE-9132: Cleanup PartitionedRegionPartialClearException

Posted by ji...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

jinmeiliao pushed a commit to branch feature/GEODE-7665
in repository https://gitbox.apache.org/repos/asf/geode.git

commit 67b646d58cfe468c0e4fab527e79e9154df37f8d
Author: Kirk Lund <kl...@apache.org>
AuthorDate: Thu Apr 15 17:10:24 2021 -0700

    GEODE-9132: Cleanup PartitionedRegionPartialClearException
    
    * Generate serialVersionUID
    * Use full words for parameter names
---
 .../cache/PartitionedRegionPartialClearException.java      | 14 +++++++++-----
 1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/geode-core/src/main/java/org/apache/geode/cache/PartitionedRegionPartialClearException.java b/geode-core/src/main/java/org/apache/geode/cache/PartitionedRegionPartialClearException.java
index 1ddb301441..b84e7755f2 100644
--- a/geode-core/src/main/java/org/apache/geode/cache/PartitionedRegionPartialClearException.java
+++ b/geode-core/src/main/java/org/apache/geode/cache/PartitionedRegionPartialClearException.java
@@ -21,14 +21,18 @@ package org.apache.geode.cache;
  */
 public class PartitionedRegionPartialClearException extends CacheRuntimeException {
 
-  public PartitionedRegionPartialClearException() {}
+  private static final long serialVersionUID = -3420558263697703892L;
 
-  public PartitionedRegionPartialClearException(String msg) {
-    super(msg);
+  public PartitionedRegionPartialClearException() {
+    // nothing
   }
 
-  public PartitionedRegionPartialClearException(String msg, Throwable cause) {
-    super(msg, cause);
+  public PartitionedRegionPartialClearException(String message) {
+    super(message);
+  }
+
+  public PartitionedRegionPartialClearException(String message, Throwable cause) {
+    super(message, cause);
   }
 
   public PartitionedRegionPartialClearException(Throwable cause) {


[geode] 17/22: GEODE-9195: Remove PR clear local locking (#6410)

Posted by ji...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

jinmeiliao pushed a commit to branch feature/GEODE-7665
in repository https://gitbox.apache.org/repos/asf/geode.git

commit ac859431ef70da5df702f98af7003f5434f78b33
Author: Kirk Lund <kl...@apache.org>
AuthorDate: Fri Apr 30 13:51:33 2021 -0700

    GEODE-9195: Remove PR clear local locking (#6410)
    
    Unit test changes in BucketRegion and DistributedRegion.
    
    Unit test most of PartitionedRegionClearMessage.
---
 .../codeAnalysis/sanctionedDataSerializables.txt   |   2 +-
 .../apache/geode/internal/cache/BucketRegion.java  |  24 +-
 .../geode/internal/cache/DistributedRegion.java    |  29 ++-
 .../internal/cache/PartitionedRegionClear.java     |  15 +-
 .../cache/PartitionedRegionClearMessage.java       | 109 ++++++--
 .../geode/internal/cache/RegionEventFactory.java   |  30 +++
 .../internal/cache/BucketRegionJUnitTest.java      |  59 ++++-
 .../internal/cache/DistributedRegionTest.java      |  77 +++++-
 .../cache/PartitionedRegionClearMessageTest.java   | 285 +++++++++++++++++++++
 9 files changed, 559 insertions(+), 71 deletions(-)

diff --git a/geode-core/src/integrationTest/resources/org/apache/geode/codeAnalysis/sanctionedDataSerializables.txt b/geode-core/src/integrationTest/resources/org/apache/geode/codeAnalysis/sanctionedDataSerializables.txt
index 415db39930..9e48f01d6d 100644
--- a/geode-core/src/integrationTest/resources/org/apache/geode/codeAnalysis/sanctionedDataSerializables.txt
+++ b/geode-core/src/integrationTest/resources/org/apache/geode/codeAnalysis/sanctionedDataSerializables.txt
@@ -1066,7 +1066,7 @@ fromData,207
 toData,178
 
 org/apache/geode/internal/cache/PartitionedRegionClearMessage,2
-fromData,40
+fromData,49
 toData,36
 
 org/apache/geode/internal/cache/PartitionedRegionClearMessage$PartitionedRegionClearReplyMessage,2
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/BucketRegion.java b/geode-core/src/main/java/org/apache/geode/internal/cache/BucketRegion.java
index b068519528..20ed54656f 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/BucketRegion.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/BucketRegion.java
@@ -588,11 +588,9 @@ public class BucketRegion extends DistributedRegion implements Bucket {
     // get rvvLock
     Set<InternalDistributedMember> participants =
         getCacheDistributionAdvisor().adviseInvalidateRegion();
-    boolean isLockedAlready = this.partitionedRegion.getPartitionedRegionClear()
-        .isLockedForListenerAndClientNotification();
 
     try {
-      obtainWriteLocksForClear(regionEvent, participants, isLockedAlready);
+      obtainWriteLocksForClear(regionEvent, participants);
       // no need to dominate my own rvv.
       // Clear is on going here, there won't be GII for this member
       clearRegionLocally(regionEvent, cacheWrite, null);
@@ -600,10 +598,28 @@ public class BucketRegion extends DistributedRegion implements Bucket {
 
       // TODO: call reindexUserDataRegion if there're lucene indexes
     } finally {
-      releaseWriteLocksForClear(regionEvent, participants, isLockedAlready);
+      releaseWriteLocksForClear(regionEvent, participants);
     }
   }
 
+  @Override
+  protected void obtainWriteLocksForClear(RegionEventImpl regionEvent,
+      Set<InternalDistributedMember> participants) {
+    lockAndFlushClearToOthers(regionEvent, participants);
+  }
+
+  @Override
+  protected void releaseWriteLocksForClear(RegionEventImpl regionEvent,
+      Set<InternalDistributedMember> participants) {
+    distributedClearOperationReleaseLocks(regionEvent, participants);
+  }
+
+  @VisibleForTesting
+  void distributedClearOperationReleaseLocks(RegionEventImpl regionEvent,
+      Set<InternalDistributedMember> participants) {
+    DistributedClearOperation.releaseLocks(regionEvent, participants);
+  }
+
   long generateTailKey() {
     long key = eventSeqNum.addAndGet(partitionedRegion.getTotalNumberOfBuckets());
     if (key < 0 || key % getPartitionedRegion().getTotalNumberOfBuckets() != getId()) {
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/DistributedRegion.java b/geode-core/src/main/java/org/apache/geode/internal/cache/DistributedRegion.java
index 8998cc88ee..72d2ffa6fa 100755
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/DistributedRegion.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/DistributedRegion.java
@@ -2040,13 +2040,13 @@ public class DistributedRegion extends LocalRegion implements InternalDistribute
               getCacheDistributionAdvisor().adviseInvalidateRegion();
           // pause all generation of versions and flush from the other members to this one
           try {
-            obtainWriteLocksForClear(regionEvent, participants, false);
+            obtainWriteLocksForClear(regionEvent, participants);
             clearRegionLocally(regionEvent, cacheWrite, null);
             if (!regionEvent.isOriginRemote() && regionEvent.getOperation().isDistributed()) {
               distributeClearOperation(regionEvent, null, participants);
             }
           } finally {
-            releaseWriteLocksForClear(regionEvent, participants, false);
+            releaseWriteLocksForClear(regionEvent, participants);
           }
         } finally {
           distributedUnlockForClear();
@@ -2095,30 +2095,31 @@ public class DistributedRegion extends LocalRegion implements InternalDistribute
     }
   }
 
-
   /**
    * obtain locks preventing generation of new versions in other members
    */
   protected void obtainWriteLocksForClear(RegionEventImpl regionEvent,
-      Set<InternalDistributedMember> participants, boolean localLockedAlready) {
-    if (!localLockedAlready) {
-      lockLocallyForClear(getDistributionManager(), getMyId(), regionEvent);
-    }
-    lockAndFlushClearToOthers(regionEvent, participants);
+      Set<InternalDistributedMember> recipients) {
+    lockLocallyForClear(getDistributionManager(), getMyId(), regionEvent);
+    lockAndFlushClearToOthers(regionEvent, recipients);
   }
 
   /**
    * releases the locks obtained in obtainWriteLocksForClear
    */
   protected void releaseWriteLocksForClear(RegionEventImpl regionEvent,
-      Set<InternalDistributedMember> participants,
-      boolean localLockedAlready) {
-    if (!localLockedAlready) {
-      releaseLockLocallyForClear(regionEvent);
-    }
-    DistributedClearOperation.releaseLocks(regionEvent, participants);
+      Set<InternalDistributedMember> recipients) {
+    releaseLockLocallyForClear(regionEvent);
+    distributedClearOperationReleaseLocks(regionEvent, recipients);
   }
 
+  @VisibleForTesting
+  void distributedClearOperationReleaseLocks(RegionEventImpl regionEvent,
+      Set<InternalDistributedMember> recipients) {
+    DistributedClearOperation.releaseLocks(regionEvent, recipients);
+  }
+
+  @VisibleForTesting
   void lockAndFlushClearToOthers(RegionEventImpl regionEvent,
       Set<InternalDistributedMember> participants) {
     DistributedClearOperation.lockAndFlushToOthers(regionEvent, participants);
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionClear.java b/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionClear.java
index 5f4e589d22..8403306a4d 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionClear.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionClear.java
@@ -36,6 +36,7 @@ import org.apache.geode.distributed.internal.DistributionManager;
 import org.apache.geode.distributed.internal.MembershipListener;
 import org.apache.geode.distributed.internal.ReplyException;
 import org.apache.geode.distributed.internal.membership.InternalDistributedMember;
+import org.apache.geode.internal.cache.PartitionedRegionClearMessage.OperationType;
 import org.apache.geode.internal.cache.PartitionedRegionClearMessage.PartitionedRegionClearResponse;
 import org.apache.geode.internal.serialization.KnownVersion;
 import org.apache.geode.logging.internal.log4j.api.LogService;
@@ -141,8 +142,7 @@ public class PartitionedRegionClear {
    */
   void obtainLockForClear(RegionEventImpl event) {
     obtainClearLockLocal(partitionedRegion.getDistributionManager().getId());
-    sendPartitionedRegionClearMessage(event,
-        PartitionedRegionClearMessage.OperationType.OP_LOCK_FOR_PR_CLEAR);
+    sendPartitionedRegionClearMessage(event, OperationType.OP_LOCK_FOR_PR_CLEAR);
   }
 
   /**
@@ -150,8 +150,7 @@ public class PartitionedRegionClear {
    */
   void releaseLockForClear(RegionEventImpl event) {
     releaseClearLockLocal();
-    sendPartitionedRegionClearMessage(event,
-        PartitionedRegionClearMessage.OperationType.OP_UNLOCK_FOR_PR_CLEAR);
+    sendPartitionedRegionClearMessage(event, OperationType.OP_UNLOCK_FOR_PR_CLEAR);
   }
 
   /**
@@ -162,7 +161,7 @@ public class PartitionedRegionClear {
     Set<Integer> localPrimaryBuckets = clearRegionLocal(regionEvent);
     // this includes all remote primary buckets and their secondaries
     Set<Integer> remotePrimaryBuckets = sendPartitionedRegionClearMessage(regionEvent,
-        PartitionedRegionClearMessage.OperationType.OP_PR_CLEAR);
+        OperationType.OP_PR_CLEAR);
 
     Set<Integer> allBucketsCleared = new HashSet<>();
     allBucketsCleared.addAll(localPrimaryBuckets);
@@ -332,7 +331,7 @@ public class PartitionedRegionClear {
   }
 
   protected Set<Integer> sendPartitionedRegionClearMessage(RegionEventImpl event,
-      PartitionedRegionClearMessage.OperationType op) {
+      OperationType op) {
     RegionEventImpl eventForLocalClear = (RegionEventImpl) event.clone();
     eventForLocalClear.setOperation(Operation.REGION_LOCAL_CLEAR);
 
@@ -349,7 +348,7 @@ public class PartitionedRegionClear {
    * @return buckets that are cleared. empty set if any exception happened
    */
   protected Set<Integer> attemptToSendPartitionedRegionClearMessage(RegionEventImpl event,
-      PartitionedRegionClearMessage.OperationType op)
+      OperationType op)
       throws ForceReattemptException {
     Set<Integer> clearedBuckets = new HashSet<>();
 
@@ -394,7 +393,7 @@ public class PartitionedRegionClear {
       clearMessage.send();
 
       clearResponse.waitForRepliesUninterruptibly();
-      clearedBuckets = clearResponse.bucketsCleared;
+      clearedBuckets = clearResponse.getBucketsCleared();
 
     } catch (ReplyException e) {
       Throwable cause = e.getCause();
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionClearMessage.java b/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionClearMessage.java
index cd33f780d8..c4c1ca5225 100755
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionClearMessage.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionClearMessage.java
@@ -14,15 +14,19 @@
  */
 package org.apache.geode.internal.cache;
 
+import static java.util.Collections.unmodifiableSet;
+
 import java.io.DataInput;
 import java.io.DataOutput;
 import java.io.IOException;
+import java.util.Collection;
 import java.util.Objects;
 import java.util.Set;
 
 import org.apache.logging.log4j.Logger;
 
 import org.apache.geode.DataSerializer;
+import org.apache.geode.annotations.VisibleForTesting;
 import org.apache.geode.cache.CacheException;
 import org.apache.geode.cache.Operation;
 import org.apache.geode.distributed.internal.ClusterDistributionManager;
@@ -52,22 +56,47 @@ public class PartitionedRegionClearMessage extends PartitionMessage {
   private Object callbackArgument;
   private OperationType operationType;
   private EventID eventId;
-  private PartitionedRegion partitionedRegion;
   private Set<Integer> bucketsCleared;
+  private DistributionManager distributionManager;
+  private RegionEventFactory regionEventFactory;
 
   public PartitionedRegionClearMessage() {
     // nothing
   }
 
-  PartitionedRegionClearMessage(Set<InternalDistributedMember> recipients,
-      PartitionedRegion partitionedRegion, ReplyProcessor21 replyProcessor21,
-      PartitionedRegionClearMessage.OperationType operationType,
+  PartitionedRegionClearMessage(Collection<InternalDistributedMember> recipients,
+      PartitionedRegion partitionedRegion,
+      ReplyProcessor21 replyProcessor21,
+      OperationType operationType,
       final RegionEventImpl regionEvent) {
-    super(recipients, partitionedRegion.getPRId(), replyProcessor21);
-    this.partitionedRegion = partitionedRegion;
+    this(recipients,
+        partitionedRegion.getDistributionManager(),
+        partitionedRegion.getPRId(),
+        replyProcessor21,
+        operationType,
+        regionEvent.getRawCallbackArgument(),
+        regionEvent.getEventId(),
+        partitionedRegion.getCache().getTxManager().isDistributed(),
+        RegionEventImpl::new);
+  }
+
+  @VisibleForTesting
+  PartitionedRegionClearMessage(Collection<InternalDistributedMember> recipients,
+      DistributionManager distributionManager,
+      int partitionedRegionId,
+      ReplyProcessor21 replyProcessor21,
+      OperationType operationType,
+      Object callbackArgument,
+      EventID eventId,
+      boolean isTransactionDistributed,
+      RegionEventFactory regionEventFactory) {
+    super(recipients, partitionedRegionId, replyProcessor21);
+    setTransactionDistributed(isTransactionDistributed);
+    this.distributionManager = distributionManager;
     this.operationType = operationType;
-    callbackArgument = regionEvent.getRawCallbackArgument();
-    eventId = regionEvent.getEventId();
+    this.callbackArgument = callbackArgument;
+    this.eventId = eventId;
+    this.regionEventFactory = regionEventFactory;
   }
 
   @Override
@@ -82,8 +111,7 @@ public class PartitionedRegionClearMessage extends PartitionMessage {
   public void send() {
     Objects.requireNonNull(getRecipients(), "ClearMessage NULL recipients set");
 
-    setTransactionDistributed(partitionedRegion.getCache().getTxManager().isDistributed());
-    partitionedRegion.getDistributionManager().putOutgoing(this);
+    distributionManager.putOutgoing(this);
   }
 
   @Override
@@ -108,15 +136,17 @@ public class PartitionedRegionClearMessage extends PartitionMessage {
       return true;
     }
 
+    PartitionedRegionClear partitionedRegionClear = partitionedRegion.getPartitionedRegionClear();
+
     if (operationType == OperationType.OP_LOCK_FOR_PR_CLEAR) {
-      partitionedRegion.getPartitionedRegionClear().obtainClearLockLocal(getSender());
+      partitionedRegionClear.obtainClearLockLocal(getSender());
     } else if (operationType == OperationType.OP_UNLOCK_FOR_PR_CLEAR) {
-      partitionedRegion.getPartitionedRegionClear().releaseClearLockLocal();
+      partitionedRegionClear.releaseClearLockLocal();
     } else {
-      RegionEventImpl event =
-          new RegionEventImpl(partitionedRegion, Operation.REGION_CLEAR, callbackArgument, true,
+      RegionEventImpl event = (RegionEventImpl) regionEventFactory
+          .create(partitionedRegion, Operation.REGION_CLEAR, callbackArgument, true,
               partitionedRegion.getMyId(), getEventID());
-      bucketsCleared = partitionedRegion.getPartitionedRegionClear().clearRegionLocal(event);
+      bucketsCleared = partitionedRegionClear.clearRegionLocal(event);
     }
     return true;
   }
@@ -125,9 +155,9 @@ public class PartitionedRegionClearMessage extends PartitionMessage {
   protected void appendFields(StringBuilder stringBuilder) {
     super.appendFields(stringBuilder);
     stringBuilder
-        .append(" cbArg=")
+        .append(" callbackArgument=")
         .append(callbackArgument)
-        .append(" op=")
+        .append(" operationType=")
         .append(operationType);
   }
 
@@ -141,8 +171,10 @@ public class PartitionedRegionClearMessage extends PartitionMessage {
       throws IOException, ClassNotFoundException {
     super.fromData(in, context);
     callbackArgument = DataSerializer.readObject(in);
-    operationType = PartitionedRegionClearMessage.OperationType.values()[in.readByte()];
+    operationType = OperationType.values()[in.readByte()];
     eventId = DataSerializer.readObject(in);
+
+    regionEventFactory = RegionEventImpl::new;
   }
 
   @Override
@@ -160,21 +192,36 @@ public class PartitionedRegionClearMessage extends PartitionMessage {
     if (partitionedRegion != null && startTime > 0) {
       partitionedRegion.getPrStats().endPartitionMessagesProcessing(startTime);
     }
-    PartitionedRegionClearMessage.PartitionedRegionClearReplyMessage
+    PartitionedRegionClearReplyMessage
         .send(recipient, processorId, getReplySender(distributionManager), operationType,
             bucketsCleared, replyException);
   }
 
+  @VisibleForTesting
+  DistributionManager getDistributionManagerForTesting() {
+    return distributionManager;
+  }
+
+  @VisibleForTesting
+  Object getCallbackArgumentForTesting() {
+    return callbackArgument;
+  }
+
+  @VisibleForTesting
+  RegionEventFactory getRegionEventFactoryForTesting() {
+    return regionEventFactory;
+  }
+
   /**
    * The response on which to wait for all the replies. This response ignores any exceptions
    * received from the "far side"
    */
   public static class PartitionedRegionClearResponse extends ReplyProcessor21 {
 
-    CopyOnWriteHashSet<Integer> bucketsCleared = new CopyOnWriteHashSet<>();
+    private final Set<Integer> bucketsCleared = new CopyOnWriteHashSet<>();
 
     public PartitionedRegionClearResponse(InternalDistributedSystem system,
-        Set<InternalDistributedMember> recipients) {
+        Collection<InternalDistributedMember> recipients) {
       super(system, recipients);
     }
 
@@ -188,12 +235,15 @@ public class PartitionedRegionClearMessage extends PartitionMessage {
       }
       process(message, true);
     }
+
+    Set<Integer> getBucketsCleared() {
+      return unmodifiableSet(bucketsCleared);
+    }
   }
 
   public static class PartitionedRegionClearReplyMessage extends ReplyMessage {
 
     private Set<Integer> bucketsCleared;
-
     private OperationType operationType;
 
     @Override
@@ -201,14 +251,17 @@ public class PartitionedRegionClearMessage extends PartitionMessage {
       return true;
     }
 
-    public static void send(InternalDistributedMember recipient, int processorId,
-        ReplySender replySender, OperationType operationType, Set<Integer> bucketsCleared,
+    private static void send(InternalDistributedMember recipient,
+        int processorId,
+        ReplySender replySender,
+        OperationType operationType,
+        Set<Integer> bucketsCleared,
         ReplyException replyException) {
       Objects.requireNonNull(recipient, "partitionedRegionClearReplyMessage NULL reply message");
 
-      PartitionedRegionClearMessage.PartitionedRegionClearReplyMessage replyMessage =
-          new PartitionedRegionClearMessage.PartitionedRegionClearReplyMessage(processorId,
-              operationType, bucketsCleared, replyException);
+      PartitionedRegionClearReplyMessage replyMessage =
+          new PartitionedRegionClearReplyMessage(processorId, operationType, bucketsCleared,
+              replyException);
 
       replyMessage.setRecipient(recipient);
       replySender.putOutgoing(replyMessage);
@@ -260,7 +313,7 @@ public class PartitionedRegionClearMessage extends PartitionMessage {
     public void fromData(DataInput in, DeserializationContext context)
         throws IOException, ClassNotFoundException {
       super.fromData(in, context);
-      operationType = PartitionedRegionClearMessage.OperationType.values()[in.readByte()];
+      operationType = OperationType.values()[in.readByte()];
       bucketsCleared = DataSerializer.readObject(in);
     }
 
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/RegionEventFactory.java b/geode-core/src/main/java/org/apache/geode/internal/cache/RegionEventFactory.java
new file mode 100644
index 0000000000..c759a44191
--- /dev/null
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/RegionEventFactory.java
@@ -0,0 +1,30 @@
+/*
+ * 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.cache;
+
+import org.apache.geode.cache.Operation;
+import org.apache.geode.cache.RegionEvent;
+import org.apache.geode.distributed.DistributedMember;
+
+@FunctionalInterface
+public interface RegionEventFactory {
+
+  RegionEvent create(PartitionedRegion partitionedRegion,
+      Operation operation,
+      Object callbackArgument,
+      boolean originRemote,
+      DistributedMember distributedMember,
+      EventID eventId);
+}
diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/BucketRegionJUnitTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/BucketRegionJUnitTest.java
index 591dc95585..5b9737fcba 100755
--- a/geode-core/src/test/java/org/apache/geode/internal/cache/BucketRegionJUnitTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/cache/BucketRegionJUnitTest.java
@@ -14,11 +14,13 @@
  */
 package org.apache.geode.internal.cache;
 
+import static java.util.Collections.emptySet;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.CALLS_REAL_METHODS;
 import static org.mockito.Mockito.anyLong;
 import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doReturn;
@@ -29,6 +31,7 @@ import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import java.util.Set;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReadWriteLock;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
@@ -36,6 +39,7 @@ import java.util.concurrent.locks.ReentrantReadWriteLock;
 import org.junit.Test;
 
 import org.apache.geode.cache.RegionAttributes;
+import org.apache.geode.distributed.internal.membership.InternalDistributedMember;
 import org.apache.geode.internal.cache.versions.RegionVersionVector;
 import org.apache.geode.internal.statistics.StatisticsClock;
 
@@ -182,17 +186,6 @@ public class BucketRegionJUnitTest extends DistributedRegionJUnitTest {
     verify(region, times(1)).clearRegionLocally(eq(event), eq(true), eq(null));
   }
 
-  @Test
-  public void obtainWriteLocksForClearInBRShouldDistribute() {
-    RegionEventImpl event = createClearRegionEvent();
-    BucketRegion region = (BucketRegion) event.getRegion();
-    doNothing().when(region).lockLocallyForClear(any(), any(), any());
-    doNothing().when(region).lockAndFlushClearToOthers(any(), any());
-    region.obtainWriteLocksForClear(event, null, false);
-    verify(region).lockLocallyForClear(any(), any(), eq(event));
-    verify(region).lockAndFlushClearToOthers(eq(event), eq(null));
-  }
-
   @Test
   public void updateSizeToZeroOnClearBucketRegion() {
     RegionEventImpl event = createClearRegionEvent();
@@ -211,4 +204,48 @@ public class BucketRegionJUnitTest extends DistributedRegionJUnitTest {
     long sizeAfterClear = region.getTotalBytes();
     assertEquals(0, sizeAfterClear);
   }
+
+  @Test
+  public void obtainWriteLocksForClearInBRShouldLockAndFlushToOthers() {
+    RegionEventImpl event = createClearRegionEvent();
+    BucketRegion region = (BucketRegion) event.getRegion();
+    doNothing().when(region).lockAndFlushClearToOthers(any(), any());
+    region.obtainWriteLocksForClear(event, null);
+    verify(region).lockAndFlushClearToOthers(eq(event), eq(null));
+  }
+
+  @Test
+  public void obtainWriteLocksForClear_invokes_lockAndFlushClearToOthers() {
+    Set<InternalDistributedMember> recipients = emptySet();
+    BucketRegion bucketRegion = bucketRegionForClearLocking();
+    RegionEventImpl regionEvent = mock(RegionEventImpl.class);
+
+    bucketRegion.obtainWriteLocksForClear(regionEvent, recipients);
+
+    verify(bucketRegion).lockAndFlushClearToOthers(regionEvent, recipients);
+  }
+
+  @Test
+  public void releaseWriteLocksForClear_invokes_distributedClearOperationReleaseLocks() {
+    Set<InternalDistributedMember> recipients = emptySet();
+    BucketRegion bucketRegion = bucketRegionForClearLocking();
+    RegionEventImpl regionEvent = mock(RegionEventImpl.class);
+
+    bucketRegion.releaseWriteLocksForClear(regionEvent, recipients);
+
+    verify(bucketRegion).distributedClearOperationReleaseLocks(regionEvent, recipients);
+  }
+
+  private BucketRegion bucketRegionForClearLocking() {
+    // use partial-mock with null fields to verify method invocations
+    BucketRegion bucketRegion = mock(BucketRegion.class, CALLS_REAL_METHODS);
+
+    // doNothing when invoking locking methods for clear
+    doNothing().when(bucketRegion).lockAndFlushClearToOthers(any(), any());
+
+    // doNothing when invoking unlocking methods for clear
+    doNothing().when(bucketRegion).distributedClearOperationReleaseLocks(any(), any());
+
+    return bucketRegion;
+  }
 }
diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/DistributedRegionTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/DistributedRegionTest.java
index e90ca759e6..ee968ada94 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/cache/DistributedRegionTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/cache/DistributedRegionTest.java
@@ -14,14 +14,19 @@
  */
 package org.apache.geode.internal.cache;
 
+import static java.util.Collections.emptySet;
 import static org.apache.geode.cache.asyncqueue.internal.AsyncEventQueueImpl.getSenderIdFromAsyncEventQueueId;
+import static org.apache.geode.util.internal.UncheckedUtils.uncheckedCast;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.CALLS_REAL_METHODS;
 import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.doCallRealMethod;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.inOrder;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
@@ -29,6 +34,7 @@ import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import java.util.Collections;
+import java.util.Set;
 
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
@@ -45,8 +51,8 @@ import org.apache.geode.internal.cache.versions.VersionTag;
 import org.apache.geode.internal.cache.wan.AsyncEventQueueConfigurationException;
 import org.apache.geode.internal.cache.wan.GatewaySenderConfigurationException;
 
-
 public class DistributedRegionTest {
+
   private RegionVersionVector<VersionSource<Object>> vector;
   private RegionVersionHolder<VersionSource<Object>> holder;
   private VersionSource<Object> lostMemberVersionID;
@@ -58,9 +64,9 @@ public class DistributedRegionTest {
   @BeforeEach
   @SuppressWarnings("unchecked")
   public void setup() {
-    vector = mock(RegionVersionVector.class);
-    holder = mock(RegionVersionHolder.class);
-    lostMemberVersionID = mock(VersionSource.class);
+    vector = uncheckedCast(mock(RegionVersionVector.class));
+    holder = uncheckedCast(mock(RegionVersionHolder.class));
+    lostMemberVersionID = uncheckedCast(mock(VersionSource.class));
     member = mock(InternalDistributedMember.class);
     event = mock(EntryEventImpl.class);
     eventTracker = mock(EventTracker.class);
@@ -105,7 +111,7 @@ public class DistributedRegionTest {
 
     distributedRegion.cleanUpAfterFailedGII(true);
 
-    verify(diskRegion).resetRecoveredEntries(eq(distributedRegion));
+    verify(diskRegion).resetRecoveredEntries(distributedRegion);
     verify(distributedRegion, never()).closeEntries();
   }
 
@@ -374,4 +380,65 @@ public class DistributedRegionTest {
     assertThat(distributedRegion.hasSeenEvent(event)).isFalse();
     verify(distributedRegion).findAndSetVersionTag(event);
   }
+
+  @Test
+  public void obtainWriteLocksForClear_invokes_lockLocallyForClear() {
+    DistributedRegion distributedRegion = distributedRegionForClearLocking();
+    RegionEventImpl regionEvent = mock(RegionEventImpl.class);
+
+    distributedRegion.obtainWriteLocksForClear(regionEvent, emptySet());
+
+    verify(distributedRegion).lockLocallyForClear(any(), any(), eq(regionEvent));
+  }
+
+  @Test
+  public void obtainWriteLocksForClear_invokes_lockAndFlushClearToOthers() {
+    Set<InternalDistributedMember> recipients = emptySet();
+    DistributedRegion distributedRegion = distributedRegionForClearLocking();
+    RegionEventImpl regionEvent = mock(RegionEventImpl.class);
+
+    distributedRegion.obtainWriteLocksForClear(regionEvent, recipients);
+
+    verify(distributedRegion).lockAndFlushClearToOthers(regionEvent, recipients);
+  }
+
+  @Test
+  public void releaseWriteLocksForClear_invokes_releaseLockLocallyForClear() {
+    DistributedRegion distributedRegion = distributedRegionForClearLocking();
+    RegionEventImpl regionEvent = mock(RegionEventImpl.class);
+
+    distributedRegion.releaseWriteLocksForClear(regionEvent, emptySet());
+
+    verify(distributedRegion).releaseLockLocallyForClear(regionEvent);
+  }
+
+  @Test
+  public void releaseWriteLocksForClear_invokes_distributedClearOperationReleaseLocks() {
+    Set<InternalDistributedMember> recipients = emptySet();
+    DistributedRegion distributedRegion = distributedRegionForClearLocking();
+    RegionEventImpl regionEvent = mock(RegionEventImpl.class);
+
+    distributedRegion.releaseWriteLocksForClear(regionEvent, recipients);
+
+    verify(distributedRegion).distributedClearOperationReleaseLocks(regionEvent, recipients);
+  }
+
+  private DistributedRegion distributedRegionForClearLocking() {
+    // use partial-mock with null fields to verify method invocations
+    DistributedRegion distributedRegion = mock(DistributedRegion.class, CALLS_REAL_METHODS);
+
+    // stub out getDistributionManager and getMyId
+    doReturn(null).when(distributedRegion).getDistributionManager();
+    doReturn(null).when(distributedRegion).getMyId();
+
+    // doNothing when invoking locking methods for clear
+    doNothing().when(distributedRegion).lockAndFlushClearToOthers(any(), any());
+    doNothing().when(distributedRegion).lockLocallyForClear(any(), any(), any());
+
+    // doNothing when invoking unlocking methods for clear
+    doNothing().when(distributedRegion).distributedClearOperationReleaseLocks(any(), any());
+    doNothing().when(distributedRegion).releaseLockLocallyForClear(any());
+
+    return distributedRegion;
+  }
 }
diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/PartitionedRegionClearMessageTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/PartitionedRegionClearMessageTest.java
new file mode 100644
index 0000000000..4e67fc13af
--- /dev/null
+++ b/geode-core/src/test/java/org/apache/geode/internal/cache/PartitionedRegionClearMessageTest.java
@@ -0,0 +1,285 @@
+/*
+ * 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.cache;
+
+import static java.util.Collections.emptySet;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.catchThrowable;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import java.util.Collection;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import org.apache.geode.cache.Operation;
+import org.apache.geode.cache.RegionEvent;
+import org.apache.geode.distributed.DistributedMember;
+import org.apache.geode.distributed.internal.ClusterDistributionManager;
+import org.apache.geode.distributed.internal.DistributionAdvisor;
+import org.apache.geode.distributed.internal.DistributionManager;
+import org.apache.geode.distributed.internal.ReplyProcessor21;
+import org.apache.geode.distributed.internal.membership.InternalDistributedMember;
+import org.apache.geode.internal.cache.PartitionedRegionClearMessage.OperationType;
+
+public class PartitionedRegionClearMessageTest {
+
+  private Collection<InternalDistributedMember> recipients;
+  private DistributionManager distributionManager;
+  private PartitionedRegion partitionedRegion;
+  private ReplyProcessor21 replyProcessor21;
+  private Object callbackArgument;
+  private EventID eventId;
+  private RegionEventFactory regionEventFactory;
+
+  @Before
+  public void setUp() {
+    recipients = emptySet();
+    distributionManager = mock(DistributionManager.class);
+    partitionedRegion = mock(PartitionedRegion.class);
+    replyProcessor21 = mock(ReplyProcessor21.class);
+    callbackArgument = new Object();
+    eventId = mock(EventID.class);
+    regionEventFactory = mock(RegionEventFactory.class);
+  }
+
+  @Test
+  public void construction_throwsNullPointerExceptionIfRecipientsIsNull() {
+    Throwable thrown = catchThrowable(() -> {
+      new PartitionedRegionClearMessage(null, distributionManager, 1,
+          replyProcessor21, OperationType.OP_PR_CLEAR, callbackArgument, eventId, false,
+          regionEventFactory);
+    });
+
+    assertThat(thrown).isInstanceOf(NullPointerException.class);
+  }
+
+  @Test
+  public void construction_findsAllDependencies() {
+    boolean isTransactionDistributed = true;
+    int regionId = 10;
+    InternalCache cache = mock(InternalCache.class);
+    RegionEventImpl regionEvent = mock(RegionEventImpl.class);
+    TXManagerImpl txManager = mock(TXManagerImpl.class);
+    when(cache.getTxManager()).thenReturn(txManager);
+    when(partitionedRegion.getCache()).thenReturn(cache);
+    when(partitionedRegion.getDistributionManager()).thenReturn(distributionManager);
+    when(partitionedRegion.getPRId()).thenReturn(regionId);
+    when(regionEvent.getEventId()).thenReturn(eventId);
+    when(regionEvent.getRawCallbackArgument()).thenReturn(callbackArgument);
+    when(txManager.isDistributed()).thenReturn(isTransactionDistributed);
+
+    PartitionedRegionClearMessage message = new PartitionedRegionClearMessage(recipients,
+        partitionedRegion,
+        replyProcessor21,
+        OperationType.OP_PR_CLEAR,
+        regionEvent);
+
+    assertThat(message.getDistributionManagerForTesting()).isSameAs(distributionManager);
+    assertThat(message.getCallbackArgumentForTesting()).isSameAs(callbackArgument);
+    assertThat(message.getRegionId()).isEqualTo(regionId);
+    assertThat(message.getEventID()).isEqualTo(eventId);
+    assertThat(message.isTransactionDistributed()).isEqualTo(isTransactionDistributed);
+
+    RegionEventFactory regionEventFactory = message.getRegionEventFactoryForTesting();
+    RegionEvent<?, ?> created =
+        regionEventFactory.create(partitionedRegion, Operation.DESTROY, callbackArgument, false,
+            mock(DistributedMember.class), mock(EventID.class));
+    assertThat(created).isInstanceOf(RegionEventImpl.class);
+  }
+
+  @Test
+  public void construction_setsTransactionDistributed() {
+    boolean isTransactionDistributed = true;
+    PartitionedRegionClearMessage message =
+        new PartitionedRegionClearMessage(recipients, distributionManager, 1,
+            replyProcessor21, OperationType.OP_PR_CLEAR, callbackArgument, eventId,
+            isTransactionDistributed, regionEventFactory);
+
+    boolean value = message.isTransactionDistributed();
+
+    assertThat(value).isEqualTo(isTransactionDistributed);
+  }
+
+  @Test
+  public void getEventID_returnsTheEventId() {
+    PartitionedRegionClearMessage message =
+        new PartitionedRegionClearMessage(recipients, distributionManager, 1,
+            replyProcessor21, OperationType.OP_PR_CLEAR, callbackArgument, eventId, false,
+            regionEventFactory);
+
+    EventID value = message.getEventID();
+
+    assertThat(value).isSameAs(eventId);
+  }
+
+  @Test
+  public void getOperationType_returnsTheOperationType() {
+    PartitionedRegionClearMessage message =
+        new PartitionedRegionClearMessage(recipients, distributionManager, 1,
+            replyProcessor21, OperationType.OP_PR_CLEAR, callbackArgument, eventId, false,
+            regionEventFactory);
+
+    OperationType value = message.getOperationType();
+
+    assertThat(value).isSameAs(OperationType.OP_PR_CLEAR);
+  }
+
+  @Test
+  public void send_putsOutgoing() {
+    PartitionedRegionClearMessage message =
+        new PartitionedRegionClearMessage(recipients, distributionManager, 1,
+            replyProcessor21, OperationType.OP_PR_CLEAR, callbackArgument, eventId, false,
+            regionEventFactory);
+
+    message.send();
+
+    verify(distributionManager).putOutgoing(message);
+  }
+
+  @Test
+  public void processCheckForPR_returnsForceReattemptException_whenRegionIsNotInitialized() {
+    DistributionAdvisor distributionAdvisor = mock(DistributionAdvisor.class);
+    when(distributionAdvisor.isInitialized()).thenReturn(false);
+    when(partitionedRegion.getDistributionAdvisor()).thenReturn(distributionAdvisor);
+    PartitionedRegionClearMessage message =
+        new PartitionedRegionClearMessage(recipients, distributionManager, 1,
+            replyProcessor21, OperationType.OP_PR_CLEAR, callbackArgument, eventId, false,
+            regionEventFactory);
+
+    Throwable throwable = message.processCheckForPR(partitionedRegion, distributionManager);
+
+    assertThat(throwable)
+        .isInstanceOf(ForceReattemptException.class)
+        .hasMessageContaining("could not find partitioned region with Id");
+  }
+
+  @Test
+  public void processCheckForPR_returnsNull_whenRegionIsNull() {
+    PartitionedRegionClearMessage message =
+        new PartitionedRegionClearMessage(recipients, distributionManager, 1,
+            replyProcessor21, OperationType.OP_PR_CLEAR, callbackArgument, eventId, false,
+            regionEventFactory);
+
+    Throwable throwable = message.processCheckForPR(null, distributionManager);
+
+    assertThat(throwable).isNull();
+  }
+
+  @Test
+  public void processCheckForPR_returnsNull_whenRegionIsInitialized() {
+    DistributionAdvisor distributionAdvisor = mock(DistributionAdvisor.class);
+    when(distributionAdvisor.isInitialized()).thenReturn(true);
+    when(partitionedRegion.getDistributionAdvisor()).thenReturn(distributionAdvisor);
+    PartitionedRegionClearMessage message =
+        new PartitionedRegionClearMessage(recipients, distributionManager, 1,
+            replyProcessor21, OperationType.OP_PR_CLEAR, callbackArgument, eventId, false,
+            regionEventFactory);
+
+    Throwable throwable = message.processCheckForPR(null, distributionManager);
+
+    assertThat(throwable).isNull();
+  }
+
+  @Test
+  public void operateOnPartitionedRegion_returnsTrue_whenRegionIsNull() {
+    ClusterDistributionManager clusterDistributionManager = mock(ClusterDistributionManager.class);
+    PartitionedRegionClear partitionedRegionClear = mock(PartitionedRegionClear.class);
+    when(partitionedRegion.getPartitionedRegionClear()).thenReturn(partitionedRegionClear);
+    when(partitionedRegionClear.clearRegionLocal(any())).thenReturn(emptySet());
+    PartitionedRegionClearMessage message =
+        new PartitionedRegionClearMessage(recipients, distributionManager, 1,
+            replyProcessor21, OperationType.OP_PR_CLEAR, callbackArgument, eventId, false,
+            regionEventFactory);
+
+    boolean result =
+        message.operateOnPartitionedRegion(clusterDistributionManager, partitionedRegion, 30);
+
+    assertThat(result).isTrue();
+  }
+
+  @Test
+  public void operateOnPartitionedRegion_returnsTrue_whenRegionIsDestroyed() {
+    ClusterDistributionManager clusterDistributionManager = mock(ClusterDistributionManager.class);
+    when(partitionedRegion.isDestroyed()).thenReturn(true);
+    PartitionedRegionClearMessage message =
+        new PartitionedRegionClearMessage(recipients, distributionManager, 1,
+            replyProcessor21, OperationType.OP_PR_CLEAR, callbackArgument, eventId, false,
+            regionEventFactory);
+
+    boolean result =
+        message.operateOnPartitionedRegion(clusterDistributionManager, partitionedRegion, 30);
+
+    assertThat(result).isTrue();
+  }
+
+  @Test
+  public void operateOnPartitionedRegion_obtainsClearLockLocal_whenOperationTypeIs_OP_LOCK_FOR_PR_CLEAR() {
+    ClusterDistributionManager clusterDistributionManager = mock(ClusterDistributionManager.class);
+    PartitionedRegionClear partitionedRegionClear = mock(PartitionedRegionClear.class);
+    when(partitionedRegion.getPartitionedRegionClear()).thenReturn(partitionedRegionClear);
+    PartitionedRegionClearMessage message = new PartitionedRegionClearMessage(recipients,
+        clusterDistributionManager, 1, replyProcessor21,
+        OperationType.OP_LOCK_FOR_PR_CLEAR, callbackArgument, eventId, false,
+        regionEventFactory);
+
+    boolean result =
+        message.operateOnPartitionedRegion(clusterDistributionManager, partitionedRegion, 30);
+
+    assertThat(result).isTrue();
+    verify(partitionedRegionClear).obtainClearLockLocal(any());
+  }
+
+  @Test
+  public void operateOnPartitionedRegion_releasesClearLockLocal_whenOperationTypeIs_OP_UNLOCK_FOR_PR_CLEAR() {
+    ClusterDistributionManager clusterDistributionManager = mock(ClusterDistributionManager.class);
+    PartitionedRegionClear partitionedRegionClear = mock(PartitionedRegionClear.class);
+    when(partitionedRegion.getPartitionedRegionClear()).thenReturn(partitionedRegionClear);
+    PartitionedRegionClearMessage message = new PartitionedRegionClearMessage(recipients,
+        clusterDistributionManager, 1, replyProcessor21,
+        OperationType.OP_UNLOCK_FOR_PR_CLEAR, callbackArgument, eventId, false,
+        regionEventFactory);
+
+    boolean result =
+        message.operateOnPartitionedRegion(clusterDistributionManager, partitionedRegion, 30);
+
+    assertThat(result).isTrue();
+    verify(partitionedRegionClear).releaseClearLockLocal();
+  }
+
+  @Test
+  public void operateOnPartitionedRegion_clearsRegionLocal_whenOperationTypeIs_OP_PR_CLEAR() {
+    ClusterDistributionManager clusterDistributionManager = mock(ClusterDistributionManager.class);
+    PartitionedRegionClear partitionedRegionClear = mock(PartitionedRegionClear.class);
+    when(partitionedRegion.getPartitionedRegionClear())
+        .thenReturn(partitionedRegionClear);
+    when(regionEventFactory.create(any(), any(), any(), anyBoolean(), any(), any()))
+        .thenReturn(mock(RegionEventImpl.class));
+    PartitionedRegionClearMessage message = new PartitionedRegionClearMessage(recipients,
+        clusterDistributionManager, 1, replyProcessor21,
+        OperationType.OP_PR_CLEAR, callbackArgument, eventId, false,
+        regionEventFactory);
+
+    boolean result =
+        message.operateOnPartitionedRegion(clusterDistributionManager, partitionedRegion, 30);
+
+    assertThat(result).isTrue();
+    verify(partitionedRegionClear).clearRegionLocal(any(RegionEventImpl.class));
+  }
+}


[geode] 14/22: GEODE-9132: Always acquire write lock for PR clear

Posted by ji...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

jinmeiliao pushed a commit to branch feature/GEODE-7665
in repository https://gitbox.apache.org/repos/asf/geode.git

commit ac800e0af65401eb1098e14b58a5ebc956bd26de
Author: Kirk Lund <kl...@apache.org>
AuthorDate: Wed Apr 21 15:24:06 2021 -0700

    GEODE-9132: Always acquire write lock for PR clear
---
 ...gionClearWithConcurrentOperationsDUnitTest.java | 110 ++++++++---------
 .../internal/cache/PartitionedRegionClear.java     | 115 ++++++++++++------
 .../internal/cache/PartitionedRegionClearTest.java | 131 +++++++++++++++++----
 3 files changed, 246 insertions(+), 110 deletions(-)

diff --git a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionClearWithConcurrentOperationsDUnitTest.java b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionClearWithConcurrentOperationsDUnitTest.java
index 7ef187fd1f..710ae6f43f 100644
--- a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionClearWithConcurrentOperationsDUnitTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionClearWithConcurrentOperationsDUnitTest.java
@@ -14,6 +14,9 @@
  */
 package org.apache.geode.internal.cache;
 
+import static java.time.Duration.ofMillis;
+import static org.apache.geode.distributed.ConfigurationProperties.MAX_WAIT_TIME_RECONNECT;
+import static org.apache.geode.distributed.ConfigurationProperties.MEMBER_TIMEOUT;
 import static org.apache.geode.internal.util.ArrayUtils.asList;
 import static org.apache.geode.test.awaitility.GeodeAwaitility.await;
 import static org.apache.geode.test.dunit.VM.getVM;
@@ -21,6 +24,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import java.io.Serializable;
+import java.time.Duration;
 import java.time.Instant;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -73,11 +77,16 @@ public class PartitionedRegionClearWithConcurrentOperationsDUnitTest implements
 
   private static final int BUCKETS = 13;
   private static final String REGION_NAME = "PartitionedRegion";
+  private static final Duration WORK_DURATION = Duration.ofSeconds(15);
 
   @Rule
   public DistributedRule distributedRule = new DistributedRule(3);
   @Rule
-  public CacheRule cacheRule = CacheRule.builder().createCacheInAll().build();
+  public CacheRule cacheRule = CacheRule.builder()
+      .addSystemProperty(MAX_WAIT_TIME_RECONNECT, "1000")
+      .addSystemProperty(MEMBER_TIMEOUT, "2000")
+      .createCacheInAll()
+      .build();
 
   private VM server1;
   private VM server2;
@@ -106,15 +115,15 @@ public class PartitionedRegionClearWithConcurrentOperationsDUnitTest implements
     createRegions(regionShortcut);
 
     // Let all VMs continuously execute puts and gets for 60 seconds.
-    final int workMillis = 60000;
+    // final int workMillis = 60000;
     final int entries = 15000;
     List<AsyncInvocation<Void>> asyncInvocationList = Arrays.asList(
-        server1.invokeAsync(() -> executePuts(entries, workMillis)),
-        server2.invokeAsync(() -> executeGets(entries, workMillis)),
-        accessor.invokeAsync(() -> executeRemoves(entries, workMillis)));
+        server1.invokeAsync(() -> executePuts(entries, WORK_DURATION)),
+        server2.invokeAsync(() -> executeGets(entries, WORK_DURATION)),
+        accessor.invokeAsync(() -> executeRemoves(entries, WORK_DURATION)));
 
     // Clear the region every second for 60 seconds.
-    getVM(coordinatorVM.getVmId()).invoke(() -> executeClears(workMillis, 1000));
+    getVM(coordinatorVM.getVmId()).invoke(() -> executeClears(WORK_DURATION, ofMillis(1000)));
 
     // Let asyncInvocations finish.
     for (AsyncInvocation<Void> asyncInvocation : asyncInvocationList) {
@@ -142,17 +151,17 @@ public class PartitionedRegionClearWithConcurrentOperationsDUnitTest implements
     createRegions(regionShortcut);
 
     // Let all VMs continuously execute putAll and removeAll for 15 seconds.
-    final int workMillis = 15000;
+    // final int workMillis = 15000;
     List<AsyncInvocation<Void>> asyncInvocationList = Arrays.asList(
-        server1.invokeAsync(() -> executePutAlls(0, 2000, workMillis)),
-        server1.invokeAsync(() -> executeRemoveAlls(0, 2000, workMillis)),
-        server2.invokeAsync(() -> executePutAlls(2000, 4000, workMillis)),
-        server2.invokeAsync(() -> executeRemoveAlls(2000, 4000, workMillis)),
-        accessor.invokeAsync(() -> executePutAlls(4000, 6000, workMillis)),
-        accessor.invokeAsync(() -> executeRemoveAlls(4000, 6000, workMillis)));
+        server1.invokeAsync(() -> executePutAlls(0, 2000, WORK_DURATION)),
+        server1.invokeAsync(() -> executeRemoveAlls(0, 2000, WORK_DURATION)),
+        server2.invokeAsync(() -> executePutAlls(2000, 4000, WORK_DURATION)),
+        server2.invokeAsync(() -> executeRemoveAlls(2000, 4000, WORK_DURATION)),
+        accessor.invokeAsync(() -> executePutAlls(4000, 6000, WORK_DURATION)),
+        accessor.invokeAsync(() -> executeRemoveAlls(4000, 6000, WORK_DURATION)));
 
     // Clear the region every half second for 15 seconds.
-    getVM(coordinatorVM.getVmId()).invoke(() -> executeClears(workMillis, 500));
+    getVM(coordinatorVM.getVmId()).invoke(() -> executeClears(WORK_DURATION, ofMillis(500)));
 
     // Let asyncInvocations finish.
     for (AsyncInvocation<Void> asyncInvocation : asyncInvocationList) {
@@ -226,12 +235,12 @@ public class PartitionedRegionClearWithConcurrentOperationsDUnitTest implements
     server2.invoke(() -> DistributionMessageObserver.setInstance(new MemberKiller(false)));
 
     // Let all VMs (except the one to kill) continuously execute gets, put and removes for 30"
-    final int workMillis = 30000;
+    // final int workMillis = 30000;
     List<AsyncInvocation<Void>> asyncInvocationList = Arrays.asList(
-        server1.invokeAsync(() -> executeGets(entries, workMillis)),
-        server1.invokeAsync(() -> executePuts(entries, workMillis)),
-        accessor.invokeAsync(() -> executeGets(entries, workMillis)),
-        accessor.invokeAsync(() -> executeRemoves(entries, workMillis)));
+        server1.invokeAsync(() -> executeGets(entries, WORK_DURATION)),
+        server1.invokeAsync(() -> executePuts(entries, WORK_DURATION)),
+        accessor.invokeAsync(() -> executeGets(entries, WORK_DURATION)),
+        accessor.invokeAsync(() -> executeRemoves(entries, WORK_DURATION)));
 
     // Retry the clear operation on the region until success (server2 will go down, but other
     // members will eventually become primary for those buckets previously hosted by server2).
@@ -278,12 +287,12 @@ public class PartitionedRegionClearWithConcurrentOperationsDUnitTest implements
     server2.invoke(() -> DistributionMessageObserver.setInstance(new MemberKiller(false)));
 
     // Let all VMs (except the one to kill) continuously execute gets, put and removes for 30"
-    final int workMillis = 30000;
+    // final int workMillis = 30000;
     List<AsyncInvocation<Void>> asyncInvocationList = Arrays.asList(
-        server1.invokeAsync(() -> executeGets(entries, workMillis)),
-        server1.invokeAsync(() -> executePuts(entries, workMillis)),
-        accessor.invokeAsync(() -> executeGets(entries, workMillis)),
-        accessor.invokeAsync(() -> executeRemoves(entries, workMillis)));
+        server1.invokeAsync(() -> executeGets(entries, WORK_DURATION)),
+        server1.invokeAsync(() -> executePuts(entries, WORK_DURATION)),
+        accessor.invokeAsync(() -> executeGets(entries, WORK_DURATION)),
+        accessor.invokeAsync(() -> executeRemoves(entries, WORK_DURATION)));
 
     // Clear the region.
     getVM(coordinatorVM.getVmId()).invoke(() -> {
@@ -315,10 +324,10 @@ public class PartitionedRegionClearWithConcurrentOperationsDUnitTest implements
     server2.invoke(() -> DistributionMessageObserver.setInstance(new MemberKiller(false)));
 
     // Let all VMs continuously execute putAll/removeAll for 30 seconds.
-    final int workMillis = 30000;
+    // final int workMillis = 30000;
     List<AsyncInvocation<Void>> asyncInvocationList = Arrays.asList(
-        server1.invokeAsync(() -> executePutAlls(0, 6000, workMillis)),
-        accessor.invokeAsync(() -> executeRemoveAlls(2000, 4000, workMillis)));
+        server1.invokeAsync(() -> executePutAlls(0, 6000, WORK_DURATION)),
+        accessor.invokeAsync(() -> executeRemoveAlls(2000, 4000, WORK_DURATION)));
 
     // Retry the clear operation on the region until success (server2 will go down, but other
     // members will eventually become primary for those buckets previously hosted by server2).
@@ -360,10 +369,9 @@ public class PartitionedRegionClearWithConcurrentOperationsDUnitTest implements
     createRegions(RegionShortcut.PARTITION);
     server2.invoke(() -> DistributionMessageObserver.setInstance(new MemberKiller(false)));
 
-    final int workMillis = 30000;
     List<AsyncInvocation<Void>> asyncInvocationList = Arrays.asList(
-        server1.invokeAsync(() -> executePutAlls(0, 6000, workMillis)),
-        accessor.invokeAsync(() -> executeRemoveAlls(2000, 4000, workMillis)));
+        server1.invokeAsync(() -> executePutAlls(0, 6000, WORK_DURATION)),
+        accessor.invokeAsync(() -> executeRemoveAlls(2000, 4000, WORK_DURATION)));
 
     // Clear the region.
     getVM(coordinatorVM.getVmId()).invoke(() -> {
@@ -520,12 +528,12 @@ public class PartitionedRegionClearWithConcurrentOperationsDUnitTest implements
   }
 
   /**
-   * Continuously execute get operations on the PartitionedRegion for the given durationInMillis.
+   * Continuously execute get operations on the PartitionedRegion for the given duration.
    */
-  private void executeGets(final int numEntries, final long durationInMillis) {
+  private void executeGets(final int numEntries, final Duration duration) {
     Cache cache = cacheRule.getCache();
     Region<String, String> region = cache.getRegion(REGION_NAME);
-    Instant finishTime = Instant.now().plusMillis(durationInMillis);
+    Instant finishTime = Instant.now().plusMillis(duration.toMillis());
 
     while (Instant.now().isBefore(finishTime)) {
       // Region might have been cleared in between, that's why we check for null.
@@ -537,12 +545,12 @@ public class PartitionedRegionClearWithConcurrentOperationsDUnitTest implements
   }
 
   /**
-   * Continuously execute put operations on the PartitionedRegion for the given durationInMillis.
+   * Continuously execute put operations on the PartitionedRegion for the given duration.
    */
-  private void executePuts(final int numEntries, final long durationInMillis) {
+  private void executePuts(final int numEntries, final Duration duration) {
     Cache cache = cacheRule.getCache();
     Region<String, String> region = cache.getRegion(REGION_NAME);
-    Instant finishTime = Instant.now().plusMillis(durationInMillis);
+    Instant finishTime = Instant.now().plusMillis(duration.toMillis());
 
     while (Instant.now().isBefore(finishTime)) {
       IntStream.range(0, numEntries).forEach(i -> region.put(String.valueOf(i), "Value_" + i));
@@ -550,16 +558,15 @@ public class PartitionedRegionClearWithConcurrentOperationsDUnitTest implements
   }
 
   /**
-   * Continuously execute putAll operations on the PartitionedRegion for the given
-   * durationInMillis.
+   * Continuously execute putAll operations on the PartitionedRegion for the given duration.
    */
-  private void executePutAlls(final int startKey, final int finalKey, final long durationInMillis) {
+  private void executePutAlls(final int startKey, final int finalKey, final Duration duration) {
     Cache cache = cacheRule.getCache();
     Map<String, String> valuesToInsert = new HashMap<>();
     Region<String, String> region = cache.getRegion(REGION_NAME);
     IntStream.range(startKey, finalKey)
         .forEach(i -> valuesToInsert.put(String.valueOf(i), "Value_" + i));
-    Instant finishTime = Instant.now().plusMillis(durationInMillis);
+    Instant finishTime = Instant.now().plusMillis(duration.toMillis());
 
     while (Instant.now().isBefore(finishTime)) {
       region.putAll(valuesToInsert);
@@ -567,13 +574,12 @@ public class PartitionedRegionClearWithConcurrentOperationsDUnitTest implements
   }
 
   /**
-   * Continuously execute remove operations on the PartitionedRegion for the given
-   * durationInMillis.
+   * Continuously execute remove operations on the PartitionedRegion for the given duration.
    */
-  private void executeRemoves(final int numEntries, final long durationInMillis) {
+  private void executeRemoves(final int numEntries, final Duration duration) {
     Cache cache = cacheRule.getCache();
     Region<String, String> region = cache.getRegion(REGION_NAME);
-    Instant finishTime = Instant.now().plusMillis(durationInMillis);
+    Instant finishTime = Instant.now().plusMillis(duration.toMillis());
 
     while (Instant.now().isBefore(finishTime)) {
       // Region might have been cleared in between, that's why we check for null.
@@ -585,16 +591,14 @@ public class PartitionedRegionClearWithConcurrentOperationsDUnitTest implements
   }
 
   /**
-   * Continuously execute removeAll operations on the PartitionedRegion for the given
-   * durationInMillis.
+   * Continuously execute removeAll operations on the PartitionedRegion for the given duration.
    */
-  private void executeRemoveAlls(final int startKey, final int finalKey,
-      final long durationInMillis) {
+  private void executeRemoveAlls(final int startKey, final int finalKey, final Duration duration) {
     Cache cache = cacheRule.getCache();
     List<String> keysToRemove = new ArrayList<>();
     Region<String, String> region = cache.getRegion(REGION_NAME);
     IntStream.range(startKey, finalKey).forEach(i -> keysToRemove.add(String.valueOf(i)));
-    Instant finishTime = Instant.now().plusMillis(durationInMillis);
+    Instant finishTime = Instant.now().plusMillis(duration.toMillis());
 
     while (Instant.now().isBefore(finishTime)) {
       region.removeAll(keysToRemove);
@@ -622,13 +626,13 @@ public class PartitionedRegionClearWithConcurrentOperationsDUnitTest implements
   }
 
   /**
-   * Continuously execute clear operations on the PartitionedRegion every periodInMillis for the
-   * given durationInMillis.
+   * Continuously execute clear operations on the PartitionedRegion every period for the
+   * given duration.
    */
-  private void executeClears(final long durationInMillis, final long periodInMillis) {
+  private void executeClears(final Duration duration, final Duration period) {
     Cache cache = cacheRule.getCache();
     Region<String, String> region = cache.getRegion(REGION_NAME);
-    long minimumInvocationCount = durationInMillis / periodInMillis;
+    long minimumInvocationCount = duration.toMillis() / period.toMillis();
 
     for (int invocationCount = 0; invocationCount < minimumInvocationCount; invocationCount++) {
       region.clear();
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionClear.java b/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionClear.java
index 569f78c637..b8597c17af 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionClear.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionClear.java
@@ -23,6 +23,7 @@ import java.util.Set;
 import org.apache.logging.log4j.Logger;
 
 import org.apache.geode.CancelException;
+import org.apache.geode.annotations.VisibleForTesting;
 import org.apache.geode.cache.CacheWriterException;
 import org.apache.geode.cache.Operation;
 import org.apache.geode.cache.OperationAbortedException;
@@ -30,10 +31,12 @@ import org.apache.geode.cache.PartitionedRegionPartialClearException;
 import org.apache.geode.cache.asyncqueue.AsyncEventQueue;
 import org.apache.geode.cache.asyncqueue.internal.AsyncEventQueueImpl;
 import org.apache.geode.cache.partition.PartitionRegionHelper;
+import org.apache.geode.distributed.DistributedLockService;
 import org.apache.geode.distributed.internal.DistributionManager;
 import org.apache.geode.distributed.internal.MembershipListener;
 import org.apache.geode.distributed.internal.ReplyException;
 import org.apache.geode.distributed.internal.membership.InternalDistributedMember;
+import org.apache.geode.internal.cache.PartitionedRegionClearMessage.PartitionedRegionClearResponse;
 import org.apache.geode.internal.serialization.KnownVersion;
 import org.apache.geode.logging.internal.log4j.api.LogService;
 
@@ -47,6 +50,8 @@ public class PartitionedRegionClear {
 
   private final PartitionedRegion partitionedRegion;
 
+  private final DistributedLockService distributedLockService;
+
   protected final LockForListenerAndClientNotification lockForListenerAndClientNotification =
       new LockForListenerAndClientNotification();
 
@@ -55,8 +60,35 @@ public class PartitionedRegionClear {
   protected final PartitionedRegionClearListener partitionedRegionClearListener =
       new PartitionedRegionClearListener();
 
+  private final ColocationLeaderRegionProvider colocationLeaderRegionProvider;
+  private final AssignBucketsToPartitions assignBucketsToPartitions;
+  private final UpdateAttributesProcessorFactory updateAttributesProcessorFactory;
+
   public PartitionedRegionClear(PartitionedRegion partitionedRegion) {
+    this(partitionedRegion,
+        partitionedRegion.getPartitionedRegionLockService(),
+        ColocationHelper::getLeaderRegion,
+        PartitionRegionHelper::assignBucketsToPartitions,
+        pr -> new UpdateAttributesProcessor(pr, true));
+  }
+
+  @VisibleForTesting
+  PartitionedRegionClear(PartitionedRegion partitionedRegion,
+      DistributedLockService distributedLockService,
+      ColocationLeaderRegionProvider colocationLeaderRegionProvider,
+      AssignBucketsToPartitions assignBucketsToPartitions,
+      UpdateAttributesProcessorFactory updateAttributesProcessorFactory) {
     this.partitionedRegion = partitionedRegion;
+    this.distributedLockService = distributedLockService;
+    this.colocationLeaderRegionProvider = colocationLeaderRegionProvider;
+    this.assignBucketsToPartitions = assignBucketsToPartitions;
+    this.updateAttributesProcessorFactory = updateAttributesProcessorFactory;
+
+    // TODO: initialize needs to move out of constructor to prevent escape of reference to 'this'
+    initialize();
+  }
+
+  private void initialize() {
     partitionedRegion.getDistributionManager()
         .addMembershipListener(partitionedRegionClearListener);
   }
@@ -67,7 +99,7 @@ public class PartitionedRegionClear {
 
   void acquireDistributedClearLock(String clearLock) {
     try {
-      partitionedRegion.getPartitionedRegionLockService().lock(clearLock, -1, -1);
+      distributedLockService.lock(clearLock, -1, -1);
     } catch (IllegalStateException e) {
       partitionedRegion.lockCheckReadiness();
       throw e;
@@ -76,7 +108,7 @@ public class PartitionedRegionClear {
 
   void releaseDistributedClearLock(String clearLock) {
     try {
-      partitionedRegion.getPartitionedRegionLockService().unlock(clearLock);
+      distributedLockService.unlock(clearLock);
     } catch (IllegalStateException e) {
       partitionedRegion.lockCheckReadiness();
     } catch (Exception ex) {
@@ -303,7 +335,7 @@ public class PartitionedRegionClear {
   protected Set<Integer> attemptToSendPartitionedRegionClearMessage(RegionEventImpl event,
       PartitionedRegionClearMessage.OperationType op)
       throws ForceReattemptException {
-    Set<Integer> bucketsOperated = new HashSet<>();
+    Set<Integer> clearedBuckets = new HashSet<>();
 
     if (partitionedRegion.getPRRoot() == null) {
       if (logger.isDebugEnabled()) {
@@ -311,8 +343,10 @@ public class PartitionedRegionClear {
             "Partition region {} failed to initialize. Remove its profile from remote members.",
             this.partitionedRegion);
       }
-      new UpdateAttributesProcessor(partitionedRegion, true).distribute(false);
-      return bucketsOperated;
+      updateAttributesProcessorFactory
+          .create(partitionedRegion)
+          .distribute(false);
+      return clearedBuckets;
     }
 
     final Set<InternalDistributedMember> configRecipients =
@@ -325,9 +359,9 @@ public class PartitionedRegionClear {
 
       if (prConfig != null) {
         for (Node node : prConfig.getNodes()) {
-          InternalDistributedMember idm = node.getMemberId();
-          if (!idm.equals(partitionedRegion.getMyId())) {
-            configRecipients.add(idm);
+          InternalDistributedMember memberId = node.getMemberId();
+          if (!memberId.equals(partitionedRegion.getMyId())) {
+            configRecipients.add(memberId);
           }
         }
       }
@@ -336,29 +370,29 @@ public class PartitionedRegionClear {
     }
 
     try {
-      PartitionedRegionClearMessage.PartitionedRegionClearResponse resp =
-          new PartitionedRegionClearMessage.PartitionedRegionClearResponse(
-              partitionedRegion.getSystem(), configRecipients);
-      PartitionedRegionClearMessage partitionedRegionClearMessage =
-          new PartitionedRegionClearMessage(configRecipients, partitionedRegion, resp, op, event);
-      partitionedRegionClearMessage.send();
+      PartitionedRegionClearResponse clearResponse =
+          new PartitionedRegionClearResponse(partitionedRegion.getSystem(), configRecipients);
+      PartitionedRegionClearMessage clearMessage =
+          new PartitionedRegionClearMessage(configRecipients, partitionedRegion, clearResponse, op,
+              event);
+      clearMessage.send();
 
-      resp.waitForRepliesUninterruptibly();
-      bucketsOperated = resp.bucketsCleared;
+      clearResponse.waitForRepliesUninterruptibly();
+      clearedBuckets = clearResponse.bucketsCleared;
 
     } catch (ReplyException e) {
-      Throwable t = e.getCause();
-      if (t instanceof ForceReattemptException) {
-        throw (ForceReattemptException) t;
+      Throwable cause = e.getCause();
+      if (cause instanceof ForceReattemptException) {
+        throw (ForceReattemptException) cause;
       }
-      if (t instanceof PartitionedRegionPartialClearException) {
-        throw new PartitionedRegionPartialClearException(t.getMessage(), t);
+      if (cause instanceof PartitionedRegionPartialClearException) {
+        throw (PartitionedRegionPartialClearException) cause;
       }
       logger.warn(
           "PartitionedRegionClear#sendPartitionedRegionClearMessage: Caught exception during ClearRegionMessage send and waiting for response",
           e);
     }
-    return bucketsOperated;
+    return clearedBuckets;
   }
 
   /**
@@ -412,14 +446,9 @@ public class PartitionedRegionClear {
         invokeCacheWriter(regionEvent);
       }
 
-      // Check if there are any listeners or clients interested. If so, then clear write
-      // locks needs to be taken on all local and remote primary buckets in order to
-      // preserve the ordering of client events (for concurrent operations on the region).
-      boolean acquireClearLockForNotification =
-          (partitionedRegion.hasAnyClientsInterested() || partitionedRegion.hasListener());
-      if (acquireClearLockForNotification) {
-        obtainLockForClear(regionEvent);
-      }
+      // clear write locks need to be taken on all local and remote primary buckets
+      // whether or not the partitioned region has any listeners clients interested
+      obtainLockForClear(regionEvent);
       try {
         Set<Integer> bucketsCleared = clearRegion(regionEvent);
 
@@ -435,9 +464,7 @@ public class PartitionedRegionClear {
           throw new PartitionedRegionPartialClearException(message);
         }
       } finally {
-        if (acquireClearLockForNotification) {
-          releaseLockForClear(regionEvent);
-        }
+        releaseLockForClear(regionEvent);
       }
     } finally {
       releaseDistributedClearLock(lockName);
@@ -458,8 +485,8 @@ public class PartitionedRegionClear {
   }
 
   protected void assignAllPrimaryBuckets() {
-    PartitionedRegion leader = ColocationHelper.getLeaderRegion(partitionedRegion);
-    PartitionRegionHelper.assignBucketsToPartitions(leader);
+    PartitionedRegion leader = colocationLeaderRegionProvider.getLeaderRegion(partitionedRegion);
+    assignBucketsToPartitions.assignBucketsToPartitions(leader);
   }
 
   protected void handleClearFromDepartedMember(InternalDistributedMember departedMember) {
@@ -505,6 +532,24 @@ public class PartitionedRegionClear {
     return membershipChange;
   }
 
+  @FunctionalInterface
+  @VisibleForTesting
+  interface ColocationLeaderRegionProvider {
+    PartitionedRegion getLeaderRegion(PartitionedRegion partitionedRegion);
+  }
+
+  @FunctionalInterface
+  @VisibleForTesting
+  interface AssignBucketsToPartitions {
+    void assignBucketsToPartitions(PartitionedRegion partitionedRegion);
+  }
+
+  @FunctionalInterface
+  @VisibleForTesting
+  interface UpdateAttributesProcessorFactory {
+    UpdateAttributesProcessor create(PartitionedRegion partitionedRegion);
+  }
+
   protected class PartitionedRegionClearListener implements MembershipListener {
 
     @Override
diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/PartitionedRegionClearTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/PartitionedRegionClearTest.java
index 721d2366be..376fc8ed46 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/cache/PartitionedRegionClearTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/cache/PartitionedRegionClearTest.java
@@ -22,6 +22,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.catchThrowable;
 import static org.mockito.ArgumentCaptor.forClass;
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.doNothing;
@@ -42,7 +43,6 @@ import org.mockito.ArgumentCaptor;
 import org.apache.geode.CancelCriterion;
 import org.apache.geode.cache.PartitionedRegionPartialClearException;
 import org.apache.geode.cache.Region;
-import org.apache.geode.cache.asyncqueue.AsyncEventQueue;
 import org.apache.geode.distributed.DistributedLockService;
 import org.apache.geode.distributed.internal.DMStats;
 import org.apache.geode.distributed.internal.DistributionManager;
@@ -50,41 +50,74 @@ import org.apache.geode.distributed.internal.InternalDistributedSystem;
 import org.apache.geode.distributed.internal.MembershipListener;
 import org.apache.geode.distributed.internal.membership.InternalDistributedMember;
 import org.apache.geode.internal.cache.PartitionedRegion.RetryTimeKeeper;
+import org.apache.geode.internal.cache.PartitionedRegionClear.AssignBucketsToPartitions;
+import org.apache.geode.internal.cache.PartitionedRegionClear.ColocationLeaderRegionProvider;
 import org.apache.geode.internal.cache.PartitionedRegionClear.PartitionedRegionClearListener;
+import org.apache.geode.internal.cache.PartitionedRegionClear.UpdateAttributesProcessorFactory;
 import org.apache.geode.internal.cache.PartitionedRegionClearMessage.OperationType;
 import org.apache.geode.internal.cache.partitioned.RegionAdvisor;
 import org.apache.geode.internal.serialization.KnownVersion;
 
 public class PartitionedRegionClearTest {
 
-  private GemFireCacheImpl cache;
-  private HashSet<AsyncEventQueue> allAEQs = new HashSet<>();
   private PartitionedRegionClear partitionedRegionClear;
   private DistributionManager distributionManager;
   private PartitionedRegion partitionedRegion;
   private RegionAdvisor regionAdvisor;
   private InternalDistributedMember internalDistributedMember;
+  private DistributedLockService distributedLockService;
 
   @Before
   public void setUp() {
-
-    cache = mock(GemFireCacheImpl.class);
+    AssignBucketsToPartitions assignBucketsToPartitions = mock(AssignBucketsToPartitions.class);
+    GemFireCacheImpl cache = mock(GemFireCacheImpl.class);
+    ColocationLeaderRegionProvider colocationLeaderRegionProvider =
+        mock(ColocationLeaderRegionProvider.class);
+    distributedLockService = mock(DistributedLockService.class);
     distributionManager = mock(DistributionManager.class);
+    FilterProfile filterProfile = mock(FilterProfile.class);
     internalDistributedMember = mock(InternalDistributedMember.class);
     partitionedRegion = mock(PartitionedRegion.class);
     regionAdvisor = mock(RegionAdvisor.class);
+    UpdateAttributesProcessorFactory updateAttributesProcessorFactory =
+        mock(UpdateAttributesProcessorFactory.class);
+
+    when(cache.getAsyncEventQueues(false))
+        .thenReturn(emptySet());
+    when(colocationLeaderRegionProvider.getLeaderRegion(any()))
+        .thenReturn(partitionedRegion);
+    when(distributedLockService.lock(anyString(), anyInt(), anyInt()))
+        .thenReturn(true);
+    when(distributionManager.getDistributionManagerId())
+        .thenReturn(internalDistributedMember);
+    when(distributionManager.getId())
+        .thenReturn(internalDistributedMember);
+    when(internalDistributedMember.getVersion())
+        .thenReturn(KnownVersion.CURRENT);
+    when(partitionedRegion.getCache())
+        .thenReturn(cache);
+    when(partitionedRegion.getDistributionManager())
+        .thenReturn(distributionManager);
+    when(partitionedRegion.getName())
+        .thenReturn("prRegion");
+    when(partitionedRegion.getRegionAdvisor())
+        .thenReturn(regionAdvisor);
+    when(partitionedRegion.getFilterProfile())
+        .thenReturn(filterProfile);
+    when(filterProfile.getFilterRoutingInfoPart1(any(), any(), any()))
+        .thenReturn(mock(FilterRoutingInfo.class));
+    when(filterProfile.getFilterRoutingInfoPart2(any(), any()))
+        .thenReturn(mock(FilterRoutingInfo.class));
+    when(regionAdvisor.getDistributionManager())
+        .thenReturn(distributionManager);
+    when(updateAttributesProcessorFactory.create(any()))
+        .thenReturn(mock(UpdateAttributesProcessor.class));
 
-    when(distributionManager.getDistributionManagerId()).thenReturn(internalDistributedMember);
-    when(distributionManager.getId()).thenReturn(internalDistributedMember);
-    when(internalDistributedMember.getVersion()).thenReturn(KnownVersion.CURRENT);
-    when(partitionedRegion.getCache()).thenReturn(cache);
-    when(cache.getAsyncEventQueues(false)).thenReturn(allAEQs);
-    when(partitionedRegion.getDistributionManager()).thenReturn(distributionManager);
-    when(partitionedRegion.getName()).thenReturn("prRegion");
-    when(partitionedRegion.getRegionAdvisor()).thenReturn(regionAdvisor);
-    when(regionAdvisor.getDistributionManager()).thenReturn(distributionManager);
+    doNothing().when(distributedLockService).unlock(anyString());
 
-    partitionedRegionClear = new PartitionedRegionClear(partitionedRegion);
+    partitionedRegionClear = new PartitionedRegionClear(partitionedRegion, distributedLockService,
+        colocationLeaderRegionProvider, assignBucketsToPartitions,
+        updateAttributesProcessorFactory);
   }
 
   @Test
@@ -115,9 +148,7 @@ public class PartitionedRegionClearTest {
   @Test
   public void acquireDistributedClearLockGetsDistributedLock() {
     // arrange
-    DistributedLockService distributedLockService = mock(DistributedLockService.class);
     String lockName = PartitionedRegionClear.CLEAR_OPERATION + partitionedRegion.getName();
-    when(partitionedRegion.getPartitionedRegionLockService()).thenReturn(distributedLockService);
 
     // act
     partitionedRegionClear.acquireDistributedClearLock(lockName);
@@ -129,9 +160,7 @@ public class PartitionedRegionClearTest {
   @Test
   public void releaseDistributedClearLockReleasesDistributedLock() {
     // arrange
-    DistributedLockService distributedLockService = mock(DistributedLockService.class);
     String lockName = PartitionedRegionClear.CLEAR_OPERATION + partitionedRegion.getName();
-    when(partitionedRegion.getPartitionedRegionLockService()).thenReturn(distributedLockService);
 
     // act
     partitionedRegionClear.releaseDistributedClearLock(lockName);
@@ -567,6 +596,7 @@ public class PartitionedRegionClearTest {
   public void doClearAcquiresAndReleasesDistributedClearLockAndCreatesAllPrimaryBuckets() {
     // arrange
     RegionEventImpl regionEvent = mock(RegionEventImpl.class);
+    when(regionEvent.clone()).thenReturn(regionEvent);
 
     // partial mocking to stub some methods and verify
     PartitionedRegionClear spyPartitionedRegionClear = spy(partitionedRegionClear);
@@ -587,6 +617,7 @@ public class PartitionedRegionClearTest {
   public void doClearInvokesCacheWriterWhenCacheWriteIsSet() {
     // arrange
     RegionEventImpl regionEvent = mock(RegionEventImpl.class);
+    when(regionEvent.clone()).thenReturn(regionEvent);
 
     // partial mocking to stub some methods and verify
     PartitionedRegionClear spyPartitionedRegionClear = spy(partitionedRegionClear);
@@ -605,6 +636,7 @@ public class PartitionedRegionClearTest {
   public void doClearDoesNotInvokesCacheWriterWhenCacheWriteIsNotSet() {
     // arrange
     RegionEventImpl regionEvent = mock(RegionEventImpl.class);
+    when(regionEvent.clone()).thenReturn(regionEvent);
 
     // partial mocking to stub some methods and verify
     PartitionedRegionClear spyPartitionedRegionClear = spy(partitionedRegionClear);
@@ -669,12 +701,13 @@ public class PartitionedRegionClearTest {
   }
 
   @Test
-  public void doClearDoesNotObtainLockForClearWhenRegionHasNoListenerAndNoClientInterest() {
+  public void doClearObtainsLockForClearWhenRegionHasNoListenerAndNoClientInterest() {
     // arrange
     RegionEventImpl regionEvent = mock(RegionEventImpl.class);
 
     when(partitionedRegion.hasAnyClientsInterested()).thenReturn(false);
     when(partitionedRegion.hasListener()).thenReturn(false);
+    when(regionEvent.clone()).thenReturn(regionEvent);
 
     // partial mocking to stub some methods and verify
     PartitionedRegionClear spyPartitionedRegionClear = spy(partitionedRegionClear);
@@ -688,8 +721,8 @@ public class PartitionedRegionClearTest {
     spyPartitionedRegionClear.doClear(regionEvent, false);
 
     // assert
-    verify(spyPartitionedRegionClear, never()).obtainLockForClear(regionEvent);
-    verify(spyPartitionedRegionClear, never()).releaseLockForClear(regionEvent);
+    verify(spyPartitionedRegionClear).obtainLockForClear(regionEvent);
+    verify(spyPartitionedRegionClear).releaseLockForClear(regionEvent);
   }
 
   @Test
@@ -867,6 +900,60 @@ public class PartitionedRegionClearTest {
         .isNotNull();
   }
 
+  @Test
+  public void doClearAcquiresLockForClearWhenHasAnyClientsInterestedIsTrue() {
+    // arrange
+    RegionEventImpl regionEvent = mock(RegionEventImpl.class);
+    when(partitionedRegion.hasAnyClientsInterested()).thenReturn(true);
+    when(partitionedRegion.hasListener()).thenReturn(false);
+    when(regionEvent.clone()).thenReturn(regionEvent);
+
+    partitionedRegionClear = spy(partitionedRegionClear);
+    doNothing().when(partitionedRegionClear).obtainLockForClear(regionEvent);
+
+    // act
+    partitionedRegionClear.doClear(regionEvent, false);
+
+    // assert
+    verify(partitionedRegionClear).obtainLockForClear(regionEvent);
+  }
+
+  @Test
+  public void doClearAcquiresLockForClearWhenHasListenerIsTrue() {
+    // arrange
+    RegionEventImpl regionEvent = mock(RegionEventImpl.class);
+    when(partitionedRegion.hasAnyClientsInterested()).thenReturn(false);
+    when(partitionedRegion.hasListener()).thenReturn(true);
+    when(regionEvent.clone()).thenReturn(regionEvent);
+
+    partitionedRegionClear = spy(partitionedRegionClear);
+    doNothing().when(partitionedRegionClear).obtainLockForClear(regionEvent);
+
+    // act
+    partitionedRegionClear.doClear(regionEvent, false);
+
+    // assert
+    verify(partitionedRegionClear).obtainLockForClear(regionEvent);
+  }
+
+  @Test
+  public void doClearAcquiresLockForClearWhenHasAnyClientsInterestedAndHasListenerAreFalse() {
+    // arrange
+    RegionEventImpl regionEvent = mock(RegionEventImpl.class);
+    when(partitionedRegion.hasAnyClientsInterested()).thenReturn(false);
+    when(partitionedRegion.hasListener()).thenReturn(false);
+    when(regionEvent.clone()).thenReturn(regionEvent);
+
+    partitionedRegionClear = spy(partitionedRegionClear);
+    doNothing().when(partitionedRegionClear).obtainLockForClear(regionEvent);
+
+    // act
+    partitionedRegionClear.doClear(regionEvent, false);
+
+    // assert
+    verify(partitionedRegionClear).obtainLockForClear(regionEvent);
+  }
+
   private Set<BucketRegion> setupBucketRegions(
       PartitionedRegionDataStore dataStore,
       BucketAdvisor bucketAdvisor) {


[geode] 18/22: GEODE-9194: Missing file is causing trouble (#6574)

Posted by ji...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

jinmeiliao pushed a commit to branch feature/GEODE-7665
in repository https://gitbox.apache.org/repos/asf/geode.git

commit d26b867ec141252b585689848112ff1db81ee46e
Author: mhansonp <ha...@vmware.com>
AuthorDate: Tue Jun 8 09:41:32 2021 -0700

    GEODE-9194: Missing file is causing trouble (#6574)
---
 .../META-INF/services/org.springframework.shell.core.CommandMarker       | 1 +
 1 file changed, 1 insertion(+)

diff --git a/geode-gfsh/src/main/resources/META-INF/services/org.springframework.shell.core.CommandMarker b/geode-gfsh/src/main/resources/META-INF/services/org.springframework.shell.core.CommandMarker
index 00ae9b2e03..71b09d2e74 100644
--- a/geode-gfsh/src/main/resources/META-INF/services/org.springframework.shell.core.CommandMarker
+++ b/geode-gfsh/src/main/resources/META-INF/services/org.springframework.shell.core.CommandMarker
@@ -6,6 +6,7 @@ org.apache.geode.management.internal.cli.commands.AlterRegionCommand
 org.apache.geode.management.internal.cli.commands.AlterRuntimeConfigCommand
 org.apache.geode.management.internal.cli.commands.BackupDiskStoreCommand
 org.apache.geode.management.internal.cli.commands.ChangeLogLevelCommand
+org.apache.geode.management.internal.cli.commands.ClearCommand
 org.apache.geode.management.internal.cli.commands.ClearDefinedIndexesCommand
 org.apache.geode.management.internal.cli.commands.CloseDurableClientCommand
 org.apache.geode.management.internal.cli.commands.CloseDurableCQsCommand


[geode] 02/22: GEODE-7674: Clear on PR with lucene index should throw exception (#6317)

Posted by ji...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

jinmeiliao pushed a commit to branch feature/GEODE-7665
in repository https://gitbox.apache.org/repos/asf/geode.git

commit fd886ca93cc0e4e97413dfb45852fc18785cba50
Author: Xiaojian Zhou <ge...@users.noreply.github.com>
AuthorDate: Tue Apr 13 14:21:34 2021 -0700

    GEODE-7674: Clear on PR with lucene index should throw exception (#6317)
---
 .../internal/AsyncEventQueueFactoryImpl.java       |  6 ++++++
 .../asyncqueue/internal/AsyncEventQueueImpl.java   |  5 +++++
 .../org/apache/geode/cache/wan/GatewaySender.java  |  2 ++
 .../internal/cache/PartitionedRegionClear.java     | 11 +++++++++++
 .../internal/cache/wan/AbstractGatewaySender.java  | 12 +++++++++++
 .../cache/wan/GatewaySenderAttributes.java         |  7 +++++++
 .../internal/cache/wan/InternalGatewaySender.java  |  2 ++
 .../internal/cache/PartitionedRegionClearTest.java | 10 ++++++++--
 .../cache/lucene/LuceneIndexCreationDUnitTest.java | 23 ++++++++++++++++++++++
 .../cache/lucene/internal/LuceneIndexImpl.java     |  1 +
 10 files changed, 77 insertions(+), 2 deletions(-)

diff --git a/geode-core/src/main/java/org/apache/geode/cache/asyncqueue/internal/AsyncEventQueueFactoryImpl.java b/geode-core/src/main/java/org/apache/geode/cache/asyncqueue/internal/AsyncEventQueueFactoryImpl.java
index 700cc4baef..089c058d93 100644
--- a/geode-core/src/main/java/org/apache/geode/cache/asyncqueue/internal/AsyncEventQueueFactoryImpl.java
+++ b/geode-core/src/main/java/org/apache/geode/cache/asyncqueue/internal/AsyncEventQueueFactoryImpl.java
@@ -283,6 +283,12 @@ public class AsyncEventQueueFactoryImpl implements AsyncEventQueueFactory {
     return this;
   }
 
+  // keep this method internal
+  public AsyncEventQueueFactory setPartitionedRegionClearUnsupported(boolean status) {
+    gatewaySenderAttributes.partitionedRegionClearUnsupported = status;
+    return this;
+  }
+
   @Override
   public AsyncEventQueueFactory pauseEventDispatching() {
     pauseEventsDispatching = true;
diff --git a/geode-core/src/main/java/org/apache/geode/cache/asyncqueue/internal/AsyncEventQueueImpl.java b/geode-core/src/main/java/org/apache/geode/cache/asyncqueue/internal/AsyncEventQueueImpl.java
index 2e5cfeb388..e9e4f43e50 100644
--- a/geode-core/src/main/java/org/apache/geode/cache/asyncqueue/internal/AsyncEventQueueImpl.java
+++ b/geode-core/src/main/java/org/apache/geode/cache/asyncqueue/internal/AsyncEventQueueImpl.java
@@ -199,6 +199,11 @@ public class AsyncEventQueueImpl implements InternalAsyncEventQueue {
     return sender.isForwardExpirationDestroy();
   }
 
+  // keep this method internal
+  public boolean isPartitionedRegionClearUnsupported() {
+    return sender.isPartitionedRegionClearUnsupported();
+  }
+
   public boolean waitUntilFlushed(long timeout, TimeUnit unit) throws InterruptedException {
     return sender.waitUntilFlushed(timeout, unit);
   }
diff --git a/geode-core/src/main/java/org/apache/geode/cache/wan/GatewaySender.java b/geode-core/src/main/java/org/apache/geode/cache/wan/GatewaySender.java
index 7117f4621e..251aa2f533 100644
--- a/geode-core/src/main/java/org/apache/geode/cache/wan/GatewaySender.java
+++ b/geode-core/src/main/java/org/apache/geode/cache/wan/GatewaySender.java
@@ -102,6 +102,8 @@ public interface GatewaySender {
 
   boolean DEFAULT_FORWARD_EXPIRATION_DESTROY = false;
 
+  boolean DEFAULT_PARTITIONED_REGION_CLEAR_UNSUPPORTED = false;
+
   @Immutable
   OrderPolicy DEFAULT_ORDER_POLICY = OrderPolicy.KEY;
   /**
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionClear.java b/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionClear.java
index 539f682667..569f78c637 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionClear.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionClear.java
@@ -27,6 +27,8 @@ import org.apache.geode.cache.CacheWriterException;
 import org.apache.geode.cache.Operation;
 import org.apache.geode.cache.OperationAbortedException;
 import org.apache.geode.cache.PartitionedRegionPartialClearException;
+import org.apache.geode.cache.asyncqueue.AsyncEventQueue;
+import org.apache.geode.cache.asyncqueue.internal.AsyncEventQueueImpl;
 import org.apache.geode.cache.partition.PartitionRegionHelper;
 import org.apache.geode.distributed.internal.DistributionManager;
 import org.apache.geode.distributed.internal.MembershipListener;
@@ -396,6 +398,15 @@ public class PartitionedRegionClear {
       // Force all primary buckets to be created before clear.
       assignAllPrimaryBuckets();
 
+      for (AsyncEventQueue asyncEventQueue : partitionedRegion.getCache()
+          .getAsyncEventQueues(false)) {
+        if (((AsyncEventQueueImpl) asyncEventQueue).isPartitionedRegionClearUnsupported()) {
+          throw new UnsupportedOperationException(
+              "Clear is not supported on region " + partitionedRegion.getFullPath()
+                  + " because it has a lucene index");
+        }
+      }
+
       // do cacheWrite
       if (cacheWrite) {
         invokeCacheWriter(regionEvent);
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/wan/AbstractGatewaySender.java b/geode-core/src/main/java/org/apache/geode/internal/cache/wan/AbstractGatewaySender.java
index e5fa44a83e..1a4930e106 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/wan/AbstractGatewaySender.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/wan/AbstractGatewaySender.java
@@ -143,6 +143,12 @@ public abstract class AbstractGatewaySender implements InternalGatewaySender, Di
 
   protected boolean forwardExpirationDestroy;
 
+  /**
+   * An attribute to specify if Partitioned region clear operation is unsupported.
+   * Default is false.
+   */
+  protected boolean partitionedRegionClearUnsupported;
+
   protected GatewayEventSubstitutionFilter substitutionFilter;
 
   protected LocatorDiscoveryCallback locatorDiscoveryCallback;
@@ -291,6 +297,7 @@ public abstract class AbstractGatewaySender implements InternalGatewaySender, Di
     }
     isBucketSorted = attrs.isBucketSorted();
     forwardExpirationDestroy = attrs.isForwardExpirationDestroy();
+    partitionedRegionClearUnsupported = attrs.isPartitionedRegionClearUnsupported();
   }
 
   public GatewaySenderAdvisor getSenderAdvisor() {
@@ -387,6 +394,11 @@ public abstract class AbstractGatewaySender implements InternalGatewaySender, Di
     return forwardExpirationDestroy;
   }
 
+  @Override
+  public boolean isPartitionedRegionClearUnsupported() {
+    return this.partitionedRegionClearUnsupported;
+  }
+
   @Override
   public boolean isManualStart() {
     return manualStart;
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/wan/GatewaySenderAttributes.java b/geode-core/src/main/java/org/apache/geode/internal/cache/wan/GatewaySenderAttributes.java
index 74f9c42685..0baa8967da 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/wan/GatewaySenderAttributes.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/wan/GatewaySenderAttributes.java
@@ -89,6 +89,9 @@ public class GatewaySenderAttributes {
 
   private boolean forwardExpirationDestroy = GatewaySender.DEFAULT_FORWARD_EXPIRATION_DESTROY;
 
+  public boolean partitionedRegionClearUnsupported =
+      GatewaySender.DEFAULT_PARTITIONED_REGION_CLEAR_UNSUPPORTED;
+
   private boolean enforceThreadsConnectSameReceiver =
       GatewaySender.DEFAULT_ENFORCE_THREADS_CONNECT_SAME_RECEIVER;
 
@@ -320,6 +323,10 @@ public class GatewaySenderAttributes {
     return forwardExpirationDestroy;
   }
 
+  public boolean isPartitionedRegionClearUnsupported() {
+    return this.partitionedRegionClearUnsupported;
+  }
+
   public boolean getEnforceThreadsConnectSameReceiver() {
     return enforceThreadsConnectSameReceiver;
   }
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/wan/InternalGatewaySender.java b/geode-core/src/main/java/org/apache/geode/internal/cache/wan/InternalGatewaySender.java
index 13e36e7f9b..d71297c448 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/wan/InternalGatewaySender.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/wan/InternalGatewaySender.java
@@ -40,6 +40,8 @@ public interface InternalGatewaySender extends GatewaySender {
 
   boolean isForwardExpirationDestroy();
 
+  boolean isPartitionedRegionClearUnsupported();
+
   boolean getIsMetaQueue();
 
   InternalCache getCache();
diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/PartitionedRegionClearTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/PartitionedRegionClearTest.java
index 3b66e67a59..721d2366be 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/cache/PartitionedRegionClearTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/cache/PartitionedRegionClearTest.java
@@ -42,6 +42,7 @@ import org.mockito.ArgumentCaptor;
 import org.apache.geode.CancelCriterion;
 import org.apache.geode.cache.PartitionedRegionPartialClearException;
 import org.apache.geode.cache.Region;
+import org.apache.geode.cache.asyncqueue.AsyncEventQueue;
 import org.apache.geode.distributed.DistributedLockService;
 import org.apache.geode.distributed.internal.DMStats;
 import org.apache.geode.distributed.internal.DistributionManager;
@@ -56,15 +57,18 @@ import org.apache.geode.internal.serialization.KnownVersion;
 
 public class PartitionedRegionClearTest {
 
+  private GemFireCacheImpl cache;
+  private HashSet<AsyncEventQueue> allAEQs = new HashSet<>();
+  private PartitionedRegionClear partitionedRegionClear;
   private DistributionManager distributionManager;
   private PartitionedRegion partitionedRegion;
   private RegionAdvisor regionAdvisor;
   private InternalDistributedMember internalDistributedMember;
 
-  private PartitionedRegionClear partitionedRegionClear;
-
   @Before
   public void setUp() {
+
+    cache = mock(GemFireCacheImpl.class);
     distributionManager = mock(DistributionManager.class);
     internalDistributedMember = mock(InternalDistributedMember.class);
     partitionedRegion = mock(PartitionedRegion.class);
@@ -73,6 +77,8 @@ public class PartitionedRegionClearTest {
     when(distributionManager.getDistributionManagerId()).thenReturn(internalDistributedMember);
     when(distributionManager.getId()).thenReturn(internalDistributedMember);
     when(internalDistributedMember.getVersion()).thenReturn(KnownVersion.CURRENT);
+    when(partitionedRegion.getCache()).thenReturn(cache);
+    when(cache.getAsyncEventQueues(false)).thenReturn(allAEQs);
     when(partitionedRegion.getDistributionManager()).thenReturn(distributionManager);
     when(partitionedRegion.getName()).thenReturn("prRegion");
     when(partitionedRegion.getRegionAdvisor()).thenReturn(regionAdvisor);
diff --git a/geode-lucene/src/distributedTest/java/org/apache/geode/cache/lucene/LuceneIndexCreationDUnitTest.java b/geode-lucene/src/distributedTest/java/org/apache/geode/cache/lucene/LuceneIndexCreationDUnitTest.java
index 45baa11d1f..4666128cec 100644
--- a/geode-lucene/src/distributedTest/java/org/apache/geode/cache/lucene/LuceneIndexCreationDUnitTest.java
+++ b/geode-lucene/src/distributedTest/java/org/apache/geode/cache/lucene/LuceneIndexCreationDUnitTest.java
@@ -28,7 +28,9 @@ import static org.apache.geode.cache.lucene.test.LuceneTestUtilities.INDEX_NAME;
 import static org.apache.geode.cache.lucene.test.LuceneTestUtilities.REGION_NAME;
 import static org.apache.geode.test.util.ResourceUtils.createTempFileFromResource;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertThrows;
 import static org.junit.Assert.fail;
 
 import java.io.FileInputStream;
@@ -106,6 +108,27 @@ public class LuceneIndexCreationDUnitTest extends LuceneDUnitTest {
     dataStore2.invoke(() -> verifyIndexes(numberOfIndexes));
   }
 
+  @Test
+  public void verifyThrowExceptionWhenClearOnRegionWithLuceneIndex() {
+    SerializableRunnableIF createIndex = getFieldsIndexWithOneField();
+    dataStore1.invoke(() -> {
+      initDataStore(createIndex, RegionTestableType.PARTITION_REDUNDANT);
+      Region<Object, Object> region = cache.getRegion(REGION_NAME);
+      assertNotNull(region);
+      assertThrows(UnsupportedOperationException.class, () -> region.clear());
+    });
+  }
+
+  @Test
+  public void verifyNotThrowExceptionWhenClearOnRegionWithoutLuceneIndex() {
+    dataStore1.invoke(() -> {
+      initDataStore(RegionTestableType.PARTITION_REDUNDANT);
+      Region<Object, Object> region = cache.getRegion(REGION_NAME);
+      assertNotNull(region);
+      region.clear();
+    });
+  }
+
   @Test
   public void verifyThatEmptyListIsOutputWhenThereAreNoIndexesInTheSystem() {
     dataStore1.invoke(() -> verifyIndexList(0));
diff --git a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneIndexImpl.java b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneIndexImpl.java
index 3a232828b7..be2bd58cc4 100644
--- a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneIndexImpl.java
+++ b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneIndexImpl.java
@@ -197,6 +197,7 @@ public abstract class LuceneIndexImpl implements InternalLuceneIndex {
     factory.setDiskStoreName(attributes.getDiskStoreName());
     factory.setDiskSynchronous(true);
     factory.setForwardExpirationDestroy(true);
+    factory.setPartitionedRegionClearUnsupported(true);
     return factory;
   }
 


[geode] 20/22: rebase to develop

Posted by ji...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

jinmeiliao pushed a commit to branch feature/GEODE-7665
in repository https://gitbox.apache.org/repos/asf/geode.git

commit 5f9b9c01415a8000df6f79ac722352d9d399aaf2
Author: Jinmei Liao <ji...@pivotal.io>
AuthorDate: Mon Mar 7 13:25:27 2022 -0800

    rebase to develop
---
 .../org/apache/geode/internal/cache/partitioned/FetchKeysMessage.java  | 3 ++-
 .../java/org/apache/geode/internal/cache/BucketRegionJUnitTest.java    | 2 +-
 .../java/org/apache/geode/internal/cache/PartitionedRegionTest.java    | 2 +-
 3 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/partitioned/FetchKeysMessage.java b/geode-core/src/main/java/org/apache/geode/internal/cache/partitioned/FetchKeysMessage.java
index 597486d69c..ee0eef8bf6 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/partitioned/FetchKeysMessage.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/partitioned/FetchKeysMessage.java
@@ -517,7 +517,8 @@ public class FetchKeysMessage extends PartitionMessage {
      */
     private volatile boolean lastChunkReceived;
 
-    public FetchKeysResponse(InternalDistributedSystem ds, Set<?> recipients) {
+    public FetchKeysResponse(InternalDistributedSystem ds,
+        Set<InternalDistributedMember> recipients) {
       super(ds, recipients);
       returnValue = new HashSet<>();
     }
diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/BucketRegionJUnitTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/BucketRegionJUnitTest.java
index 5b9737fcba..98d41dcac3 100755
--- a/geode-core/src/test/java/org/apache/geode/internal/cache/BucketRegionJUnitTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/cache/BucketRegionJUnitTest.java
@@ -18,8 +18,8 @@ import static java.util.Collections.emptySet;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.CALLS_REAL_METHODS;
 import static org.mockito.Mockito.anyLong;
 import static org.mockito.Mockito.doNothing;
diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/PartitionedRegionTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/PartitionedRegionTest.java
index 4c24e7d8ed..f937775007 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/cache/PartitionedRegionTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/cache/PartitionedRegionTest.java
@@ -28,8 +28,8 @@ import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.anyLong;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.ArgumentMatchers.isNull;
-import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doCallRealMethod;
+import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.mock;


[geode] 15/22: GEODE-9132: Use factory method to avoid escaped reference

Posted by ji...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

jinmeiliao pushed a commit to branch feature/GEODE-7665
in repository https://gitbox.apache.org/repos/asf/geode.git

commit 40715edb97cc7a4e475cb88bd624fba970eb5203
Author: Kirk Lund <kl...@apache.org>
AuthorDate: Thu Apr 22 11:42:09 2021 -0700

    GEODE-9132: Use factory method to avoid escaped reference
---
 .../geode/internal/cache/PartitionedRegion.java    |  2 +-
 .../internal/cache/PartitionedRegionClear.java     | 28 +++++++++++++++++-----
 .../internal/cache/PartitionedRegionClearTest.java |  4 ++--
 3 files changed, 25 insertions(+), 9 deletions(-)

diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegion.java b/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegion.java
index caafc57bc7..8419dc5969 100755
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegion.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegion.java
@@ -319,7 +319,7 @@ public class PartitionedRegion extends LocalRegion
     }
   };
 
-  private final PartitionedRegionClear partitionedRegionClear = new PartitionedRegionClear(this);
+  private final PartitionedRegionClear partitionedRegionClear = PartitionedRegionClear.create(this);
 
   /**
    * Global Region for storing PR config ( PRName->PRConfig). This region would be used to resolve
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionClear.java b/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionClear.java
index b8597c17af..5f4e589d22 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionClear.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionClear.java
@@ -64,7 +64,27 @@ public class PartitionedRegionClear {
   private final AssignBucketsToPartitions assignBucketsToPartitions;
   private final UpdateAttributesProcessorFactory updateAttributesProcessorFactory;
 
-  public PartitionedRegionClear(PartitionedRegion partitionedRegion) {
+  public static PartitionedRegionClear create(PartitionedRegion partitionedRegion) {
+    PartitionedRegionClear partitionedRegionClear = new PartitionedRegionClear(partitionedRegion);
+    partitionedRegionClear.initialize();
+    return partitionedRegionClear;
+  }
+
+  @VisibleForTesting
+  static PartitionedRegionClear create(PartitionedRegion partitionedRegion,
+      DistributedLockService distributedLockService,
+      ColocationLeaderRegionProvider colocationLeaderRegionProvider,
+      AssignBucketsToPartitions assignBucketsToPartitions,
+      UpdateAttributesProcessorFactory updateAttributesProcessorFactory) {
+    PartitionedRegionClear partitionedRegionClear =
+        new PartitionedRegionClear(partitionedRegion, distributedLockService,
+            colocationLeaderRegionProvider, assignBucketsToPartitions,
+            updateAttributesProcessorFactory);
+    partitionedRegionClear.initialize();
+    return partitionedRegionClear;
+  }
+
+  private PartitionedRegionClear(PartitionedRegion partitionedRegion) {
     this(partitionedRegion,
         partitionedRegion.getPartitionedRegionLockService(),
         ColocationHelper::getLeaderRegion,
@@ -72,8 +92,7 @@ public class PartitionedRegionClear {
         pr -> new UpdateAttributesProcessor(pr, true));
   }
 
-  @VisibleForTesting
-  PartitionedRegionClear(PartitionedRegion partitionedRegion,
+  private PartitionedRegionClear(PartitionedRegion partitionedRegion,
       DistributedLockService distributedLockService,
       ColocationLeaderRegionProvider colocationLeaderRegionProvider,
       AssignBucketsToPartitions assignBucketsToPartitions,
@@ -83,9 +102,6 @@ public class PartitionedRegionClear {
     this.colocationLeaderRegionProvider = colocationLeaderRegionProvider;
     this.assignBucketsToPartitions = assignBucketsToPartitions;
     this.updateAttributesProcessorFactory = updateAttributesProcessorFactory;
-
-    // TODO: initialize needs to move out of constructor to prevent escape of reference to 'this'
-    initialize();
   }
 
   private void initialize() {
diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/PartitionedRegionClearTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/PartitionedRegionClearTest.java
index 376fc8ed46..eafb99123c 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/cache/PartitionedRegionClearTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/cache/PartitionedRegionClearTest.java
@@ -115,8 +115,8 @@ public class PartitionedRegionClearTest {
 
     doNothing().when(distributedLockService).unlock(anyString());
 
-    partitionedRegionClear = new PartitionedRegionClear(partitionedRegion, distributedLockService,
-        colocationLeaderRegionProvider, assignBucketsToPartitions,
+    partitionedRegionClear = PartitionedRegionClear.create(partitionedRegion,
+        distributedLockService, colocationLeaderRegionProvider, assignBucketsToPartitions,
         updateAttributesProcessorFactory);
   }
 


[geode] 07/22: GEODE-9132: Undelete unnecessary uses of final

Posted by ji...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

jinmeiliao pushed a commit to branch feature/GEODE-7665
in repository https://gitbox.apache.org/repos/asf/geode.git

commit 4a9e5b6de856d3f21fd0230d7825c145be5959cb
Author: Kirk Lund <kl...@apache.org>
AuthorDate: Thu Apr 15 17:08:52 2021 -0700

    GEODE-9132: Undelete unnecessary uses of final
---
 .../apache/geode/internal/cache/PartitionedRegionClearMessage.java | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionClearMessage.java b/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionClearMessage.java
index 36cdcb6b3d..cd33f780d8 100755
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionClearMessage.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionClearMessage.java
@@ -61,7 +61,8 @@ public class PartitionedRegionClearMessage extends PartitionMessage {
 
   PartitionedRegionClearMessage(Set<InternalDistributedMember> recipients,
       PartitionedRegion partitionedRegion, ReplyProcessor21 replyProcessor21,
-      PartitionedRegionClearMessage.OperationType operationType, RegionEventImpl regionEvent) {
+      PartitionedRegionClearMessage.OperationType operationType,
+      final RegionEventImpl regionEvent) {
     super(recipients, partitionedRegion.getPRId(), replyProcessor21);
     this.partitionedRegion = partitionedRegion;
     this.operationType = operationType;
@@ -234,8 +235,8 @@ public class PartitionedRegionClearMessage extends PartitionMessage {
      * @param distributionManager the distribution manager that is processing the message.
      */
     @Override
-    public void process(DistributionManager distributionManager,
-        ReplyProcessor21 replyProcessor21) {
+    public void process(final DistributionManager distributionManager,
+        final ReplyProcessor21 replyProcessor21) {
       long startTime = getTimestamp();
 
       if (replyProcessor21 == null) {


[geode] 12/22: GEODE-9132: PartitionedRegionClearWithConcurrentOperationsDUnitTest cleanup 2

Posted by ji...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

jinmeiliao pushed a commit to branch feature/GEODE-7665
in repository https://gitbox.apache.org/repos/asf/geode.git

commit 3ffb9c327d619265a38bc88bf552527d88c8d534
Author: Kirk Lund <kl...@apache.org>
AuthorDate: Mon Apr 19 16:16:17 2021 -0700

    GEODE-9132: PartitionedRegionClearWithConcurrentOperationsDUnitTest cleanup 2
---
 ...gionClearWithConcurrentOperationsDUnitTest.java | 782 ++++++++++-----------
 1 file changed, 378 insertions(+), 404 deletions(-)

diff --git a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionClearWithConcurrentOperationsDUnitTest.java b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionClearWithConcurrentOperationsDUnitTest.java
index c9a1e5b86d..b2aacc05fa 100644
--- a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionClearWithConcurrentOperationsDUnitTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionClearWithConcurrentOperationsDUnitTest.java
@@ -72,8 +72,6 @@ public class PartitionedRegionClearWithConcurrentOperationsDUnitTest implements
 
   private static final int BUCKETS = 13;
   private static final String REGION_NAME = "PartitionedRegion";
-  private static final String TEST_CASE_NAME =
-      "[{index}] {method}(Coordinator:{0}, RegionType:{1})";
 
   @Rule
   public DistributedRule distributedRule = new DistributedRule(3);
@@ -84,32 +82,6 @@ public class PartitionedRegionClearWithConcurrentOperationsDUnitTest implements
   private VM server2;
   private VM accessor;
 
-  @SuppressWarnings("unused")
-  static TestVM[] coordinators() {
-    return new TestVM[] {
-        TestVM.SERVER1, TestVM.ACCESSOR
-    };
-  }
-
-  @SuppressWarnings("unused")
-  static Object[] coordinatorsAndRegionTypes() {
-    List<Object[]> parameters = new ArrayList<>();
-    RegionShortcut[] regionShortcuts = regionTypes();
-
-    Arrays.stream(regionShortcuts).forEach(regionShortcut -> {
-      parameters.add(new Object[] {TestVM.SERVER1, regionShortcut});
-      parameters.add(new Object[] {TestVM.ACCESSOR, regionShortcut});
-    });
-
-    return parameters.toArray();
-  }
-
-  private static RegionShortcut[] regionTypes() {
-    return new RegionShortcut[] {
-        RegionShortcut.PARTITION, RegionShortcut.PARTITION_REDUNDANT
-    };
-  }
-
   @Before
   public void setUp() throws Exception {
     server1 = getVM(TestVM.SERVER1.vmNumber);
@@ -117,127 +89,414 @@ public class PartitionedRegionClearWithConcurrentOperationsDUnitTest implements
     accessor = getVM(TestVM.ACCESSOR.vmNumber);
   }
 
-  private void initAccessor(RegionShortcut regionShortcut) {
-    PartitionAttributes<String, String> attrs = new PartitionAttributesFactory<String, String>()
-        .setTotalNumBuckets(BUCKETS)
-        .setLocalMaxMemory(0)
-        .create();
+  /**
+   * The test does the following (clear coordinator and regionType are parametrized):
+   * - Launches one thread per VM to continuously execute removes, puts and gets for a given time.
+   * - Clears the Partition Region continuously every X milliseconds for a given time.
+   * - Asserts that, after the clears have finished, the Region Buckets are consistent across
+   * members.
+   */
+  @Test
+  @Parameters({"SERVER1,PARTITION", "ACCESSOR,PARTITION",
+      "SERVER1,PARTITION_REDUNDANT", "ACCESSOR,PARTITION_REDUNDANT"})
+  @TestCaseName("[{index}] {method}(Coordinator:{0}, RegionType:{1})")
+  public void clearWithConcurrentPutGetRemoveShouldWorkCorrectly(TestVM coordinatorVM,
+      RegionShortcut regionShortcut) throws InterruptedException {
+    parametrizedSetup(regionShortcut);
 
-    cacheRule.getCache().createRegionFactory(regionShortcut)
-        .setPartitionAttributes(attrs)
-        .create(REGION_NAME);
+    // Let all VMs continuously execute puts and gets for 60 seconds.
+    final int workMillis = 60000;
+    final int entries = 15000;
+    List<AsyncInvocation<Void>> asyncInvocationList = Arrays.asList(
+        server1.invokeAsync(() -> executePuts(entries, workMillis)),
+        server2.invokeAsync(() -> executeGets(entries, workMillis)),
+        accessor.invokeAsync(() -> executeRemoves(entries, workMillis)));
 
-  }
+    // Clear the region every second for 60 seconds.
+    getVM(coordinatorVM.vmNumber).invoke(() -> executeClears(workMillis, 1000));
 
-  private void initDataStore(RegionShortcut regionShortcut) {
-    PartitionAttributes<String, String> attrs = new PartitionAttributesFactory<String, String>()
-        .setTotalNumBuckets(BUCKETS)
-        .create();
+    // Let asyncInvocations finish.
+    for (AsyncInvocation<Void> asyncInvocation : asyncInvocationList) {
+      asyncInvocation.await();
+    }
 
-    cacheRule.getCache().createRegionFactory(regionShortcut)
-        .setPartitionAttributes(attrs)
-        .create(REGION_NAME);
+    // Assert Region Buckets are consistent.
+    asList(accessor, server1, server2).forEach(vm -> vm.invoke(this::waitForSilence));
+    accessor.invoke(this::assertRegionBucketsConsistency);
   }
 
-  private void parametrizedSetup(RegionShortcut regionShortcut) {
-    server1.invoke(() -> initDataStore(regionShortcut));
-    server2.invoke(() -> initDataStore(regionShortcut));
-    accessor.invoke(() -> initAccessor(regionShortcut));
-  }
+  /**
+   * The test does the following (clear coordinator and regionType are parametrized):
+   * - Launches two threads per VM to continuously execute putAll and removeAll for a given time.
+   * - Clears the Partition Region continuously every X milliseconds for a given time.
+   * - Asserts that, after the clears have finished, the Region Buckets are consistent across
+   * members.
+   */
+  @Test
+  @Parameters({"SERVER1,PARTITION", "ACCESSOR,PARTITION",
+      "SERVER1,PARTITION_REDUNDANT", "ACCESSOR,PARTITION_REDUNDANT"})
+  @TestCaseName("[{index}] {method}(Coordinator:{0}, RegionType:{1})")
+  public void clearWithConcurrentPutAllRemoveAllShouldWorkCorrectly(TestVM coordinatorVM,
+      RegionShortcut regionShortcut) throws InterruptedException {
+    parametrizedSetup(regionShortcut);
 
-  private void waitForSilence() {
-    DMStats dmStats = cacheRule.getSystem().getDistributionManager().getStats();
-    PartitionedRegion region = (PartitionedRegion) cacheRule.getCache().getRegion(REGION_NAME);
-    PartitionedRegionStats partitionedRegionStats = region.getPrStats();
+    // Let all VMs continuously execute putAll and removeAll for 15 seconds.
+    final int workMillis = 15000;
+    List<AsyncInvocation<Void>> asyncInvocationList = Arrays.asList(
+        server1.invokeAsync(() -> executePutAlls(0, 2000, workMillis)),
+        server1.invokeAsync(() -> executeRemoveAlls(0, 2000, workMillis)),
+        server2.invokeAsync(() -> executePutAlls(2000, 4000, workMillis)),
+        server2.invokeAsync(() -> executeRemoveAlls(2000, 4000, workMillis)),
+        accessor.invokeAsync(() -> executePutAlls(4000, 6000, workMillis)),
+        accessor.invokeAsync(() -> executeRemoveAlls(4000, 6000, workMillis)));
 
-    await().untilAsserted(() -> {
-      assertThat(dmStats.getReplyWaitsInProgress()).isEqualTo(0);
-      assertThat(partitionedRegionStats.getVolunteeringInProgress()).isEqualTo(0);
-      assertThat(partitionedRegionStats.getBucketCreatesInProgress()).isEqualTo(0);
-      assertThat(partitionedRegionStats.getPrimaryTransfersInProgress()).isEqualTo(0);
-      assertThat(partitionedRegionStats.getRebalanceBucketCreatesInProgress()).isEqualTo(0);
-      assertThat(partitionedRegionStats.getRebalancePrimaryTransfersInProgress()).isEqualTo(0);
-    });
+    // Clear the region every half second for 15 seconds.
+    getVM(coordinatorVM.vmNumber).invoke(() -> executeClears(workMillis, 500));
+
+    // Let asyncInvocations finish.
+    for (AsyncInvocation<Void> asyncInvocation : asyncInvocationList) {
+      asyncInvocation.await();
+    }
+
+    // Assert Region Buckets are consistent.
+    asList(accessor, server1, server2).forEach(vm -> vm.invoke(this::waitForSilence));
+    accessor.invoke(this::assertRegionBucketsConsistency);
   }
 
   /**
-   * Populates the region and verifies the data on the selected VMs.
+   * The test does the following (regionType is parametrized):
+   * - Populates the Partition Region.
+   * - Verifies that the entries are synchronized on all members.
+   * - Sets the {@link MemberKiller} as a {@link DistributionMessageObserver} to stop the
+   * coordinator VM while the clear is in progress.
+   * - Clears the Partition Region (at this point the coordinator is restarted).
+   * - Asserts that, after the member joins again, the Region Buckets are consistent.
    */
-  private void populateRegion(VM feeder, int entryCount, Iterable<VM> vms) {
-    feeder.invoke(() -> {
+  @Test
+  @Parameters({"PARTITION", "PARTITION_REDUNDANT"})
+  @TestCaseName("[{index}] {method}(RegionType:{0})")
+  public void clearShouldFailWhenCoordinatorMemberIsBounced(RegionShortcut regionShortcut) {
+    parametrizedSetup(regionShortcut);
+    final int entries = 1000;
+    populateRegion(accessor, entries, asList(accessor, server1, server2));
+
+    // Set the CoordinatorMemberKiller and try to clear the region
+    server1.invoke(() -> {
+      DistributionMessageObserver.setInstance(new MemberKiller(true));
       Region<String, String> region = cacheRule.getCache().getRegion(REGION_NAME);
-      IntStream.range(0, entryCount).forEach(i -> region.put(String.valueOf(i), "Value_" + i));
+      assertThatThrownBy(region::clear)
+          .isInstanceOf(DistributedSystemDisconnectedException.class)
+          .hasCauseInstanceOf(ForcedDisconnectException.class);
     });
 
-    vms.forEach(vm -> vm.invoke(() -> {
-      waitForSilence();
-      Region<String, String> region = cacheRule.getCache().getRegion(REGION_NAME);
+    // Wait for member to get back online and assign all buckets.
+    server1.invoke(() -> {
+      cacheRule.createCache();
+      initDataStore(regionShortcut);
+      await().untilAsserted(
+          () -> assertThat(InternalDistributedSystem.getConnectedInstance()).isNotNull());
+      PartitionRegionHelper.assignBucketsToPartitions(cacheRule.getCache().getRegion(REGION_NAME));
+    });
 
-      IntStream.range(0, entryCount)
-          .forEach(i -> assertThat(region.get(String.valueOf(i))).isEqualTo("Value_" + i));
-    }));
+    // Assert Region Buckets are consistent.
+    asList(accessor, server1, server2).forEach(vm -> vm.invoke(this::waitForSilence));
+    accessor.invoke(this::assertRegionBucketsConsistency);
   }
 
   /**
-   * Asserts that the RegionVersionVectors for both buckets are consistent.
-   *
-   * @param bucketId Id of the bucket to compare.
-   * @param bucketDump1 First bucketDump.
-   * @param bucketDump2 Second bucketDump.
+   * The test does the following (clear coordinator is chosen through parameters):
+   * - Populates the Partition Region.
+   * - Verifies that the entries are synchronized on all members.
+   * - Sets the {@link MemberKiller} as a {@link DistributionMessageObserver} to stop a
+   * non-coordinator VM while the clear is in progress (the member has primary buckets, though, so
+   * participates on the clear operation).
+   * - Launches two threads per VM to continuously execute gets, puts and removes for a given time.
+   * - Clears the Partition Region (at this point the non-coordinator is restarted).
+   * - Asserts that, after the clear has finished, the Region Buckets are consistent across members.
    */
-  private void assertRegionVersionVectorsConsistency(int bucketId, BucketDump bucketDump1,
-      BucketDump bucketDump2) {
-    RegionVersionVector<?> rvv1 = bucketDump1.getRvv();
-    RegionVersionVector<?> rvv2 = bucketDump2.getRvv();
+  @Test
+  @Parameters({"SERVER1", "ACCESSOR"})
+  @TestCaseName("[{index}] {method}(Coordinator:{0})")
+  public void clearOnRedundantPartitionRegionWithConcurrentPutGetRemoveShouldWorkCorrectlyWhenNonCoordinatorMembersAreBounced(
+      TestVM coordinatorVM) throws InterruptedException {
+    parametrizedSetup(RegionShortcut.PARTITION_REDUNDANT);
+    final int entries = 7500;
+    populateRegion(accessor, entries, asList(accessor, server1, server2));
+    server2.invoke(() -> DistributionMessageObserver.setInstance(new MemberKiller(false)));
 
-    if (rvv1 == null) {
-      assertThat(rvv2)
-          .as("Bucket " + bucketId + " has an RVV on member " + bucketDump2.getMember()
-              + ", but does not on member " + bucketDump1.getMember())
-          .isNull();
-    }
+    // Let all VMs (except the one to kill) continuously execute gets, put and removes for 30"
+    final int workMillis = 30000;
+    List<AsyncInvocation<Void>> asyncInvocationList = Arrays.asList(
+        server1.invokeAsync(() -> executeGets(entries, workMillis)),
+        server1.invokeAsync(() -> executePuts(entries, workMillis)),
+        accessor.invokeAsync(() -> executeGets(entries, workMillis)),
+        accessor.invokeAsync(() -> executeRemoves(entries, workMillis)));
 
-    if (rvv2 == null) {
-      assertThat(rvv1)
-          .as("Bucket " + bucketId + " has an RVV on member " + bucketDump1.getMember()
-              + ", but does not on member " + bucketDump2.getMember())
-          .isNull();
-    }
+    // Retry the clear operation on the region until success (server2 will go down, but other
+    // members will eventually become primary for those buckets previously hosted by server2).
+    executeClearWithRetry(getVM(coordinatorVM.vmNumber));
 
-    assertThat(rvv1).isNotNull();
-    assertThat(rvv2).isNotNull();
-    Map<VersionSource<?>, RegionVersionHolder<?>> rvv2Members =
-        new HashMap<>(rvv1.getMemberToVersion());
-    Map<VersionSource<?>, RegionVersionHolder<?>> rvv1Members =
-        new HashMap<>(rvv1.getMemberToVersion());
-    for (Map.Entry<VersionSource<?>, RegionVersionHolder<?>> entry : rvv1Members.entrySet()) {
-      VersionSource<?> memberId = entry.getKey();
-      RegionVersionHolder<?> versionHolder1 = entry.getValue();
-      RegionVersionHolder<?> versionHolder2 = rvv2Members.remove(memberId);
-      assertThat(versionHolder1)
-          .as("RegionVersionVector for bucket " + bucketId + " on member " + bucketDump1.getMember()
-              + " is not consistent with member " + bucketDump2.getMember())
-          .isEqualTo(versionHolder2);
+    // Wait for member to get back online.
+    server2.invoke(() -> {
+      cacheRule.createCache();
+      initDataStore(RegionShortcut.PARTITION_REDUNDANT);
+      await().untilAsserted(
+          () -> assertThat(InternalDistributedSystem.getConnectedInstance()).isNotNull());
+    });
+
+    // Let asyncInvocations finish.
+    for (AsyncInvocation<Void> asyncInvocation : asyncInvocationList) {
+      asyncInvocation.await();
     }
+
+    // Assert Region Buckets are consistent.
+    asList(accessor, server1, server2).forEach(vm -> vm.invoke(this::waitForSilence));
+    accessor.invoke(this::assertRegionBucketsConsistency);
   }
 
   /**
-   * Asserts that the region data is consistent across buckets.
+   * The test does the following (clear coordinator is chosen through parameters):
+   * - Populates the Partition Region.
+   * - Verifies that the entries are synchronized on all members.
+   * - Sets the {@link MemberKiller} as a {@link DistributionMessageObserver} to stop a
+   * non-coordinator VM while the clear is in progress (the member has primary buckets, though, so
+   * participates on the clear operation).
+   * - Launches two threads per VM to continuously execute gets, puts and removes for a given time.
+   * - Clears the Partition Region (at this point the non-coordinator is restarted).
+   * - Asserts that the clear operation failed with PartitionedRegionPartialClearException (primary
+   * buckets on the the restarted members are not available).
    */
-  private void assertRegionBucketsConsistency() throws ForceReattemptException {
-    PartitionedRegion region = (PartitionedRegion) cacheRule.getCache().getRegion(REGION_NAME);
-    // Redundant copies + 1 primary.
-    int expectedCopies = region.getRedundantCopies() + 1;
+  @Test
+  @Parameters({"SERVER1", "ACCESSOR"})
+  @TestCaseName("[{index}] {method}(Coordinator:{0})")
+  public void clearOnNonRedundantPartitionRegionWithConcurrentPutGetRemoveShouldFailWhenNonCoordinatorMembersAreBounced(
+      TestVM coordinatorVM) throws InterruptedException {
+    parametrizedSetup(RegionShortcut.PARTITION);
+    final int entries = 7500;
+    populateRegion(accessor, entries, asList(accessor, server1, server2));
+    server2.invoke(() -> DistributionMessageObserver.setInstance(new MemberKiller(false)));
 
-    for (int bId = 0; bId < BUCKETS; bId++) {
-      final int bucketId = bId;
-      List<BucketDump> bucketDumps = region.getAllBucketEntries(bucketId);
-      assertThat(bucketDumps.size())
-          .as("Bucket " + bucketId + " should have " + expectedCopies + " copies, but has "
-              + bucketDumps.size())
-          .isEqualTo(expectedCopies);
+    // Let all VMs (except the one to kill) continuously execute gets, put and removes for 30"
+    final int workMillis = 30000;
+    List<AsyncInvocation<Void>> asyncInvocationList = Arrays.asList(
+        server1.invokeAsync(() -> executeGets(entries, workMillis)),
+        server1.invokeAsync(() -> executePuts(entries, workMillis)),
+        accessor.invokeAsync(() -> executeGets(entries, workMillis)),
+        accessor.invokeAsync(() -> executeRemoves(entries, workMillis)));
 
-      // Check that all copies of the bucket have the same data.
+    // Clear the region.
+    getVM(coordinatorVM.vmNumber).invoke(() -> {
+      assertThatThrownBy(() -> cacheRule.getCache().getRegion(REGION_NAME).clear())
+          .isInstanceOf(PartitionedRegionPartialClearException.class);
+    });
+
+    // Let asyncInvocations finish.
+    for (AsyncInvocation<Void> asyncInvocation : asyncInvocationList) {
+      asyncInvocation.await();
+    }
+  }
+
+  /**
+   * The test does the following (clear coordinator is chosen through parameters):
+   * - Sets the {@link MemberKiller} as a {@link DistributionMessageObserver} to stop a
+   * non-coordinator VM while the clear is in progress (the member has primary buckets, though, so
+   * participates on the clear operation).
+   * - Launches one thread per VM to continuously execute putAll/removeAll for a given time.
+   * - Clears the Partition Region (at this point the non-coordinator is restarted).
+   * - Asserts that, after the clear has finished, the Region Buckets are consistent across members.
+   */
+  @Test
+  @Parameters({"SERVER1", "ACCESSOR"})
+  @TestCaseName("[{index}] {method}(Coordinator:{0})")
+  public void clearOnRedundantPartitionRegionWithConcurrentPutAllRemoveAllShouldWorkCorrectlyWhenNonCoordinatorMembersAreBounced(
+      TestVM coordinatorVM) throws InterruptedException {
+    parametrizedSetup(RegionShortcut.PARTITION_REDUNDANT);
+    server2.invoke(() -> DistributionMessageObserver.setInstance(new MemberKiller(false)));
+
+    // Let all VMs continuously execute putAll/removeAll for 30 seconds.
+    final int workMillis = 30000;
+    List<AsyncInvocation<Void>> asyncInvocationList = Arrays.asList(
+        server1.invokeAsync(() -> executePutAlls(0, 6000, workMillis)),
+        accessor.invokeAsync(() -> executeRemoveAlls(2000, 4000, workMillis)));
+
+    // Retry the clear operation on the region until success (server2 will go down, but other
+    // members will eventually become primary for those buckets previously hosted by server2).
+    executeClearWithRetry(getVM(coordinatorVM.vmNumber));
+
+    // Wait for member to get back online.
+    server2.invoke(() -> {
+      cacheRule.createCache();
+      initDataStore(RegionShortcut.PARTITION_REDUNDANT);
+      await().untilAsserted(
+          () -> assertThat(InternalDistributedSystem.getConnectedInstance()).isNotNull());
+    });
+
+    // Let asyncInvocations finish.
+    for (AsyncInvocation<Void> asyncInvocation : asyncInvocationList) {
+      asyncInvocation.await();
+    }
+
+    // Assert Region Buckets are consistent.
+    asList(accessor, server1, server2).forEach(vm -> vm.invoke(this::waitForSilence));
+    accessor.invoke(this::assertRegionBucketsConsistency);
+  }
+
+  /**
+   * The test does the following (clear coordinator is chosen through parameters):
+   * - Sets the {@link MemberKiller} as a {@link DistributionMessageObserver} to stop a
+   * non-coordinator VM while the clear is in progress (the member has primary buckets, though, so
+   * participates on the clear operation).
+   * - Launches one thread per VM to continuously execute putAll/removeAll for a given time.
+   * - Clears the Partition Region (at this point the non-coordinator is restarted).
+   * - Asserts that the clear operation failed with PartitionedRegionPartialClearException (primary
+   * buckets on the the restarted members are not available).
+   */
+  @Test
+  @Parameters({"SERVER1", "ACCESSOR"})
+  @TestCaseName("[{index}] {method}(Coordinator:{0})")
+  public void clearOnNonRedundantPartitionRegionWithConcurrentPutAllRemoveAllShouldFailWhenNonCoordinatorMembersAreBounced(
+      TestVM coordinatorVM) throws InterruptedException {
+    parametrizedSetup(RegionShortcut.PARTITION);
+    server2.invoke(() -> DistributionMessageObserver.setInstance(new MemberKiller(false)));
+
+    final int workMillis = 30000;
+    List<AsyncInvocation<Void>> asyncInvocationList = Arrays.asList(
+        server1.invokeAsync(() -> executePutAlls(0, 6000, workMillis)),
+        accessor.invokeAsync(() -> executeRemoveAlls(2000, 4000, workMillis)));
+
+    // Clear the region.
+    getVM(coordinatorVM.vmNumber).invoke(() -> {
+      assertThatThrownBy(() -> cacheRule.getCache().getRegion(REGION_NAME).clear())
+          .isInstanceOf(PartitionedRegionPartialClearException.class);
+    });
+
+    // Let asyncInvocations finish.
+    for (AsyncInvocation<Void> asyncInvocation : asyncInvocationList) {
+      asyncInvocation.await();
+    }
+  }
+
+  private void initAccessor(RegionShortcut regionShortcut) {
+    PartitionAttributes<String, String> attrs = new PartitionAttributesFactory<String, String>()
+        .setTotalNumBuckets(BUCKETS)
+        .setLocalMaxMemory(0)
+        .create();
+
+    cacheRule.getCache().createRegionFactory(regionShortcut)
+        .setPartitionAttributes(attrs)
+        .create(REGION_NAME);
+
+  }
+
+  private void initDataStore(RegionShortcut regionShortcut) {
+    PartitionAttributes<String, String> attrs = new PartitionAttributesFactory<String, String>()
+        .setTotalNumBuckets(BUCKETS)
+        .create();
+
+    cacheRule.getCache().createRegionFactory(regionShortcut)
+        .setPartitionAttributes(attrs)
+        .create(REGION_NAME);
+  }
+
+  private void parametrizedSetup(RegionShortcut regionShortcut) {
+    server1.invoke(() -> initDataStore(regionShortcut));
+    server2.invoke(() -> initDataStore(regionShortcut));
+    accessor.invoke(() -> initAccessor(regionShortcut));
+  }
+
+  private void waitForSilence() {
+    DMStats dmStats = cacheRule.getSystem().getDistributionManager().getStats();
+    PartitionedRegion region = (PartitionedRegion) cacheRule.getCache().getRegion(REGION_NAME);
+    PartitionedRegionStats partitionedRegionStats = region.getPrStats();
+
+    await().untilAsserted(() -> {
+      assertThat(dmStats.getReplyWaitsInProgress()).isEqualTo(0);
+      assertThat(partitionedRegionStats.getVolunteeringInProgress()).isEqualTo(0);
+      assertThat(partitionedRegionStats.getBucketCreatesInProgress()).isEqualTo(0);
+      assertThat(partitionedRegionStats.getPrimaryTransfersInProgress()).isEqualTo(0);
+      assertThat(partitionedRegionStats.getRebalanceBucketCreatesInProgress()).isEqualTo(0);
+      assertThat(partitionedRegionStats.getRebalancePrimaryTransfersInProgress()).isEqualTo(0);
+    });
+  }
+
+  /**
+   * Populates the region and verifies the data on the selected VMs.
+   */
+  private void populateRegion(VM feeder, int entryCount, Iterable<VM> vms) {
+    feeder.invoke(() -> {
+      Region<String, String> region = cacheRule.getCache().getRegion(REGION_NAME);
+      IntStream.range(0, entryCount).forEach(i -> region.put(String.valueOf(i), "Value_" + i));
+    });
+
+    vms.forEach(vm -> vm.invoke(() -> {
+      waitForSilence();
+      Region<String, String> region = cacheRule.getCache().getRegion(REGION_NAME);
+
+      IntStream.range(0, entryCount)
+          .forEach(i -> assertThat(region.get(String.valueOf(i))).isEqualTo("Value_" + i));
+    }));
+  }
+
+  /**
+   * Asserts that the RegionVersionVectors for both buckets are consistent.
+   *
+   * @param bucketId Id of the bucket to compare.
+   * @param bucketDump1 First bucketDump.
+   * @param bucketDump2 Second bucketDump.
+   */
+  private void assertRegionVersionVectorsConsistency(int bucketId, BucketDump bucketDump1,
+      BucketDump bucketDump2) {
+    RegionVersionVector<?> rvv1 = bucketDump1.getRvv();
+    RegionVersionVector<?> rvv2 = bucketDump2.getRvv();
+
+    if (rvv1 == null) {
+      assertThat(rvv2)
+          .as("Bucket " + bucketId + " has an RVV on member " + bucketDump2.getMember()
+              + ", but does not on member " + bucketDump1.getMember())
+          .isNull();
+    }
+
+    if (rvv2 == null) {
+      assertThat(rvv1)
+          .as("Bucket " + bucketId + " has an RVV on member " + bucketDump1.getMember()
+              + ", but does not on member " + bucketDump2.getMember())
+          .isNull();
+    }
+
+    assertThat(rvv1).isNotNull();
+    assertThat(rvv2).isNotNull();
+    Map<VersionSource<?>, RegionVersionHolder<?>> rvv2Members =
+        new HashMap<>(rvv1.getMemberToVersion());
+    Map<VersionSource<?>, RegionVersionHolder<?>> rvv1Members =
+        new HashMap<>(rvv1.getMemberToVersion());
+    for (Map.Entry<VersionSource<?>, RegionVersionHolder<?>> entry : rvv1Members.entrySet()) {
+      VersionSource<?> memberId = entry.getKey();
+      RegionVersionHolder<?> versionHolder1 = entry.getValue();
+      RegionVersionHolder<?> versionHolder2 = rvv2Members.remove(memberId);
+      assertThat(versionHolder1)
+          .as("RegionVersionVector for bucket " + bucketId + " on member " + bucketDump1.getMember()
+              + " is not consistent with member " + bucketDump2.getMember())
+          .isEqualTo(versionHolder2);
+    }
+  }
+
+  /**
+   * Asserts that the region data is consistent across buckets.
+   */
+  private void assertRegionBucketsConsistency() throws ForceReattemptException {
+    PartitionedRegion region = (PartitionedRegion) cacheRule.getCache().getRegion(REGION_NAME);
+    // Redundant copies + 1 primary.
+    int expectedCopies = region.getRedundantCopies() + 1;
+
+    for (int bId = 0; bId < BUCKETS; bId++) {
+      final int bucketId = bId;
+      List<BucketDump> bucketDumps = region.getAllBucketEntries(bucketId);
+      assertThat(bucketDumps.size())
+          .as("Bucket " + bucketId + " should have " + expectedCopies + " copies, but has "
+              + bucketDumps.size())
+          .isEqualTo(expectedCopies);
+
+      // Check that all copies of the bucket have the same data.
       if (bucketDumps.size() > 1) {
         BucketDump firstDump = bucketDumps.get(0);
 
@@ -375,291 +634,6 @@ public class PartitionedRegionClearWithConcurrentOperationsDUnitTest implements
     }
   }
 
-  /**
-   * The test does the following (clear coordinator and regionType are parametrized):
-   * - Launches one thread per VM to continuously execute removes, puts and gets for a given time.
-   * - Clears the Partition Region continuously every X milliseconds for a given time.
-   * - Asserts that, after the clears have finished, the Region Buckets are consistent across
-   * members.
-   */
-  @Test
-  @TestCaseName(TEST_CASE_NAME)
-  @Parameters(method = "coordinatorsAndRegionTypes")
-  public void clearWithConcurrentPutGetRemoveShouldWorkCorrectly(TestVM coordinatorVM,
-      RegionShortcut regionShortcut) throws InterruptedException {
-    parametrizedSetup(regionShortcut);
-
-    // Let all VMs continuously execute puts and gets for 60 seconds.
-    final int workMillis = 60000;
-    final int entries = 15000;
-    List<AsyncInvocation<Void>> asyncInvocationList = Arrays.asList(
-        server1.invokeAsync(() -> executePuts(entries, workMillis)),
-        server2.invokeAsync(() -> executeGets(entries, workMillis)),
-        accessor.invokeAsync(() -> executeRemoves(entries, workMillis)));
-
-    // Clear the region every second for 60 seconds.
-    getVM(coordinatorVM.vmNumber).invoke(() -> executeClears(workMillis, 1000));
-
-    // Let asyncInvocations finish.
-    for (AsyncInvocation<Void> asyncInvocation : asyncInvocationList) {
-      asyncInvocation.await();
-    }
-
-    // Assert Region Buckets are consistent.
-    asList(accessor, server1, server2).forEach(vm -> vm.invoke(this::waitForSilence));
-    accessor.invoke(this::assertRegionBucketsConsistency);
-  }
-
-  /**
-   * The test does the following (clear coordinator and regionType are parametrized):
-   * - Launches two threads per VM to continuously execute putAll and removeAll for a given time.
-   * - Clears the Partition Region continuously every X milliseconds for a given time.
-   * - Asserts that, after the clears have finished, the Region Buckets are consistent across
-   * members.
-   */
-  @Test
-  @TestCaseName(TEST_CASE_NAME)
-  @Parameters(method = "coordinatorsAndRegionTypes")
-  public void clearWithConcurrentPutAllRemoveAllShouldWorkCorrectly(TestVM coordinatorVM,
-      RegionShortcut regionShortcut) throws InterruptedException {
-    parametrizedSetup(regionShortcut);
-
-    // Let all VMs continuously execute putAll and removeAll for 15 seconds.
-    final int workMillis = 15000;
-    List<AsyncInvocation<Void>> asyncInvocationList = Arrays.asList(
-        server1.invokeAsync(() -> executePutAlls(0, 2000, workMillis)),
-        server1.invokeAsync(() -> executeRemoveAlls(0, 2000, workMillis)),
-        server2.invokeAsync(() -> executePutAlls(2000, 4000, workMillis)),
-        server2.invokeAsync(() -> executeRemoveAlls(2000, 4000, workMillis)),
-        accessor.invokeAsync(() -> executePutAlls(4000, 6000, workMillis)),
-        accessor.invokeAsync(() -> executeRemoveAlls(4000, 6000, workMillis)));
-
-    // Clear the region every half second for 15 seconds.
-    getVM(coordinatorVM.vmNumber).invoke(() -> executeClears(workMillis, 500));
-
-    // Let asyncInvocations finish.
-    for (AsyncInvocation<Void> asyncInvocation : asyncInvocationList) {
-      asyncInvocation.await();
-    }
-
-    // Assert Region Buckets are consistent.
-    asList(accessor, server1, server2).forEach(vm -> vm.invoke(this::waitForSilence));
-    accessor.invoke(this::assertRegionBucketsConsistency);
-  }
-
-  /**
-   * The test does the following (regionType is parametrized):
-   * - Populates the Partition Region.
-   * - Verifies that the entries are synchronized on all members.
-   * - Sets the {@link MemberKiller} as a {@link DistributionMessageObserver} to stop the
-   * coordinator VM while the clear is in progress.
-   * - Clears the Partition Region (at this point the coordinator is restarted).
-   * - Asserts that, after the member joins again, the Region Buckets are consistent.
-   */
-  @Test
-  @TestCaseName("[{index}] {method}(RegionType:{0})")
-  @Parameters(method = "regionTypes")
-  public void clearShouldFailWhenCoordinatorMemberIsBounced(RegionShortcut regionShortcut) {
-    parametrizedSetup(regionShortcut);
-    final int entries = 1000;
-    populateRegion(accessor, entries, asList(accessor, server1, server2));
-
-    // Set the CoordinatorMemberKiller and try to clear the region
-    server1.invoke(() -> {
-      DistributionMessageObserver.setInstance(new MemberKiller(true));
-      Region<String, String> region = cacheRule.getCache().getRegion(REGION_NAME);
-      assertThatThrownBy(region::clear)
-          .isInstanceOf(DistributedSystemDisconnectedException.class)
-          .hasCauseInstanceOf(ForcedDisconnectException.class);
-    });
-
-    // Wait for member to get back online and assign all buckets.
-    server1.invoke(() -> {
-      cacheRule.createCache();
-      initDataStore(regionShortcut);
-      await().untilAsserted(
-          () -> assertThat(InternalDistributedSystem.getConnectedInstance()).isNotNull());
-      PartitionRegionHelper.assignBucketsToPartitions(cacheRule.getCache().getRegion(REGION_NAME));
-    });
-
-    // Assert Region Buckets are consistent.
-    asList(accessor, server1, server2).forEach(vm -> vm.invoke(this::waitForSilence));
-    accessor.invoke(this::assertRegionBucketsConsistency);
-  }
-
-  /**
-   * The test does the following (clear coordinator is chosen through parameters):
-   * - Populates the Partition Region.
-   * - Verifies that the entries are synchronized on all members.
-   * - Sets the {@link MemberKiller} as a {@link DistributionMessageObserver} to stop a
-   * non-coordinator VM while the clear is in progress (the member has primary buckets, though, so
-   * participates on the clear operation).
-   * - Launches two threads per VM to continuously execute gets, puts and removes for a given time.
-   * - Clears the Partition Region (at this point the non-coordinator is restarted).
-   * - Asserts that, after the clear has finished, the Region Buckets are consistent across members.
-   */
-  @Test
-  @Parameters(method = "coordinators")
-  @TestCaseName("[{index}] {method}(Coordinator:{0})")
-  public void clearOnRedundantPartitionRegionWithConcurrentPutGetRemoveShouldWorkCorrectlyWhenNonCoordinatorMembersAreBounced(
-      TestVM coordinatorVM) throws InterruptedException {
-    parametrizedSetup(RegionShortcut.PARTITION_REDUNDANT);
-    final int entries = 7500;
-    populateRegion(accessor, entries, asList(accessor, server1, server2));
-    server2.invoke(() -> DistributionMessageObserver.setInstance(new MemberKiller(false)));
-
-    // Let all VMs (except the one to kill) continuously execute gets, put and removes for 30"
-    final int workMillis = 30000;
-    List<AsyncInvocation<Void>> asyncInvocationList = Arrays.asList(
-        server1.invokeAsync(() -> executeGets(entries, workMillis)),
-        server1.invokeAsync(() -> executePuts(entries, workMillis)),
-        accessor.invokeAsync(() -> executeGets(entries, workMillis)),
-        accessor.invokeAsync(() -> executeRemoves(entries, workMillis)));
-
-    // Retry the clear operation on the region until success (server2 will go down, but other
-    // members will eventually become primary for those buckets previously hosted by server2).
-    executeClearWithRetry(getVM(coordinatorVM.vmNumber));
-
-    // Wait for member to get back online.
-    server2.invoke(() -> {
-      cacheRule.createCache();
-      initDataStore(RegionShortcut.PARTITION_REDUNDANT);
-      await().untilAsserted(
-          () -> assertThat(InternalDistributedSystem.getConnectedInstance()).isNotNull());
-    });
-
-    // Let asyncInvocations finish.
-    for (AsyncInvocation<Void> asyncInvocation : asyncInvocationList) {
-      asyncInvocation.await();
-    }
-
-    // Assert Region Buckets are consistent.
-    asList(accessor, server1, server2).forEach(vm -> vm.invoke(this::waitForSilence));
-    accessor.invoke(this::assertRegionBucketsConsistency);
-  }
-
-  /**
-   * The test does the following (clear coordinator is chosen through parameters):
-   * - Populates the Partition Region.
-   * - Verifies that the entries are synchronized on all members.
-   * - Sets the {@link MemberKiller} as a {@link DistributionMessageObserver} to stop a
-   * non-coordinator VM while the clear is in progress (the member has primary buckets, though, so
-   * participates on the clear operation).
-   * - Launches two threads per VM to continuously execute gets, puts and removes for a given time.
-   * - Clears the Partition Region (at this point the non-coordinator is restarted).
-   * - Asserts that the clear operation failed with PartitionedRegionPartialClearException (primary
-   * buckets on the the restarted members are not available).
-   */
-  @Test
-  @Parameters(method = "coordinators")
-  @TestCaseName("[{index}] {method}(Coordinator:{0})")
-  public void clearOnNonRedundantPartitionRegionWithConcurrentPutGetRemoveShouldFailWhenNonCoordinatorMembersAreBounced(
-      TestVM coordinatorVM) throws InterruptedException {
-    parametrizedSetup(RegionShortcut.PARTITION);
-    final int entries = 7500;
-    populateRegion(accessor, entries, asList(accessor, server1, server2));
-    server2.invoke(() -> DistributionMessageObserver.setInstance(new MemberKiller(false)));
-
-    // Let all VMs (except the one to kill) continuously execute gets, put and removes for 30"
-    final int workMillis = 30000;
-    List<AsyncInvocation<Void>> asyncInvocationList = Arrays.asList(
-        server1.invokeAsync(() -> executeGets(entries, workMillis)),
-        server1.invokeAsync(() -> executePuts(entries, workMillis)),
-        accessor.invokeAsync(() -> executeGets(entries, workMillis)),
-        accessor.invokeAsync(() -> executeRemoves(entries, workMillis)));
-
-    // Clear the region.
-    getVM(coordinatorVM.vmNumber).invoke(() -> {
-      assertThatThrownBy(() -> cacheRule.getCache().getRegion(REGION_NAME).clear())
-          .isInstanceOf(PartitionedRegionPartialClearException.class);
-    });
-
-    // Let asyncInvocations finish.
-    for (AsyncInvocation<Void> asyncInvocation : asyncInvocationList) {
-      asyncInvocation.await();
-    }
-  }
-
-  /**
-   * The test does the following (clear coordinator is chosen through parameters):
-   * - Sets the {@link MemberKiller} as a {@link DistributionMessageObserver} to stop a
-   * non-coordinator VM while the clear is in progress (the member has primary buckets, though, so
-   * participates on the clear operation).
-   * - Launches one thread per VM to continuously execute putAll/removeAll for a given time.
-   * - Clears the Partition Region (at this point the non-coordinator is restarted).
-   * - Asserts that, after the clear has finished, the Region Buckets are consistent across members.
-   */
-  @Test
-  @Parameters(method = "coordinators")
-  @TestCaseName("[{index}] {method}(Coordinator:{0})")
-  public void clearOnRedundantPartitionRegionWithConcurrentPutAllRemoveAllShouldWorkCorrectlyWhenNonCoordinatorMembersAreBounced(
-      TestVM coordinatorVM) throws InterruptedException {
-    parametrizedSetup(RegionShortcut.PARTITION_REDUNDANT);
-    server2.invoke(() -> DistributionMessageObserver.setInstance(new MemberKiller(false)));
-
-    // Let all VMs continuously execute putAll/removeAll for 30 seconds.
-    final int workMillis = 30000;
-    List<AsyncInvocation<Void>> asyncInvocationList = Arrays.asList(
-        server1.invokeAsync(() -> executePutAlls(0, 6000, workMillis)),
-        accessor.invokeAsync(() -> executeRemoveAlls(2000, 4000, workMillis)));
-
-    // Retry the clear operation on the region until success (server2 will go down, but other
-    // members will eventually become primary for those buckets previously hosted by server2).
-    executeClearWithRetry(getVM(coordinatorVM.vmNumber));
-
-    // Wait for member to get back online.
-    server2.invoke(() -> {
-      cacheRule.createCache();
-      initDataStore(RegionShortcut.PARTITION_REDUNDANT);
-      await().untilAsserted(
-          () -> assertThat(InternalDistributedSystem.getConnectedInstance()).isNotNull());
-    });
-
-    // Let asyncInvocations finish.
-    for (AsyncInvocation<Void> asyncInvocation : asyncInvocationList) {
-      asyncInvocation.await();
-    }
-
-    // Assert Region Buckets are consistent.
-    asList(accessor, server1, server2).forEach(vm -> vm.invoke(this::waitForSilence));
-    accessor.invoke(this::assertRegionBucketsConsistency);
-  }
-
-  /**
-   * The test does the following (clear coordinator is chosen through parameters):
-   * - Sets the {@link MemberKiller} as a {@link DistributionMessageObserver} to stop a
-   * non-coordinator VM while the clear is in progress (the member has primary buckets, though, so
-   * participates on the clear operation).
-   * - Launches one thread per VM to continuously execute putAll/removeAll for a given time.
-   * - Clears the Partition Region (at this point the non-coordinator is restarted).
-   * - Asserts that the clear operation failed with PartitionedRegionPartialClearException (primary
-   * buckets on the the restarted members are not available).
-   */
-  @Test
-  @Parameters(method = "coordinators")
-  @TestCaseName("[{index}] {method}(Coordinator:{0})")
-  public void clearOnNonRedundantPartitionRegionWithConcurrentPutAllRemoveAllShouldFailWhenNonCoordinatorMembersAreBounced(
-      TestVM coordinatorVM) throws InterruptedException {
-    parametrizedSetup(RegionShortcut.PARTITION);
-    server2.invoke(() -> DistributionMessageObserver.setInstance(new MemberKiller(false)));
-
-    final int workMillis = 30000;
-    List<AsyncInvocation<Void>> asyncInvocationList = Arrays.asList(
-        server1.invokeAsync(() -> executePutAlls(0, 6000, workMillis)),
-        accessor.invokeAsync(() -> executeRemoveAlls(2000, 4000, workMillis)));
-
-    // Clear the region.
-    getVM(coordinatorVM.vmNumber).invoke(() -> {
-      assertThatThrownBy(() -> cacheRule.getCache().getRegion(REGION_NAME).clear())
-          .isInstanceOf(PartitionedRegionPartialClearException.class);
-    });
-
-    // Let asyncInvocations finish.
-    for (AsyncInvocation<Void> asyncInvocation : asyncInvocationList) {
-      asyncInvocation.await();
-    }
-  }
-
   private enum TestVM {
     ACCESSOR(0), SERVER1(1), SERVER2(2);
 


[geode] 03/22: GEODE-9132: Delete ClearPRMessage

Posted by ji...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

jinmeiliao pushed a commit to branch feature/GEODE-7665
in repository https://gitbox.apache.org/repos/asf/geode.git

commit 198a362392a74192646f63bb4e176171b1c44c87
Author: Kirk Lund <kl...@apache.org>
AuthorDate: Fri Apr 9 15:06:40 2021 -0700

    GEODE-9132: Delete ClearPRMessage
---
 .../org/apache/geode/internal/DSFIDFactory.java    |   1 -
 .../geode/internal/cache/PartitionedRegion.java    |  10 -
 .../internal/cache/partitioned/ClearPRMessage.java | 320 ---------------------
 .../internal/cache/PartitionedRegionTest.java      |  14 -
 .../cache/partitioned/ClearPRMessageTest.java      | 260 -----------------
 5 files changed, 605 deletions(-)

diff --git a/geode-core/src/main/java/org/apache/geode/internal/DSFIDFactory.java b/geode-core/src/main/java/org/apache/geode/internal/DSFIDFactory.java
index a89400ff75..07c396f4d2 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/DSFIDFactory.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/DSFIDFactory.java
@@ -290,7 +290,6 @@ import org.apache.geode.internal.cache.partitioned.BucketCountLoadProbe;
 import org.apache.geode.internal.cache.partitioned.BucketProfileUpdateMessage;
 import org.apache.geode.internal.cache.partitioned.BucketSizeMessage;
 import org.apache.geode.internal.cache.partitioned.BucketSizeMessage.BucketSizeReplyMessage;
-import org.apache.geode.internal.cache.partitioned.ClearPRMessage;
 import org.apache.geode.internal.cache.partitioned.ContainsKeyValueMessage;
 import org.apache.geode.internal.cache.partitioned.ContainsKeyValueMessage.ContainsKeyValueReplyMessage;
 import org.apache.geode.internal.cache.partitioned.CreateBucketMessage;
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegion.java b/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegion.java
index f5d7bfa21b..caafc57bc7 100755
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegion.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegion.java
@@ -181,7 +181,6 @@ import org.apache.geode.internal.cache.execute.PartitionedRegionFunctionResultWa
 import org.apache.geode.internal.cache.execute.RegionFunctionContextImpl;
 import org.apache.geode.internal.cache.execute.ServerToClientFunctionResultSender;
 import org.apache.geode.internal.cache.ha.ThreadIdentifier;
-import org.apache.geode.internal.cache.partitioned.ClearPRMessage;
 import org.apache.geode.internal.cache.partitioned.ContainsKeyValueMessage;
 import org.apache.geode.internal.cache.partitioned.ContainsKeyValueMessage.ContainsKeyValueResponse;
 import org.apache.geode.internal.cache.partitioned.DestroyMessage;
@@ -2215,15 +2214,6 @@ public class PartitionedRegion extends LocalRegion
     throw new UnsupportedOperationException();
   }
 
-  List<ClearPRMessage> createClearPRMessages(EventID eventID) {
-    ArrayList<ClearPRMessage> clearMsgList = new ArrayList<>();
-    for (int bucketId = 0; bucketId < getTotalNumberOfBuckets(); bucketId++) {
-      ClearPRMessage clearPRMessage = new ClearPRMessage(bucketId, eventID);
-      clearMsgList.add(clearPRMessage);
-    }
-    return clearMsgList;
-  }
-
   @Override
   void basicLocalClear(RegionEventImpl event) {
     throw new UnsupportedOperationException();
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/partitioned/ClearPRMessage.java b/geode-core/src/main/java/org/apache/geode/internal/cache/partitioned/ClearPRMessage.java
deleted file mode 100644
index 2603b785ff..0000000000
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/partitioned/ClearPRMessage.java
+++ /dev/null
@@ -1,320 +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.internal.cache.partitioned;
-
-import java.io.DataInput;
-import java.io.DataOutput;
-import java.io.IOException;
-import java.util.Collections;
-import java.util.Set;
-
-import org.apache.logging.log4j.Logger;
-
-import org.apache.geode.DataSerializer;
-import org.apache.geode.annotations.VisibleForTesting;
-import org.apache.geode.cache.CacheException;
-import org.apache.geode.cache.Operation;
-import org.apache.geode.cache.persistence.PartitionOfflineException;
-import org.apache.geode.distributed.DistributedMember;
-import org.apache.geode.distributed.internal.ClusterDistributionManager;
-import org.apache.geode.distributed.internal.DirectReplyProcessor;
-import org.apache.geode.distributed.internal.DistributionManager;
-import org.apache.geode.distributed.internal.InternalDistributedSystem;
-import org.apache.geode.distributed.internal.ReplyException;
-import org.apache.geode.distributed.internal.ReplyMessage;
-import org.apache.geode.distributed.internal.ReplyProcessor21;
-import org.apache.geode.distributed.internal.ReplySender;
-import org.apache.geode.distributed.internal.membership.InternalDistributedMember;
-import org.apache.geode.internal.Assert;
-import org.apache.geode.internal.InternalDataSerializer;
-import org.apache.geode.internal.NanoTimer;
-import org.apache.geode.internal.cache.BucketRegion;
-import org.apache.geode.internal.cache.EventID;
-import org.apache.geode.internal.cache.ForceReattemptException;
-import org.apache.geode.internal.cache.PartitionedRegion;
-import org.apache.geode.internal.cache.RegionEventImpl;
-import org.apache.geode.internal.logging.log4j.LogMarker;
-import org.apache.geode.internal.serialization.DeserializationContext;
-import org.apache.geode.internal.serialization.SerializationContext;
-import org.apache.geode.logging.internal.log4j.api.LogService;
-
-public class ClearPRMessage extends PartitionMessageWithDirectReply {
-  private static final Logger logger = LogService.getLogger();
-
-  private Integer bucketId;
-
-  private EventID eventID;
-
-  public static final String BUCKET_NON_PRIMARY_MESSAGE =
-      "The bucket region on target member is no longer primary";
-  public static final String EXCEPTION_THROWN_DURING_CLEAR_OPERATION =
-      "An exception was thrown during the local clear operation: ";
-
-  /**
-   * state from operateOnRegion that must be preserved for transmission from the waiting pool
-   */
-  transient boolean result = false;
-
-  /**
-   * Empty constructor to satisfy {@link DataSerializer}requirements
-   */
-  public ClearPRMessage() {}
-
-  public ClearPRMessage(int bucketId, EventID eventID) {
-    this.bucketId = bucketId;
-    this.eventID = eventID;
-  }
-
-  public void initMessage(PartitionedRegion region, Set<InternalDistributedMember> recipients,
-      DirectReplyProcessor replyProcessor) {
-    this.resetRecipients();
-    if (recipients != null) {
-      setRecipients(recipients);
-    }
-    this.regionId = region.getPRId();
-    this.processor = replyProcessor;
-    this.processorId = replyProcessor == null ? 0 : replyProcessor.getProcessorId();
-    if (replyProcessor != null) {
-      replyProcessor.enableSevereAlertProcessing();
-    }
-  }
-
-  public ClearResponse send(DistributedMember recipient, PartitionedRegion region)
-      throws ForceReattemptException {
-    Set<InternalDistributedMember> recipients =
-        Collections.singleton((InternalDistributedMember) recipient);
-    ClearResponse clearResponse = new ClearResponse(region.getSystem(), recipients);
-    initMessage(region, recipients, clearResponse);
-    if (logger.isDebugEnabled()) {
-      logger.debug("ClearPRMessage.send: recipient is {}, msg is {}", recipient, this);
-    }
-
-    Set<InternalDistributedMember> failures = region.getDistributionManager().putOutgoing(this);
-    if (failures != null && failures.size() > 0) {
-      throw new ForceReattemptException("Failed sending <" + this + "> due to " + failures);
-    }
-    return clearResponse;
-  }
-
-  @Override
-  public int getDSFID() {
-    return PR_CLEAR_MESSAGE;
-  }
-
-  @Override
-  public void toData(DataOutput out, SerializationContext context) throws IOException {
-    super.toData(out, context);
-    if (bucketId == null) {
-      InternalDataSerializer.writeSignedVL(-1, out);
-    } else {
-      InternalDataSerializer.writeSignedVL(bucketId, out);
-    }
-    DataSerializer.writeObject(this.eventID, out);
-  }
-
-  @Override
-  public void fromData(DataInput in, DeserializationContext context)
-      throws IOException, ClassNotFoundException {
-    super.fromData(in, context);
-    this.bucketId = (int) InternalDataSerializer.readSignedVL(in);
-    this.eventID = (EventID) DataSerializer.readObject(in);
-  }
-
-  @Override
-  public EventID getEventID() {
-    return null;
-  }
-
-  /**
-   * This method is called upon receipt and make the desired changes to the PartitionedRegion Note:
-   * It is very important that this message does NOT cause any deadlocks as the sender will wait
-   * indefinitely for the acknowledgement
-   */
-  @Override
-  @VisibleForTesting
-  protected boolean operateOnPartitionedRegion(ClusterDistributionManager distributionManager,
-      PartitionedRegion region, long startTime) {
-    try {
-      this.result = doLocalClear(region);
-    } catch (ForceReattemptException ex) {
-      sendReply(getSender(), getProcessorId(), distributionManager, new ReplyException(ex), region,
-          startTime);
-      return false;
-    }
-    return this.result;
-  }
-
-  public Integer getBucketId() {
-    return this.bucketId;
-  }
-
-  public boolean doLocalClear(PartitionedRegion region)
-      throws ForceReattemptException {
-    // Retrieve local bucket region which matches target bucketId
-    BucketRegion bucketRegion =
-        region.getDataStore().getInitializedBucketForId(null, this.bucketId);
-
-    boolean lockedForPrimary = bucketRegion.doLockForPrimary(false);
-    // Check if we obtained primary lock, throw exception if not
-    if (!lockedForPrimary) {
-      throw new ForceReattemptException(BUCKET_NON_PRIMARY_MESSAGE);
-    }
-    try {
-      RegionEventImpl regionEvent = new RegionEventImpl(bucketRegion, Operation.REGION_CLEAR, null,
-          false, region.getMyId(), eventID);
-      bucketRegion.cmnClearRegion(regionEvent, false, true);
-    } catch (PartitionOfflineException poe) {
-      logger.info(
-          "All members holding data for bucket {} are offline, no more retries will be attempted",
-          this.bucketId,
-          poe);
-      throw poe;
-    } catch (Exception ex) {
-      throw new ForceReattemptException(
-          EXCEPTION_THROWN_DURING_CLEAR_OPERATION + ex.getClass().getName(), ex);
-    } finally {
-      bucketRegion.doUnlockForPrimary();
-    }
-
-    return true;
-  }
-
-  @Override
-  public boolean canStartRemoteTransaction() {
-    return false;
-  }
-
-  @Override
-  protected void sendReply(InternalDistributedMember member, int processorId,
-      DistributionManager distributionManager, ReplyException ex,
-      PartitionedRegion partitionedRegion, long startTime) {
-    if (partitionedRegion != null) {
-      if (startTime > 0) {
-        partitionedRegion.getPrStats().endPartitionMessagesProcessing(startTime);
-      }
-    }
-    ClearReplyMessage.send(member, processorId, getReplySender(distributionManager), this.result,
-        ex);
-  }
-
-  @Override
-  protected void appendFields(StringBuilder buff) {
-    super.appendFields(buff);
-    buff.append("; bucketId=").append(this.bucketId);
-  }
-
-  public static class ClearReplyMessage extends ReplyMessage {
-    @Override
-    public boolean getInlineProcess() {
-      return true;
-    }
-
-    /**
-     * Empty constructor to conform to DataSerializable interface
-     */
-    @SuppressWarnings("unused")
-    public ClearReplyMessage() {}
-
-    private ClearReplyMessage(int processorId, boolean result, ReplyException ex) {
-      super();
-      setProcessorId(processorId);
-      if (ex != null) {
-        setException(ex);
-      } else {
-        setReturnValue(result);
-      }
-    }
-
-    /**
-     * Send an ack
-     */
-    public static void send(InternalDistributedMember recipient, int processorId,
-        ReplySender replySender,
-        boolean result, ReplyException ex) {
-      Assert.assertNotNull(recipient, "ClearReplyMessage recipient was NULL.");
-      ClearReplyMessage message = new ClearReplyMessage(processorId, result, ex);
-      message.setRecipient(recipient);
-      replySender.putOutgoing(message);
-    }
-
-    /**
-     * Processes this message. This method is invoked by the receiver of the message.
-     *
-     * @param distributionManager the distribution manager that is processing the message.
-     */
-    @Override
-    public void process(final DistributionManager distributionManager,
-        final ReplyProcessor21 replyProcessor) {
-      final long startTime = getTimestamp();
-      if (replyProcessor == null) {
-        if (logger.isTraceEnabled(LogMarker.DM_VERBOSE)) {
-          logger.trace(LogMarker.DM_VERBOSE, "{}: processor not found", this);
-        }
-        return;
-      }
-      if (replyProcessor instanceof ClearResponse) {
-        ((ClearResponse) replyProcessor).setResponse(this);
-      }
-      replyProcessor.process(this);
-
-      if (logger.isTraceEnabled(LogMarker.DM_VERBOSE)) {
-        logger.trace(LogMarker.DM_VERBOSE, "{} processed {}", replyProcessor, this);
-      }
-      distributionManager.getStats().incReplyMessageTime(NanoTimer.getTime() - startTime);
-    }
-
-    @Override
-    public int getDSFID() {
-      return PR_CLEAR_REPLY_MESSAGE;
-    }
-
-    @Override
-    public String toString() {
-      StringBuilder stringBuilder = new StringBuilder(super.toString());
-      stringBuilder.append(" returnValue=");
-      stringBuilder.append(getReturnValue());
-      return stringBuilder.toString();
-    }
-  }
-
-  /**
-   * A processor to capture the value returned by {@link ClearPRMessage}
-   */
-  public static class ClearResponse extends PartitionResponse {
-    private volatile boolean returnValue;
-
-    public ClearResponse(InternalDistributedSystem distributedSystem,
-        Set<InternalDistributedMember> recipients) {
-      super(distributedSystem, recipients, false);
-    }
-
-    public void setResponse(ClearReplyMessage response) {
-      if (response.getException() == null) {
-        this.returnValue = (boolean) response.getReturnValue();
-      }
-    }
-
-    /**
-     * @return the result of the remote clear operation
-     * @throws ForceReattemptException if the peer is no longer available
-     * @throws CacheException if the peer generates an error
-     */
-    public boolean waitForResult() throws CacheException, ForceReattemptException {
-      waitForCacheException();
-      return this.returnValue;
-    }
-  }
-}
diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/PartitionedRegionTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/PartitionedRegionTest.java
index 3f958f8171..e952d4328b 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/cache/PartitionedRegionTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/cache/PartitionedRegionTest.java
@@ -42,7 +42,6 @@ import static org.mockito.quality.Strictness.STRICT_STUBS;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
-import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
@@ -251,19 +250,6 @@ public class PartitionedRegionTest {
     spyPartitionedRegion.clear();
   }
 
-  @Test
-  public void createClearPRMessagesShouldCreateMessagePerBucket() {
-    PartitionedRegion spyPartitionedRegion = spy(partitionedRegion);
-    RegionEventImpl regionEvent =
-        new RegionEventImpl(spyPartitionedRegion, Operation.REGION_CLEAR, null, false,
-            spyPartitionedRegion.getMyId(), true);
-    when(spyPartitionedRegion.getTotalNumberOfBuckets()).thenReturn(3);
-    EventID eventID = new EventID(spyPartitionedRegion.getCache().getDistributedSystem());
-    List<ClearPRMessage> msgs = spyPartitionedRegion.createClearPRMessages(eventID);
-    assertThat(msgs.size()).isEqualTo(3);
-  }
-
-
   @Test
   public void getBucketNodeForReadOrWriteReturnsPrimaryNodeForRegisterInterest() {
     // ARRANGE
diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/partitioned/ClearPRMessageTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/partitioned/ClearPRMessageTest.java
deleted file mode 100644
index acdd4fc368..0000000000
--- a/geode-core/src/test/java/org/apache/geode/internal/cache/partitioned/ClearPRMessageTest.java
+++ /dev/null
@@ -1,260 +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.internal.cache.partitioned;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.assertThatThrownBy;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyBoolean;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.anyLong;
-import static org.mockito.ArgumentMatchers.notNull;
-import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
-import static org.mockito.Mockito.doNothing;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.doThrow;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import org.junit.Before;
-import org.junit.Test;
-
-import org.apache.geode.distributed.internal.ClusterDistributionManager;
-import org.apache.geode.distributed.internal.DMStats;
-import org.apache.geode.distributed.internal.DistributionManager;
-import org.apache.geode.distributed.internal.ReplyException;
-import org.apache.geode.distributed.internal.ReplySender;
-import org.apache.geode.distributed.internal.membership.InternalDistributedMember;
-import org.apache.geode.internal.cache.BucketRegion;
-import org.apache.geode.internal.cache.ForceReattemptException;
-import org.apache.geode.internal.cache.PartitionedRegion;
-import org.apache.geode.internal.cache.PartitionedRegionDataStore;
-import org.apache.geode.internal.cache.PartitionedRegionStats;
-import org.apache.geode.internal.cache.RegionEventImpl;
-
-public class ClearPRMessageTest {
-
-  ClearPRMessage message;
-  PartitionedRegion region;
-  PartitionedRegionDataStore dataStore;
-  BucketRegion bucketRegion;
-
-  @Before
-  public void setup() throws ForceReattemptException {
-    message = spy(new ClearPRMessage());
-    InternalDistributedMember member = mock(InternalDistributedMember.class);
-    region = mock(PartitionedRegion.class, RETURNS_DEEP_STUBS);
-    dataStore = mock(PartitionedRegionDataStore.class);
-    when(region.getDataStore()).thenReturn(dataStore);
-    when(region.getFullPath()).thenReturn("/test");
-    bucketRegion = mock(BucketRegion.class);
-    when(dataStore.getInitializedBucketForId(any(), any())).thenReturn(bucketRegion);
-    RegionEventImpl bucketRegionEventImpl = mock(RegionEventImpl.class);
-  }
-
-  @Test
-  public void doLocalClearThrowsExceptionWhenBucketIsNotPrimaryAtFirstCheck() {
-    when(bucketRegion.isPrimary()).thenReturn(false);
-
-    assertThatThrownBy(() -> message.doLocalClear(region))
-        .isInstanceOf(ForceReattemptException.class)
-        .hasMessageContaining(ClearPRMessage.BUCKET_NON_PRIMARY_MESSAGE);
-  }
-
-  @Test
-  public void doLocalClearThrowsExceptionWhenLockCannotBeObtained() {
-    when(bucketRegion.doLockForPrimary(false)).thenReturn(false);
-
-    assertThatThrownBy(() -> message.doLocalClear(region))
-        .isInstanceOf(ForceReattemptException.class)
-        .hasMessageContaining(ClearPRMessage.BUCKET_NON_PRIMARY_MESSAGE);
-  }
-
-  @Test
-  public void doLocalClearThrowsForceReattemptExceptionWhenAnExceptionIsThrownDuringClearOperation() {
-    NullPointerException exception = new NullPointerException("Error encountered");
-    doThrow(exception).when(bucketRegion).cmnClearRegion(any(), anyBoolean(), anyBoolean());
-
-    when(bucketRegion.doLockForPrimary(false)).thenReturn(true);
-
-    assertThatThrownBy(() -> message.doLocalClear(region))
-        .isInstanceOf(ForceReattemptException.class)
-        .hasMessageContaining(ClearPRMessage.EXCEPTION_THROWN_DURING_CLEAR_OPERATION);
-
-    // Confirm that cmnClearRegion was called
-    verify(bucketRegion, times(1)).cmnClearRegion(any(), anyBoolean(), anyBoolean());
-  }
-
-  @Test
-  public void doLocalClearInvokesCmnClearRegionWhenBucketIsPrimaryAndLockIsObtained()
-      throws ForceReattemptException {
-
-    // Be primary on the first check, then be not primary on the second check
-    when(bucketRegion.doLockForPrimary(false)).thenReturn(true);
-    assertThat(message.doLocalClear(region)).isTrue();
-
-    // Confirm that cmnClearRegion was called
-    verify(bucketRegion, times(1)).cmnClearRegion(any(), anyBoolean(), anyBoolean());
-  }
-
-  @Test
-  public void initMessageSetsReplyProcessorCorrectlyWithDefinedReplyProcessor() {
-    InternalDistributedMember sender = mock(InternalDistributedMember.class);
-
-    Set<InternalDistributedMember> recipients = new HashSet<>();
-    recipients.add(sender);
-
-    ClearPRMessage.ClearResponse mockProcessor = mock(ClearPRMessage.ClearResponse.class);
-    int mockProcessorId = 5;
-    when(mockProcessor.getProcessorId()).thenReturn(mockProcessorId);
-
-    message.initMessage(region, recipients, mockProcessor);
-
-    verify(mockProcessor, times(1)).enableSevereAlertProcessing();
-    assertThat(message.getProcessorId()).isEqualTo(mockProcessorId);
-  }
-
-  @Test
-  public void initMessageSetsProcessorIdToZeroWithNullProcessor() {
-    message.initMessage(region, null, null);
-
-    assertThat(message.getProcessorId()).isEqualTo(0);
-  }
-
-  @Test
-  public void sendThrowsExceptionIfPutOutgoingMethodReturnsNonNullSetOfFailures() {
-    InternalDistributedMember recipient = mock(InternalDistributedMember.class);
-
-    DistributionManager distributionManager = mock(DistributionManager.class);
-    when(region.getDistributionManager()).thenReturn(distributionManager);
-
-    doNothing().when(message).initMessage(any(), any(), any());
-    Set<InternalDistributedMember> failures = new HashSet<>();
-    failures.add(recipient);
-
-    when(distributionManager.putOutgoing(message)).thenReturn(failures);
-
-    assertThatThrownBy(() -> message.send(recipient, region))
-        .isInstanceOf(ForceReattemptException.class)
-        .hasMessageContaining("Failed sending <" + message + ">");
-  }
-
-  @SuppressWarnings("ResultOfMethodCallIgnored")
-  @Test
-  public void operateOnPartitionedRegionCallsSendReplyWithNoExceptionWhenDoLocalClearSucceeds()
-      throws ForceReattemptException {
-    ClusterDistributionManager distributionManager = mock(ClusterDistributionManager.class);
-    InternalDistributedMember sender = mock(InternalDistributedMember.class);
-    int processorId = 1000;
-    int startTime = 0;
-
-    doReturn(0).when(message).getBucketId();
-    doReturn(true).when(message).doLocalClear(region);
-    doReturn(sender).when(message).getSender();
-    doReturn(processorId).when(message).getProcessorId();
-
-    // We don't want to deal with mocking the behavior of sendReply() in this test, so we mock it to
-    // do nothing and verify later that it was called with proper input
-    doNothing().when(message).sendReply(any(), anyInt(), any(), any(), any(), anyLong());
-
-    message.operateOnPartitionedRegion(distributionManager, region, startTime);
-    assertThat(message.result).isTrue();
-
-    verify(message, times(0)).sendReply(sender, processorId, distributionManager, null, region,
-        startTime);
-  }
-
-  @SuppressWarnings("ResultOfMethodCallIgnored")
-  @Test
-  public void operateOnPartitionedRegionCallsSendReplyWithExceptionWhenDoLocalClearFailsWithException()
-      throws ForceReattemptException {
-    ClusterDistributionManager distributionManager = mock(ClusterDistributionManager.class);
-    InternalDistributedMember sender = mock(InternalDistributedMember.class);
-    int processorId = 1000;
-    int startTime = 0;
-    ForceReattemptException exception =
-        new ForceReattemptException(ClearPRMessage.BUCKET_NON_PRIMARY_MESSAGE);
-
-    doReturn(0).when(message).getBucketId();
-    doThrow(exception).when(message).doLocalClear(region);
-    doReturn(sender).when(message).getSender();
-    doReturn(processorId).when(message).getProcessorId();
-
-    // We don't want to deal with mocking the behavior of sendReply() in this test, so we mock it to
-    // do nothing and verify later that it was called with proper input
-    doNothing().when(message).sendReply(any(), anyInt(), any(), any(), any(), anyLong());
-
-    message.operateOnPartitionedRegion(distributionManager, region, startTime);
-
-    verify(message, times(1)).sendReply(any(), anyInt(), any(), notNull(), any(), anyLong());
-  }
-
-  @Test
-  public void sendReplyEndsMessageProcessingIfWeHaveARegionAndHaveStartedProcessing() {
-    DistributionManager distributionManager = mock(DistributionManager.class);
-    InternalDistributedMember recipient = mock(InternalDistributedMember.class);
-    PartitionedRegionStats partitionedRegionStats = mock(PartitionedRegionStats.class);
-    when(region.getPrStats()).thenReturn(partitionedRegionStats);
-
-    int processorId = 1000;
-    int startTime = 10000;
-    ReplyException exception = new ReplyException(ClearPRMessage.BUCKET_NON_PRIMARY_MESSAGE);
-
-    ReplySender replySender = mock(ReplySender.class);
-    doReturn(replySender).when(message).getReplySender(distributionManager);
-
-    message.sendReply(recipient, processorId, distributionManager, exception, region, startTime);
-
-    verify(partitionedRegionStats, times(1)).endPartitionMessagesProcessing(startTime);
-  }
-
-  @Test
-  public void sendReplyDoesNotEndMessageProcessingIfStartTimeIsZero() {
-    DistributionManager distributionManager = mock(DistributionManager.class);
-    InternalDistributedMember recipient = mock(InternalDistributedMember.class);
-    PartitionedRegionStats partitionedRegionStats = mock(PartitionedRegionStats.class);
-    when(region.getPrStats()).thenReturn(partitionedRegionStats);
-
-    int processorId = 1000;
-    int startTime = 0;
-    ReplyException exception = new ReplyException(ClearPRMessage.BUCKET_NON_PRIMARY_MESSAGE);
-
-    ReplySender replySender = mock(ReplySender.class);
-    doReturn(replySender).when(message).getReplySender(distributionManager);
-
-    message.sendReply(recipient, processorId, distributionManager, exception, region, startTime);
-
-    verify(partitionedRegionStats, times(0)).endPartitionMessagesProcessing(startTime);
-  }
-
-  @Test
-  public void clearReplyMessageProcessCallsSetResponseIfReplyProcessorIsInstanceOfClearResponse() {
-    DistributionManager distributionManager = mock(DistributionManager.class);
-    DMStats mockStats = mock(DMStats.class);
-    when(distributionManager.getStats()).thenReturn(mockStats);
-    ClearPRMessage.ClearReplyMessage clearReplyMessage = new ClearPRMessage.ClearReplyMessage();
-    ClearPRMessage.ClearResponse mockProcessor = mock(ClearPRMessage.ClearResponse.class);
-
-    clearReplyMessage.process(distributionManager, mockProcessor);
-
-    verify(mockProcessor, times(1)).setResponse(clearReplyMessage);
-  }
-}


[geode] 11/22: GEODE-9132: PartitionedRegionClearWithConcurrentOperationsDUnitTest cleanup 1

Posted by ji...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

jinmeiliao pushed a commit to branch feature/GEODE-7665
in repository https://gitbox.apache.org/repos/asf/geode.git

commit a22e9b504511eb43f77ef1810169e65f00c5417c
Author: Kirk Lund <kl...@apache.org>
AuthorDate: Mon Apr 19 14:38:02 2021 -0700

    GEODE-9132: PartitionedRegionClearWithConcurrentOperationsDUnitTest cleanup 1
---
 ...gionClearWithConcurrentOperationsDUnitTest.java | 97 +++++++++-------------
 1 file changed, 41 insertions(+), 56 deletions(-)

diff --git a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionClearWithConcurrentOperationsDUnitTest.java b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionClearWithConcurrentOperationsDUnitTest.java
index 77537cbda3..c9a1e5b86d 100644
--- a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionClearWithConcurrentOperationsDUnitTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionClearWithConcurrentOperationsDUnitTest.java
@@ -28,11 +28,6 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.ScheduledFuture;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicLong;
 import java.util.stream.IntStream;
 
 import junitparams.JUnitParamsRunner;
@@ -61,7 +56,6 @@ import org.apache.geode.distributed.internal.membership.api.MembershipManagerHel
 import org.apache.geode.internal.cache.versions.RegionVersionHolder;
 import org.apache.geode.internal.cache.versions.RegionVersionVector;
 import org.apache.geode.internal.cache.versions.VersionSource;
-import org.apache.geode.test.awaitility.GeodeAwaitility;
 import org.apache.geode.test.dunit.AsyncInvocation;
 import org.apache.geode.test.dunit.VM;
 import org.apache.geode.test.dunit.rules.CacheRule;
@@ -73,15 +67,16 @@ import org.apache.geode.test.dunit.rules.DistributedRule;
  * added or removed.
  */
 @RunWith(JUnitParamsRunner.class)
+@SuppressWarnings("serial")
 public class PartitionedRegionClearWithConcurrentOperationsDUnitTest implements Serializable {
-  private static final Integer BUCKETS = 13;
+
+  private static final int BUCKETS = 13;
   private static final String REGION_NAME = "PartitionedRegion";
   private static final String TEST_CASE_NAME =
       "[{index}] {method}(Coordinator:{0}, RegionType:{1})";
 
   @Rule
   public DistributedRule distributedRule = new DistributedRule(3);
-
   @Rule
   public CacheRule cacheRule = CacheRule.builder().createCacheInAll().build();
 
@@ -89,22 +84,6 @@ public class PartitionedRegionClearWithConcurrentOperationsDUnitTest implements
   private VM server2;
   private VM accessor;
 
-  private enum TestVM {
-    ACCESSOR(0), SERVER1(1), SERVER2(2);
-
-    final int vmNumber;
-
-    TestVM(int vmNumber) {
-      this.vmNumber = vmNumber;
-    }
-  }
-
-  static RegionShortcut[] regionTypes() {
-    return new RegionShortcut[] {
-        RegionShortcut.PARTITION, RegionShortcut.PARTITION_REDUNDANT
-    };
-  }
-
   @SuppressWarnings("unused")
   static TestVM[] coordinators() {
     return new TestVM[] {
@@ -114,7 +93,7 @@ public class PartitionedRegionClearWithConcurrentOperationsDUnitTest implements
 
   @SuppressWarnings("unused")
   static Object[] coordinatorsAndRegionTypes() {
-    ArrayList<Object[]> parameters = new ArrayList<>();
+    List<Object[]> parameters = new ArrayList<>();
     RegionShortcut[] regionShortcuts = regionTypes();
 
     Arrays.stream(regionShortcuts).forEach(regionShortcut -> {
@@ -125,6 +104,12 @@ public class PartitionedRegionClearWithConcurrentOperationsDUnitTest implements
     return parameters.toArray();
   }
 
+  private static RegionShortcut[] regionTypes() {
+    return new RegionShortcut[] {
+        RegionShortcut.PARTITION, RegionShortcut.PARTITION_REDUNDANT
+    };
+  }
+
   @Before
   public void setUp() throws Exception {
     server1 = getVM(TestVM.SERVER1.vmNumber);
@@ -178,7 +163,7 @@ public class PartitionedRegionClearWithConcurrentOperationsDUnitTest implements
   /**
    * Populates the region and verifies the data on the selected VMs.
    */
-  private void populateRegion(VM feeder, int entryCount, List<VM> vms) {
+  private void populateRegion(VM feeder, int entryCount, Iterable<VM> vms) {
     feeder.invoke(() -> {
       Region<String, String> region = cacheRule.getCache().getRegion(REGION_NAME);
       IntStream.range(0, entryCount).forEach(i -> region.put(String.valueOf(i), "Value_" + i));
@@ -240,14 +225,13 @@ public class PartitionedRegionClearWithConcurrentOperationsDUnitTest implements
    * Asserts that the region data is consistent across buckets.
    */
   private void assertRegionBucketsConsistency() throws ForceReattemptException {
-    List<BucketDump> bucketDumps;
     PartitionedRegion region = (PartitionedRegion) cacheRule.getCache().getRegion(REGION_NAME);
     // Redundant copies + 1 primary.
     int expectedCopies = region.getRedundantCopies() + 1;
 
     for (int bId = 0; bId < BUCKETS; bId++) {
       final int bucketId = bId;
-      bucketDumps = region.getAllBucketEntries(bucketId);
+      List<BucketDump> bucketDumps = region.getAllBucketEntries(bucketId);
       assertThat(bucketDumps.size())
           .as("Bucket " + bucketId + " should have " + expectedCopies + " copies, but has "
               + bucketDumps.size())
@@ -379,26 +363,16 @@ public class PartitionedRegionClearWithConcurrentOperationsDUnitTest implements
 
   /**
    * Continuously execute clear operations on the PartitionedRegion every periodInMillis for the
-   * given
-   * durationInMillis.
+   * given durationInMillis.
    */
-  private void executeClears(final long durationInMillis, final long periodInMillis)
-      throws InterruptedException {
+  private void executeClears(final long durationInMillis, final long periodInMillis) {
     Cache cache = cacheRule.getCache();
-    AtomicLong invocationCount = new AtomicLong(0);
     Region<String, String> region = cache.getRegion(REGION_NAME);
-    Long minimumInvocationCount = (durationInMillis / periodInMillis);
-    ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
-    ScheduledFuture<?> scheduledFuture = executor.scheduleWithFixedDelay(() -> {
+    long minimumInvocationCount = durationInMillis / periodInMillis;
+
+    for (int invocationCount = 0; invocationCount < minimumInvocationCount; invocationCount++) {
       region.clear();
-      invocationCount.incrementAndGet();
-    }, 0, periodInMillis, TimeUnit.MILLISECONDS);
-
-    await().untilAsserted(
-        () -> assertThat(invocationCount.get()).isGreaterThanOrEqualTo(minimumInvocationCount));
-    scheduledFuture.cancel(false);
-    executor.shutdown();
-    executor.awaitTermination(GeodeAwaitility.getTimeout().getSeconds(), TimeUnit.SECONDS);
+    }
   }
 
   /**
@@ -413,11 +387,11 @@ public class PartitionedRegionClearWithConcurrentOperationsDUnitTest implements
   @Parameters(method = "coordinatorsAndRegionTypes")
   public void clearWithConcurrentPutGetRemoveShouldWorkCorrectly(TestVM coordinatorVM,
       RegionShortcut regionShortcut) throws InterruptedException {
-    final int entries = 15000;
-    final int workMillis = 60000;
     parametrizedSetup(regionShortcut);
 
     // Let all VMs continuously execute puts and gets for 60 seconds.
+    final int workMillis = 60000;
+    final int entries = 15000;
     List<AsyncInvocation<Void>> asyncInvocationList = Arrays.asList(
         server1.invokeAsync(() -> executePuts(entries, workMillis)),
         server2.invokeAsync(() -> executeGets(entries, workMillis)),
@@ -448,10 +422,10 @@ public class PartitionedRegionClearWithConcurrentOperationsDUnitTest implements
   @Parameters(method = "coordinatorsAndRegionTypes")
   public void clearWithConcurrentPutAllRemoveAllShouldWorkCorrectly(TestVM coordinatorVM,
       RegionShortcut regionShortcut) throws InterruptedException {
-    final int workMillis = 15000;
     parametrizedSetup(regionShortcut);
 
     // Let all VMs continuously execute putAll and removeAll for 15 seconds.
+    final int workMillis = 15000;
     List<AsyncInvocation<Void>> asyncInvocationList = Arrays.asList(
         server1.invokeAsync(() -> executePutAlls(0, 2000, workMillis)),
         server1.invokeAsync(() -> executeRemoveAlls(0, 2000, workMillis)),
@@ -486,8 +460,8 @@ public class PartitionedRegionClearWithConcurrentOperationsDUnitTest implements
   @TestCaseName("[{index}] {method}(RegionType:{0})")
   @Parameters(method = "regionTypes")
   public void clearShouldFailWhenCoordinatorMemberIsBounced(RegionShortcut regionShortcut) {
-    final int entries = 1000;
     parametrizedSetup(regionShortcut);
+    final int entries = 1000;
     populateRegion(accessor, entries, asList(accessor, server1, server2));
 
     // Set the CoordinatorMemberKiller and try to clear the region
@@ -529,13 +503,13 @@ public class PartitionedRegionClearWithConcurrentOperationsDUnitTest implements
   @TestCaseName("[{index}] {method}(Coordinator:{0})")
   public void clearOnRedundantPartitionRegionWithConcurrentPutGetRemoveShouldWorkCorrectlyWhenNonCoordinatorMembersAreBounced(
       TestVM coordinatorVM) throws InterruptedException {
-    final int entries = 7500;
-    final int workMillis = 30000;
     parametrizedSetup(RegionShortcut.PARTITION_REDUNDANT);
+    final int entries = 7500;
     populateRegion(accessor, entries, asList(accessor, server1, server2));
     server2.invoke(() -> DistributionMessageObserver.setInstance(new MemberKiller(false)));
 
     // Let all VMs (except the one to kill) continuously execute gets, put and removes for 30"
+    final int workMillis = 30000;
     List<AsyncInvocation<Void>> asyncInvocationList = Arrays.asList(
         server1.invokeAsync(() -> executeGets(entries, workMillis)),
         server1.invokeAsync(() -> executePuts(entries, workMillis)),
@@ -581,13 +555,13 @@ public class PartitionedRegionClearWithConcurrentOperationsDUnitTest implements
   @TestCaseName("[{index}] {method}(Coordinator:{0})")
   public void clearOnNonRedundantPartitionRegionWithConcurrentPutGetRemoveShouldFailWhenNonCoordinatorMembersAreBounced(
       TestVM coordinatorVM) throws InterruptedException {
-    final int entries = 7500;
-    final int workMillis = 30000;
     parametrizedSetup(RegionShortcut.PARTITION);
+    final int entries = 7500;
     populateRegion(accessor, entries, asList(accessor, server1, server2));
     server2.invoke(() -> DistributionMessageObserver.setInstance(new MemberKiller(false)));
 
     // Let all VMs (except the one to kill) continuously execute gets, put and removes for 30"
+    final int workMillis = 30000;
     List<AsyncInvocation<Void>> asyncInvocationList = Arrays.asList(
         server1.invokeAsync(() -> executeGets(entries, workMillis)),
         server1.invokeAsync(() -> executePuts(entries, workMillis)),
@@ -620,11 +594,11 @@ public class PartitionedRegionClearWithConcurrentOperationsDUnitTest implements
   @TestCaseName("[{index}] {method}(Coordinator:{0})")
   public void clearOnRedundantPartitionRegionWithConcurrentPutAllRemoveAllShouldWorkCorrectlyWhenNonCoordinatorMembersAreBounced(
       TestVM coordinatorVM) throws InterruptedException {
-    final int workMillis = 30000;
     parametrizedSetup(RegionShortcut.PARTITION_REDUNDANT);
     server2.invoke(() -> DistributionMessageObserver.setInstance(new MemberKiller(false)));
 
     // Let all VMs continuously execute putAll/removeAll for 30 seconds.
+    final int workMillis = 30000;
     List<AsyncInvocation<Void>> asyncInvocationList = Arrays.asList(
         server1.invokeAsync(() -> executePutAlls(0, 6000, workMillis)),
         accessor.invokeAsync(() -> executeRemoveAlls(2000, 4000, workMillis)));
@@ -666,10 +640,10 @@ public class PartitionedRegionClearWithConcurrentOperationsDUnitTest implements
   @TestCaseName("[{index}] {method}(Coordinator:{0})")
   public void clearOnNonRedundantPartitionRegionWithConcurrentPutAllRemoveAllShouldFailWhenNonCoordinatorMembersAreBounced(
       TestVM coordinatorVM) throws InterruptedException {
-    final int workMillis = 30000;
     parametrizedSetup(RegionShortcut.PARTITION);
     server2.invoke(() -> DistributionMessageObserver.setInstance(new MemberKiller(false)));
 
+    final int workMillis = 30000;
     List<AsyncInvocation<Void>> asyncInvocationList = Arrays.asList(
         server1.invokeAsync(() -> executePutAlls(0, 6000, workMillis)),
         accessor.invokeAsync(() -> executeRemoveAlls(2000, 4000, workMillis)));
@@ -686,13 +660,24 @@ public class PartitionedRegionClearWithConcurrentOperationsDUnitTest implements
     }
   }
 
+  private enum TestVM {
+    ACCESSOR(0), SERVER1(1), SERVER2(2);
+
+    final int vmNumber;
+
+    TestVM(int vmNumber) {
+      this.vmNumber = vmNumber;
+    }
+  }
+
   /**
    * Shutdowns a coordinator member while the clear operation is in progress.
    */
-  public static class MemberKiller extends DistributionMessageObserver {
+  private static class MemberKiller extends DistributionMessageObserver {
+
     private final boolean coordinator;
 
-    public MemberKiller(boolean coordinator) {
+    private MemberKiller(boolean coordinator) {
       this.coordinator = coordinator;
     }
 


[geode] 13/22: GEODE-9132: PartitionedRegionClearWithConcurrentOperationsDUnitTest cleanup 3

Posted by ji...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

jinmeiliao pushed a commit to branch feature/GEODE-7665
in repository https://gitbox.apache.org/repos/asf/geode.git

commit b7c5189c2aa939793feca4fdba6a8723828b97b1
Author: Kirk Lund <kl...@apache.org>
AuthorDate: Mon Apr 19 16:42:22 2021 -0700

    GEODE-9132: PartitionedRegionClearWithConcurrentOperationsDUnitTest cleanup 3
---
 ...gionClearWithConcurrentOperationsDUnitTest.java | 99 ++++++++++++----------
 1 file changed, 52 insertions(+), 47 deletions(-)

diff --git a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionClearWithConcurrentOperationsDUnitTest.java b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionClearWithConcurrentOperationsDUnitTest.java
index b2aacc05fa..7ef187fd1f 100644
--- a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionClearWithConcurrentOperationsDUnitTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionClearWithConcurrentOperationsDUnitTest.java
@@ -53,6 +53,7 @@ import org.apache.geode.distributed.internal.DistributionMessage;
 import org.apache.geode.distributed.internal.DistributionMessageObserver;
 import org.apache.geode.distributed.internal.InternalDistributedSystem;
 import org.apache.geode.distributed.internal.membership.api.MembershipManagerHelper;
+import org.apache.geode.internal.cache.PartitionedRegionClearMessage.OperationType;
 import org.apache.geode.internal.cache.versions.RegionVersionHolder;
 import org.apache.geode.internal.cache.versions.RegionVersionVector;
 import org.apache.geode.internal.cache.versions.VersionSource;
@@ -83,10 +84,10 @@ public class PartitionedRegionClearWithConcurrentOperationsDUnitTest implements
   private VM accessor;
 
   @Before
-  public void setUp() throws Exception {
-    server1 = getVM(TestVM.SERVER1.vmNumber);
-    server2 = getVM(TestVM.SERVER2.vmNumber);
-    accessor = getVM(TestVM.ACCESSOR.vmNumber);
+  public void setUp() {
+    server1 = getVM(TestVM.SERVER1.getVmId());
+    server2 = getVM(TestVM.SERVER2.getVmId());
+    accessor = getVM(TestVM.ACCESSOR.getVmId());
   }
 
   /**
@@ -102,7 +103,7 @@ public class PartitionedRegionClearWithConcurrentOperationsDUnitTest implements
   @TestCaseName("[{index}] {method}(Coordinator:{0}, RegionType:{1})")
   public void clearWithConcurrentPutGetRemoveShouldWorkCorrectly(TestVM coordinatorVM,
       RegionShortcut regionShortcut) throws InterruptedException {
-    parametrizedSetup(regionShortcut);
+    createRegions(regionShortcut);
 
     // Let all VMs continuously execute puts and gets for 60 seconds.
     final int workMillis = 60000;
@@ -113,7 +114,7 @@ public class PartitionedRegionClearWithConcurrentOperationsDUnitTest implements
         accessor.invokeAsync(() -> executeRemoves(entries, workMillis)));
 
     // Clear the region every second for 60 seconds.
-    getVM(coordinatorVM.vmNumber).invoke(() -> executeClears(workMillis, 1000));
+    getVM(coordinatorVM.getVmId()).invoke(() -> executeClears(workMillis, 1000));
 
     // Let asyncInvocations finish.
     for (AsyncInvocation<Void> asyncInvocation : asyncInvocationList) {
@@ -138,7 +139,7 @@ public class PartitionedRegionClearWithConcurrentOperationsDUnitTest implements
   @TestCaseName("[{index}] {method}(Coordinator:{0}, RegionType:{1})")
   public void clearWithConcurrentPutAllRemoveAllShouldWorkCorrectly(TestVM coordinatorVM,
       RegionShortcut regionShortcut) throws InterruptedException {
-    parametrizedSetup(regionShortcut);
+    createRegions(regionShortcut);
 
     // Let all VMs continuously execute putAll and removeAll for 15 seconds.
     final int workMillis = 15000;
@@ -151,7 +152,7 @@ public class PartitionedRegionClearWithConcurrentOperationsDUnitTest implements
         accessor.invokeAsync(() -> executeRemoveAlls(4000, 6000, workMillis)));
 
     // Clear the region every half second for 15 seconds.
-    getVM(coordinatorVM.vmNumber).invoke(() -> executeClears(workMillis, 500));
+    getVM(coordinatorVM.getVmId()).invoke(() -> executeClears(workMillis, 500));
 
     // Let asyncInvocations finish.
     for (AsyncInvocation<Void> asyncInvocation : asyncInvocationList) {
@@ -176,7 +177,7 @@ public class PartitionedRegionClearWithConcurrentOperationsDUnitTest implements
   @Parameters({"PARTITION", "PARTITION_REDUNDANT"})
   @TestCaseName("[{index}] {method}(RegionType:{0})")
   public void clearShouldFailWhenCoordinatorMemberIsBounced(RegionShortcut regionShortcut) {
-    parametrizedSetup(regionShortcut);
+    createRegions(regionShortcut);
     final int entries = 1000;
     populateRegion(accessor, entries, asList(accessor, server1, server2));
 
@@ -192,7 +193,7 @@ public class PartitionedRegionClearWithConcurrentOperationsDUnitTest implements
     // Wait for member to get back online and assign all buckets.
     server1.invoke(() -> {
       cacheRule.createCache();
-      initDataStore(regionShortcut);
+      createDataStore(regionShortcut);
       await().untilAsserted(
           () -> assertThat(InternalDistributedSystem.getConnectedInstance()).isNotNull());
       PartitionRegionHelper.assignBucketsToPartitions(cacheRule.getCache().getRegion(REGION_NAME));
@@ -219,7 +220,7 @@ public class PartitionedRegionClearWithConcurrentOperationsDUnitTest implements
   @TestCaseName("[{index}] {method}(Coordinator:{0})")
   public void clearOnRedundantPartitionRegionWithConcurrentPutGetRemoveShouldWorkCorrectlyWhenNonCoordinatorMembersAreBounced(
       TestVM coordinatorVM) throws InterruptedException {
-    parametrizedSetup(RegionShortcut.PARTITION_REDUNDANT);
+    createRegions(RegionShortcut.PARTITION_REDUNDANT);
     final int entries = 7500;
     populateRegion(accessor, entries, asList(accessor, server1, server2));
     server2.invoke(() -> DistributionMessageObserver.setInstance(new MemberKiller(false)));
@@ -234,12 +235,12 @@ public class PartitionedRegionClearWithConcurrentOperationsDUnitTest implements
 
     // Retry the clear operation on the region until success (server2 will go down, but other
     // members will eventually become primary for those buckets previously hosted by server2).
-    executeClearWithRetry(getVM(coordinatorVM.vmNumber));
+    executeClearWithRetry(getVM(coordinatorVM.getVmId()));
 
     // Wait for member to get back online.
     server2.invoke(() -> {
       cacheRule.createCache();
-      initDataStore(RegionShortcut.PARTITION_REDUNDANT);
+      createDataStore(RegionShortcut.PARTITION_REDUNDANT);
       await().untilAsserted(
           () -> assertThat(InternalDistributedSystem.getConnectedInstance()).isNotNull());
     });
@@ -271,7 +272,7 @@ public class PartitionedRegionClearWithConcurrentOperationsDUnitTest implements
   @TestCaseName("[{index}] {method}(Coordinator:{0})")
   public void clearOnNonRedundantPartitionRegionWithConcurrentPutGetRemoveShouldFailWhenNonCoordinatorMembersAreBounced(
       TestVM coordinatorVM) throws InterruptedException {
-    parametrizedSetup(RegionShortcut.PARTITION);
+    createRegions(RegionShortcut.PARTITION);
     final int entries = 7500;
     populateRegion(accessor, entries, asList(accessor, server1, server2));
     server2.invoke(() -> DistributionMessageObserver.setInstance(new MemberKiller(false)));
@@ -285,7 +286,7 @@ public class PartitionedRegionClearWithConcurrentOperationsDUnitTest implements
         accessor.invokeAsync(() -> executeRemoves(entries, workMillis)));
 
     // Clear the region.
-    getVM(coordinatorVM.vmNumber).invoke(() -> {
+    getVM(coordinatorVM.getVmId()).invoke(() -> {
       assertThatThrownBy(() -> cacheRule.getCache().getRegion(REGION_NAME).clear())
           .isInstanceOf(PartitionedRegionPartialClearException.class);
     });
@@ -310,7 +311,7 @@ public class PartitionedRegionClearWithConcurrentOperationsDUnitTest implements
   @TestCaseName("[{index}] {method}(Coordinator:{0})")
   public void clearOnRedundantPartitionRegionWithConcurrentPutAllRemoveAllShouldWorkCorrectlyWhenNonCoordinatorMembersAreBounced(
       TestVM coordinatorVM) throws InterruptedException {
-    parametrizedSetup(RegionShortcut.PARTITION_REDUNDANT);
+    createRegions(RegionShortcut.PARTITION_REDUNDANT);
     server2.invoke(() -> DistributionMessageObserver.setInstance(new MemberKiller(false)));
 
     // Let all VMs continuously execute putAll/removeAll for 30 seconds.
@@ -321,12 +322,12 @@ public class PartitionedRegionClearWithConcurrentOperationsDUnitTest implements
 
     // Retry the clear operation on the region until success (server2 will go down, but other
     // members will eventually become primary for those buckets previously hosted by server2).
-    executeClearWithRetry(getVM(coordinatorVM.vmNumber));
+    executeClearWithRetry(getVM(coordinatorVM.getVmId()));
 
     // Wait for member to get back online.
     server2.invoke(() -> {
       cacheRule.createCache();
-      initDataStore(RegionShortcut.PARTITION_REDUNDANT);
+      createDataStore(RegionShortcut.PARTITION_REDUNDANT);
       await().untilAsserted(
           () -> assertThat(InternalDistributedSystem.getConnectedInstance()).isNotNull());
     });
@@ -356,7 +357,7 @@ public class PartitionedRegionClearWithConcurrentOperationsDUnitTest implements
   @TestCaseName("[{index}] {method}(Coordinator:{0})")
   public void clearOnNonRedundantPartitionRegionWithConcurrentPutAllRemoveAllShouldFailWhenNonCoordinatorMembersAreBounced(
       TestVM coordinatorVM) throws InterruptedException {
-    parametrizedSetup(RegionShortcut.PARTITION);
+    createRegions(RegionShortcut.PARTITION);
     server2.invoke(() -> DistributionMessageObserver.setInstance(new MemberKiller(false)));
 
     final int workMillis = 30000;
@@ -365,7 +366,7 @@ public class PartitionedRegionClearWithConcurrentOperationsDUnitTest implements
         accessor.invokeAsync(() -> executeRemoveAlls(2000, 4000, workMillis)));
 
     // Clear the region.
-    getVM(coordinatorVM.vmNumber).invoke(() -> {
+    getVM(coordinatorVM.getVmId()).invoke(() -> {
       assertThatThrownBy(() -> cacheRule.getCache().getRegion(REGION_NAME).clear())
           .isInstanceOf(PartitionedRegionPartialClearException.class);
     });
@@ -376,7 +377,7 @@ public class PartitionedRegionClearWithConcurrentOperationsDUnitTest implements
     }
   }
 
-  private void initAccessor(RegionShortcut regionShortcut) {
+  private void createAccessor(RegionShortcut regionShortcut) {
     PartitionAttributes<String, String> attrs = new PartitionAttributesFactory<String, String>()
         .setTotalNumBuckets(BUCKETS)
         .setLocalMaxMemory(0)
@@ -388,7 +389,7 @@ public class PartitionedRegionClearWithConcurrentOperationsDUnitTest implements
 
   }
 
-  private void initDataStore(RegionShortcut regionShortcut) {
+  private void createDataStore(RegionShortcut regionShortcut) {
     PartitionAttributes<String, String> attrs = new PartitionAttributesFactory<String, String>()
         .setTotalNumBuckets(BUCKETS)
         .create();
@@ -398,10 +399,10 @@ public class PartitionedRegionClearWithConcurrentOperationsDUnitTest implements
         .create(REGION_NAME);
   }
 
-  private void parametrizedSetup(RegionShortcut regionShortcut) {
-    server1.invoke(() -> initDataStore(regionShortcut));
-    server2.invoke(() -> initDataStore(regionShortcut));
-    accessor.invoke(() -> initAccessor(regionShortcut));
+  private void createRegions(RegionShortcut regionShortcut) {
+    server1.invoke(() -> createDataStore(regionShortcut));
+    server2.invoke(() -> createDataStore(regionShortcut));
+    accessor.invoke(() -> createAccessor(regionShortcut));
   }
 
   private void waitForSilence() {
@@ -637,10 +638,14 @@ public class PartitionedRegionClearWithConcurrentOperationsDUnitTest implements
   private enum TestVM {
     ACCESSOR(0), SERVER1(1), SERVER2(2);
 
-    final int vmNumber;
+    private final int vmId;
 
-    TestVM(int vmNumber) {
-      this.vmNumber = vmNumber;
+    TestVM(int vmId) {
+      this.vmId = vmId;
+    }
+
+    int getVmId() {
+      return vmId;
     }
   }
 
@@ -655,24 +660,6 @@ public class PartitionedRegionClearWithConcurrentOperationsDUnitTest implements
       this.coordinator = coordinator;
     }
 
-    /**
-     * Shutdowns the VM whenever the message is an instance of
-     * {@link PartitionedRegionClearMessage}.
-     */
-    private void shutdownMember(DistributionMessage message) {
-      if (message instanceof PartitionedRegionClearMessage) {
-        if (((PartitionedRegionClearMessage) message)
-            .getOperationType() == PartitionedRegionClearMessage.OperationType.OP_PR_CLEAR) {
-          DistributionMessageObserver.setInstance(null);
-          InternalDistributedSystem.getConnectedInstance().stopReconnectingNoDisconnect();
-          MembershipManagerHelper
-              .crashDistributedSystem(InternalDistributedSystem.getConnectedInstance());
-          await().untilAsserted(
-              () -> assertThat(InternalDistributedSystem.getConnectedInstance()).isNull());
-        }
-      }
-    }
-
     /**
      * Invoked only on clear coordinator VM.
      *
@@ -702,5 +689,23 @@ public class PartitionedRegionClearWithConcurrentOperationsDUnitTest implements
         super.beforeProcessMessage(dm, message);
       }
     }
+
+    /**
+     * Shutdowns the VM whenever the message is an instance of
+     * {@link PartitionedRegionClearMessage}.
+     */
+    private void shutdownMember(DistributionMessage message) {
+      if (message instanceof PartitionedRegionClearMessage) {
+        PartitionedRegionClearMessage clearMessage = (PartitionedRegionClearMessage) message;
+        if (clearMessage.getOperationType() == OperationType.OP_PR_CLEAR) {
+          DistributionMessageObserver.setInstance(null);
+          InternalDistributedSystem.getConnectedInstance().stopReconnectingNoDisconnect();
+          MembershipManagerHelper
+              .crashDistributedSystem(InternalDistributedSystem.getConnectedInstance());
+          await().untilAsserted(
+              () -> assertThat(InternalDistributedSystem.getConnectedInstance()).isNull());
+        }
+      }
+    }
   }
 }


[geode] 09/22: GEODE-9132: Remove ClearPRMessage from sanctionedDataSerializables.txt

Posted by ji...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

jinmeiliao pushed a commit to branch feature/GEODE-7665
in repository https://gitbox.apache.org/repos/asf/geode.git

commit f2fdd6963abaa18e44901ef134d92cf836181af2
Author: Kirk Lund <kl...@apache.org>
AuthorDate: Thu Apr 15 17:12:10 2021 -0700

    GEODE-9132: Remove ClearPRMessage from sanctionedDataSerializables.txt
---
 .../org/apache/geode/codeAnalysis/sanctionedDataSerializables.txt | 8 --------
 1 file changed, 8 deletions(-)

diff --git a/geode-core/src/integrationTest/resources/org/apache/geode/codeAnalysis/sanctionedDataSerializables.txt b/geode-core/src/integrationTest/resources/org/apache/geode/codeAnalysis/sanctionedDataSerializables.txt
index 1d7e9f920a..415db39930 100644
--- a/geode-core/src/integrationTest/resources/org/apache/geode/codeAnalysis/sanctionedDataSerializables.txt
+++ b/geode-core/src/integrationTest/resources/org/apache/geode/codeAnalysis/sanctionedDataSerializables.txt
@@ -1374,14 +1374,6 @@ org/apache/geode/internal/cache/partitioned/BucketSizeMessage$BucketSizeReplyMes
 fromData,27
 toData,27
 
-org/apache/geode/internal/cache/partitioned/ClearPRMessage,2
-fromData,30
-toData,44
-
-org/apache/geode/internal/cache/partitioned/ClearPRMessage$ClearReplyMessage,2
-fromData,17
-toData,17
-
 org/apache/geode/internal/cache/partitioned/ColocatedRegionDetails,2
 fromData,81
 toData,133


[geode] 05/22: GEODE-9132: Cleanup PartitionedRegionClearMessage

Posted by ji...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

jinmeiliao pushed a commit to branch feature/GEODE-7665
in repository https://gitbox.apache.org/repos/asf/geode.git

commit f0062cf2168686f46508631123ec825fb485799e
Author: Kirk Lund <kl...@apache.org>
AuthorDate: Fri Apr 9 17:24:26 2021 -0700

    GEODE-9132: Cleanup PartitionedRegionClearMessage
    
    * Use descriptive names for variables and methods
    * Use Objects.requireNonNull instead of Assert.assertTrue
    * Remove unnecessary uses of final, this, and super
    * Use static logger
    * Reformat some lines with weird formatting
---
 .../partitioned/PRClearCreateIndexDUnitTest.java   |   5 +-
 ...ionedRegionAfterClearNotificationDUnitTest.java |   4 +-
 ...itionedRegionClearWithAlterRegionDUnitTest.java |   2 +-
 ...gionClearWithConcurrentOperationsDUnitTest.java |   2 +-
 .../cache/PartitionedRegionClearMessage.java       | 225 ++++++++++-----------
 .../internal/cache/PartitionRegionClearHATest.java |   2 +-
 6 files changed, 118 insertions(+), 122 deletions(-)

diff --git a/geode-core/src/distributedTest/java/org/apache/geode/cache/query/partitioned/PRClearCreateIndexDUnitTest.java b/geode-core/src/distributedTest/java/org/apache/geode/cache/query/partitioned/PRClearCreateIndexDUnitTest.java
index 1c94c2dec7..423932d6d4 100644
--- a/geode-core/src/distributedTest/java/org/apache/geode/cache/query/partitioned/PRClearCreateIndexDUnitTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/cache/query/partitioned/PRClearCreateIndexDUnitTest.java
@@ -236,10 +236,11 @@ public class PRClearCreateIndexDUnitTest implements Serializable {
       if (message instanceof PartitionedRegionClearMessage) {
         PartitionedRegionClearMessage clearMessage = (PartitionedRegionClearMessage) message;
         if (clearMessage
-            .getOp() == PartitionedRegionClearMessage.OperationType.OP_LOCK_FOR_PR_CLEAR) {
+            .getOperationType() == PartitionedRegionClearMessage.OperationType.OP_LOCK_FOR_PR_CLEAR) {
           lock_others = true;
         }
-        if (clearMessage.getOp() == PartitionedRegionClearMessage.OperationType.OP_PR_CLEAR) {
+        if (clearMessage
+            .getOperationType() == PartitionedRegionClearMessage.OperationType.OP_PR_CLEAR) {
           clear_others = true;
         }
       }
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionAfterClearNotificationDUnitTest.java b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionAfterClearNotificationDUnitTest.java
index 237b6a8171..7979cfaa16 100644
--- a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionAfterClearNotificationDUnitTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionAfterClearNotificationDUnitTest.java
@@ -326,7 +326,7 @@ public class PartitionedRegionAfterClearNotificationDUnitTest implements Seriali
       public void beforeProcessMessage(ClusterDistributionManager dm, DistributionMessage message) {
         if (message instanceof PartitionedRegionClearMessage) {
           if (((PartitionedRegionClearMessage) message)
-              .getOp() == PartitionedRegionClearMessage.OperationType.OP_LOCK_FOR_PR_CLEAR) {
+              .getOperationType() == PartitionedRegionClearMessage.OperationType.OP_LOCK_FOR_PR_CLEAR) {
             DistributionMessageObserver.setInstance(null);
             getBlackboard().signalGate("CLOSE_CACHE");
             try {
@@ -348,7 +348,7 @@ public class PartitionedRegionAfterClearNotificationDUnitTest implements Seriali
       public void afterProcessMessage(ClusterDistributionManager dm, DistributionMessage message) {
         if (message instanceof PartitionedRegionClearMessage) {
           if (((PartitionedRegionClearMessage) message)
-              .getOp() == PartitionedRegionClearMessage.OperationType.OP_LOCK_FOR_PR_CLEAR) {
+              .getOperationType() == PartitionedRegionClearMessage.OperationType.OP_LOCK_FOR_PR_CLEAR) {
             DistributionMessageObserver.setInstance(null);
             getBlackboard().signalGate("CLOSE_CACHE");
             try {
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionClearWithAlterRegionDUnitTest.java b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionClearWithAlterRegionDUnitTest.java
index fb74eb32a4..564706eba8 100644
--- a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionClearWithAlterRegionDUnitTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionClearWithAlterRegionDUnitTest.java
@@ -759,7 +759,7 @@ public class PartitionedRegionClearWithAlterRegionDUnitTest implements Serializa
     private void shutdownMember(DistributionMessage message) {
       if (message instanceof PartitionedRegionClearMessage) {
         if (((PartitionedRegionClearMessage) message)
-            .getOp() == PartitionedRegionClearMessage.OperationType.OP_PR_CLEAR) {
+            .getOperationType() == PartitionedRegionClearMessage.OperationType.OP_PR_CLEAR) {
           DistributionMessageObserver.setInstance(null);
           InternalDistributedSystem.getConnectedInstance().stopReconnectingNoDisconnect();
           MembershipManagerHelper
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionClearWithConcurrentOperationsDUnitTest.java b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionClearWithConcurrentOperationsDUnitTest.java
index fdb91c7005..77537cbda3 100644
--- a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionClearWithConcurrentOperationsDUnitTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionClearWithConcurrentOperationsDUnitTest.java
@@ -703,7 +703,7 @@ public class PartitionedRegionClearWithConcurrentOperationsDUnitTest implements
     private void shutdownMember(DistributionMessage message) {
       if (message instanceof PartitionedRegionClearMessage) {
         if (((PartitionedRegionClearMessage) message)
-            .getOp() == PartitionedRegionClearMessage.OperationType.OP_PR_CLEAR) {
+            .getOperationType() == PartitionedRegionClearMessage.OperationType.OP_PR_CLEAR) {
           DistributionMessageObserver.setInstance(null);
           InternalDistributedSystem.getConnectedInstance().stopReconnectingNoDisconnect();
           MembershipManagerHelper
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionClearMessage.java b/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionClearMessage.java
index 724256b365..36cdcb6b3d 100755
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionClearMessage.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionClearMessage.java
@@ -12,14 +12,16 @@
  * or implied. See the License for the specific language governing permissions and limitations under
  * the License.
  */
-
 package org.apache.geode.internal.cache;
 
 import java.io.DataInput;
 import java.io.DataOutput;
 import java.io.IOException;
+import java.util.Objects;
 import java.util.Set;
 
+import org.apache.logging.log4j.Logger;
+
 import org.apache.geode.DataSerializer;
 import org.apache.geode.cache.CacheException;
 import org.apache.geode.cache.Operation;
@@ -32,7 +34,6 @@ import org.apache.geode.distributed.internal.ReplyMessage;
 import org.apache.geode.distributed.internal.ReplyProcessor21;
 import org.apache.geode.distributed.internal.ReplySender;
 import org.apache.geode.distributed.internal.membership.InternalDistributedMember;
-import org.apache.geode.internal.Assert;
 import org.apache.geode.internal.CopyOnWriteHashSet;
 import org.apache.geode.internal.NanoTimer;
 import org.apache.geode.internal.cache.partitioned.PartitionMessage;
@@ -41,96 +42,92 @@ import org.apache.geode.internal.serialization.DeserializationContext;
 import org.apache.geode.internal.serialization.SerializationContext;
 import org.apache.geode.logging.internal.log4j.api.LogService;
 
-/**
- * this message is for operations no the partition region level, could be sent by any originating
- * member to the other members hosting this partition region
- */
 public class PartitionedRegionClearMessage extends PartitionMessage {
+  private static final Logger logger = LogService.getLogger();
 
   public enum OperationType {
     OP_LOCK_FOR_PR_CLEAR, OP_UNLOCK_FOR_PR_CLEAR, OP_PR_CLEAR,
   }
 
-  private Object cbArg;
-
-  private OperationType op;
-
-  private EventID eventID;
-
+  private Object callbackArgument;
+  private OperationType operationType;
+  private EventID eventId;
   private PartitionedRegion partitionedRegion;
-
   private Set<Integer> bucketsCleared;
 
-  @Override
-  public EventID getEventID() {
-    return eventID;
+  public PartitionedRegionClearMessage() {
+    // nothing
   }
 
-  public PartitionedRegionClearMessage() {}
+  PartitionedRegionClearMessage(Set<InternalDistributedMember> recipients,
+      PartitionedRegion partitionedRegion, ReplyProcessor21 replyProcessor21,
+      PartitionedRegionClearMessage.OperationType operationType, RegionEventImpl regionEvent) {
+    super(recipients, partitionedRegion.getPRId(), replyProcessor21);
+    this.partitionedRegion = partitionedRegion;
+    this.operationType = operationType;
+    callbackArgument = regionEvent.getRawCallbackArgument();
+    eventId = regionEvent.getEventId();
+  }
 
-  PartitionedRegionClearMessage(Set<InternalDistributedMember> recipients, PartitionedRegion region,
-      ReplyProcessor21 processor, PartitionedRegionClearMessage.OperationType operationType,
-      final RegionEventImpl event) {
-    super(recipients, region.getPRId(), processor);
-    partitionedRegion = region;
-    op = operationType;
-    cbArg = event.getRawCallbackArgument();
-    eventID = event.getEventId();
+  @Override
+  public EventID getEventID() {
+    return eventId;
   }
 
-  public OperationType getOp() {
-    return op;
+  public OperationType getOperationType() {
+    return operationType;
   }
 
   public void send() {
-    Assert.assertTrue(getRecipients() != null, "ClearMessage NULL recipients set");
+    Objects.requireNonNull(getRecipients(), "ClearMessage NULL recipients set");
+
     setTransactionDistributed(partitionedRegion.getCache().getTxManager().isDistributed());
     partitionedRegion.getDistributionManager().putOutgoing(this);
   }
 
   @Override
-  protected Throwable processCheckForPR(PartitionedRegion pr,
+  protected Throwable processCheckForPR(PartitionedRegion partitionedRegion,
       DistributionManager distributionManager) {
-    if (pr != null && !pr.getDistributionAdvisor().isInitialized()) {
+    if (partitionedRegion != null && !partitionedRegion.getDistributionAdvisor().isInitialized()) {
       return new ForceReattemptException(
           String.format("%s : could not find partitioned region with Id %s",
               distributionManager.getDistributionManagerId(),
-              pr.getRegionIdentifier()));
+              partitionedRegion.getRegionIdentifier()));
     }
     return null;
   }
 
   @Override
-  protected boolean operateOnPartitionedRegion(ClusterDistributionManager dm,
-      PartitionedRegion partitionedRegion,
-      long startTime) throws CacheException {
-
+  protected boolean operateOnPartitionedRegion(ClusterDistributionManager distributionManager,
+      PartitionedRegion partitionedRegion, long startTime) throws CacheException {
     if (partitionedRegion == null) {
       return true;
     }
-
     if (partitionedRegion.isDestroyed()) {
       return true;
     }
 
-    if (op == OperationType.OP_LOCK_FOR_PR_CLEAR) {
+    if (operationType == OperationType.OP_LOCK_FOR_PR_CLEAR) {
       partitionedRegion.getPartitionedRegionClear().obtainClearLockLocal(getSender());
-    } else if (op == OperationType.OP_UNLOCK_FOR_PR_CLEAR) {
+    } else if (operationType == OperationType.OP_UNLOCK_FOR_PR_CLEAR) {
       partitionedRegion.getPartitionedRegionClear().releaseClearLockLocal();
     } else {
       RegionEventImpl event =
-          new RegionEventImpl(partitionedRegion, Operation.REGION_CLEAR, this.cbArg, true,
-              partitionedRegion.getMyId(),
-              getEventID());
+          new RegionEventImpl(partitionedRegion, Operation.REGION_CLEAR, callbackArgument, true,
+              partitionedRegion.getMyId(), getEventID());
       bucketsCleared = partitionedRegion.getPartitionedRegionClear().clearRegionLocal(event);
     }
     return true;
   }
 
   @Override
-  protected void appendFields(StringBuilder buff) {
-    super.appendFields(buff);
-    buff.append(" cbArg=").append(this.cbArg).append(" op=").append(this.op);
+  protected void appendFields(StringBuilder stringBuilder) {
+    super.appendFields(stringBuilder);
+    stringBuilder
+        .append(" cbArg=")
+        .append(callbackArgument)
+        .append(" op=")
+        .append(operationType);
   }
 
   @Override
@@ -139,21 +136,32 @@ public class PartitionedRegionClearMessage extends PartitionMessage {
   }
 
   @Override
-  public void fromData(DataInput in,
-      DeserializationContext context) throws IOException, ClassNotFoundException {
+  public void fromData(DataInput in, DeserializationContext context)
+      throws IOException, ClassNotFoundException {
     super.fromData(in, context);
-    this.cbArg = DataSerializer.readObject(in);
-    op = PartitionedRegionClearMessage.OperationType.values()[in.readByte()];
-    eventID = DataSerializer.readObject(in);
+    callbackArgument = DataSerializer.readObject(in);
+    operationType = PartitionedRegionClearMessage.OperationType.values()[in.readByte()];
+    eventId = DataSerializer.readObject(in);
   }
 
   @Override
-  public void toData(DataOutput out,
-      SerializationContext context) throws IOException {
+  public void toData(DataOutput out, SerializationContext context) throws IOException {
     super.toData(out, context);
-    DataSerializer.writeObject(this.cbArg, out);
-    out.writeByte(op.ordinal());
-    DataSerializer.writeObject(eventID, out);
+    DataSerializer.writeObject(callbackArgument, out);
+    out.writeByte(operationType.ordinal());
+    DataSerializer.writeObject(eventId, out);
+  }
+
+  @Override
+  protected void sendReply(InternalDistributedMember recipient, int processorId,
+      DistributionManager distributionManager, ReplyException replyException,
+      PartitionedRegion partitionedRegion, long startTime) {
+    if (partitionedRegion != null && startTime > 0) {
+      partitionedRegion.getPrStats().endPartitionMessagesProcessing(startTime);
+    }
+    PartitionedRegionClearMessage.PartitionedRegionClearReplyMessage
+        .send(recipient, processorId, getReplySender(distributionManager), operationType,
+            bucketsCleared, replyException);
   }
 
   /**
@@ -161,97 +169,85 @@ public class PartitionedRegionClearMessage extends PartitionMessage {
    * received from the "far side"
    */
   public static class PartitionedRegionClearResponse extends ReplyProcessor21 {
+
     CopyOnWriteHashSet<Integer> bucketsCleared = new CopyOnWriteHashSet<>();
 
     public PartitionedRegionClearResponse(InternalDistributedSystem system,
-        Set<InternalDistributedMember> initMembers) {
-      super(system, initMembers);
+        Set<InternalDistributedMember> recipients) {
+      super(system, recipients);
     }
 
     @Override
-    public void process(DistributionMessage msg) {
-      if (msg instanceof PartitionedRegionClearReplyMessage) {
-        Set<Integer> buckets = ((PartitionedRegionClearReplyMessage) msg).bucketsCleared;
+    public void process(DistributionMessage message) {
+      if (message instanceof PartitionedRegionClearReplyMessage) {
+        Set<Integer> buckets = ((PartitionedRegionClearReplyMessage) message).bucketsCleared;
         if (buckets != null) {
           bucketsCleared.addAll(buckets);
         }
       }
-      super.process(msg, true);
-    }
-  }
-
-  @Override
-  protected void sendReply(InternalDistributedMember member, int processorId,
-      DistributionManager distributionManager, ReplyException ex,
-      PartitionedRegion partitionedRegion, long startTime) {
-    if (partitionedRegion != null) {
-      if (startTime > 0) {
-        partitionedRegion.getPrStats().endPartitionMessagesProcessing(startTime);
-      }
+      process(message, true);
     }
-    PartitionedRegionClearMessage.PartitionedRegionClearReplyMessage
-        .send(member, processorId, getReplySender(distributionManager), op, bucketsCleared,
-            ex);
   }
 
   public static class PartitionedRegionClearReplyMessage extends ReplyMessage {
 
     private Set<Integer> bucketsCleared;
 
-    private OperationType op;
+    private OperationType operationType;
 
     @Override
     public boolean getInlineProcess() {
       return true;
     }
 
+    public static void send(InternalDistributedMember recipient, int processorId,
+        ReplySender replySender, OperationType operationType, Set<Integer> bucketsCleared,
+        ReplyException replyException) {
+      Objects.requireNonNull(recipient, "partitionedRegionClearReplyMessage NULL reply message");
+
+      PartitionedRegionClearMessage.PartitionedRegionClearReplyMessage replyMessage =
+          new PartitionedRegionClearMessage.PartitionedRegionClearReplyMessage(processorId,
+              operationType, bucketsCleared, replyException);
+
+      replyMessage.setRecipient(recipient);
+      replySender.putOutgoing(replyMessage);
+    }
+
     /**
      * Empty constructor to conform to DataSerializable interface
      */
-    public PartitionedRegionClearReplyMessage() {}
+    public PartitionedRegionClearReplyMessage() {
+      // Empty constructor to conform to DataSerializable interface
+    }
 
-    private PartitionedRegionClearReplyMessage(int processorId, OperationType op,
-        Set<Integer> bucketsCleared, ReplyException ex) {
-      super();
+    private PartitionedRegionClearReplyMessage(int processorId, OperationType operationType,
+        Set<Integer> bucketsCleared, ReplyException replyException) {
       this.bucketsCleared = bucketsCleared;
-      this.op = op;
+      this.operationType = operationType;
       setProcessorId(processorId);
-      setException(ex);
-    }
-
-    /** Send an ack */
-    public static void send(InternalDistributedMember recipient, int processorId, ReplySender dm,
-        OperationType op, Set<Integer> bucketsCleared, ReplyException ex) {
-
-      Assert.assertTrue(recipient != null, "partitionedRegionClearReplyMessage NULL reply message");
-
-      PartitionedRegionClearMessage.PartitionedRegionClearReplyMessage m =
-          new PartitionedRegionClearMessage.PartitionedRegionClearReplyMessage(processorId, op,
-              bucketsCleared, ex);
-
-      m.setRecipient(recipient);
-      dm.putOutgoing(m);
+      setException(replyException);
     }
 
     /**
      * Processes this message. This method is invoked by the receiver of the message.
      *
-     * @param dm the distribution manager that is processing the message.
+     * @param distributionManager the distribution manager that is processing the message.
      */
     @Override
-    public void process(final DistributionManager dm, final ReplyProcessor21 rp) {
-      final long startTime = getTimestamp();
+    public void process(DistributionManager distributionManager,
+        ReplyProcessor21 replyProcessor21) {
+      long startTime = getTimestamp();
 
-      if (rp == null) {
-        if (LogService.getLogger().isTraceEnabled(LogMarker.DM_VERBOSE)) {
-          LogService.getLogger().trace(LogMarker.DM_VERBOSE, "{}: processor not found", this);
+      if (replyProcessor21 == null) {
+        if (logger.isTraceEnabled(LogMarker.DM_VERBOSE)) {
+          logger.trace(LogMarker.DM_VERBOSE, "{}: processor not found", this);
         }
         return;
       }
 
-      rp.process(this);
+      replyProcessor21.process(this);
 
-      dm.getStats().incReplyMessageTime(NanoTimer.getTime() - startTime);
+      distributionManager.getStats().incReplyMessageTime(NanoTimer.getTime() - startTime);
     }
 
     @Override
@@ -260,30 +256,29 @@ public class PartitionedRegionClearMessage extends PartitionMessage {
     }
 
     @Override
-    public void fromData(DataInput in,
-        DeserializationContext context) throws IOException, ClassNotFoundException {
+    public void fromData(DataInput in, DeserializationContext context)
+        throws IOException, ClassNotFoundException {
       super.fromData(in, context);
-      op = PartitionedRegionClearMessage.OperationType.values()[in.readByte()];
+      operationType = PartitionedRegionClearMessage.OperationType.values()[in.readByte()];
       bucketsCleared = DataSerializer.readObject(in);
     }
 
     @Override
-    public void toData(DataOutput out,
-        SerializationContext context) throws IOException {
+    public void toData(DataOutput out, SerializationContext context) throws IOException {
       super.toData(out, context);
-      out.writeByte(op.ordinal());
+      out.writeByte(operationType.ordinal());
       DataSerializer.writeObject(bucketsCleared, out);
     }
 
     @Override
     public String toString() {
-      StringBuffer sb = new StringBuffer();
-      sb.append("PartitionedRegionClearReplyMessage ")
-          .append("processorId=").append(this.processorId)
+      return new StringBuilder()
+          .append("PartitionedRegionClearReplyMessage ")
+          .append("processorId=").append(processorId)
           .append(" sender=").append(sender)
-          .append(" bucketsCleared ").append(this.bucketsCleared)
-          .append(" exception=").append(getException());
-      return sb.toString();
+          .append(" bucketsCleared ").append(bucketsCleared)
+          .append(" exception=").append(getException())
+          .toString();
     }
   }
 }
diff --git a/geode-cq/src/distributedTest/java/org/apache/geode/internal/cache/PartitionRegionClearHATest.java b/geode-cq/src/distributedTest/java/org/apache/geode/internal/cache/PartitionRegionClearHATest.java
index 7d0db0a17e..5497028f1e 100644
--- a/geode-cq/src/distributedTest/java/org/apache/geode/internal/cache/PartitionRegionClearHATest.java
+++ b/geode-cq/src/distributedTest/java/org/apache/geode/internal/cache/PartitionRegionClearHATest.java
@@ -220,7 +220,7 @@ public class PartitionRegionClearHATest implements Serializable {
       if (message instanceof PartitionedRegionClearMessage) {
         PartitionedRegionClearMessage clearMessage = (PartitionedRegionClearMessage) message;
         if (clearMessage
-            .getOp() == PartitionedRegionClearMessage.OperationType.OP_UNLOCK_FOR_PR_CLEAR) {
+            .getOperationType() == PartitionedRegionClearMessage.OperationType.OP_UNLOCK_FOR_PR_CLEAR) {
           try {
             // count down to 1 so that we can go ahead and restart the server
             latch.countDown();


[geode] 04/22: GEODE-9132: Fixup PartitionResponse constructors

Posted by ji...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

jinmeiliao pushed a commit to branch feature/GEODE-7665
in repository https://gitbox.apache.org/repos/asf/geode.git

commit 919bbc2df267a96fe35f9cd1f8f1651cc0bf23dc
Author: Kirk Lund <kl...@apache.org>
AuthorDate: Fri Apr 9 15:22:46 2021 -0700

    GEODE-9132: Fixup PartitionResponse constructors
    
    * Chain constructors to only one constructor that calls super
    * Expose all arguments for dependency injection
    * Provide type to recipients
---
 .../cache/partitioned/PartitionMessage.java        | 32 ++++++++++++++--------
 1 file changed, 21 insertions(+), 11 deletions(-)

diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/partitioned/PartitionMessage.java b/geode-core/src/main/java/org/apache/geode/internal/cache/partitioned/PartitionMessage.java
index 8ebc4da469..ab83538354 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/partitioned/PartitionMessage.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/partitioned/PartitionMessage.java
@@ -14,6 +14,8 @@
  */
 package org.apache.geode.internal.cache.partitioned;
 
+import static java.util.Collections.singleton;
+
 import java.io.DataInput;
 import java.io.DataOutput;
 import java.io.IOException;
@@ -22,6 +24,7 @@ import java.util.Set;
 
 import org.apache.logging.log4j.Logger;
 
+import org.apache.geode.CancelCriterion;
 import org.apache.geode.CancelException;
 import org.apache.geode.InternalGemFireError;
 import org.apache.geode.InternalGemFireException;
@@ -760,24 +763,31 @@ public abstract class PartitionMessage extends DistributionMessage
      */
     boolean responseRequired;
 
-    public PartitionResponse(InternalDistributedSystem dm, Set initMembers) {
-      this(dm, initMembers, true);
+    protected PartitionResponse(InternalDistributedSystem dm,
+        Set<InternalDistributedMember> recipients) {
+      this(dm, recipients, true);
     }
 
-    public PartitionResponse(InternalDistributedSystem dm, Set initMembers, boolean register) {
-      super(dm, initMembers);
-      if (register) {
-        register();
-      }
+    protected PartitionResponse(InternalDistributedSystem system,
+        Set<InternalDistributedMember> recipients, boolean register) {
+      this(system.getDistributionManager(), system, recipients, system.getCancelCriterion(),
+          register);
+    }
+
+    protected PartitionResponse(InternalDistributedSystem system,
+        InternalDistributedMember member) {
+      this(system.getDistributionManager(), system, singleton(member), system.getCancelCriterion());
     }
 
-    public PartitionResponse(InternalDistributedSystem dm, InternalDistributedMember member) {
-      this(dm, member, true);
+    protected PartitionResponse(DistributionManager dm, InternalDistributedSystem system,
+        Set<InternalDistributedMember> recipients, CancelCriterion cancelCriterion) {
+      this(dm, system, recipients, cancelCriterion, true);
     }
 
-    public PartitionResponse(InternalDistributedSystem dm, InternalDistributedMember member,
+    private PartitionResponse(DistributionManager dm, InternalDistributedSystem system,
+        Set<InternalDistributedMember> recipients, CancelCriterion cancelCriterion,
         boolean register) {
-      super(dm, member);
+      super(dm, system, recipients, cancelCriterion);
       if (register) {
         register();
       }


[geode] 22/22: rebase to develop

Posted by ji...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

jinmeiliao pushed a commit to branch feature/GEODE-7665
in repository https://gitbox.apache.org/repos/asf/geode.git

commit 0a3041ef66d4fb2b10ca113e357bc522d95cfffd
Author: Jinmei Liao <ji...@pivotal.io>
AuthorDate: Wed Jun 8 15:38:35 2022 -0700

    rebase to develop
---
 .../java/org/apache/geode/internal/cache/partitioned/RegionAdvisor.java | 2 +-
 .../java/org/apache/geode/internal/cache/PartitionedRegionTest.java     | 1 -
 2 files changed, 1 insertion(+), 2 deletions(-)

diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/partitioned/RegionAdvisor.java b/geode-core/src/main/java/org/apache/geode/internal/cache/partitioned/RegionAdvisor.java
index 10794b8df0..38648efe5d 100755
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/partitioned/RegionAdvisor.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/partitioned/RegionAdvisor.java
@@ -879,7 +879,7 @@ public class RegionAdvisor extends CacheDistributionAdvisor {
   };
 
   @Immutable
-  private static final Filter prServerWithCqFilter = profile -> {
+  private static final Predicate<Profile> prServerWithCqFilter = profile -> {
     CacheProfile prof = (CacheProfile) profile;
     return prof.isPartitioned && prof.hasCacheServer && prof.filterProfile != null
         && prof.filterProfile.hasCQs();
diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/PartitionedRegionTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/PartitionedRegionTest.java
index f937775007..cdf9ff675c 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/cache/PartitionedRegionTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/cache/PartitionedRegionTest.java
@@ -85,7 +85,6 @@ import org.apache.geode.distributed.internal.InternalDistributedSystem;
 import org.apache.geode.distributed.internal.membership.InternalDistributedMember;
 import org.apache.geode.internal.cache.control.InternalResourceManager;
 import org.apache.geode.internal.cache.partitioned.RegionAdvisor;
-import org.apache.geode.internal.cache.partitioned.ClearPRMessage;
 import org.apache.geode.internal.cache.partitioned.colocation.ColocationLoggerFactory;
 import org.apache.geode.test.junit.runners.GeodeParamsRunner;
 


[geode] 21/22: Rebase missed code changes in DistributedClearOperation

Posted by ji...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

jinmeiliao pushed a commit to branch feature/GEODE-7665
in repository https://gitbox.apache.org/repos/asf/geode.git

commit 6e31e9b57bccac18e5bfdd7bd0f36c2b20d482ad
Author: zhouxh <gz...@pivotal.io>
AuthorDate: Mon Mar 7 22:58:44 2022 -0800

    Rebase missed code changes in DistributedClearOperation
---
 .../apache/geode/internal/cache/DistributedClearOperation.java | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/DistributedClearOperation.java b/geode-core/src/main/java/org/apache/geode/internal/cache/DistributedClearOperation.java
index 5b2e3d76d0..d25ea1230e 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/DistributedClearOperation.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/DistributedClearOperation.java
@@ -215,7 +215,7 @@ public class DistributedClearOperation extends DistributedCacheOperation {
     protected boolean operateOnRegion(CacheEvent event, ClusterDistributionManager dm)
         throws EntryNotFoundException {
 
-      DistributedRegion region = (DistributedRegion) event.getRegion();
+      LocalRegion region = (LocalRegion) event.getRegion();
       switch (clearOp) {
         case OP_CLEAR:
           region.clearRegionLocally((RegionEventImpl) event, false, rvv);
@@ -223,9 +223,11 @@ public class DistributedClearOperation extends DistributedCacheOperation {
           appliedOperation = true;
           break;
         case OP_LOCK_FOR_CLEAR:
-          if (region.getDataPolicy().withStorage()) {
-            DistributedClearOperation.regionLocked(getSender(), region.getFullPath(), region);
-            region.lockLocallyForClear(dm, getSender(), event);
+          if (region.getDataPolicy().withStorage() && region instanceof DistributedRegion) {
+            DistributedRegion distributedRegion = (DistributedRegion) region;
+            DistributedClearOperation.regionLocked(getSender(), region.getFullPath(),
+                distributedRegion);
+            distributedRegion.lockLocallyForClear(dm, getSender(), event);
           }
           appliedOperation = true;
           break;


[geode] 10/22: Fixup AnalyzeCoreSerializablesJUnitTest for PartitionedRegionPartialClearException

Posted by ji...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

jinmeiliao pushed a commit to branch feature/GEODE-7665
in repository https://gitbox.apache.org/repos/asf/geode.git

commit f595900e5b325113b2ac74b4a5b27f171afb9b6e
Author: Kirk Lund <kl...@apache.org>
AuthorDate: Fri Apr 16 11:40:37 2021 -0700

    Fixup AnalyzeCoreSerializablesJUnitTest for PartitionedRegionPartialClearException
---
 .../org/apache/geode/internal/sanctioned-geode-core-serializables.txt   | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/geode-core/src/main/resources/org/apache/geode/internal/sanctioned-geode-core-serializables.txt b/geode-core/src/main/resources/org/apache/geode/internal/sanctioned-geode-core-serializables.txt
index 2800154e84..9270f962ba 100644
--- a/geode-core/src/main/resources/org/apache/geode/internal/sanctioned-geode-core-serializables.txt
+++ b/geode-core/src/main/resources/org/apache/geode/internal/sanctioned-geode-core-serializables.txt
@@ -79,7 +79,7 @@ org/apache/geode/cache/NoSubscriptionServersAvailableException,true,848408601915
 org/apache/geode/cache/Operation,true,-7521751729852504238,ordinal:byte
 org/apache/geode/cache/OperationAbortedException,true,-8293166225026556949
 org/apache/geode/cache/PartitionedRegionDistributionException,true,-3004093739855972548
-org/apache/geode/cache/PartitionedRegionPartialClearException,false
+org/apache/geode/cache/PartitionedRegionPartialClearException,true,-3420558263697703892
 org/apache/geode/cache/PartitionedRegionStorageException,true,5905463619475329732
 org/apache/geode/cache/RegionAccessException,true,3142958723089038406
 org/apache/geode/cache/RegionDestroyedException,true,319804842308010754,regionFullPath:java/lang/String


[geode] 01/22: GEODE-7683: introduce BR.cmnClearRegion

Posted by ji...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

jinmeiliao pushed a commit to branch feature/GEODE-7665
in repository https://gitbox.apache.org/repos/asf/geode.git

commit 28d31d89de607d8947fe17890b5a951dfc895299
Author: zhouxh <gz...@pivotal.io>
AuthorDate: Mon Jan 27 17:02:48 2020 -0800

    GEODE-7683: introduce BR.cmnClearRegion
    
    Co-authored-by: Xiaojian Zhou <gz...@pivotal.io>
    
    GEODE-7684: Create messaging class for PR Clear (#4689)
    
    * Added new message class and test
    
    Co-authored-by: Benjamin Ross <br...@pivotal.io>
    Co-authored-by: Donal Evans <do...@pivotal.io>
    
    GEODE-7682: add PR.clear  API (#4755)
    
    * GEODE-7683: introduce BR.cmnClearRegion
    
    Co-authored-by: Xiaojian Zhou <gz...@pivotal.io>
    
    PR.clear's event id should be created and used in BR (#4805)
    
    * GEODE-7857: PR.clear's event id should be created and used in BR
    
    GEODE-7912: cacheWriter should be triggered when PR.clear (#4882)
    
            Co-authored-by: Anil <ag...@pivotal.io>
            Co-authored-by: Xiaojian Zhou <gz...@pivotal.io>
    
    GEODE-7983: Clear region writer callbacks should not be invoked for bucket regions (#4954)
    
    GEODE-7676: Add PR clear with expiration tests (#4970)
    
    Added distributed tests to verify the clear operation on Partitioned
    Regions works as expected when expiration is configured.
    
    - Added unit and distributed tests.
    - Fixed LocalRegion class to clear the entryExpiryTasks Map whenever
      the cancelAllEntryExpiryTasks method is invoked.
    
    GEODE-7667: Add a 'clear' gfsh command for PR and RR clear (#4818)
    
    * Added clear command and modified remove functionality to clear PR
    
    Authored-by: Benjamin Ross <br...@pivotal.io>
    
    GEODE-7676: Conversion of duration to seconds.
    
    GEODE-7894: Moving expiry tasks to AbstractRegion.
    
    GEODE-7667: Fixing test to include PR clear help text.
    
    GEODE-7678 (2nd PR) - Support for cache-listener and client-notification for Partitioned Region Clear operation  (#5124)
    
    * GEODE-7678: Add support for cache listener and client notification for PR clear
    
    The changes are made to PR clear messaging and locking mechanism to preserve
    cache-listener and client-events ordering during concurrent cache operation
    while clear in progress.
    
    GEODE-7669 Test coverage for Partitioned Region clear with Overflow enabled (#5189)
    
    Authored-by: Jianxia Chen <jc...@apache.org>
    
    GEODE-8173: Add unit test (coverage) for PartitionedRegionClear class. (#5208)
    
    * GEODE-8173: Add unit test (coverage) for PartitionedRegionClear class.
    Co-authored-by: anilkumar gingade <an...@anilg.local>
    
    GEODE-8334: PR.clear should sync with putAll or removeAll on rvvLock (#5365)
    
        Co-authored-by: Xiaojian Zhou <zh...@vmware.com>
        Co-authored-by: Anil Gingade <ag...@vmware.com>
    
    GEODE-8361: Use Set instead of List to track cleared buckets (#5379)
    
    - Refactor PartitionRegionClear to use Set instead of List
    - Some other changes to remove warnings/alerts from PartitionedRegionClear and PartitionedRegionClearMessage
    
    Authored-by: Donal Evans <do...@vmware.com>
    
    GEODE-7670: PR Clear with Concurrent Ops DUnitTests (#4848)
    
    Added distributed tests to verify that the clear operation on
    Partitioned Regions works as expected when there are other
    concurrent operations happening on the cache (put, putAll, get,
    remove, removeAll, members added and members removed).
    
    GEODE-7680: PR.clear must be successful when interacting with rebalance (#5095)
    
    - Added DUnit tests to confirm that clear does not interfere with
    rebalance or vice versa
    - Test when member departs during clear/rebalance
    - Test when member joins during clear/rebalance
    - Fixed typo in PartitionedRegionClearWithExpirationDUnitTest
    - Fixed typo in PartitionedRegion
    - Call assignBucketsToPartitions() on leader colocated region during clear
    instead of target region
    
    Authored-by: Donal Evans <do...@pivotal.io>
    
    GEODE-7846: Adding Stats for Partitioned Region Clear (#5391)
    
    Added stats to CachePerfStats for PR Clear
    - Changed clears to 'regionClears' and 'bucketClears' to differentiate between the number of times the region was cleared and the number of times a bucket was cleared in a PartitionedRegion
    - Added Local and Total duration stats to record how long clear has been running for a specific region, as well as how long it was spent clearing any specific member
    
    GEODE-7672: add dunit test to verify OQL index after PR clear. (#5436)
    
    * require rvv lock when create index
    
    fix rebase compiling error
    
    GEODE-7845 blocking PR region clear if one or more server versions are too old (#5577)
    
    - if a server is running an old version when a PR clear is invoked
    by the client, the client will receive a ServerOperationException
    with a cause of ServerVersionMismatchException.
    
    GEODE-7845: Adding a cleaner simpler test. (#5622)
    
    - Changed the test for ServerVersionMismatchException to be more readable.
    
    GEODE-7845: Now behaving with clients of various versions. (#5645)
    
    - added functionality that would allow the tests to be run using various versions of the clients against and and new versions of the server.
    
    GEODE-7858: PR.clear notify client should let the queue holder member to notify (#5677)
    
    GEODE-7679 Partitioned Region clear is successful while region is being altered (#5516)
    
    GEODE-7675: Partitioned Region clear should be successful when clients are present with subscription enabled (#5727)
    
    GEODE-8771: invalidate should acquire the lock before initIndex (#5823)
    
    GEODE-8878: PR clear should also send a lock message to the secondary members. (#5950)
    
    GEODE-9132: Minor cleanup of PartitionedRegionClearTest
---
 .../integrationTest/resources/assembly_content.txt |   1 +
 .../cache/PRCacheListenerDistributedTest.java      | 585 +++++++++++++-
 .../cache/RegionClearStatsDistributedTest.java     |   2 +-
 .../ReplicateCacheListenerDistributedTest.java     | 111 ++-
 .../partitioned/PRClearCreateIndexDUnitTest.java   | 265 ++++++
 .../partitioned/PRClearQueryIndexDUnitTest.java    | 376 +++++++++
 ...ionedRegionAfterClearNotificationDUnitTest.java | 372 +++++++++
 .../cache/PartitionedRegionClearDUnitTest.java     | 465 +++++++++++
 ...itionedRegionClearWithAlterRegionDUnitTest.java | 803 ++++++++++++++++++
 ...gionClearWithConcurrentOperationsDUnitTest.java | 747 +++++++++++++++++
 ...titionedRegionClearWithExpirationDUnitTest.java | 501 ++++++++++++
 ...rtitionedRegionClearWithRebalanceDUnitTest.java | 578 +++++++++++++
 .../PartitionedRegionOverflowClearDUnitTest.java   | 380 +++++++++
 .../PartitionedRegionPersistentClearDUnitTest.java |  38 +-
 ...titionedRegionClearWithExpirationDUnitTest.java | 530 ++++++++++++
 .../query/partitioned/PRClearIntegrationTest.java  |  73 ++
 .../cache/PartitionedRegionIntegrationTest.java    |  45 ++
 ...itionedRegionSingleNodeOperationsJUnitTest.java |  66 --
 .../codeAnalysis/sanctionedDataSerializables.txt   |  16 +
 .../PartitionedRegionPartialClearException.java    |  45 +-
 .../main/java/org/apache/geode/cache/Region.java   |   6 +-
 .../cache/query/internal/DefaultQueryService.java  |   5 +-
 .../cache/query/internal/index/IndexManager.java   |   4 +-
 .../org/apache/geode/internal/DSFIDFactory.java    |   6 +
 .../geode/internal/cache/AbstractRegion.java       |   1 +
 .../geode/internal/cache/AbstractRegionMap.java    |  27 +-
 .../apache/geode/internal/cache/BucketAdvisor.java |   2 +-
 .../apache/geode/internal/cache/BucketRegion.java  |  42 +-
 .../geode/internal/cache/CachePerfStats.java       |  59 +-
 .../geode/internal/cache/ColocationHelper.java     |  10 +-
 .../internal/cache/DistributedClearOperation.java  |   8 +
 .../geode/internal/cache/DistributedRegion.java    |  57 +-
 .../geode/internal/cache/InternalRegion.java       |   3 +
 .../apache/geode/internal/cache/LocalRegion.java   |  25 +-
 .../geode/internal/cache/PartitionedRegion.java    | 118 ++-
 .../internal/cache/PartitionedRegionClear.java     | 506 ++++++++++++
 .../cache/PartitionedRegionClearMessage.java       | 289 +++++++
 .../internal/cache/PartitionedRegionDataStore.java |   8 +
 .../geode/internal/cache/RegionEventImpl.java      |   5 +
 .../geode/internal/cache/RegionPerfStats.java      |  12 +-
 .../apache/geode/internal/cache/RegionStats.java   |   4 +-
 .../internal/cache/partitioned/ClearPRMessage.java | 320 ++++++++
 .../cache/partitioned/PutAllPRMessage.java         |   9 +
 .../internal/cache/partitioned/RegionAdvisor.java  |  11 +
 .../cache/partitioned/RemoveAllPRMessage.java      |   9 +
 .../cache/versions/RegionVersionVector.java        |   4 +-
 .../geode/management/internal/i18n/CliStrings.java |  14 +-
 .../sanctioned-geode-core-serializables.txt        |   2 +
 .../internal/cache/BucketRegionJUnitTest.java      |  85 +-
 .../geode/internal/cache/CachePerfStatsTest.java   |  53 +-
 .../internal/cache/DistributedRegionJUnitTest.java |  18 +
 .../geode/internal/cache/LocalRegionTest.java      |  22 +
 .../internal/cache/PartitionedRegionClearTest.java | 897 +++++++++++++++++++++
 .../internal/cache/PartitionedRegionTest.java      |  25 +
 .../cache/partitioned/ClearPRMessageTest.java      | 260 ++++++
 .../cache/partitioned/PutAllPRMessageTest.java     |  29 +
 .../cache/partitioned/RemoveAllPRMessageTest.java  |  29 +
 .../RollingUpgrade2DUnitTestBase.java              |   4 +-
 ...ePartitionRegionClearServerVersionMismatch.java | 212 +++++
 .../internal/cache/PartitionRegionClearHATest.java | 236 ++++++
 .../PartitionRegionClearMessageQueueDUnitTest.java | 165 ++++
 .../geode/test/dunit/rules/ClusterStartupRule.java |  21 +-
 .../geode/test/junit/rules/MemberStarterRule.java  |   9 +
 .../cli/commands/ClearCommandDUnitTest.java        | 120 +++
 .../cli/commands/RemoveCommandDUnitTest.java       |  13 +-
 .../GfshParserAutoCompletionIntegrationTest.java   |   2 +-
 .../{RemoveCommand.java => ClearCommand.java}      |  51 +-
 .../cli/commands/CommandAvailabilityIndicator.java |   1 +
 .../internal/cli/commands/RemoveCommand.java       |   9 +-
 .../internal/cli/domain/DataCommandResult.java     |  12 +
 .../cli/functions/DataCommandFunction.java         |  23 +-
 .../internal/cli/commands/ClearCommandTest.java    | 115 +++
 .../org/apache/geode/cache/query/data/City.java    |   7 +-
 .../test/concurrent/FileBasedCountDownLatch.java   |   2 +-
 .../serialization/DataSerializableFixedID.java     |   5 +
 75 files changed, 9679 insertions(+), 311 deletions(-)

diff --git a/geode-assembly/src/integrationTest/resources/assembly_content.txt b/geode-assembly/src/integrationTest/resources/assembly_content.txt
index 2b41f9c8cb..4cb7ef5bee 100644
--- a/geode-assembly/src/integrationTest/resources/assembly_content.txt
+++ b/geode-assembly/src/integrationTest/resources/assembly_content.txt
@@ -222,6 +222,7 @@ javadoc/org/apache/geode/cache/PartitionAttributes.html
 javadoc/org/apache/geode/cache/PartitionAttributesFactory.html
 javadoc/org/apache/geode/cache/PartitionResolver.html
 javadoc/org/apache/geode/cache/PartitionedRegionDistributionException.html
+javadoc/org/apache/geode/cache/PartitionedRegionPartialClearException.html
 javadoc/org/apache/geode/cache/PartitionedRegionStorageException.html
 javadoc/org/apache/geode/cache/Region.Entry.html
 javadoc/org/apache/geode/cache/Region.html
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/cache/PRCacheListenerDistributedTest.java b/geode-core/src/distributedTest/java/org/apache/geode/cache/PRCacheListenerDistributedTest.java
index 559def7e95..ac02b651e0 100644
--- a/geode-core/src/distributedTest/java/org/apache/geode/cache/PRCacheListenerDistributedTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/cache/PRCacheListenerDistributedTest.java
@@ -14,14 +14,35 @@
  */
 package org.apache.geode.cache;
 
+import static org.apache.geode.test.dunit.VM.getVM;
+import static org.apache.geode.test.dunit.VM.getVMCount;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.fail;
+import static org.hamcrest.Matchers.anyOf;
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.not;
+import static org.hamcrest.Matchers.nullValue;
+
+import java.io.Serializable;
 import java.util.Arrays;
+import java.util.Collection;
 
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 import org.junit.runners.Parameterized.Parameter;
 import org.junit.runners.Parameterized.Parameters;
 import org.junit.runners.Parameterized.UseParametersRunnerFactory;
 
+import org.apache.geode.cache.util.CacheListenerAdapter;
+import org.apache.geode.logging.internal.log4j.api.LogService;
+import org.apache.geode.test.dunit.rules.CacheRule;
+import org.apache.geode.test.dunit.rules.DistributedCounters;
+import org.apache.geode.test.dunit.rules.DistributedErrorCollector;
+import org.apache.geode.test.dunit.rules.DistributedRule;
+import org.apache.geode.test.junit.rules.serializable.SerializableTestName;
 import org.apache.geode.test.junit.runners.CategoryWithParameterizedRunnerFactory;
 
 /**
@@ -36,47 +57,591 @@ import org.apache.geode.test.junit.runners.CategoryWithParameterizedRunnerFactor
 @RunWith(Parameterized.class)
 @UseParametersRunnerFactory(CategoryWithParameterizedRunnerFactory.class)
 @SuppressWarnings("serial")
-public class PRCacheListenerDistributedTest extends ReplicateCacheListenerDistributedTest {
+public class PRCacheListenerDistributedTest implements Serializable {
+
+  protected static final String CLEAR = "CLEAR";
+  protected static final String REGION_DESTROY = "REGION_DESTROY";
+  private static final String CREATES = "CREATES";
+  private static final String UPDATES = "UPDATES";
+  private static final String INVALIDATES = "INVALIDATES";
+  private static final String DESTROYS = "DESTROYS";
+  private static final int ENTRY_VALUE = 0;
+  private static final int UPDATED_ENTRY_VALUE = 1;
+  private static final String KEY = "key-1";
+  @Rule
+  public DistributedRule distributedRule = new DistributedRule();
+  @Rule
+  public CacheRule cacheRule = CacheRule.builder().createCacheInAll().build();
+  @Rule
+  public SerializableTestName testName = new SerializableTestName();
+  @Rule
+  public DistributedCounters sharedCountersRule = new DistributedCounters();
+  @Rule
+  public DistributedErrorCollector errorCollector = new DistributedErrorCollector();
+  protected String regionName;
 
-  @Parameters(name = "{index}: redundancy={0}")
-  public static Iterable<Integer> data() {
-    return Arrays.asList(0, 3);
+  @Parameters
+  public static Collection<Object[]> data() {
+    return Arrays.asList(new Object[][] {
+        {1, Boolean.FALSE},
+        {3, Boolean.TRUE},
+    });
   }
 
   @Parameter
   public int redundancy;
 
-  @Override
+  @Parameter(1)
+  public Boolean withData;
+
   protected Region<String, Integer> createRegion(final String name,
       final CacheListener<String, Integer> listener) {
+    return createPartitionedRegion(name, listener, false);
+  }
+
+  protected Region<String, Integer> createAccessorRegion(final String name,
+      final CacheListener<String, Integer> listener) {
+    return createPartitionedRegion(name, listener, true);
+  }
+
+  private Region<String, Integer> createPartitionedRegion(String name,
+      CacheListener<String, Integer> listener, boolean accessor) {
+    LogService.getLogger()
+        .info("Params [Redundancy: " + redundancy + " withData:" + withData + "]");
     PartitionAttributesFactory<String, Integer> paf = new PartitionAttributesFactory<>();
     paf.setRedundantCopies(redundancy);
 
+    if (accessor) {
+      paf.setLocalMaxMemory(0);
+    }
     RegionFactory<String, Integer> regionFactory = cacheRule.getCache().createRegionFactory();
-    regionFactory.addCacheListener(listener);
+    if (listener != null) {
+      regionFactory.addCacheListener(listener);
+    }
     regionFactory.setDataPolicy(DataPolicy.PARTITION);
     regionFactory.setPartitionAttributes(paf.create());
 
     return regionFactory.create(name);
   }
 
-  @Override
+  private void withData(Region region) {
+    if (withData) {
+      // Fewer buckets.
+      // Covers case where node doesn't have any buckets depending on redundancy.
+      region.put("key1", "value1");
+      region.put("key2", "value2");
+    }
+  }
+
   protected int expectedCreates() {
     return 1;
   }
 
-  @Override
   protected int expectedUpdates() {
     return 1;
   }
 
-  @Override
   protected int expectedInvalidates() {
     return 1;
   }
 
-  @Override
   protected int expectedDestroys() {
     return 1;
   }
+
+  @Test
+  public void afterRegionDestroyIsInvokedInEveryMember() {
+    CacheListener<String, Integer> listener = new RegionDestroyCountingCacheListener();
+    Region<String, Integer> region = createRegion(regionName, listener);
+
+    for (int i = 0; i < getVMCount(); i++) {
+      getVM(i).invoke(() -> {
+        withData(createRegion(regionName, listener));
+      });
+    }
+
+    region.destroyRegion();
+
+    assertThat(sharedCountersRule.getTotal(REGION_DESTROY))
+        .isGreaterThanOrEqualTo(expectedRegionDestroys());
+  }
+
+  @Test
+  public void afterRegionDestroyIsInvokedOnNodeWithListener() {
+    CacheListener<String, Integer> listener = new RegionDestroyCountingCacheListener();
+    Region<String, Integer> region = createRegion(regionName, listener);
+
+    for (int i = 0; i < getVMCount(); i++) {
+      getVM(i).invoke(() -> {
+        withData(createRegion(regionName, null));
+      });
+    }
+
+    region.destroyRegion();
+
+    assertThat(sharedCountersRule.getTotal(REGION_DESTROY)).isEqualTo(1);
+  }
+
+  @Test
+  public void afterRegionDestroyIsInvokedOnRemoteNodeWithListener() {
+    CacheListener<String, Integer> listener = new RegionDestroyCountingCacheListener();
+    Region<String, Integer> region = createRegion(regionName, null);
+
+    getVM(0).invoke(() -> {
+      createRegion(regionName, listener);
+    });
+
+    for (int i = 1; i < getVMCount(); i++) {
+      getVM(i).invoke(() -> {
+        withData(createRegion(regionName, null));
+      });
+    }
+
+    region.destroyRegion();
+
+    assertThat(sharedCountersRule.getTotal(REGION_DESTROY)).isEqualTo(1);
+  }
+
+  @Test
+  public void afterRegionDestroyIsInvokedOnAccessorAndDataMembers() {
+    CacheListener<String, Integer> listener = new RegionDestroyCountingCacheListener();
+    Region<String, Integer> region = createAccessorRegion(regionName, listener);
+    for (int i = 0; i < getVMCount(); i++) {
+      getVM(i).invoke(() -> {
+        withData(createRegion(regionName, listener));
+      });
+    }
+
+    region.destroyRegion();
+
+    assertThat(sharedCountersRule.getTotal(REGION_DESTROY))
+        .isGreaterThanOrEqualTo(expectedRegionDestroys());
+  }
+
+  @Test
+  public void afterRegionDestroyIsInvokedOnAccessor() {
+    CacheListener<String, Integer> listener = new RegionDestroyCountingCacheListener();
+    Region<String, Integer> region = createAccessorRegion(regionName, listener);
+
+    for (int i = 0; i < getVMCount(); i++) {
+      getVM(i).invoke(() -> {
+        withData(createRegion(regionName, null));
+      });
+    }
+
+    region.destroyRegion();
+
+    assertThat(sharedCountersRule.getTotal(REGION_DESTROY)).isEqualTo(1);
+  }
+
+  @Test
+  public void afterRegionDestroyIsInvokedOnNonAccessor() {
+    CacheListener<String, Integer> listener = new RegionDestroyCountingCacheListener();
+    Region<String, Integer> region = createAccessorRegion(regionName, null);
+    getVM(0).invoke(() -> {
+      createRegion(regionName, listener);
+    });
+    for (int i = 1; i < getVMCount(); i++) {
+      getVM(i).invoke(() -> {
+        withData(createRegion(regionName, null));
+      });
+    }
+
+    region.destroyRegion();
+
+    assertThat(sharedCountersRule.getTotal(REGION_DESTROY)).isEqualTo(1);
+  }
+
+  @Test
+  public void afterRegionClearIsInvokedInEveryMember() {
+    CacheListener<String, Integer> listener = new ClearCountingCacheListener();
+    Region<String, Integer> region = createRegion(regionName, listener);
+
+    for (int i = 0; i < getVMCount(); i++) {
+      getVM(i).invoke(() -> {
+        withData(createRegion(regionName, listener));
+      });
+    }
+
+    region.clear();
+
+    assertThat(sharedCountersRule.getTotal(CLEAR)).isEqualTo(expectedClears());
+  }
+
+  @Test
+  public void afterClearIsInvokedOnNodeWithListener() {
+    CacheListener<String, Integer> listener = new ClearCountingCacheListener();
+    Region<String, Integer> region = createRegion(regionName, listener);
+    for (int i = 0; i < getVMCount(); i++) {
+      getVM(i).invoke(() -> {
+        withData(createRegion(regionName, null));
+      });
+    }
+
+    region.clear();
+
+    assertThat(sharedCountersRule.getTotal(CLEAR)).isEqualTo(1);
+  }
+
+  @Test
+  public void afterRegionClearIsInvokedOnRemoteNodeWithListener() {
+    CacheListener<String, Integer> listener = new ClearCountingCacheListener();
+    Region<String, Integer> region = createRegion(regionName, null);
+    getVM(0).invoke(() -> {
+      createRegion(regionName, listener);
+    });
+    for (int i = 1; i < getVMCount(); i++) {
+      getVM(i).invoke(() -> {
+        withData(createRegion(regionName, null));
+      });
+    }
+
+    region.clear();
+
+    assertThat(sharedCountersRule.getTotal(CLEAR)).isEqualTo(1);
+  }
+
+  @Test
+  public void afterRegionClearIsInvokedOnAccessorAndDataMembers() {
+    CacheListener<String, Integer> listener = new ClearCountingCacheListener();
+    Region<String, Integer> region = createAccessorRegion(regionName, listener);
+
+    for (int i = 0; i < getVMCount(); i++) {
+      getVM(i).invoke(() -> {
+        withData(createRegion(regionName, listener));
+      });
+    }
+
+    region.clear();
+
+    assertThat(sharedCountersRule.getTotal(CLEAR)).isEqualTo(expectedClears());
+  }
+
+  @Test
+  public void afterRegionClearIsInvokedOnAccessor() {
+    CacheListener<String, Integer> listener = new ClearCountingCacheListener();
+    Region<String, Integer> region = createAccessorRegion(regionName, listener);
+
+    for (int i = 0; i < getVMCount(); i++) {
+      getVM(i).invoke(() -> {
+        withData(createRegion(regionName, null));
+      });
+    }
+
+    region.clear();
+
+    assertThat(sharedCountersRule.getTotal(CLEAR)).isEqualTo(1);
+  }
+
+  @Test
+  public void afterRegionClearIsInvokedOnNonAccessor() {
+    CacheListener<String, Integer> listener = new ClearCountingCacheListener();
+    Region<String, Integer> region = createAccessorRegion(regionName, null);
+
+    getVM(0).invoke(() -> {
+      createRegion(regionName, listener);
+    });
+    for (int i = 1; i < getVMCount(); i++) {
+      getVM(i).invoke(() -> {
+        withData(createRegion(regionName, null));
+      });
+    }
+
+    region.clear();
+
+    assertThat(sharedCountersRule.getTotal(CLEAR)).isEqualTo(1);
+  }
+
+  @Before
+  public void setUp() {
+    regionName = getClass().getSimpleName();
+
+    sharedCountersRule.initialize(CREATES);
+    sharedCountersRule.initialize(DESTROYS);
+    sharedCountersRule.initialize(INVALIDATES);
+    sharedCountersRule.initialize(UPDATES);
+    sharedCountersRule.initialize(CLEAR);
+    sharedCountersRule.initialize(REGION_DESTROY);
+  }
+
+  @Test
+  public void afterCreateIsInvokedInEveryMember() {
+    CacheListener<String, Integer> listener = new CreateCountingCacheListener();
+    Region<String, Integer> region = createRegion(regionName, listener);
+    for (int i = 0; i < getVMCount(); i++) {
+      getVM(i).invoke(() -> {
+        createRegion(regionName, listener);
+      });
+    }
+
+    region.put(KEY, ENTRY_VALUE, cacheRule.getSystem().getDistributedMember());
+
+    assertThat(sharedCountersRule.getTotal(CREATES)).isEqualTo(expectedCreates());
+  }
+
+  @Test
+  public void afterUpdateIsInvokedInEveryMember() {
+    CacheListener<String, Integer> listener = new UpdateCountingCacheListener();
+    Region<String, Integer> region = createRegion(regionName, listener);
+    for (int i = 0; i < getVMCount(); i++) {
+      getVM(i).invoke(() -> {
+        createRegion(regionName, listener);
+      });
+    }
+
+    region.put(KEY, ENTRY_VALUE, cacheRule.getSystem().getDistributedMember());
+    region.put(KEY, UPDATED_ENTRY_VALUE, cacheRule.getSystem().getDistributedMember());
+
+    assertThat(sharedCountersRule.getTotal(UPDATES)).isEqualTo(expectedUpdates());
+  }
+
+  @Test
+  public void afterInvalidateIsInvokedInEveryMember() {
+    CacheListener<String, Integer> listener = new InvalidateCountingCacheListener();
+    Region<String, Integer> region = createRegion(regionName, listener);
+    for (int i = 0; i < getVMCount(); i++) {
+      getVM(i).invoke(() -> {
+        createRegion(regionName, listener);
+      });
+    }
+
+    region.put(KEY, 0, cacheRule.getSystem().getDistributedMember());
+    region.invalidate(KEY);
+
+    assertThat(sharedCountersRule.getTotal(INVALIDATES)).isEqualTo(expectedInvalidates());
+    assertThat(region.get(KEY)).isNull();
+  }
+
+  @Test
+  public void afterDestroyIsInvokedInEveryMember() {
+    CacheListener<String, Integer> listener = new DestroyCountingCacheListener();
+    Region<String, Integer> region = createRegion(regionName, listener);
+    for (int i = 0; i < getVMCount(); i++) {
+      getVM(i).invoke(() -> {
+        createRegion(regionName, listener);
+      });
+    }
+
+    region.put(KEY, 0, cacheRule.getSystem().getDistributedMember());
+    region.destroy(KEY);
+
+    assertThat(sharedCountersRule.getTotal(DESTROYS)).isEqualTo(expectedDestroys());
+  }
+
+  @Test
+  public void afterClearIsInvokedInEveryMember() {
+    CacheListener<String, Integer> listener = new ClearCountingCacheListener();
+    Region<String, Integer> region = createRegion(regionName, listener);
+    for (int i = 0; i < getVMCount(); i++) {
+      getVM(i).invoke(() -> {
+        createRegion(regionName, listener);
+      });
+    }
+
+    region.clear();
+
+    assertThat(sharedCountersRule.getTotal(CLEAR)).isEqualTo(expectedClears());
+  }
+
+  protected int expectedClears() {
+    return getVMCount() + 1;
+  }
+
+  protected int expectedRegionDestroys() {
+    return getVMCount() + 1;
+  }
+
+  /**
+   * Overridden within tests to increment shared counters.
+   */
+  private abstract static class BaseCacheListener extends CacheListenerAdapter<String, Integer>
+      implements Serializable {
+
+    @Override
+    public void afterCreate(final EntryEvent<String, Integer> event) {
+      fail("Unexpected listener callback: afterCreate");
+    }
+
+    @Override
+    public void afterInvalidate(final EntryEvent<String, Integer> event) {
+      fail("Unexpected listener callback: afterInvalidate");
+    }
+
+    @Override
+    public void afterDestroy(final EntryEvent<String, Integer> event) {
+      fail("Unexpected listener callback: afterDestroy");
+    }
+
+    @Override
+    public void afterUpdate(final EntryEvent<String, Integer> event) {
+      fail("Unexpected listener callback: afterUpdate");
+    }
+
+    @Override
+    public void afterRegionInvalidate(final RegionEvent<String, Integer> event) {
+      fail("Unexpected listener callback: afterRegionInvalidate");
+    }
+  }
+
+  private class CreateCountingCacheListener extends BaseCacheListener {
+
+    @Override
+    public void afterCreate(final EntryEvent<String, Integer> event) {
+      sharedCountersRule.increment(CREATES);
+
+      errorCollector.checkThat(event.getDistributedMember(), equalTo(event.getCallbackArgument()));
+      errorCollector.checkThat(event.getOperation(), equalTo(Operation.CREATE));
+      errorCollector.checkThat(event.getOldValue(), nullValue());
+      errorCollector.checkThat(event.getNewValue(), equalTo(ENTRY_VALUE));
+
+      if (event.getSerializedOldValue() != null) {
+        errorCollector.checkThat(event.getSerializedOldValue().getDeserializedValue(),
+            equalTo(event.getOldValue()));
+      }
+      if (event.getSerializedNewValue() != null) {
+        errorCollector.checkThat(event.getSerializedNewValue().getDeserializedValue(),
+            equalTo(event.getNewValue()));
+      }
+    }
+  }
+
+  private class UpdateCountingCacheListener extends BaseCacheListener {
+
+    @Override
+    public void afterCreate(final EntryEvent<String, Integer> event) {
+      // nothing
+    }
+
+    @Override
+    public void afterUpdate(final EntryEvent<String, Integer> event) {
+      sharedCountersRule.increment(UPDATES);
+
+      errorCollector.checkThat(event.getDistributedMember(), equalTo(event.getCallbackArgument()));
+      errorCollector.checkThat(event.getOperation(), equalTo(Operation.UPDATE));
+      errorCollector.checkThat(event.getOldValue(), anyOf(equalTo(ENTRY_VALUE), nullValue()));
+      errorCollector.checkThat(event.getNewValue(), equalTo(UPDATED_ENTRY_VALUE));
+
+      if (event.getSerializedOldValue() != null) {
+        errorCollector.checkThat(event.getSerializedOldValue().getDeserializedValue(),
+            equalTo(event.getOldValue()));
+      }
+      if (event.getSerializedNewValue() != null) {
+        errorCollector.checkThat(event.getSerializedNewValue().getDeserializedValue(),
+            equalTo(event.getNewValue()));
+      }
+    }
+  }
+
+  private class InvalidateCountingCacheListener extends BaseCacheListener {
+
+    @Override
+    public void afterCreate(final EntryEvent<String, Integer> event) {
+      // ignore
+    }
+
+    @Override
+    public void afterInvalidate(final EntryEvent<String, Integer> event) {
+      sharedCountersRule.increment(INVALIDATES);
+
+      if (event.isOriginRemote()) {
+        errorCollector.checkThat(event.getDistributedMember(),
+            not(cacheRule.getSystem().getDistributedMember()));
+      } else {
+        errorCollector.checkThat(event.getDistributedMember(),
+            equalTo(cacheRule.getSystem().getDistributedMember()));
+      }
+      errorCollector.checkThat(event.getOperation(), equalTo(Operation.INVALIDATE));
+      errorCollector.checkThat(event.getOldValue(), anyOf(equalTo(ENTRY_VALUE), nullValue()));
+      errorCollector.checkThat(event.getNewValue(), nullValue());
+    }
+  }
+
+  private class DestroyCountingCacheListener extends BaseCacheListener {
+
+    @Override
+    public void afterCreate(final EntryEvent<String, Integer> event) {
+      sharedCountersRule.increment(CREATES);
+    }
+
+    @Override
+    public void afterUpdate(final EntryEvent<String, Integer> event) {
+      sharedCountersRule.increment(UPDATES);
+    }
+
+    @Override
+    public void afterDestroy(final EntryEvent<String, Integer> event) {
+      sharedCountersRule.increment(DESTROYS);
+
+      if (event.isOriginRemote()) {
+        errorCollector.checkThat(event.getDistributedMember(),
+            not(cacheRule.getSystem().getDistributedMember()));
+      } else {
+        errorCollector.checkThat(event.getDistributedMember(),
+            equalTo(cacheRule.getSystem().getDistributedMember()));
+      }
+      errorCollector.checkThat(event.getOperation(), equalTo(Operation.DESTROY));
+      errorCollector.checkThat(event.getOldValue(), anyOf(equalTo(ENTRY_VALUE), nullValue()));
+      errorCollector.checkThat(event.getNewValue(), nullValue());
+    }
+  }
+
+  protected class ClearCountingCacheListener extends BaseCacheListener {
+
+    @Override
+    public void afterCreate(final EntryEvent<String, Integer> event) {
+      sharedCountersRule.increment(CREATES);
+    }
+
+    @Override
+    public void afterUpdate(final EntryEvent<String, Integer> event) {
+      sharedCountersRule.increment(UPDATES);
+    }
+
+    @Override
+    public void afterRegionClear(RegionEvent<String, Integer> event) {
+
+      sharedCountersRule.increment(CLEAR);
+      if (!event.getRegion().getAttributes().getDataPolicy().withPartitioning()) {
+        if (event.isOriginRemote()) {
+          errorCollector.checkThat(event.getDistributedMember(),
+              not(cacheRule.getSystem().getDistributedMember()));
+        } else {
+          errorCollector.checkThat(event.getDistributedMember(),
+              equalTo(cacheRule.getSystem().getDistributedMember()));
+        }
+      }
+      errorCollector.checkThat(event.getOperation(), equalTo(Operation.REGION_CLEAR));
+      errorCollector.checkThat(event.getRegion().getName(), equalTo(regionName));
+    }
+  }
+
+  protected class RegionDestroyCountingCacheListener extends BaseCacheListener {
+
+    @Override
+    public void afterCreate(final EntryEvent<String, Integer> event) {
+      sharedCountersRule.increment(CREATES);
+    }
+
+    @Override
+    public void afterUpdate(final EntryEvent<String, Integer> event) {
+      sharedCountersRule.increment(UPDATES);
+    }
+
+    @Override
+    public void afterRegionDestroy(final RegionEvent<String, Integer> event) {
+      sharedCountersRule.increment(REGION_DESTROY);
+
+      if (!event.getRegion().getAttributes().getDataPolicy().withPartitioning()) {
+        if (event.isOriginRemote()) {
+          errorCollector.checkThat(event.getDistributedMember(),
+              not(cacheRule.getSystem().getDistributedMember()));
+        } else {
+          errorCollector.checkThat(event.getDistributedMember(),
+              equalTo(cacheRule.getSystem().getDistributedMember()));
+        }
+      }
+      errorCollector.checkThat(event.getOperation(), equalTo(Operation.REGION_DESTROY));
+      errorCollector.checkThat(event.getRegion().getName(), equalTo(regionName));
+    }
+  }
 }
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/cache/RegionClearStatsDistributedTest.java b/geode-core/src/distributedTest/java/org/apache/geode/cache/RegionClearStatsDistributedTest.java
index 086a93f48b..e0214b7c7d 100755
--- a/geode-core/src/distributedTest/java/org/apache/geode/cache/RegionClearStatsDistributedTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/cache/RegionClearStatsDistributedTest.java
@@ -169,7 +169,7 @@ public class RegionClearStatsDistributedTest implements Serializable {
   }
 
   private void validateClearCountStat() {
-    assertThat(cacheRule.getCache().getCachePerfStats().getClearCount())
+    assertThat(cacheRule.getCache().getCachePerfStats().getRegionClearCount())
         .isEqualTo(EXPECTED_CLEAR_COUNT_STAT_VALUE);
   }
 }
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/cache/ReplicateCacheListenerDistributedTest.java b/geode-core/src/distributedTest/java/org/apache/geode/cache/ReplicateCacheListenerDistributedTest.java
index 3eedcefb55..dd229def23 100644
--- a/geode-core/src/distributedTest/java/org/apache/geode/cache/ReplicateCacheListenerDistributedTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/cache/ReplicateCacheListenerDistributedTest.java
@@ -51,13 +51,15 @@ public class ReplicateCacheListenerDistributedTest implements Serializable {
   private static final String UPDATES = "UPDATES";
   private static final String INVALIDATES = "INVALIDATES";
   private static final String DESTROYS = "DESTROYS";
+  private static final String CLEAR = "CLEAR";
+  private static final String REGION_DESTROY = "REGION_DESTROY";
 
   private static final int ENTRY_VALUE = 0;
   private static final int UPDATED_ENTRY_VALUE = 1;
 
   private static final String KEY = "key-1";
 
-  private String regionName;
+  protected String regionName;
 
   @Rule
   public DistributedRule distributedRule = new DistributedRule();
@@ -82,6 +84,8 @@ public class ReplicateCacheListenerDistributedTest implements Serializable {
     distributedCounters.initialize(DESTROYS);
     distributedCounters.initialize(INVALIDATES);
     distributedCounters.initialize(UPDATES);
+    distributedCounters.initialize(CLEAR);
+    distributedCounters.initialize(REGION_DESTROY);
   }
 
   @Test
@@ -148,6 +152,36 @@ public class ReplicateCacheListenerDistributedTest implements Serializable {
     assertThat(distributedCounters.getTotal(DESTROYS)).isEqualTo(expectedDestroys());
   }
 
+  @Test
+  public void afterClearIsInvokedInEveryMember() {
+    CacheListener<String, Integer> listener = new ClearCountingCacheListener();
+    Region<String, Integer> region = createRegion(regionName, listener);
+    for (int i = 0; i < getVMCount(); i++) {
+      getVM(i).invoke(() -> {
+        createRegion(regionName, listener);
+      });
+    }
+
+    region.clear();
+
+    assertThat(distributedCounters.getTotal(CLEAR)).isEqualTo(expectedClears());
+  }
+
+  @Test
+  public void afterRegionDestroyIsInvokedInEveryMember() {
+    CacheListener<String, Integer> listener = new RegionDestroyCountingCacheListener();
+    Region<String, Integer> region = createRegion(regionName, listener);
+    for (int i = 0; i < getVMCount(); i++) {
+      getVM(i).invoke(() -> {
+        createRegion(regionName, listener);
+      });
+    }
+
+    region.destroyRegion();
+
+    assertThat(distributedCounters.getTotal(REGION_DESTROY)).isEqualTo(expectedRegionDestroys());
+  }
+
   protected Region<String, Integer> createRegion(final String name,
       final CacheListener<String, Integer> listener) {
     RegionFactory<String, Integer> regionFactory = cacheRule.getCache().createRegionFactory();
@@ -174,6 +208,14 @@ public class ReplicateCacheListenerDistributedTest implements Serializable {
     return getVMCount() + 1;
   }
 
+  protected int expectedClears() {
+    return getVMCount() + 1;
+  }
+
+  protected int expectedRegionDestroys() {
+    return getVMCount() + 1;
+  }
+
   /**
    * Overridden within tests to increment shared counters.
    */
@@ -283,7 +325,12 @@ public class ReplicateCacheListenerDistributedTest implements Serializable {
 
     @Override
     public void afterCreate(final EntryEvent<String, Integer> event) {
-      // ignore
+      distributedCounters.increment(CREATES);
+    }
+
+    @Override
+    public void afterUpdate(final EntryEvent<String, Integer> event) {
+      distributedCounters.increment(UPDATES);
     }
 
     @Override
@@ -302,4 +349,64 @@ public class ReplicateCacheListenerDistributedTest implements Serializable {
       errorCollector.checkThat(event.getNewValue(), nullValue());
     }
   }
+
+  protected class ClearCountingCacheListener extends BaseCacheListener {
+
+    @Override
+    public void afterCreate(final EntryEvent<String, Integer> event) {
+      distributedCounters.increment(CREATES);
+    }
+
+    @Override
+    public void afterUpdate(final EntryEvent<String, Integer> event) {
+      distributedCounters.increment(UPDATES);
+    }
+
+    @Override
+    public void afterRegionClear(RegionEvent<String, Integer> event) {
+
+      distributedCounters.increment(CLEAR);
+      if (!event.getRegion().getAttributes().getDataPolicy().withPartitioning()) {
+        if (event.isOriginRemote()) {
+          errorCollector.checkThat(event.getDistributedMember(),
+              not(cacheRule.getSystem().getDistributedMember()));
+        } else {
+          errorCollector.checkThat(event.getDistributedMember(),
+              equalTo(cacheRule.getSystem().getDistributedMember()));
+        }
+      }
+      errorCollector.checkThat(event.getOperation(), equalTo(Operation.REGION_CLEAR));
+      errorCollector.checkThat(event.getRegion().getName(), equalTo(regionName));
+    }
+  }
+
+  protected class RegionDestroyCountingCacheListener extends BaseCacheListener {
+
+    @Override
+    public void afterCreate(final EntryEvent<String, Integer> event) {
+      distributedCounters.increment(CREATES);
+    }
+
+    @Override
+    public void afterUpdate(final EntryEvent<String, Integer> event) {
+      distributedCounters.increment(UPDATES);
+    }
+
+    @Override
+    public void afterRegionDestroy(final RegionEvent<String, Integer> event) {
+      distributedCounters.increment(REGION_DESTROY);
+
+      if (!event.getRegion().getAttributes().getDataPolicy().withPartitioning()) {
+        if (event.isOriginRemote()) {
+          errorCollector.checkThat(event.getDistributedMember(),
+              not(cacheRule.getSystem().getDistributedMember()));
+        } else {
+          errorCollector.checkThat(event.getDistributedMember(),
+              equalTo(cacheRule.getSystem().getDistributedMember()));
+        }
+      }
+      errorCollector.checkThat(event.getOperation(), equalTo(Operation.REGION_DESTROY));
+      errorCollector.checkThat(event.getRegion().getName(), equalTo(regionName));
+    }
+  }
 }
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/cache/query/partitioned/PRClearCreateIndexDUnitTest.java b/geode-core/src/distributedTest/java/org/apache/geode/cache/query/partitioned/PRClearCreateIndexDUnitTest.java
new file mode 100644
index 0000000000..1c94c2dec7
--- /dev/null
+++ b/geode-core/src/distributedTest/java/org/apache/geode/cache/query/partitioned/PRClearCreateIndexDUnitTest.java
@@ -0,0 +1,265 @@
+/*
+ * 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.cache.query.partitioned;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.io.Serializable;
+import java.util.stream.IntStream;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+import org.apache.geode.cache.Region;
+import org.apache.geode.cache.client.ClientCache;
+import org.apache.geode.cache.client.ClientRegionShortcut;
+import org.apache.geode.cache.query.QueryService;
+import org.apache.geode.distributed.internal.ClusterDistributionManager;
+import org.apache.geode.distributed.internal.DistributionMessage;
+import org.apache.geode.distributed.internal.DistributionMessageObserver;
+import org.apache.geode.internal.cache.DistributedClearOperation;
+import org.apache.geode.internal.cache.DistributedClearOperation.ClearRegionMessage;
+import org.apache.geode.internal.cache.PartitionedRegionClearMessage;
+import org.apache.geode.test.dunit.AsyncInvocation;
+import org.apache.geode.test.dunit.rules.ClientVM;
+import org.apache.geode.test.dunit.rules.ClusterStartupRule;
+import org.apache.geode.test.dunit.rules.MemberVM;
+
+public class PRClearCreateIndexDUnitTest implements Serializable {
+  @Rule
+  public ClusterStartupRule cluster = new ClusterStartupRule(4, true);
+
+  private MemberVM primary, secondary;
+  private ClientVM client;
+
+  @Before
+  public void before() throws Exception {
+    int locatorPort = ClusterStartupRule.getDUnitLocatorPort();
+    primary = cluster.startServerVM(0, locatorPort);
+    secondary = cluster.startServerVM(1, locatorPort);
+
+    // create region on server1 first, making sure server1 has the primary bucket
+    primary.invoke(() -> {
+      DistributionMessageObserver.setInstance(new MessageObserver());
+      Region<Object, Object> region =
+          ClusterStartupRule.memberStarter.createPartitionRegion("regionA",
+              f -> f.setTotalNumBuckets(1).setRedundantCopies(1));
+      IntStream.range(0, 100).forEach(i -> region.put(i, "value" + i));
+    });
+
+    // server2 has the secondary bucket
+    secondary.invoke(() -> {
+      DistributionMessageObserver.setInstance(new MessageObserver());
+      ClusterStartupRule.memberStarter.createPartitionRegion("regionA",
+          f -> f.setTotalNumBuckets(1).setRedundantCopies(1));
+    });
+  }
+
+  @After
+  public void after() throws Exception {
+    primary.invoke(() -> {
+      DistributionMessageObserver.setInstance(null);
+    });
+    secondary.invoke(() -> {
+      DistributionMessageObserver.setInstance(null);
+    });
+  }
+
+  // All tests create index on secondary members. These tests are making sure we are requesting
+  // locks for clear on secondary members as well. If we create index on the primary, the clear
+  // and createIndex will run sequentially so there would be no error. But if we create index on
+  // the secondary member and if the secondary member will not
+  // request a lock for clear operation, it will result in an EntryDestroyedException when create
+  // index is happening.
+
+  // Note: OP_LOCK_FOR_CLEAR, OP_CLEAR, OP_UNLOCK_FOR_CLEAR are messages for secondary members
+  // OP_LOCK_FOR_PR_CLEAR, OP_UNLOCK_FOR_PR_CLEAR, OP_PR_CLEAR can be for anybody
+
+  @Test
+  // all local buckets are primary, so only OP_LOCK_FOR_CLEAR and OP_CLEAR messages are sent to the
+  // secondary member
+  // in the end an OP_PR_CLEAR is sent to the secondary for no effect
+  public void clearFromPrimaryMember() throws Exception {
+    AsyncInvocation createIndex = secondary.invokeAsync(PRClearCreateIndexDUnitTest::createIndex);
+    AsyncInvocation clear = primary.invokeAsync(PRClearCreateIndexDUnitTest::clear);
+
+    createIndex.get();
+    clear.get();
+
+    // assert that secondary member received these messages
+    primary.invoke(() -> verifyEvents(false, false, false, false));
+    secondary.invoke(() -> verifyEvents(false, true, true, true));
+  }
+
+  @Test
+  // all local buckets are secondary, so an OP_PR_CLEAR is sent to the primary member, from there
+  // a OP_LOCK_FOR_CLEAR and OP_CLEAR messages are sent back to the secondary
+  public void clearFromSecondaryMember() throws Exception {
+    AsyncInvocation createIndex = secondary.invokeAsync(PRClearCreateIndexDUnitTest::createIndex);
+    AsyncInvocation clear = secondary.invokeAsync(PRClearCreateIndexDUnitTest::clear);
+
+    createIndex.get();
+    clear.get();
+
+    // assert that secondary member received these messages
+    primary.invoke(() -> verifyEvents(false, true, false, false));
+    secondary.invoke(() -> verifyEvents(false, false, true, true));
+  }
+
+  /**
+   * For interested client connecting to secondary member
+   * 1. locks all local primary region
+   * 2. send OP_LOCK_FOR_PR_CLEAR to lock all other members
+   * 3. send OP_PR_CLEAR to primary to clear
+   * 4. primary will send a OP_CLEAR message back to the secondary to clear
+   */
+  @Test
+  public void clearFromInterestedClientConnectingToSecondaryMember() throws Exception {
+    int port = secondary.getPort();
+    client = cluster.startClientVM(2, c -> c.withServerConnection(port).withPoolSubscription(true));
+    AsyncInvocation createIndex = secondary.invokeAsync(PRClearCreateIndexDUnitTest::createIndex);
+
+    AsyncInvocation clear = client.invokeAsync(() -> {
+      Thread.sleep(200);
+      ClientCache clientCache = ClusterStartupRule.getClientCache();
+      Region<Object, Object> regionA =
+          clientCache.createClientRegionFactory(ClientRegionShortcut.PROXY).create("regionA");
+      regionA.registerInterestForAllKeys();
+      regionA.clear();
+    });
+
+    createIndex.get();
+    clear.get();
+    primary.invoke(() -> verifyEvents(true, true, false, false));
+    secondary.invoke(() -> verifyEvents(false, false, true, true));
+  }
+
+  @Test
+  /**
+   * For interested client connecting to primary member, behaves like starting from primary member
+   * except it locks first
+   * 1. locks local primary regions
+   * 2. send OP_LOCK_FOR_PR_CLEAR to lock all other members' primary buckets
+   * 3. send a OP_LOCK_FOR_CLEAR message to lock all secondary buckets
+   * 4. send OP_CLEAR to clear all secondary buckets
+   */
+  public void clearFromInterestedClientConnectingToPrimaryMember() throws Exception {
+    int port = primary.getPort();
+    client = cluster.startClientVM(2, c -> c.withServerConnection(port).withPoolSubscription(true));
+    AsyncInvocation createIndex = secondary.invokeAsync(PRClearCreateIndexDUnitTest::createIndex);
+
+    AsyncInvocation clear = client.invokeAsync(() -> {
+      Thread.sleep(200);
+      ClientCache clientCache = ClusterStartupRule.getClientCache();
+      Region<Object, Object> regionA =
+          clientCache.createClientRegionFactory(ClientRegionShortcut.PROXY).create("regionA");
+      regionA.registerInterestForAllKeys();
+      regionA.clear();
+    });
+
+    createIndex.get();
+    clear.get();
+    primary.invoke(() -> verifyEvents(false, false, false, false));
+    secondary.invoke(() -> verifyEvents(true, true, true, true));
+  }
+
+  private static void clear() throws InterruptedException {
+    // start the clear a bit later that the createIndex operation, to reveal the race condition
+    // comment it out since the test does not need the race condition to happen anymore
+    // Thread.sleep(200);
+    Region region = ClusterStartupRule.getCache().getRegion("/regionA");
+    region.clear();
+  }
+
+  private static void createIndex() {
+    QueryService queryService = ClusterStartupRule.getCache().getQueryService();
+    // run create index multiple times to make sure the clear operation fall inside a
+    // createIndex Operation
+    IntStream.range(0, 10).forEach(i -> {
+      try {
+        queryService.createIndex("index" + i, "name" + i, "/regionA");
+      } catch (Exception e) {
+        throw new RuntimeException(e.getMessage(), e);
+      }
+    });
+  }
+
+  private static void verifyEvents(boolean lockOthers, boolean clearOthers, boolean lockSecondary,
+      boolean clearSecondary) {
+    MessageObserver observer = (MessageObserver) DistributionMessageObserver.getInstance();
+    assertThat(observer.isLock_others())
+        .describedAs("OP_LOCK_FOR_PR_CLEAR received: %s", observer.isLock_others())
+        .isEqualTo(lockOthers);
+    assertThat(observer.isClear_others())
+        .describedAs("OP_PR_CLEAR received: %s", observer.isClear_others()).isEqualTo(clearOthers);
+    assertThat(observer.isLock_secondary())
+        .describedAs("OP_LOCK_FOR_CLEAR received: %s", observer.isLock_secondary())
+        .isEqualTo(lockSecondary);
+    assertThat(observer.isClear_secondary())
+        .describedAs("OP_CLEAR received: %s", observer.isClear_secondary())
+        .isEqualTo(clearSecondary);
+  }
+
+  private static class MessageObserver extends DistributionMessageObserver {
+    private volatile boolean lock_secondary = false;
+    private volatile boolean clear_secondary = false;
+    private volatile boolean clear_others = false;
+    private volatile boolean lock_others = false;
+
+    @Override
+    public void beforeProcessMessage(ClusterDistributionManager dm, DistributionMessage message) {
+      if (message instanceof ClearRegionMessage) {
+        ClearRegionMessage clearMessage = (ClearRegionMessage) message;
+        if (clearMessage
+            .getOperationType() == DistributedClearOperation.OperationType.OP_LOCK_FOR_CLEAR) {
+          lock_secondary = true;
+        }
+        if (clearMessage.getOperationType() == DistributedClearOperation.OperationType.OP_CLEAR) {
+          clear_secondary = true;
+        }
+      }
+      if (message instanceof PartitionedRegionClearMessage) {
+        PartitionedRegionClearMessage clearMessage = (PartitionedRegionClearMessage) message;
+        if (clearMessage
+            .getOp() == PartitionedRegionClearMessage.OperationType.OP_LOCK_FOR_PR_CLEAR) {
+          lock_others = true;
+        }
+        if (clearMessage.getOp() == PartitionedRegionClearMessage.OperationType.OP_PR_CLEAR) {
+          clear_others = true;
+        }
+      }
+    }
+
+    public boolean isLock_secondary() {
+      return lock_secondary;
+    }
+
+    public boolean isClear_secondary() {
+      return clear_secondary;
+    }
+
+    public boolean isClear_others() {
+      return clear_others;
+    }
+
+    public boolean isLock_others() {
+      return lock_others;
+    }
+  }
+
+}
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/cache/query/partitioned/PRClearQueryIndexDUnitTest.java b/geode-core/src/distributedTest/java/org/apache/geode/cache/query/partitioned/PRClearQueryIndexDUnitTest.java
new file mode 100644
index 0000000000..feed3fc114
--- /dev/null
+++ b/geode-core/src/distributedTest/java/org/apache/geode/cache/query/partitioned/PRClearQueryIndexDUnitTest.java
@@ -0,0 +1,376 @@
+/*
+ * 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.cache.query.partitioned;
+
+import static org.apache.geode.distributed.ConfigurationProperties.SERIALIZABLE_OBJECT_FILTER;
+import static org.apache.geode.test.awaitility.GeodeAwaitility.await;
+import static org.apache.geode.test.junit.rules.VMProvider.invokeInEveryMember;
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.IntStream;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.ClassRule;
+import org.junit.Rule;
+import org.junit.Test;
+
+import org.apache.geode.cache.Cache;
+import org.apache.geode.cache.Region;
+import org.apache.geode.cache.RegionShortcut;
+import org.apache.geode.cache.client.ClientCache;
+import org.apache.geode.cache.client.ServerOperationException;
+import org.apache.geode.cache.query.Index;
+import org.apache.geode.cache.query.IndexStatistics;
+import org.apache.geode.cache.query.Query;
+import org.apache.geode.cache.query.QueryService;
+import org.apache.geode.cache.query.SelectResults;
+import org.apache.geode.cache.query.data.City;
+import org.apache.geode.internal.cache.InternalCache;
+import org.apache.geode.test.dunit.AsyncInvocation;
+import org.apache.geode.test.dunit.DUnitBlackboard;
+import org.apache.geode.test.dunit.rules.ClusterStartupRule;
+import org.apache.geode.test.dunit.rules.MemberVM;
+import org.apache.geode.test.junit.rules.ClientCacheRule;
+import org.apache.geode.test.junit.rules.ExecutorServiceRule;
+
+public class PRClearQueryIndexDUnitTest {
+  public static final String MUMBAI_QUERY = "select * from /cities c where c.name = 'MUMBAI'";
+  public static final String ID_10_QUERY = "select * from /cities c where c.id = 10";
+  @ClassRule
+  public static ClusterStartupRule cluster = new ClusterStartupRule(4, true);
+
+  private static MemberVM server1;
+  private static MemberVM server2;
+
+  private static DUnitBlackboard blackboard;
+
+  @Rule
+  public ClientCacheRule clientCacheRule = new ClientCacheRule();
+
+  @Rule
+  public ExecutorServiceRule executor = ExecutorServiceRule.builder().build();
+
+  private ClientCache clientCache;
+  private Region cities;
+
+  // class test setup. set up the servers, regions and indexes on the servers
+  @BeforeClass
+  public static void beforeClass() {
+    int locatorPort = ClusterStartupRule.getDUnitLocatorPort();
+    server1 = cluster.startServerVM(1, s -> s.withConnectionToLocator(locatorPort)
+        .withProperty(SERIALIZABLE_OBJECT_FILTER, "org.apache.geode.cache.query.data.*")
+        .withRegion(RegionShortcut.PARTITION, "cities"));
+    server2 = cluster.startServerVM(2, s -> s.withConnectionToLocator(locatorPort)
+        .withProperty(SERIALIZABLE_OBJECT_FILTER, "org.apache.geode.cache.query.data.*")
+        .withRegion(RegionShortcut.PARTITION, "cities"));
+
+    server1.invoke(() -> {
+      Cache cache = ClusterStartupRule.getCache();
+      Region region = cache.getRegion("cities");
+      // create indexes
+      QueryService queryService = cache.getQueryService();
+      queryService.createKeyIndex("cityId", "c.id", "/cities c");
+      queryService.createIndex("cityName", "c.name", "/cities c");
+      assertThat(cache.getQueryService().getIndexes(region))
+          .extracting(Index::getName).containsExactlyInAnyOrder("cityId", "cityName");
+    });
+
+    server2.invoke(() -> {
+      Cache cache = ClusterStartupRule.getCache();
+      Region region = cache.getRegion("cities");
+      assertThat(cache.getQueryService().getIndexes(region))
+          .extracting(Index::getName).containsExactlyInAnyOrder("cityId", "cityName");
+    });
+  }
+
+  // before every test method, create the client cache and region
+  @Before
+  public void before() throws Exception {
+    int locatorPort = ClusterStartupRule.getDUnitLocatorPort();
+    clientCache = clientCacheRule.withLocatorConnection(locatorPort).createCache();
+    cities = clientCacheRule.createProxyRegion("cities");
+  }
+
+  @Test
+  public void clearOnEmptyRegion() throws Exception {
+    cities.clear();
+    invokeInEveryMember(() -> {
+      verifyIndexesAfterClear("cities", "cityId", "cityName");
+    }, server1, server2);
+
+    IntStream.range(0, 10).forEach(i -> cities.put(i, new City(i)));
+    cities.clear();
+    invokeInEveryMember(() -> {
+      verifyIndexesAfterClear("cities", "cityId", "cityName");
+    }, server1, server2);
+  }
+
+  @Test
+  public void createIndexWhileClear() throws Exception {
+    IntStream.range(0, 1000).forEach(i -> cities.put(i, new City(i)));
+
+    // create index while clear
+    AsyncInvocation createIndex = server1.invokeAsync("create index", () -> {
+      Cache cache = ClusterStartupRule.getCache();
+      QueryService queryService = cache.getQueryService();
+      Index cityZip = queryService.createIndex("cityZip", "c.zip", "/cities c");
+      assertThat(cityZip).isNotNull();
+    });
+
+    // do clear for 3 times at the same time to increease the concurrency of clear and createIndex
+    for (int i = 0; i < 3; i++) {
+      cities.clear();
+    }
+    createIndex.await();
+
+    invokeInEveryMember(() -> {
+      verifyIndexesAfterClear("cities", "cityId", "cityName");
+    }, server1, server2);
+
+    QueryService queryService = clientCache.getQueryService();
+    Query query =
+        queryService.newQuery("select * from /cities c where c.zip < " + (City.ZIP_START + 10));
+    assertThat(((SelectResults) query.execute()).size()).isEqualTo(0);
+
+    IntStream.range(0, 10).forEach(i -> cities.put(i, new City(i)));
+    assertThat(((SelectResults) query.execute()).size()).isEqualTo(10);
+  }
+
+  @Test
+  public void createIndexWhileClearOnReplicateRegion() throws Exception {
+    invokeInEveryMember(() -> {
+      Cache cache = ClusterStartupRule.getCache();
+      cache.createRegionFactory(RegionShortcut.PARTITION)
+          .create("replicateCities");
+    }, server1, server2);
+
+    Region replicateCities = clientCacheRule.createProxyRegion("replicateCities");
+    IntStream.range(0, 1000).forEach(i -> replicateCities.put(i, new City(i)));
+
+    // create index while clear
+    AsyncInvocation createIndex = server1.invokeAsync("create index on replicate regions", () -> {
+      Cache cache = ClusterStartupRule.getCache();
+      QueryService queryService = cache.getQueryService();
+      Index cityZip = queryService.createIndex("cityZip_replicate", "c.zip", "/replicateCities c");
+      assertThat(cityZip).isNotNull();
+    });
+
+    // do clear at the same time for 3 timese
+    for (int i = 0; i < 3; i++) {
+      replicateCities.clear();
+    }
+    createIndex.await();
+
+    invokeInEveryMember(() -> {
+      verifyIndexesAfterClear("replicateCities", "cityZip_replicate");
+    }, server1, server2);
+
+    QueryService queryService = clientCache.getQueryService();
+    Query query =
+        queryService
+            .newQuery("select * from /replicateCities c where c.zip < " + (City.ZIP_START + 10));
+    assertThat(((SelectResults) query.execute()).size()).isEqualTo(0);
+
+    IntStream.range(0, 10).forEach(i -> replicateCities.put(i, new City(i)));
+    assertThat(((SelectResults) query.execute()).size()).isEqualTo(10);
+  }
+
+  @Test
+  public void removeIndexWhileClear() throws Exception {
+    // create cityZip index
+    server1.invoke("create index", () -> {
+      Cache cache = ClusterStartupRule.getCache();
+      QueryService queryService = cache.getQueryService();
+      Index cityZip = queryService.createIndex("cityZip", "c.zip", "/cities c");
+      assertThat(cityZip).isNotNull();
+    });
+
+    // remove index while clear
+    // removeIndex has to be invoked on each server. It's not distributed
+    AsyncInvocation removeIndex1 = server1.invokeAsync("remove index",
+        PRClearQueryIndexDUnitTest::removeCityZipIndex);
+    AsyncInvocation removeIndex2 = server2.invokeAsync("remove index",
+        PRClearQueryIndexDUnitTest::removeCityZipIndex);
+
+    cities.clear();
+    removeIndex1.await();
+    removeIndex2.await();
+
+    // make sure removeIndex and clear operations are successful
+    invokeInEveryMember(() -> {
+      InternalCache internalCache = ClusterStartupRule.getCache();
+      QueryService qs = internalCache.getQueryService();
+      Region region = internalCache.getRegion("cities");
+      assertThat(region.size()).isEqualTo(0);
+      // verify only 2 indexes created in the beginning of the tests exist
+      assertThat(qs.getIndexes(region)).extracting(Index::getName)
+          .containsExactlyInAnyOrder("cityId", "cityName");
+    }, server1, server2);
+  }
+
+  private static void removeCityZipIndex() {
+    Cache cache = ClusterStartupRule.getCache();
+    QueryService qs = cache.getQueryService();
+    Region<Object, Object> region = cache.getRegion("cities");
+    Index cityZip = qs.getIndex(region, "cityZip");
+    if (cityZip != null) {
+      qs.removeIndex(cityZip);
+    }
+  }
+
+  @Test
+  public void verifyQuerySucceedsAfterClear() throws Exception {
+    // put in some data
+    IntStream.range(0, 100).forEach(i -> cities.put(i, new City(i)));
+
+    QueryService queryService = clientCache.getQueryService();
+    Query query = queryService.newQuery(MUMBAI_QUERY);
+    Query query2 = queryService.newQuery(ID_10_QUERY);
+    assertThat(((SelectResults) query.execute()).size()).isEqualTo(50);
+    assertThat(((SelectResults) query2.execute()).size()).isEqualTo(1);
+
+    cities.clear();
+    invokeInEveryMember(() -> {
+      verifyIndexesAfterClear("cities", "cityId", "cityName");
+    }, server1, server2);
+
+    assertThat(((SelectResults) query.execute()).size()).isEqualTo(0);
+    assertThat(((SelectResults) query2.execute()).size()).isEqualTo(0);
+  }
+
+  private static void verifyIndexesAfterClear(String regionName, String... indexes) {
+    InternalCache internalCache = ClusterStartupRule.getCache();
+    QueryService qs = internalCache.getQueryService();
+    Region region = internalCache.getRegion(regionName);
+    assertThat(region.size()).isEqualTo(0);
+    for (String indexName : indexes) {
+      Index index = qs.getIndex(region, indexName);
+      IndexStatistics statistics = index.getStatistics();
+      assertThat(statistics.getNumberOfKeys()).isEqualTo(0);
+      assertThat(statistics.getNumberOfValues()).isEqualTo(0);
+    }
+  }
+
+  @Test
+  public void concurrentClearAndQuery() {
+    QueryService queryService = clientCache.getQueryService();
+    Query query = queryService.newQuery(MUMBAI_QUERY);
+    Query query2 = queryService.newQuery(ID_10_QUERY);
+
+    IntStream.range(0, 100).forEach(i -> cities.put(i, new City(i)));
+
+    server1.invokeAsync(() -> {
+      Cache cache = ClusterStartupRule.getCache();
+      Region region = cache.getRegion("cities");
+      region.clear();
+    });
+
+    await().untilAsserted(() -> {
+      assertThat(((SelectResults) query.execute()).size()).isEqualTo(0);
+      assertThat(((SelectResults) query2.execute()).size()).isEqualTo(0);
+    });
+  }
+
+  @Test
+  public void concurrentClearAndPut() throws Exception {
+    AsyncInvocation puts = server1.invokeAsync(() -> {
+      Cache cache = ClusterStartupRule.getCache();
+      Region region = cache.getRegion("cities");
+      for (int i = 0; i < 1000; i++) {
+        // wait for gate to open
+        getBlackboard().waitForGate("proceedToPut", 60, TimeUnit.SECONDS);
+        region.put(i, new City(i));
+      }
+    });
+
+    AsyncInvocation clears = server2.invokeAsync(() -> {
+      Cache cache = ClusterStartupRule.getCache();
+      Region region = cache.getRegion("cities");
+      // do clear 10 times
+      for (int i = 0; i < 10; i++) {
+        try {
+          // don't allow put to proceed. It's like "close the gate"
+          getBlackboard().clearGate("proceedToPut");
+          region.clear();
+          verifyIndexesAfterClear("cities", "cityId", "cityName");
+        } finally {
+          // allow put to proceed. It's like "open the gate"
+          getBlackboard().signalGate("proceedToPut");
+        }
+      }
+    });
+
+    puts.await();
+    clears.await();
+  }
+
+  @Test
+  public void serverLeavingAndJoiningWhilePutAndClear() throws Exception {
+    int locatorPort = ClusterStartupRule.getDUnitLocatorPort();
+    Future<Void> startStopServer = executor.submit(() -> {
+      for (int i = 0; i < 3; i++) {
+        MemberVM server3 = cluster.startServerVM(3, s -> s.withConnectionToLocator(locatorPort)
+            .withProperty(SERIALIZABLE_OBJECT_FILTER, "org.apache.geode.cache.query.data.*")
+            .withRegion(RegionShortcut.PARTITION, "cities"));
+        server3.stop(false);
+      }
+    });
+
+    Future<Void> putAndClear = executor.submit(() -> {
+      for (int i = 0; i < 30; i++) {
+        IntStream.range(0, 100).forEach(j -> cities.put(j, new City(j)));
+        try {
+          cities.clear();
+
+          // only verify if clear is successful
+          QueryService queryService = clientCache.getQueryService();
+          Query query = queryService.newQuery(MUMBAI_QUERY);
+          Query query2 = queryService.newQuery(ID_10_QUERY);
+          assertThat(((SelectResults) query.execute()).size()).isEqualTo(0);
+          assertThat(((SelectResults) query2.execute()).size()).isEqualTo(0);
+        } catch (ServerOperationException e) {
+          assertThat(e.getCause().getMessage())
+              .contains("Unable to clear all the buckets from the partitioned region cities")
+              .contains("either data (buckets) moved or member departed");
+        }
+      }
+    });
+    startStopServer.get(60, TimeUnit.SECONDS);
+    putAndClear.get(60, TimeUnit.SECONDS);
+  }
+
+  private static DUnitBlackboard getBlackboard() {
+    if (blackboard == null) {
+      blackboard = new DUnitBlackboard();
+    }
+    return blackboard;
+  }
+
+  @After
+  public void tearDown() {
+    invokeInEveryMember(() -> {
+      if (blackboard != null) {
+        blackboard.clearGate("proceedToPut");
+      }
+      // remove the cityZip index
+      removeCityZipIndex();
+    }, server1, server2);
+  }
+}
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionAfterClearNotificationDUnitTest.java b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionAfterClearNotificationDUnitTest.java
new file mode 100644
index 0000000000..237b6a8171
--- /dev/null
+++ b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionAfterClearNotificationDUnitTest.java
@@ -0,0 +1,372 @@
+/*
+ * 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.cache;
+
+import static java.util.concurrent.TimeUnit.SECONDS;
+import static org.apache.geode.test.dunit.rules.ClusterStartupRule.getCache;
+import static org.apache.geode.test.dunit.rules.ClusterStartupRule.getClientCache;
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Properties;
+import java.util.concurrent.TimeoutException;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.IntStream;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+import org.apache.geode.cache.InterestResultPolicy;
+import org.apache.geode.cache.PartitionAttributesFactory;
+import org.apache.geode.cache.Region;
+import org.apache.geode.cache.RegionEvent;
+import org.apache.geode.cache.RegionShortcut;
+import org.apache.geode.cache.client.ClientRegionShortcut;
+import org.apache.geode.cache.server.CacheServer;
+import org.apache.geode.cache.util.CacheListenerAdapter;
+import org.apache.geode.distributed.internal.ClusterDistributionManager;
+import org.apache.geode.distributed.internal.DistributionMessage;
+import org.apache.geode.distributed.internal.DistributionMessageObserver;
+import org.apache.geode.test.awaitility.GeodeAwaitility;
+import org.apache.geode.test.dunit.AsyncInvocation;
+import org.apache.geode.test.dunit.DUnitBlackboard;
+import org.apache.geode.test.dunit.SerializableCallableIF;
+import org.apache.geode.test.dunit.rules.ClientVM;
+import org.apache.geode.test.dunit.rules.ClusterStartupRule;
+import org.apache.geode.test.dunit.rules.MemberVM;
+
+public class PartitionedRegionAfterClearNotificationDUnitTest implements Serializable {
+  protected static final String REGION_NAME = "testPR";
+  protected static final int NUM_ENTRIES = 100;
+
+  protected int locatorPort;
+  protected MemberVM locator;
+  protected MemberVM dataStore1;
+  protected MemberVM dataStore2;
+  protected MemberVM dataStore3;
+  protected MemberVM accessor;
+
+  protected ClientVM client1;
+  protected ClientVM client2;
+
+  private static volatile DUnitBlackboard blackboard;
+
+  @Rule
+  public ClusterStartupRule cluster = new ClusterStartupRule(7);
+
+  @Before
+  public void setUp() throws Exception {
+    locator = cluster.startLocatorVM(0);
+    locatorPort = locator.getPort();
+    dataStore1 = cluster.startServerVM(1, getProperties(), locatorPort);
+    dataStore2 = cluster.startServerVM(2, getProperties(), locatorPort);
+    dataStore3 = cluster.startServerVM(3, getProperties(), locatorPort);
+    accessor = cluster.startServerVM(4, getProperties(), locatorPort);
+
+    client1 = cluster.startClientVM(5,
+        c -> c.withPoolSubscription(true).withLocatorConnection((locatorPort)));
+    client2 = cluster.startClientVM(6,
+        c -> c.withPoolSubscription(true).withLocatorConnection((locatorPort)));
+
+    dataStore1.invoke(this::initDataStore);
+    dataStore2.invoke(this::initDataStore);
+    dataStore3.invoke(this::initDataStore);
+    accessor.invoke(this::initAccessor);
+
+    getBlackboard().initBlackboard();
+  }
+
+  protected RegionShortcut getRegionShortCut() {
+    return RegionShortcut.PARTITION_REDUNDANT;
+  }
+
+  protected Properties getProperties() {
+    Properties properties = new Properties();
+    return properties;
+  }
+
+  private Region getRegion(boolean isClient) {
+    if (isClient) {
+      return getClientCache().getRegion(REGION_NAME);
+    } else {
+      return getCache().getRegion(REGION_NAME);
+    }
+  }
+
+  private void verifyRegionSize(boolean isClient, int expectedNum) {
+    GeodeAwaitility.await()
+        .untilAsserted(() -> assertThat(getRegion(isClient).size()).isEqualTo(expectedNum));
+  }
+
+  private void initClientCache() {
+    Region region = getClientCache().createClientRegionFactory(ClientRegionShortcut.CACHING_PROXY)
+        .create(REGION_NAME);
+    region.registerInterestForAllKeys(InterestResultPolicy.KEYS);
+  }
+
+  private void stopServers() {
+    List<CacheServer> cacheServers = getCache().getCacheServers();
+    for (CacheServer server : cacheServers) {
+      server.stop();
+    }
+  }
+
+  private void initDataStore() {
+    getCache().createRegionFactory(getRegionShortCut())
+        .setPartitionAttributes(new PartitionAttributesFactory().setTotalNumBuckets(10).create())
+        .addCacheListener(new CountingCacheListener())
+        .create(REGION_NAME);
+  }
+
+  private void initAccessor() {
+    RegionShortcut shortcut = getRegionShortCut();
+    getCache().createRegionFactory(shortcut)
+        .setPartitionAttributes(
+            new PartitionAttributesFactory().setTotalNumBuckets(10).setLocalMaxMemory(0).create())
+        .addCacheListener(new CountingCacheListener())
+        .create(REGION_NAME);
+  }
+
+  private void feed(boolean isClient) {
+    Region region = getRegion(isClient);
+    IntStream.range(0, NUM_ENTRIES).forEach(i -> region.put(i, "value" + i));
+  }
+
+  private void verifyServerRegionSize(int expectedNum) {
+    accessor.invoke(() -> verifyRegionSize(false, expectedNum));
+    dataStore1.invoke(() -> verifyRegionSize(false, expectedNum));
+    dataStore2.invoke(() -> verifyRegionSize(false, expectedNum));
+    dataStore3.invoke(() -> verifyRegionSize(false, expectedNum));
+  }
+
+  private void verifyClientRegionSize(int expectedNum) {
+    client1.invoke(() -> verifyRegionSize(true, expectedNum));
+    client2.invoke(() -> verifyRegionSize(true, expectedNum));
+  }
+
+  private void verifyCacheListenerTriggerCount(MemberVM serverVM) {
+    SerializableCallableIF<Integer> getListenerTriggerCount = () -> {
+      CountingCacheListener countingCacheListener =
+          (CountingCacheListener) getRegion(false).getAttributes()
+              .getCacheListeners()[0];
+      return countingCacheListener.getClears();
+    };
+
+    int count = accessor.invoke(getListenerTriggerCount)
+        + dataStore1.invoke(getListenerTriggerCount)
+        + dataStore2.invoke(getListenerTriggerCount)
+        + dataStore3.invoke(getListenerTriggerCount);
+    assertThat(count).isEqualTo(4);
+
+    if (serverVM != null) {
+      assertThat(serverVM.invoke(getListenerTriggerCount)).isEqualTo(1);
+    }
+  }
+
+  @Test
+  public void invokeClearOnDataStoreAndVerifyListenerCount() {
+    accessor.invoke(() -> feed(false));
+    verifyServerRegionSize(NUM_ENTRIES);
+
+    dataStore1.invoke(() -> getRegion(false).clear());
+
+    verifyServerRegionSize(0);
+    verifyCacheListenerTriggerCount(dataStore1);
+  }
+
+  @Test
+  public void invokeClearOnAccessorAndVerifyListenerCount() {
+    accessor.invoke(() -> feed(false));
+    verifyServerRegionSize(NUM_ENTRIES);
+    accessor.invoke(() -> getRegion(false).clear());
+    verifyServerRegionSize(0);
+    verifyCacheListenerTriggerCount(accessor);
+  }
+
+  @Test
+  public void invokeClearFromClientAndVerifyListenerCount() {
+    client1.invoke(this::initClientCache);
+    client2.invoke(this::initClientCache);
+
+    client1.invoke(() -> feed(true));
+    verifyClientRegionSize(NUM_ENTRIES);
+    verifyServerRegionSize(NUM_ENTRIES);
+
+    client1.invoke(() -> getRegion(true).clear());
+
+    verifyServerRegionSize(0);
+    verifyClientRegionSize(0);
+    verifyCacheListenerTriggerCount(null);
+  }
+
+  @Test
+  public void invokeClearFromClientWithAccessorAsServer() {
+    dataStore1.invoke(this::stopServers);
+    dataStore2.invoke(this::stopServers);
+    dataStore3.invoke(this::stopServers);
+
+    client1.invoke(this::initClientCache);
+    client2.invoke(this::initClientCache);
+
+    client1.invoke(() -> feed(true));
+    verifyClientRegionSize(NUM_ENTRIES);
+    verifyServerRegionSize(NUM_ENTRIES);
+
+    client1.invoke(() -> getRegion(true).clear());
+
+    verifyServerRegionSize(0);
+    verifyClientRegionSize(0);
+    verifyCacheListenerTriggerCount(null);
+  }
+
+  @Test
+  public void invokeClearFromDataStoreWithClientInterest() {
+    client1.invoke(this::initClientCache);
+    client2.invoke(this::initClientCache);
+
+    accessor.invoke(() -> feed(false));
+    verifyServerRegionSize(NUM_ENTRIES);
+
+    dataStore1.invoke(() -> getRegion(false).clear());
+
+    verifyServerRegionSize(0);
+    verifyCacheListenerTriggerCount(dataStore1);
+  }
+
+  @Test(expected = AssertionError.class)
+  public void verifyTheLocksAreClearedWhenMemberDepartsAfterTakingClearLockOnRemoteMembers()
+      throws Exception {
+    client1.invoke(this::initClientCache);
+    client2.invoke(this::initClientCache);
+
+    accessor.invoke(() -> feed(false));
+    verifyServerRegionSize(NUM_ENTRIES);
+    dataStore2.invoke(() -> DistributionMessageObserver.setInstance(
+        testHookToKillMemberCallingClearBeforeMessageProcessed()));
+
+    AsyncInvocation ds1ClearAsync = dataStore1.invokeAsync(() -> getRegion(false).clear());
+
+    getBlackboard().waitForGate("CLOSE_CACHE", 30, SECONDS);
+
+    dataStore1.invoke(() -> getCache().close());
+    getBlackboard().signalGate("CACHE_CLOSED");
+
+    // This should not be blocked.
+    dataStore2.invoke(() -> feed(false));
+    dataStore3.invoke(() -> feed(false));
+
+    dataStore2.invoke(() -> verifyRegionSize(false, NUM_ENTRIES));
+    dataStore3.invoke(() -> verifyRegionSize(false, NUM_ENTRIES));
+
+    ds1ClearAsync.await();
+  }
+
+  @Test
+  public void verifyTheLocksAreClearedWhenMemberDepartsAfterTakingClearLockOnRemoteMembersAfterMessageProcessed()
+      throws Exception {
+    client1.invoke(this::initClientCache);
+    client2.invoke(this::initClientCache);
+
+    accessor.invoke(() -> feed(false));
+    verifyServerRegionSize(NUM_ENTRIES);
+
+    dataStore2.invoke(() -> DistributionMessageObserver.setInstance(
+        testHookToKillMemberCallingClearAfterMessageProcessed()));
+
+    AsyncInvocation ds1ClearAsync = dataStore1.invokeAsync(() -> getRegion(false).clear());
+
+    getBlackboard().waitForGate("CLOSE_CACHE", 30, SECONDS);
+
+    dataStore1.invoke(() -> getCache().close());
+    getBlackboard().signalGate("CACHE_CLOSED");
+
+    // This should not be blocked.
+    dataStore2.invoke(() -> feed(false));
+    dataStore3.invoke(() -> feed(false));
+
+    dataStore2.invoke(() -> verifyRegionSize(false, NUM_ENTRIES));
+    dataStore3.invoke(() -> verifyRegionSize(false, NUM_ENTRIES));
+
+    ds1ClearAsync.await();
+  }
+
+
+  private static class CountingCacheListener extends CacheListenerAdapter {
+    private final AtomicInteger clears = new AtomicInteger();
+
+    @Override
+    public void afterRegionClear(RegionEvent event) {
+      clears.incrementAndGet();
+    }
+
+    int getClears() {
+      return clears.get();
+
+    }
+  }
+
+  private DistributionMessageObserver testHookToKillMemberCallingClearBeforeMessageProcessed() {
+    return new DistributionMessageObserver() {
+
+      @Override
+      public void beforeProcessMessage(ClusterDistributionManager dm, DistributionMessage message) {
+        if (message instanceof PartitionedRegionClearMessage) {
+          if (((PartitionedRegionClearMessage) message)
+              .getOp() == PartitionedRegionClearMessage.OperationType.OP_LOCK_FOR_PR_CLEAR) {
+            DistributionMessageObserver.setInstance(null);
+            getBlackboard().signalGate("CLOSE_CACHE");
+            try {
+              getBlackboard().waitForGate("CACHE_CLOSED", 30, SECONDS);
+              GeodeAwaitility.await().untilAsserted(
+                  () -> assertThat(dm.isCurrentMember(message.getSender())).isFalse());
+            } catch (TimeoutException | InterruptedException e) {
+              throw new RuntimeException("Failed waiting for signal.");
+            }
+          }
+        }
+      }
+    };
+  }
+
+  private DistributionMessageObserver testHookToKillMemberCallingClearAfterMessageProcessed() {
+    return new DistributionMessageObserver() {
+      @Override
+      public void afterProcessMessage(ClusterDistributionManager dm, DistributionMessage message) {
+        if (message instanceof PartitionedRegionClearMessage) {
+          if (((PartitionedRegionClearMessage) message)
+              .getOp() == PartitionedRegionClearMessage.OperationType.OP_LOCK_FOR_PR_CLEAR) {
+            DistributionMessageObserver.setInstance(null);
+            getBlackboard().signalGate("CLOSE_CACHE");
+            try {
+              getBlackboard().waitForGate("CACHE_CLOSED", 30, SECONDS);
+            } catch (TimeoutException | InterruptedException e) {
+              throw new RuntimeException("Failed waiting for signal.");
+            }
+          }
+        }
+      }
+    };
+  }
+
+  private static DUnitBlackboard getBlackboard() {
+    if (blackboard == null) {
+      blackboard = new DUnitBlackboard();
+    }
+    return blackboard;
+  }
+
+}
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionClearDUnitTest.java b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionClearDUnitTest.java
new file mode 100644
index 0000000000..b8719266b3
--- /dev/null
+++ b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionClearDUnitTest.java
@@ -0,0 +1,465 @@
+/*
+ * 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.cache;
+
+import static org.apache.geode.internal.Assert.fail;
+import static org.apache.geode.test.dunit.rules.ClusterStartupRule.getCache;
+import static org.apache.geode.test.dunit.rules.ClusterStartupRule.getClientCache;
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Properties;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.IntStream;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+import org.apache.geode.cache.CacheWriterException;
+import org.apache.geode.cache.InterestResultPolicy;
+import org.apache.geode.cache.PartitionAttributesFactory;
+import org.apache.geode.cache.Region;
+import org.apache.geode.cache.RegionEvent;
+import org.apache.geode.cache.RegionFactory;
+import org.apache.geode.cache.RegionShortcut;
+import org.apache.geode.cache.client.ClientRegionShortcut;
+import org.apache.geode.cache.util.CacheWriterAdapter;
+import org.apache.geode.test.dunit.SerializableCallableIF;
+import org.apache.geode.test.dunit.rules.ClientVM;
+import org.apache.geode.test.dunit.rules.ClusterStartupRule;
+import org.apache.geode.test.dunit.rules.MemberVM;
+
+public class PartitionedRegionClearDUnitTest implements Serializable {
+  protected static final String REGION_NAME = "testPR";
+  protected static final int TOTAL_BUCKET_NUM = 10;
+  protected static final int NUM_ENTRIES = 1000;
+
+  protected int locatorPort;
+  protected MemberVM locator;
+  protected MemberVM dataStore1, dataStore2, dataStore3, accessor;
+  protected ClientVM client1, client2;
+
+  private static final Logger logger = LogManager.getLogger();
+
+  @Rule
+  public ClusterStartupRule cluster = new ClusterStartupRule(7);
+
+  @Before
+  public void setUp() throws Exception {
+    locator = cluster.startLocatorVM(0);
+    locatorPort = locator.getPort();
+    dataStore1 = cluster.startServerVM(1, getProperties(), locatorPort);
+    dataStore2 = cluster.startServerVM(2, getProperties(), locatorPort);
+    dataStore3 = cluster.startServerVM(3, getProperties(), locatorPort);
+    accessor = cluster.startServerVM(4, getProperties(), locatorPort);
+    client1 = cluster.startClientVM(5,
+        c -> c.withPoolSubscription(true).withLocatorConnection((locatorPort)));
+    client2 = cluster.startClientVM(6,
+        c -> c.withPoolSubscription(true).withLocatorConnection((locatorPort)));
+  }
+
+  protected RegionShortcut getRegionShortCut() {
+    return RegionShortcut.PARTITION_REDUNDANT;
+  }
+
+  protected Properties getProperties() {
+    Properties properties = new Properties();
+    return properties;
+  }
+
+  private Region getRegion(boolean isClient) {
+    if (isClient) {
+      return getClientCache().getRegion(REGION_NAME);
+    } else {
+      return getCache().getRegion(REGION_NAME);
+    }
+  }
+
+  private void verifyRegionSize(boolean isClient, int expectedNum) {
+    assertThat(getRegion(isClient).size()).isEqualTo(expectedNum);
+  }
+
+  private void initClientCache() {
+    Region region = getClientCache().createClientRegionFactory(ClientRegionShortcut.CACHING_PROXY)
+        .create(REGION_NAME);
+    region.registerInterestForAllKeys(InterestResultPolicy.KEYS);
+  }
+
+  private void initDataStore(boolean withWriter) {
+    RegionFactory factory = getCache().createRegionFactory(getRegionShortCut())
+        .setPartitionAttributes(
+            new PartitionAttributesFactory().setTotalNumBuckets(TOTAL_BUCKET_NUM).create());
+    if (withWriter) {
+      factory.setCacheWriter(new CountingCacheWriter());
+    }
+    factory.create(REGION_NAME);
+    clearsByRegion = new HashMap<>();
+    destroysByRegion = new HashMap<>();
+  }
+
+  private void initAccessor(boolean withWriter) {
+    RegionShortcut shortcut = getRegionShortCut();
+    if (shortcut.isPersistent()) {
+      if (shortcut == RegionShortcut.PARTITION_PERSISTENT) {
+        shortcut = RegionShortcut.PARTITION;
+      } else if (shortcut == RegionShortcut.PARTITION_PERSISTENT_OVERFLOW) {
+        shortcut = RegionShortcut.PARTITION_OVERFLOW;
+      } else if (shortcut == RegionShortcut.PARTITION_REDUNDANT_PERSISTENT) {
+        shortcut = RegionShortcut.PARTITION_REDUNDANT;
+      } else if (shortcut == RegionShortcut.PARTITION_REDUNDANT_PERSISTENT_OVERFLOW) {
+        shortcut = RegionShortcut.PARTITION_REDUNDANT_OVERFLOW;
+      } else {
+        fail("Wrong region type:" + shortcut);
+      }
+    }
+    RegionFactory factory = getCache().createRegionFactory(shortcut)
+        .setPartitionAttributes(
+            new PartitionAttributesFactory().setTotalNumBuckets(10).setLocalMaxMemory(0).create())
+        .setPartitionAttributes(new PartitionAttributesFactory().setTotalNumBuckets(10).create());
+    if (withWriter) {
+      factory.setCacheWriter(new CountingCacheWriter());
+    }
+    factory.create(REGION_NAME);
+    clearsByRegion = new HashMap<>();
+    destroysByRegion = new HashMap<>();
+  }
+
+  private void feed(boolean isClient) {
+    Region region = getRegion(isClient);
+    IntStream.range(0, NUM_ENTRIES).forEach(i -> region.put(i, "value" + i));
+  }
+
+  private void verifyServerRegionSize(int expectedNum) {
+    accessor.invoke(() -> verifyRegionSize(false, expectedNum));
+    dataStore1.invoke(() -> verifyRegionSize(false, expectedNum));
+    dataStore2.invoke(() -> verifyRegionSize(false, expectedNum));
+    dataStore3.invoke(() -> verifyRegionSize(false, expectedNum));
+  }
+
+  private void verifyDatastoreStats(MemberVM datastore, boolean isCoordinator) {
+    datastore.invoke(() -> {
+      PartitionedRegion region = (PartitionedRegion) getRegion(false);
+      long clearCount = 0L;
+      int bucketCount = region.getDataStore().getAllLocalBucketRegions().size();
+
+      for (BucketRegion bucket : region.getDataStore().getAllLocalBucketRegions()) {
+        if (clearCount == 0) {
+          clearCount = bucket.getCachePerfStats().getBucketClearCount();
+        }
+        assertThat(bucket.getCachePerfStats().getBucketClearCount()).isEqualTo(bucketCount);
+      }
+
+      CachePerfStats stats = region.getRegionCachePerfStats();
+
+      assertThat(stats.getRegionClearCount()).isEqualTo(1);
+      assertThat(stats.getPartitionedRegionClearLocalDuration())
+          .isGreaterThan(0);
+      if (isCoordinator) {
+        assertThat(stats.getPartitionedRegionClearTotalDuration())
+            .isGreaterThan(0);
+      } else {
+        assertThat(stats.getPartitionedRegionClearTotalDuration())
+            .isEqualTo(0);
+      }
+    });
+  }
+
+  private void verifyClientRegionSize(int expectedNum) {
+    client1.invoke(() -> verifyRegionSize(true, expectedNum));
+    // TODO: notify register clients
+    // client2.invoke(()->verifyRegionSize(true, expectedNum));
+  }
+
+  SerializableCallableIF<Integer> getWriterClears = () -> {
+    int clears =
+        clearsByRegion.get(REGION_NAME) == null ? 0 : clearsByRegion.get(REGION_NAME).get();
+    return clears;
+  };
+
+  SerializableCallableIF<Integer> getWriterDestroys = () -> {
+    int destroys =
+        destroysByRegion.get(REGION_NAME) == null ? 0 : destroysByRegion.get(REGION_NAME).get();
+    return destroys;
+  };
+
+  SerializableCallableIF<Integer> getBucketRegionWriterClears = () -> {
+    int clears = 0;
+    for (int i = 0; i < TOTAL_BUCKET_NUM; i++) {
+      String bucketRegionName = "_B__" + REGION_NAME + "_" + i;
+      clears += clearsByRegion.get(bucketRegionName) == null ? 0
+          : clearsByRegion.get(bucketRegionName).get();
+    }
+    return clears;
+  };
+
+  SerializableCallableIF<Integer> getBucketRegionWriterDestroys = () -> {
+    int destroys = 0;
+    for (int i = 0; i < TOTAL_BUCKET_NUM; i++) {
+      String bucketRegionName = "_B__" + REGION_NAME + "_" + i;
+      destroys += destroysByRegion.get(bucketRegionName) == null ? 0
+          : destroysByRegion.get(bucketRegionName).get();
+    }
+    return destroys;
+  };
+
+  void configureServers(boolean dataStoreWithWriter, boolean accessorWithWriter) {
+    dataStore1.invoke(() -> initDataStore(dataStoreWithWriter));
+    dataStore2.invoke(() -> initDataStore(dataStoreWithWriter));
+    dataStore3.invoke(() -> initDataStore(dataStoreWithWriter));
+    accessor.invoke(() -> initAccessor(accessorWithWriter));
+    // make sure only datastore3 has cacheWriter
+    dataStore1.invoke(() -> {
+      Region region = getRegion(false);
+      region.getAttributesMutator().setCacheWriter(null);
+    });
+    dataStore2.invoke(() -> {
+      Region region = getRegion(false);
+      region.getAttributesMutator().setCacheWriter(null);
+    });
+  }
+
+  @Test
+  public void normalClearFromDataStoreWithWriterOnDataStore() {
+    configureServers(true, true);
+    client1.invoke(this::initClientCache);
+    client2.invoke(this::initClientCache);
+
+    accessor.invoke(() -> feed(false));
+    verifyServerRegionSize(NUM_ENTRIES);
+    dataStore3.invoke(() -> getRegion(false).clear());
+    verifyServerRegionSize(0);
+
+    // do the region destroy to compare that the same callbacks will be triggered
+    dataStore3.invoke(() -> {
+      Region region = getRegion(false);
+      region.destroyRegion();
+    });
+
+    assertThat(dataStore1.invoke(getWriterDestroys)).isEqualTo(dataStore1.invoke(getWriterClears))
+        .isEqualTo(0);
+    assertThat(dataStore2.invoke(getWriterDestroys)).isEqualTo(dataStore2.invoke(getWriterClears))
+        .isEqualTo(0);
+    assertThat(dataStore3.invoke(getWriterDestroys)).isEqualTo(dataStore3.invoke(getWriterClears))
+        .isEqualTo(1);
+    assertThat(accessor.invoke(getWriterDestroys)).isEqualTo(accessor.invoke(getWriterClears))
+        .isEqualTo(0);
+
+    assertThat(dataStore3.invoke(getBucketRegionWriterDestroys))
+        .isEqualTo(dataStore3.invoke(getBucketRegionWriterClears))
+        .isEqualTo(0);
+  }
+
+  @Test
+  public void normalClearFromDataStoreWithoutWriterOnDataStore() {
+    configureServers(false, true);
+    client1.invoke(this::initClientCache);
+    client2.invoke(this::initClientCache);
+
+    accessor.invoke(() -> feed(false));
+    verifyServerRegionSize(NUM_ENTRIES);
+    dataStore1.invoke(() -> getRegion(false).clear());
+    verifyServerRegionSize(0);
+
+    // do the region destroy to compare that the same callbacks will be triggered
+    dataStore1.invoke(() -> {
+      Region region = getRegion(false);
+      region.destroyRegion();
+    });
+
+    assertThat(dataStore1.invoke(getWriterDestroys)).isEqualTo(dataStore1.invoke(getWriterClears))
+        .isEqualTo(0);
+    assertThat(dataStore2.invoke(getWriterDestroys)).isEqualTo(dataStore2.invoke(getWriterClears))
+        .isEqualTo(0);
+    assertThat(dataStore3.invoke(getWriterDestroys)).isEqualTo(dataStore3.invoke(getWriterClears))
+        .isEqualTo(0);
+    assertThat(accessor.invoke(getWriterDestroys)).isEqualTo(accessor.invoke(getWriterClears))
+        .isEqualTo(1);
+
+    assertThat(accessor.invoke(getBucketRegionWriterDestroys))
+        .isEqualTo(accessor.invoke(getBucketRegionWriterClears))
+        .isEqualTo(0);
+  }
+
+  @Test
+  public void normalClearFromAccessorWithWriterOnDataStore() {
+    configureServers(true, true);
+    client1.invoke(this::initClientCache);
+    client2.invoke(this::initClientCache);
+
+    accessor.invoke(() -> feed(false));
+    verifyServerRegionSize(NUM_ENTRIES);
+    accessor.invoke(() -> getRegion(false).clear());
+    verifyServerRegionSize(0);
+
+    // do the region destroy to compare that the same callbacks will be triggered
+    accessor.invoke(() -> {
+      Region region = getRegion(false);
+      region.destroyRegion();
+    });
+
+    assertThat(dataStore1.invoke(getWriterDestroys)).isEqualTo(dataStore1.invoke(getWriterClears))
+        .isEqualTo(0);
+    assertThat(dataStore2.invoke(getWriterDestroys)).isEqualTo(dataStore2.invoke(getWriterClears))
+        .isEqualTo(0);
+    assertThat(dataStore3.invoke(getWriterDestroys)).isEqualTo(dataStore3.invoke(getWriterClears))
+        .isEqualTo(0);
+    assertThat(accessor.invoke(getWriterDestroys)).isEqualTo(accessor.invoke(getWriterClears))
+        .isEqualTo(1);
+
+    assertThat(accessor.invoke(getBucketRegionWriterDestroys))
+        .isEqualTo(accessor.invoke(getBucketRegionWriterClears))
+        .isEqualTo(0);
+  }
+
+  @Test
+  public void normalClearFromAccessorWithoutWriterButWithWriterOnDataStore() {
+    configureServers(true, false);
+    client1.invoke(this::initClientCache);
+    client2.invoke(this::initClientCache);
+
+    accessor.invoke(() -> feed(false));
+    verifyServerRegionSize(NUM_ENTRIES);
+    accessor.invoke(() -> getRegion(false).clear());
+    verifyServerRegionSize(0);
+
+    // do the region destroy to compare that the same callbacks will be triggered
+    accessor.invoke(() -> {
+      Region region = getRegion(false);
+      region.destroyRegion();
+    });
+
+    assertThat(dataStore1.invoke(getWriterDestroys)).isEqualTo(dataStore1.invoke(getWriterClears))
+        .isEqualTo(0);
+    assertThat(dataStore2.invoke(getWriterDestroys)).isEqualTo(dataStore2.invoke(getWriterClears))
+        .isEqualTo(0);
+    assertThat(dataStore3.invoke(getWriterDestroys)).isEqualTo(dataStore3.invoke(getWriterClears))
+        .isEqualTo(1);
+    assertThat(accessor.invoke(getWriterDestroys)).isEqualTo(accessor.invoke(getWriterClears))
+        .isEqualTo(0);
+
+    assertThat(dataStore3.invoke(getBucketRegionWriterDestroys))
+        .isEqualTo(dataStore3.invoke(getBucketRegionWriterClears))
+        .isEqualTo(0);
+  }
+
+  @Test
+  public void normalClearFromDataStoreUpdatesStats() {
+    configureServers(false, true);
+    client1.invoke(this::initClientCache);
+    client2.invoke(this::initClientCache);
+
+    // Verify no clears have been recorded in stats
+    dataStore1.invoke(() -> {
+      PartitionedRegion region = (PartitionedRegion) getRegion(false);
+
+      for (BucketRegion bucket : region.getDataStore().getAllLocalBucketRegions()) {
+        long clearCount = bucket.getCachePerfStats().getRegionClearCount();
+        assertThat(clearCount).isEqualTo(0);
+      }
+    });
+
+    accessor.invoke(() -> feed(false));
+    verifyServerRegionSize(NUM_ENTRIES);
+    dataStore1.invoke(() -> getRegion(false).clear());
+    verifyServerRegionSize(0);
+
+    // Verify the stats were properly updated for the bucket regions
+    verifyDatastoreStats(dataStore1, true);
+    verifyDatastoreStats(dataStore2, false);
+    verifyDatastoreStats(dataStore3, false);
+
+
+    // The accessor shouldn't increment the region clear count
+    accessor.invoke(() -> {
+      PartitionedRegion region = (PartitionedRegion) getRegion(false);
+
+      assertThat(region.getRegionCachePerfStats()).isNull();
+      assertThat(region.getCachePerfStats().getRegionClearCount()).isEqualTo(0);
+      assertThat(region.getCachePerfStats().getPartitionedRegionClearLocalDuration()).isEqualTo(0);
+      assertThat(region.getCachePerfStats().getPartitionedRegionClearTotalDuration()).isEqualTo(0);
+    });
+  }
+
+  @Test
+  public void normalClearFromClient() {
+    configureServers(true, false);
+    client1.invoke(this::initClientCache);
+    client2.invoke(this::initClientCache);
+
+    client1.invoke(() -> feed(true));
+    verifyClientRegionSize(NUM_ENTRIES);
+    verifyServerRegionSize(NUM_ENTRIES);
+
+    client1.invoke(() -> getRegion(true).clear());
+    verifyServerRegionSize(0);
+    verifyClientRegionSize(0);
+
+    // do the region destroy to compare that the same callbacks will be triggered
+    client1.invoke(() -> {
+      Region region = getRegion(true);
+      region.destroyRegion();
+    });
+
+    assertThat(dataStore1.invoke(getWriterDestroys)).isEqualTo(dataStore1.invoke(getWriterClears))
+        .isEqualTo(0);
+    assertThat(dataStore2.invoke(getWriterDestroys)).isEqualTo(dataStore2.invoke(getWriterClears))
+        .isEqualTo(0);
+    assertThat(dataStore3.invoke(getWriterDestroys)).isEqualTo(dataStore3.invoke(getWriterClears))
+        .isEqualTo(1);
+    assertThat(accessor.invoke(getWriterDestroys)).isEqualTo(accessor.invoke(getWriterClears))
+        .isEqualTo(0);
+
+    assertThat(dataStore3.invoke(getBucketRegionWriterDestroys))
+        .isEqualTo(dataStore3.invoke(getBucketRegionWriterClears))
+        .isEqualTo(0);
+  }
+
+  public static HashMap<String, AtomicInteger> clearsByRegion = new HashMap<>();
+  public static HashMap<String, AtomicInteger> destroysByRegion = new HashMap<>();
+
+  private static class CountingCacheWriter extends CacheWriterAdapter {
+    @Override
+    public void beforeRegionClear(RegionEvent event) throws CacheWriterException {
+      Region region = event.getRegion();
+      AtomicInteger clears = clearsByRegion.get(region.getName());
+      if (clears == null) {
+        clears = new AtomicInteger(1);
+        clearsByRegion.put(region.getName(), clears);
+      } else {
+        clears.incrementAndGet();
+      }
+      logger
+          .info("Region " + region.getName() + " will be cleared, clear count is:" + clears.get());
+    }
+
+    @Override
+    public void beforeRegionDestroy(RegionEvent event) throws CacheWriterException {
+      Region region = event.getRegion();
+      AtomicInteger destroys = destroysByRegion.get(region.getName());
+      if (destroys == null) {
+        destroys = new AtomicInteger(1);
+        destroysByRegion.put(region.getName(), destroys);
+      } else {
+        destroys.incrementAndGet();
+      }
+      logger.info(
+          "Region " + region.getName() + " will be destroyed, destroy count is:" + destroys.get());
+    }
+  }
+}
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionClearWithAlterRegionDUnitTest.java b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionClearWithAlterRegionDUnitTest.java
new file mode 100644
index 0000000000..fb74eb32a4
--- /dev/null
+++ b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionClearWithAlterRegionDUnitTest.java
@@ -0,0 +1,803 @@
+/*
+ * 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.cache;
+
+import static org.apache.geode.test.awaitility.GeodeAwaitility.await;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+
+import java.io.Serializable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeoutException;
+import java.util.stream.IntStream;
+
+import org.junit.Ignore;
+import org.junit.Rule;
+import org.junit.Test;
+
+import org.apache.geode.cache.AttributesMutator;
+import org.apache.geode.cache.CacheListener;
+import org.apache.geode.cache.CacheLoader;
+import org.apache.geode.cache.CacheLoaderException;
+import org.apache.geode.cache.CacheWriter;
+import org.apache.geode.cache.CacheWriterException;
+import org.apache.geode.cache.EntryEvent;
+import org.apache.geode.cache.ExpirationAction;
+import org.apache.geode.cache.ExpirationAttributes;
+import org.apache.geode.cache.LoaderHelper;
+import org.apache.geode.cache.PartitionedRegionPartialClearException;
+import org.apache.geode.cache.Region;
+import org.apache.geode.cache.RegionEvent;
+import org.apache.geode.cache.RegionShortcut;
+import org.apache.geode.distributed.internal.ClusterDistributionManager;
+import org.apache.geode.distributed.internal.DistributionMessage;
+import org.apache.geode.distributed.internal.DistributionMessageObserver;
+import org.apache.geode.distributed.internal.InternalDistributedSystem;
+import org.apache.geode.distributed.internal.membership.api.MembershipManagerHelper;
+import org.apache.geode.test.dunit.AsyncInvocation;
+import org.apache.geode.test.dunit.DUnitBlackboard;
+import org.apache.geode.test.dunit.VM;
+import org.apache.geode.test.dunit.rules.CacheRule;
+import org.apache.geode.test.dunit.rules.DistributedRule;
+import org.apache.geode.test.junit.rules.ExecutorServiceRule;
+
+public class PartitionedRegionClearWithAlterRegionDUnitTest implements Serializable {
+
+  @Rule
+  public DistributedRule distributedRule = new DistributedRule();
+
+  @Rule
+  public CacheRule cacheRule = new CacheRule();
+
+  @Rule
+  public ExecutorServiceRule executorServiceRule = new ExecutorServiceRule();
+
+  private VM server1;
+
+  private VM server2;
+
+  private VM server3;
+
+  private static volatile DUnitBlackboard blackboard;
+
+  private static final String REGION_NAME = "testRegion";
+
+  private static final int NUM_ENTRIES = 1000000;
+
+  private static final String GATE_NAME = "ALLOW_ALTER_REGION";
+
+  private void initialize() {
+    server1 = VM.getVM(0);
+    server2 = VM.getVM(1);
+
+    server1.invoke(() -> {
+      cacheRule.createCache();
+      cacheRule.getCache().createRegionFactory(RegionShortcut.PARTITION).setStatisticsEnabled(true)
+          .create(REGION_NAME);
+    });
+
+    server2.invoke(() -> {
+      cacheRule.createCache();
+      cacheRule.getCache().createRegionFactory(RegionShortcut.PARTITION).setStatisticsEnabled(true)
+          .create(REGION_NAME);
+    });
+
+    server1.invoke(() -> {
+      populateRegion();
+      Region region = cacheRule.getCache().getRegion(REGION_NAME);
+      assertThat(region.size()).isEqualTo(NUM_ENTRIES);
+    });
+
+    server2.invoke(() -> {
+      Region region = cacheRule.getCache().getRegion(REGION_NAME);
+      assertThat(region.size()).isEqualTo(NUM_ENTRIES);
+    });
+  }
+
+  @Test
+  public void testClearRegionWhileAddingCacheLoaderBeforeProcessMessage()
+      throws InterruptedException {
+    initialize();
+
+    server1.invoke(() -> DistributionMessageObserver.setInstance(
+        getDistributionMessageObserverBeforeProcessMessage()));
+
+    AsyncInvocation asyncInvocation1 = server1.invokeAsync(() -> {
+      alterRegionSetCacheLoader();
+    });
+
+    AsyncInvocation asyncInvocation2 = server2.invokeAsync(() -> {
+      cacheRule.getCache().getRegion(REGION_NAME).clear();
+      assertThat(cacheRule.getCache().getRegion(REGION_NAME).size()).isEqualTo(0);
+    });
+
+    asyncInvocation1.await();
+    asyncInvocation2.await();
+  }
+
+  @Test
+  public void testClearRegionWhileAddingCacheLoaderAfterProcessMessage()
+      throws InterruptedException {
+    initialize();
+
+    server1.invoke(() -> DistributionMessageObserver.setInstance(
+        getDistributionMessageObserverAfterProcessMessage()));
+
+    AsyncInvocation asyncInvocation1 = server1.invokeAsync(() -> {
+      alterRegionSetCacheLoader();
+    });
+
+    AsyncInvocation asyncInvocation2 = server2.invokeAsync(() -> {
+      cacheRule.getCache().getRegion(REGION_NAME).clear();
+      assertThat(cacheRule.getCache().getRegion(REGION_NAME).size()).isEqualTo(0);
+    });
+
+    asyncInvocation1.await();
+    asyncInvocation2.await();
+  }
+
+  @Test
+  public void testClearRegionWhileAddingCacheWriterBeforeProcessMessage()
+      throws InterruptedException {
+    initialize();
+
+    server1.invoke(() -> DistributionMessageObserver.setInstance(
+        getDistributionMessageObserverBeforeProcessMessage()));
+
+    AsyncInvocation asyncInvocation1 = server1.invokeAsync(() -> {
+      alterRegionSetCacheWriter();
+    });
+
+    AsyncInvocation asyncInvocation2 = server2.invokeAsync(() -> {
+      cacheRule.getCache().getRegion(REGION_NAME).clear();
+      assertThat(cacheRule.getCache().getRegion(REGION_NAME).size()).isEqualTo(0);
+    });
+
+    asyncInvocation1.await();
+    asyncInvocation2.await();
+  }
+
+  @Test
+  public void testClearRegionWhileAddingCacheWriterAfterProcessMessage()
+      throws InterruptedException {
+    initialize();
+
+    server1.invoke(() -> DistributionMessageObserver.setInstance(
+        getDistributionMessageObserverAfterProcessMessage()));
+
+    AsyncInvocation asyncInvocation1 = server1.invokeAsync(() -> {
+      alterRegionSetCacheWriter();
+    });
+
+    AsyncInvocation asyncInvocation2 = server2.invokeAsync(() -> {
+      cacheRule.getCache().getRegion(REGION_NAME).clear();
+      assertThat(cacheRule.getCache().getRegion(REGION_NAME).size()).isEqualTo(0);
+    });
+
+    asyncInvocation1.await();
+    asyncInvocation2.await();
+  }
+
+  @Test
+  public void testClearRegionWhileAddingCacheListenerBeforeProcessMessage()
+      throws InterruptedException {
+    initialize();
+
+    server1.invoke(() -> DistributionMessageObserver.setInstance(
+        getDistributionMessageObserverBeforeProcessMessage()));
+
+    AsyncInvocation asyncInvocation1 = server1.invokeAsync(() -> {
+      alterRegionSetCacheListener();
+    });
+
+    AsyncInvocation asyncInvocation2 = server2.invokeAsync(() -> {
+      cacheRule.getCache().getRegion(REGION_NAME).clear();
+      assertThat(cacheRule.getCache().getRegion(REGION_NAME).size()).isEqualTo(0);
+    });
+
+    asyncInvocation1.await();
+    asyncInvocation2.await();
+  }
+
+  @Test
+  public void testClearRegionWhileAddingCacheListenerAfterProcessMessage()
+      throws InterruptedException {
+    initialize();
+
+    server1.invoke(() -> DistributionMessageObserver.setInstance(
+        getDistributionMessageObserverAfterProcessMessage()));
+
+    AsyncInvocation asyncInvocation1 = server1.invokeAsync(() -> {
+      alterRegionSetCacheListener();
+    });
+
+    AsyncInvocation asyncInvocation2 = server2.invokeAsync(() -> {
+      cacheRule.getCache().getRegion(REGION_NAME).clear();
+      assertThat(cacheRule.getCache().getRegion(REGION_NAME).size()).isEqualTo(0);
+    });
+
+    asyncInvocation1.await();
+    asyncInvocation2.await();
+  }
+
+  @Test
+  public void testClearRegionWhileChangingEvictionBeforeProcessMessage()
+      throws InterruptedException {
+    initialize();
+
+    server1.invoke(() -> DistributionMessageObserver.setInstance(
+        getDistributionMessageObserverBeforeProcessMessage()));
+
+    AsyncInvocation asyncInvocation1 = server1.invokeAsync(() -> {
+      Region region = cacheRule.getCache().getRegion(REGION_NAME);
+      AttributesMutator attributesMutator = region.getAttributesMutator();
+      getBlackboard().waitForGate(GATE_NAME);
+      attributesMutator.getEvictionAttributesMutator().setMaximum(1);
+      assertThat(region.getAttributes().getEvictionAttributes().getMaximum()).isEqualTo(1);
+    });
+
+    AsyncInvocation asyncInvocation2 = server2.invokeAsync(() -> {
+      cacheRule.getCache().getRegion(REGION_NAME).clear();
+      assertThat(cacheRule.getCache().getRegion(REGION_NAME).size()).isEqualTo(0);
+    });
+
+    asyncInvocation1.await();
+    asyncInvocation2.await();
+  }
+
+  @Test
+  public void testClearRegionWhileChangingEvictionAfterProcessMessage()
+      throws InterruptedException {
+    initialize();
+
+    server1.invoke(() -> DistributionMessageObserver.setInstance(
+        getDistributionMessageObserverAfterProcessMessage()));
+
+    AsyncInvocation asyncInvocation1 = server1.invokeAsync(() -> {
+      Region region = cacheRule.getCache().getRegion(REGION_NAME);
+      AttributesMutator attributesMutator = region.getAttributesMutator();
+      getBlackboard().waitForGate(GATE_NAME);
+      attributesMutator.getEvictionAttributesMutator().setMaximum(1);
+      assertThat(region.getAttributes().getEvictionAttributes().getMaximum()).isEqualTo(1);
+    });
+
+    AsyncInvocation asyncInvocation2 = server2.invokeAsync(() -> {
+      cacheRule.getCache().getRegion(REGION_NAME).clear();
+      assertThat(cacheRule.getCache().getRegion(REGION_NAME).size()).isEqualTo(0);
+    });
+
+    asyncInvocation1.await();
+    asyncInvocation2.await();
+  }
+
+  @Test
+  public void testClearRegionWhileChangingRegionTTLExpirationBeforeProcessMessage()
+      throws InterruptedException {
+    initialize();
+
+    server1.invoke(() -> DistributionMessageObserver.setInstance(
+        getDistributionMessageObserverBeforeProcessMessage()));
+
+    AsyncInvocation asyncInvocation1 = server1.invokeAsync(() -> {
+      Region region = cacheRule.getCache().getRegion(REGION_NAME);
+      AttributesMutator attributesMutator = region.getAttributesMutator();
+      ExpirationAttributes expirationAttributes = new ExpirationAttributes();
+      getBlackboard().waitForGate(GATE_NAME);
+      attributesMutator.setRegionTimeToLive(expirationAttributes);
+      assertThat(region.getAttributes().getRegionTimeToLive()).isEqualTo(expirationAttributes);
+    });
+
+    AsyncInvocation asyncInvocation2 = server2.invokeAsync(() -> {
+      cacheRule.getCache().getRegion(REGION_NAME).clear();
+      assertThat(cacheRule.getCache().getRegion(REGION_NAME).size()).isEqualTo(0);
+    });
+
+    asyncInvocation1.await();
+    asyncInvocation2.await();
+  }
+
+  @Test
+  public void testClearRegionWhileChangingRegionTTLExpirationAfterProcessMessage()
+      throws InterruptedException {
+    initialize();
+
+    server1.invoke(() -> DistributionMessageObserver.setInstance(
+        getDistributionMessageObserverAfterProcessMessage()));
+
+    AsyncInvocation asyncInvocation1 = server1.invokeAsync(() -> {
+      Region region = cacheRule.getCache().getRegion(REGION_NAME);
+      AttributesMutator attributesMutator = region.getAttributesMutator();
+      ExpirationAttributes expirationAttributes = new ExpirationAttributes();
+      getBlackboard().waitForGate(GATE_NAME);
+      attributesMutator.setRegionTimeToLive(expirationAttributes);
+      assertThat(region.getAttributes().getRegionTimeToLive()).isEqualTo(expirationAttributes);
+    });
+
+    AsyncInvocation asyncInvocation2 = server2.invokeAsync(() -> {
+      cacheRule.getCache().getRegion(REGION_NAME).clear();
+      assertThat(cacheRule.getCache().getRegion(REGION_NAME).size()).isEqualTo(0);
+    });
+
+    asyncInvocation1.await();
+    asyncInvocation2.await();
+  }
+
+  @Test
+  public void testClearRegionWhileChangingEntryTTLExpirationBeforeProcessMessage()
+      throws InterruptedException {
+    initialize();
+
+    server1.invoke(() -> DistributionMessageObserver.setInstance(
+        getDistributionMessageObserverBeforeProcessMessage()));
+
+    AsyncInvocation asyncInvocation1 = server1.invokeAsync(() -> {
+      Region region = cacheRule.getCache().getRegion(REGION_NAME);
+      AttributesMutator attributesMutator = region.getAttributesMutator();
+      ExpirationAttributes expirationAttributes = new ExpirationAttributes();
+      getBlackboard().waitForGate(GATE_NAME);
+      attributesMutator.setEntryTimeToLive(expirationAttributes);
+      assertThat(region.getAttributes().getEntryTimeToLive()).isEqualTo(expirationAttributes);
+    });
+
+    AsyncInvocation asyncInvocation2 = server2.invokeAsync(() -> {
+      cacheRule.getCache().getRegion(REGION_NAME).clear();
+      assertThat(cacheRule.getCache().getRegion(REGION_NAME).size()).isEqualTo(0);
+    });
+
+    asyncInvocation1.await();
+    asyncInvocation2.await();
+  }
+
+
+  @Test
+  public void testClearRegionWhileChangingEntryTTLExpirationAfterProcessMessage()
+      throws InterruptedException {
+    initialize();
+
+    server1.invoke(() -> DistributionMessageObserver.setInstance(
+        getDistributionMessageObserverAfterProcessMessage()));
+
+    AsyncInvocation asyncInvocation1 = server1.invokeAsync(() -> {
+      Region region = cacheRule.getCache().getRegion(REGION_NAME);
+      AttributesMutator attributesMutator = region.getAttributesMutator();
+      ExpirationAttributes expirationAttributes = new ExpirationAttributes();
+      getBlackboard().waitForGate(GATE_NAME);
+      attributesMutator.setEntryTimeToLive(expirationAttributes);
+      assertThat(region.getAttributes().getEntryTimeToLive()).isEqualTo(expirationAttributes);
+    });
+
+    AsyncInvocation asyncInvocation2 = server2.invokeAsync(() -> {
+      cacheRule.getCache().getRegion(REGION_NAME).clear();
+      assertThat(cacheRule.getCache().getRegion(REGION_NAME).size()).isEqualTo(0);
+    });
+
+    asyncInvocation1.await();
+    asyncInvocation2.await();
+  }
+
+  @Test
+  public void testClearRegionWhileChangingRegionIdleExpirationBeforeProcessMessage()
+      throws InterruptedException {
+    initialize();
+
+    server1.invoke(() -> DistributionMessageObserver.setInstance(
+        getDistributionMessageObserverBeforeProcessMessage()));
+
+    AsyncInvocation asyncInvocation1 = server1.invokeAsync(() -> {
+      Region region = cacheRule.getCache().getRegion(REGION_NAME);
+      AttributesMutator attributesMutator = region.getAttributesMutator();
+      ExpirationAttributes expirationAttributes = new ExpirationAttributes();
+      getBlackboard().waitForGate(GATE_NAME);
+      attributesMutator.setRegionIdleTimeout(expirationAttributes);
+      assertThat(region.getAttributes().getRegionIdleTimeout()).isEqualTo(expirationAttributes);
+    });
+
+    AsyncInvocation asyncInvocation2 = server2.invokeAsync(() -> {
+      cacheRule.getCache().getRegion(REGION_NAME).clear();
+      assertThat(cacheRule.getCache().getRegion(REGION_NAME).size()).isEqualTo(0);
+    });
+
+    asyncInvocation1.await();
+    asyncInvocation2.await();
+  }
+
+  @Test
+  public void testClearRegionWhileChangingRegionIdleExpirationAfterProcessMessage()
+      throws InterruptedException {
+    initialize();
+
+    server1.invoke(() -> DistributionMessageObserver.setInstance(
+        getDistributionMessageObserverAfterProcessMessage()));
+
+    AsyncInvocation asyncInvocation1 = server1.invokeAsync(() -> {
+      Region region = cacheRule.getCache().getRegion(REGION_NAME);
+      AttributesMutator attributesMutator = region.getAttributesMutator();
+      ExpirationAttributes expirationAttributes = new ExpirationAttributes();
+      getBlackboard().waitForGate(GATE_NAME);
+      attributesMutator.setRegionIdleTimeout(expirationAttributes);
+      assertThat(region.getAttributes().getRegionIdleTimeout()).isEqualTo(expirationAttributes);
+    });
+
+    AsyncInvocation asyncInvocation2 = server2.invokeAsync(() -> {
+      cacheRule.getCache().getRegion(REGION_NAME).clear();
+      assertThat(cacheRule.getCache().getRegion(REGION_NAME).size()).isEqualTo(0);
+    });
+
+    asyncInvocation1.await();
+    asyncInvocation2.await();
+  }
+
+  @Test
+  @Ignore // See GEODE-8680
+  public void testClearRegionWhileChangingEntryIdleExpirationBeforeProcessMessage()
+      throws InterruptedException {
+    initialize();
+
+    server1.invoke(() -> DistributionMessageObserver.setInstance(
+        getDistributionMessageObserverBeforeProcessMessage()));
+
+    AsyncInvocation asyncInvocation1 = server1.invokeAsync(() -> {
+      Region region = cacheRule.getCache().getRegion(REGION_NAME);
+      AttributesMutator attributesMutator = region.getAttributesMutator();
+      ExpirationAttributes expirationAttributes =
+          new ExpirationAttributes(1, ExpirationAction.DESTROY);
+      getBlackboard().waitForGate(GATE_NAME);
+      attributesMutator.setEntryIdleTimeout(expirationAttributes);
+      assertThat(region.getAttributes().getEntryIdleTimeout()).isEqualTo(expirationAttributes);
+    });
+
+    AsyncInvocation asyncInvocation2 = server2.invokeAsync(() -> {
+      cacheRule.getCache().getRegion(REGION_NAME).clear();
+      assertThat(cacheRule.getCache().getRegion(REGION_NAME).size()).isEqualTo(0);
+    });
+
+    asyncInvocation1.await();
+    asyncInvocation2.await();
+  }
+
+  @Test
+  @Ignore // See GEODE-8680
+  public void testClearRegionWhileChangingEntryIdleExpirationAfterProcessMessage()
+      throws InterruptedException {
+    initialize();
+
+    server1.invoke(() -> DistributionMessageObserver.setInstance(
+        getDistributionMessageObserverAfterProcessMessage()));
+
+    AsyncInvocation asyncInvocation1 = server1.invokeAsync(() -> {
+      Region region = cacheRule.getCache().getRegion(REGION_NAME);
+      AttributesMutator attributesMutator = region.getAttributesMutator();
+      ExpirationAttributes expirationAttributes =
+          new ExpirationAttributes(1, ExpirationAction.DESTROY);
+      getBlackboard().waitForGate(GATE_NAME);
+      attributesMutator.setEntryIdleTimeout(expirationAttributes);
+      assertThat(region.getAttributes().getEntryIdleTimeout()).isEqualTo(expirationAttributes);
+    });
+
+    AsyncInvocation asyncInvocation2 = server2.invokeAsync(() -> {
+      cacheRule.getCache().getRegion(REGION_NAME).clear();
+      assertThat(cacheRule.getCache().getRegion(REGION_NAME).size()).isEqualTo(0);
+    });
+
+    asyncInvocation1.await();
+    asyncInvocation2.await();
+  }
+
+  @Test
+  public void testMemberLeaveBeforeProcessMessage() throws InterruptedException {
+    initialize();
+
+    server3 = VM.getVM(2);
+
+    server3.invoke(() -> {
+      cacheRule.createCache();
+      cacheRule.getCache().createRegionFactory(RegionShortcut.PARTITION).setStatisticsEnabled(true)
+          .create(REGION_NAME);
+      Region region = cacheRule.getCache().getRegion(REGION_NAME);
+      assertThat(region.size()).isEqualTo(NUM_ENTRIES);
+    });
+
+    server2.invoke(() -> {
+      DistributionMessageObserver
+          .setInstance(
+              new MemberKiller(false));
+    });
+
+    server3.invoke(() -> DistributionMessageObserver.setInstance(
+        getDistributionMessageObserverBeforeProcessMessage()));
+
+    AsyncInvocation asyncInvocation1 = server1.invokeAsync(() -> {
+      assertThatThrownBy(() -> cacheRule.getCache().getRegion(REGION_NAME).clear())
+          .isInstanceOf(PartitionedRegionPartialClearException.class);
+    });
+
+    AsyncInvocation asyncInvocation2 = server3.invokeAsync(() -> {
+      alterRegionSetCacheWriter();
+    });
+
+    asyncInvocation1.await();
+    asyncInvocation2.await();
+  }
+
+  @Test
+  public void testMemberLeaveAfterProcessMessage() throws InterruptedException {
+    initialize();
+
+    server3 = VM.getVM(2);
+
+    server3.invoke(() -> {
+      cacheRule.createCache();
+      cacheRule.getCache().createRegionFactory(RegionShortcut.PARTITION).setStatisticsEnabled(true)
+          .create(REGION_NAME);
+      Region region = cacheRule.getCache().getRegion(REGION_NAME);
+      assertThat(region.size()).isEqualTo(NUM_ENTRIES);
+    });
+
+    server2.invoke(() -> {
+      DistributionMessageObserver
+          .setInstance(
+              new MemberKiller(false));
+    });
+
+    server3.invoke(() -> DistributionMessageObserver.setInstance(
+        getDistributionMessageObserverAfterProcessMessage()));
+
+    AsyncInvocation asyncInvocation1 = server1.invokeAsync(() -> {
+      assertThatThrownBy(() -> cacheRule.getCache().getRegion(REGION_NAME).clear())
+          .isInstanceOf(PartitionedRegionPartialClearException.class);
+    });
+
+    AsyncInvocation asyncInvocation2 = server3.invokeAsync(() -> {
+      alterRegionSetCacheWriter();
+    });
+
+    asyncInvocation1.await();
+    asyncInvocation2.await();
+  }
+
+  @Test
+  public void testSingleServer() throws InterruptedException, ExecutionException {
+    cacheRule.createCache();
+    cacheRule.getCache().createRegionFactory(RegionShortcut.PARTITION).setStatisticsEnabled(true)
+        .create(REGION_NAME);
+    populateRegion();
+    Region region = cacheRule.getCache().getRegion(REGION_NAME);
+    assertThat(region.size()).isEqualTo(NUM_ENTRIES);
+
+    Future future1 = executorServiceRule.runAsync(() -> {
+      cacheRule.getCache().getRegion(REGION_NAME).clear();
+      assertThat(cacheRule.getCache().getRegion(REGION_NAME).size()).isEqualTo(0);
+    });
+
+    Future future2 = executorServiceRule.runAsync(() -> {
+      AttributesMutator attributesMutator = region.getAttributesMutator();
+      TestCacheLoader testCacheLoader = new TestCacheLoader();
+      attributesMutator.setCacheLoader(testCacheLoader);
+      assertThat(region.getAttributes().getCacheLoader()).isEqualTo(testCacheLoader);
+    });
+
+    future1.get();
+    future2.get();
+  }
+
+  private void populateRegion() {
+    Region region = cacheRule.getCache().getRegion(REGION_NAME);
+    IntStream.range(0, NUM_ENTRIES).forEach(i -> region.put(i, i));
+  }
+
+  private void alterRegionSetCacheLoader() throws TimeoutException, InterruptedException {
+    Region region = cacheRule.getCache().getRegion(REGION_NAME);
+    AttributesMutator attributesMutator = region.getAttributesMutator();
+    TestCacheLoader testCacheLoader = new TestCacheLoader();
+    getBlackboard().waitForGate(GATE_NAME);
+    attributesMutator.setCacheLoader(testCacheLoader);
+    assertThat(region.getAttributes().getCacheLoader()).isEqualTo(testCacheLoader);
+  }
+
+  private void alterRegionSetCacheWriter() throws TimeoutException, InterruptedException {
+    Region region = cacheRule.getCache().getRegion(REGION_NAME);
+    AttributesMutator attributesMutator = region.getAttributesMutator();
+    TestCacheWriter testCacheWriter = new TestCacheWriter();
+    getBlackboard().waitForGate(GATE_NAME);
+    attributesMutator.setCacheWriter(testCacheWriter);
+    assertThat(region.getAttributes().getCacheWriter()).isEqualTo(testCacheWriter);
+  }
+
+  private void alterRegionSetCacheListener() throws TimeoutException, InterruptedException {
+    Region region = cacheRule.getCache().getRegion(REGION_NAME);
+    AttributesMutator attributesMutator = region.getAttributesMutator();
+    TestCacheListener testCacheListener = new TestCacheListener();
+    getBlackboard().waitForGate(GATE_NAME);
+    attributesMutator.addCacheListener(testCacheListener);
+    assertThat(region.getAttributes().getCacheListeners()).contains(testCacheListener);
+  }
+
+  private class TestCacheLoader implements CacheLoader {
+
+    @Override
+    public Object load(LoaderHelper helper) throws CacheLoaderException {
+      return new Integer(NUM_ENTRIES);
+    }
+  }
+
+  private class TestCacheWriter implements CacheWriter {
+
+    @Override
+    public void beforeUpdate(EntryEvent event) throws CacheWriterException {
+
+    }
+
+    @Override
+    public void beforeCreate(EntryEvent event) throws CacheWriterException {
+
+    }
+
+    @Override
+    public void beforeDestroy(EntryEvent event) throws CacheWriterException {
+
+    }
+
+    @Override
+    public void beforeRegionDestroy(RegionEvent event) throws CacheWriterException {
+
+    }
+
+    @Override
+    public void beforeRegionClear(RegionEvent event) throws CacheWriterException {
+      System.out.println("beforeRegionClear");
+    }
+  }
+
+  private class TestCacheListener implements CacheListener {
+
+    @Override
+    public void afterCreate(EntryEvent event) {
+
+    }
+
+    @Override
+    public void afterUpdate(EntryEvent event) {
+
+    }
+
+    @Override
+    public void afterInvalidate(EntryEvent event) {
+
+    }
+
+    @Override
+    public void afterDestroy(EntryEvent event) {
+
+    }
+
+    @Override
+    public void afterRegionInvalidate(RegionEvent event) {
+
+    }
+
+    @Override
+    public void afterRegionDestroy(RegionEvent event) {
+
+    }
+
+    @Override
+    public void afterRegionClear(RegionEvent event) {
+      System.out.println("afterRegionClear");
+    }
+
+    @Override
+    public void afterRegionCreate(RegionEvent event) {
+
+    }
+
+    @Override
+    public void afterRegionLive(RegionEvent event) {
+
+    }
+  }
+
+  private static DUnitBlackboard getBlackboard() {
+    if (blackboard == null) {
+      blackboard = new DUnitBlackboard();
+    }
+    return blackboard;
+  }
+
+  private DistributionMessageObserver getDistributionMessageObserverBeforeProcessMessage() {
+    return new DistributionMessageObserver() {
+      @Override
+      public void beforeProcessMessage(ClusterDistributionManager dm, DistributionMessage message) {
+        super.beforeProcessMessage(dm, message);
+        if (message instanceof PartitionedRegionClearMessage) {
+          DistributionMessageObserver.setInstance(null);
+          getBlackboard().signalGate(GATE_NAME);
+        }
+      }
+    };
+  }
+
+  private DistributionMessageObserver getDistributionMessageObserverAfterProcessMessage() {
+    return new DistributionMessageObserver() {
+      @Override
+      public void afterProcessMessage(ClusterDistributionManager dm, DistributionMessage message) {
+        super.afterProcessMessage(dm, message);
+        if (message instanceof PartitionedRegionClearMessage) {
+          DistributionMessageObserver.setInstance(null);
+          getBlackboard().signalGate(GATE_NAME);
+        }
+      }
+    };
+  }
+
+  /**
+   * Shutdowns a coordinator member while the clear operation is in progress.
+   */
+  public static class MemberKiller extends DistributionMessageObserver {
+    private final boolean coordinator;
+
+    public MemberKiller(boolean coordinator) {
+      this.coordinator = coordinator;
+    }
+
+    /**
+     * Shutdowns the VM whenever the message is an instance of
+     * {@link PartitionedRegionClearMessage}.
+     */
+    private void shutdownMember(DistributionMessage message) {
+      if (message instanceof PartitionedRegionClearMessage) {
+        if (((PartitionedRegionClearMessage) message)
+            .getOp() == PartitionedRegionClearMessage.OperationType.OP_PR_CLEAR) {
+          DistributionMessageObserver.setInstance(null);
+          InternalDistributedSystem.getConnectedInstance().stopReconnectingNoDisconnect();
+          MembershipManagerHelper
+              .crashDistributedSystem(InternalDistributedSystem.getConnectedInstance());
+          await().untilAsserted(
+              () -> assertThat(InternalDistributedSystem.getConnectedInstance()).isNull());
+        }
+      }
+    }
+
+    /**
+     * Invoked only on clear coordinator VM.
+     *
+     * @param dm the distribution manager that received the message
+     * @param message The message itself
+     */
+    @Override
+    public void beforeSendMessage(ClusterDistributionManager dm, DistributionMessage message) {
+      if (coordinator) {
+        shutdownMember(message);
+      } else {
+        super.beforeSendMessage(dm, message);
+      }
+    }
+
+    /**
+     * Invoked only on non clear coordinator VM.
+     *
+     * @param dm the distribution manager that received the message
+     * @param message The message itself
+     */
+    @Override
+    public void beforeProcessMessage(ClusterDistributionManager dm, DistributionMessage message) {
+      if (!coordinator) {
+        shutdownMember(message);
+      } else {
+        super.beforeProcessMessage(dm, message);
+      }
+    }
+  }
+}
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionClearWithConcurrentOperationsDUnitTest.java b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionClearWithConcurrentOperationsDUnitTest.java
new file mode 100644
index 0000000000..fdb91c7005
--- /dev/null
+++ b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionClearWithConcurrentOperationsDUnitTest.java
@@ -0,0 +1,747 @@
+/*
+ * 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.cache;
+
+import static org.apache.geode.internal.util.ArrayUtils.asList;
+import static org.apache.geode.test.awaitility.GeodeAwaitility.await;
+import static org.apache.geode.test.dunit.VM.getVM;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+
+import java.io.Serializable;
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.stream.IntStream;
+
+import junitparams.JUnitParamsRunner;
+import junitparams.Parameters;
+import junitparams.naming.TestCaseName;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import org.apache.geode.ForcedDisconnectException;
+import org.apache.geode.cache.Cache;
+import org.apache.geode.cache.PartitionAttributes;
+import org.apache.geode.cache.PartitionAttributesFactory;
+import org.apache.geode.cache.PartitionedRegionPartialClearException;
+import org.apache.geode.cache.Region;
+import org.apache.geode.cache.RegionShortcut;
+import org.apache.geode.cache.partition.PartitionRegionHelper;
+import org.apache.geode.distributed.DistributedSystemDisconnectedException;
+import org.apache.geode.distributed.internal.ClusterDistributionManager;
+import org.apache.geode.distributed.internal.DMStats;
+import org.apache.geode.distributed.internal.DistributionMessage;
+import org.apache.geode.distributed.internal.DistributionMessageObserver;
+import org.apache.geode.distributed.internal.InternalDistributedSystem;
+import org.apache.geode.distributed.internal.membership.api.MembershipManagerHelper;
+import org.apache.geode.internal.cache.versions.RegionVersionHolder;
+import org.apache.geode.internal.cache.versions.RegionVersionVector;
+import org.apache.geode.internal.cache.versions.VersionSource;
+import org.apache.geode.test.awaitility.GeodeAwaitility;
+import org.apache.geode.test.dunit.AsyncInvocation;
+import org.apache.geode.test.dunit.VM;
+import org.apache.geode.test.dunit.rules.CacheRule;
+import org.apache.geode.test.dunit.rules.DistributedRule;
+
+/**
+ * Tests to verify that {@link PartitionedRegion#clear()} operation can be executed multiple times
+ * on the same region while other cache operations are being executed concurrently and members are
+ * added or removed.
+ */
+@RunWith(JUnitParamsRunner.class)
+public class PartitionedRegionClearWithConcurrentOperationsDUnitTest implements Serializable {
+  private static final Integer BUCKETS = 13;
+  private static final String REGION_NAME = "PartitionedRegion";
+  private static final String TEST_CASE_NAME =
+      "[{index}] {method}(Coordinator:{0}, RegionType:{1})";
+
+  @Rule
+  public DistributedRule distributedRule = new DistributedRule(3);
+
+  @Rule
+  public CacheRule cacheRule = CacheRule.builder().createCacheInAll().build();
+
+  private VM server1;
+  private VM server2;
+  private VM accessor;
+
+  private enum TestVM {
+    ACCESSOR(0), SERVER1(1), SERVER2(2);
+
+    final int vmNumber;
+
+    TestVM(int vmNumber) {
+      this.vmNumber = vmNumber;
+    }
+  }
+
+  static RegionShortcut[] regionTypes() {
+    return new RegionShortcut[] {
+        RegionShortcut.PARTITION, RegionShortcut.PARTITION_REDUNDANT
+    };
+  }
+
+  @SuppressWarnings("unused")
+  static TestVM[] coordinators() {
+    return new TestVM[] {
+        TestVM.SERVER1, TestVM.ACCESSOR
+    };
+  }
+
+  @SuppressWarnings("unused")
+  static Object[] coordinatorsAndRegionTypes() {
+    ArrayList<Object[]> parameters = new ArrayList<>();
+    RegionShortcut[] regionShortcuts = regionTypes();
+
+    Arrays.stream(regionShortcuts).forEach(regionShortcut -> {
+      parameters.add(new Object[] {TestVM.SERVER1, regionShortcut});
+      parameters.add(new Object[] {TestVM.ACCESSOR, regionShortcut});
+    });
+
+    return parameters.toArray();
+  }
+
+  @Before
+  public void setUp() throws Exception {
+    server1 = getVM(TestVM.SERVER1.vmNumber);
+    server2 = getVM(TestVM.SERVER2.vmNumber);
+    accessor = getVM(TestVM.ACCESSOR.vmNumber);
+  }
+
+  private void initAccessor(RegionShortcut regionShortcut) {
+    PartitionAttributes<String, String> attrs = new PartitionAttributesFactory<String, String>()
+        .setTotalNumBuckets(BUCKETS)
+        .setLocalMaxMemory(0)
+        .create();
+
+    cacheRule.getCache().createRegionFactory(regionShortcut)
+        .setPartitionAttributes(attrs)
+        .create(REGION_NAME);
+
+  }
+
+  private void initDataStore(RegionShortcut regionShortcut) {
+    PartitionAttributes<String, String> attrs = new PartitionAttributesFactory<String, String>()
+        .setTotalNumBuckets(BUCKETS)
+        .create();
+
+    cacheRule.getCache().createRegionFactory(regionShortcut)
+        .setPartitionAttributes(attrs)
+        .create(REGION_NAME);
+  }
+
+  private void parametrizedSetup(RegionShortcut regionShortcut) {
+    server1.invoke(() -> initDataStore(regionShortcut));
+    server2.invoke(() -> initDataStore(regionShortcut));
+    accessor.invoke(() -> initAccessor(regionShortcut));
+  }
+
+  private void waitForSilence() {
+    DMStats dmStats = cacheRule.getSystem().getDistributionManager().getStats();
+    PartitionedRegion region = (PartitionedRegion) cacheRule.getCache().getRegion(REGION_NAME);
+    PartitionedRegionStats partitionedRegionStats = region.getPrStats();
+
+    await().untilAsserted(() -> {
+      assertThat(dmStats.getReplyWaitsInProgress()).isEqualTo(0);
+      assertThat(partitionedRegionStats.getVolunteeringInProgress()).isEqualTo(0);
+      assertThat(partitionedRegionStats.getBucketCreatesInProgress()).isEqualTo(0);
+      assertThat(partitionedRegionStats.getPrimaryTransfersInProgress()).isEqualTo(0);
+      assertThat(partitionedRegionStats.getRebalanceBucketCreatesInProgress()).isEqualTo(0);
+      assertThat(partitionedRegionStats.getRebalancePrimaryTransfersInProgress()).isEqualTo(0);
+    });
+  }
+
+  /**
+   * Populates the region and verifies the data on the selected VMs.
+   */
+  private void populateRegion(VM feeder, int entryCount, List<VM> vms) {
+    feeder.invoke(() -> {
+      Region<String, String> region = cacheRule.getCache().getRegion(REGION_NAME);
+      IntStream.range(0, entryCount).forEach(i -> region.put(String.valueOf(i), "Value_" + i));
+    });
+
+    vms.forEach(vm -> vm.invoke(() -> {
+      waitForSilence();
+      Region<String, String> region = cacheRule.getCache().getRegion(REGION_NAME);
+
+      IntStream.range(0, entryCount)
+          .forEach(i -> assertThat(region.get(String.valueOf(i))).isEqualTo("Value_" + i));
+    }));
+  }
+
+  /**
+   * Asserts that the RegionVersionVectors for both buckets are consistent.
+   *
+   * @param bucketId Id of the bucket to compare.
+   * @param bucketDump1 First bucketDump.
+   * @param bucketDump2 Second bucketDump.
+   */
+  private void assertRegionVersionVectorsConsistency(int bucketId, BucketDump bucketDump1,
+      BucketDump bucketDump2) {
+    RegionVersionVector<?> rvv1 = bucketDump1.getRvv();
+    RegionVersionVector<?> rvv2 = bucketDump2.getRvv();
+
+    if (rvv1 == null) {
+      assertThat(rvv2)
+          .as("Bucket " + bucketId + " has an RVV on member " + bucketDump2.getMember()
+              + ", but does not on member " + bucketDump1.getMember())
+          .isNull();
+    }
+
+    if (rvv2 == null) {
+      assertThat(rvv1)
+          .as("Bucket " + bucketId + " has an RVV on member " + bucketDump1.getMember()
+              + ", but does not on member " + bucketDump2.getMember())
+          .isNull();
+    }
+
+    assertThat(rvv1).isNotNull();
+    assertThat(rvv2).isNotNull();
+    Map<VersionSource<?>, RegionVersionHolder<?>> rvv2Members =
+        new HashMap<>(rvv1.getMemberToVersion());
+    Map<VersionSource<?>, RegionVersionHolder<?>> rvv1Members =
+        new HashMap<>(rvv1.getMemberToVersion());
+    for (Map.Entry<VersionSource<?>, RegionVersionHolder<?>> entry : rvv1Members.entrySet()) {
+      VersionSource<?> memberId = entry.getKey();
+      RegionVersionHolder<?> versionHolder1 = entry.getValue();
+      RegionVersionHolder<?> versionHolder2 = rvv2Members.remove(memberId);
+      assertThat(versionHolder1)
+          .as("RegionVersionVector for bucket " + bucketId + " on member " + bucketDump1.getMember()
+              + " is not consistent with member " + bucketDump2.getMember())
+          .isEqualTo(versionHolder2);
+    }
+  }
+
+  /**
+   * Asserts that the region data is consistent across buckets.
+   */
+  private void assertRegionBucketsConsistency() throws ForceReattemptException {
+    List<BucketDump> bucketDumps;
+    PartitionedRegion region = (PartitionedRegion) cacheRule.getCache().getRegion(REGION_NAME);
+    // Redundant copies + 1 primary.
+    int expectedCopies = region.getRedundantCopies() + 1;
+
+    for (int bId = 0; bId < BUCKETS; bId++) {
+      final int bucketId = bId;
+      bucketDumps = region.getAllBucketEntries(bucketId);
+      assertThat(bucketDumps.size())
+          .as("Bucket " + bucketId + " should have " + expectedCopies + " copies, but has "
+              + bucketDumps.size())
+          .isEqualTo(expectedCopies);
+
+      // Check that all copies of the bucket have the same data.
+      if (bucketDumps.size() > 1) {
+        BucketDump firstDump = bucketDumps.get(0);
+
+        for (int j = 1; j < bucketDumps.size(); j++) {
+          BucketDump otherDump = bucketDumps.get(j);
+          assertRegionVersionVectorsConsistency(bucketId, firstDump, otherDump);
+
+          await().untilAsserted(() -> assertThat(otherDump.getValues())
+              .as("Values for bucket " + bucketId + " on member " + otherDump.getMember()
+                  + " are not consistent with member " + firstDump.getMember())
+              .isEqualTo(firstDump.getValues()));
+
+          await().untilAsserted(() -> assertThat(otherDump.getVersions())
+              .as("Versions for bucket " + bucketId + " on member " + otherDump.getMember()
+                  + " are not consistent with member " + firstDump.getMember())
+              .isEqualTo(firstDump.getVersions()));
+        }
+      }
+    }
+  }
+
+  /**
+   * Continuously execute get operations on the PartitionedRegion for the given durationInMillis.
+   */
+  private void executeGets(final int numEntries, final long durationInMillis) {
+    Cache cache = cacheRule.getCache();
+    Region<String, String> region = cache.getRegion(REGION_NAME);
+    Instant finishTime = Instant.now().plusMillis(durationInMillis);
+
+    while (Instant.now().isBefore(finishTime)) {
+      // Region might have been cleared in between, that's why we check for null.
+      IntStream.range(0, numEntries).forEach(i -> {
+        Optional<String> nullableValue = Optional.ofNullable(region.get(String.valueOf(i)));
+        nullableValue.ifPresent(value -> assertThat(value).isEqualTo("Value_" + i));
+      });
+    }
+  }
+
+  /**
+   * Continuously execute put operations on the PartitionedRegion for the given durationInMillis.
+   */
+  private void executePuts(final int numEntries, final long durationInMillis) {
+    Cache cache = cacheRule.getCache();
+    Region<String, String> region = cache.getRegion(REGION_NAME);
+    Instant finishTime = Instant.now().plusMillis(durationInMillis);
+
+    while (Instant.now().isBefore(finishTime)) {
+      IntStream.range(0, numEntries).forEach(i -> region.put(String.valueOf(i), "Value_" + i));
+    }
+  }
+
+  /**
+   * Continuously execute putAll operations on the PartitionedRegion for the given
+   * durationInMillis.
+   */
+  private void executePutAlls(final int startKey, final int finalKey, final long durationInMillis) {
+    Cache cache = cacheRule.getCache();
+    Map<String, String> valuesToInsert = new HashMap<>();
+    Region<String, String> region = cache.getRegion(REGION_NAME);
+    IntStream.range(startKey, finalKey)
+        .forEach(i -> valuesToInsert.put(String.valueOf(i), "Value_" + i));
+    Instant finishTime = Instant.now().plusMillis(durationInMillis);
+
+    while (Instant.now().isBefore(finishTime)) {
+      region.putAll(valuesToInsert);
+    }
+  }
+
+  /**
+   * Continuously execute remove operations on the PartitionedRegion for the given
+   * durationInMillis.
+   */
+  private void executeRemoves(final int numEntries, final long durationInMillis) {
+    Cache cache = cacheRule.getCache();
+    Region<String, String> region = cache.getRegion(REGION_NAME);
+    Instant finishTime = Instant.now().plusMillis(durationInMillis);
+
+    while (Instant.now().isBefore(finishTime)) {
+      // Region might have been cleared in between, that's why we check for null.
+      IntStream.range(0, numEntries).forEach(i -> {
+        Optional<String> nullableValue = Optional.ofNullable(region.remove(String.valueOf(i)));
+        nullableValue.ifPresent(value -> assertThat(value).isEqualTo("Value_" + i));
+      });
+    }
+  }
+
+  /**
+   * Continuously execute removeAll operations on the PartitionedRegion for the given
+   * durationInMillis.
+   */
+  private void executeRemoveAlls(final int startKey, final int finalKey,
+      final long durationInMillis) {
+    Cache cache = cacheRule.getCache();
+    List<String> keysToRemove = new ArrayList<>();
+    Region<String, String> region = cache.getRegion(REGION_NAME);
+    IntStream.range(startKey, finalKey).forEach(i -> keysToRemove.add(String.valueOf(i)));
+    Instant finishTime = Instant.now().plusMillis(durationInMillis);
+
+    while (Instant.now().isBefore(finishTime)) {
+      region.removeAll(keysToRemove);
+    }
+  }
+
+  /**
+   * Execute the clear operation and retry until success.
+   */
+  private void executeClearWithRetry(VM coordinator) {
+    coordinator.invoke(() -> {
+      boolean retry;
+
+      do {
+        retry = false;
+
+        try {
+          cacheRule.getCache().getRegion(REGION_NAME).clear();
+        } catch (PartitionedRegionPartialClearException pce) {
+          retry = true;
+        }
+
+      } while (retry);
+    });
+  }
+
+  /**
+   * Continuously execute clear operations on the PartitionedRegion every periodInMillis for the
+   * given
+   * durationInMillis.
+   */
+  private void executeClears(final long durationInMillis, final long periodInMillis)
+      throws InterruptedException {
+    Cache cache = cacheRule.getCache();
+    AtomicLong invocationCount = new AtomicLong(0);
+    Region<String, String> region = cache.getRegion(REGION_NAME);
+    Long minimumInvocationCount = (durationInMillis / periodInMillis);
+    ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
+    ScheduledFuture<?> scheduledFuture = executor.scheduleWithFixedDelay(() -> {
+      region.clear();
+      invocationCount.incrementAndGet();
+    }, 0, periodInMillis, TimeUnit.MILLISECONDS);
+
+    await().untilAsserted(
+        () -> assertThat(invocationCount.get()).isGreaterThanOrEqualTo(minimumInvocationCount));
+    scheduledFuture.cancel(false);
+    executor.shutdown();
+    executor.awaitTermination(GeodeAwaitility.getTimeout().getSeconds(), TimeUnit.SECONDS);
+  }
+
+  /**
+   * The test does the following (clear coordinator and regionType are parametrized):
+   * - Launches one thread per VM to continuously execute removes, puts and gets for a given time.
+   * - Clears the Partition Region continuously every X milliseconds for a given time.
+   * - Asserts that, after the clears have finished, the Region Buckets are consistent across
+   * members.
+   */
+  @Test
+  @TestCaseName(TEST_CASE_NAME)
+  @Parameters(method = "coordinatorsAndRegionTypes")
+  public void clearWithConcurrentPutGetRemoveShouldWorkCorrectly(TestVM coordinatorVM,
+      RegionShortcut regionShortcut) throws InterruptedException {
+    final int entries = 15000;
+    final int workMillis = 60000;
+    parametrizedSetup(regionShortcut);
+
+    // Let all VMs continuously execute puts and gets for 60 seconds.
+    List<AsyncInvocation<Void>> asyncInvocationList = Arrays.asList(
+        server1.invokeAsync(() -> executePuts(entries, workMillis)),
+        server2.invokeAsync(() -> executeGets(entries, workMillis)),
+        accessor.invokeAsync(() -> executeRemoves(entries, workMillis)));
+
+    // Clear the region every second for 60 seconds.
+    getVM(coordinatorVM.vmNumber).invoke(() -> executeClears(workMillis, 1000));
+
+    // Let asyncInvocations finish.
+    for (AsyncInvocation<Void> asyncInvocation : asyncInvocationList) {
+      asyncInvocation.await();
+    }
+
+    // Assert Region Buckets are consistent.
+    asList(accessor, server1, server2).forEach(vm -> vm.invoke(this::waitForSilence));
+    accessor.invoke(this::assertRegionBucketsConsistency);
+  }
+
+  /**
+   * The test does the following (clear coordinator and regionType are parametrized):
+   * - Launches two threads per VM to continuously execute putAll and removeAll for a given time.
+   * - Clears the Partition Region continuously every X milliseconds for a given time.
+   * - Asserts that, after the clears have finished, the Region Buckets are consistent across
+   * members.
+   */
+  @Test
+  @TestCaseName(TEST_CASE_NAME)
+  @Parameters(method = "coordinatorsAndRegionTypes")
+  public void clearWithConcurrentPutAllRemoveAllShouldWorkCorrectly(TestVM coordinatorVM,
+      RegionShortcut regionShortcut) throws InterruptedException {
+    final int workMillis = 15000;
+    parametrizedSetup(regionShortcut);
+
+    // Let all VMs continuously execute putAll and removeAll for 15 seconds.
+    List<AsyncInvocation<Void>> asyncInvocationList = Arrays.asList(
+        server1.invokeAsync(() -> executePutAlls(0, 2000, workMillis)),
+        server1.invokeAsync(() -> executeRemoveAlls(0, 2000, workMillis)),
+        server2.invokeAsync(() -> executePutAlls(2000, 4000, workMillis)),
+        server2.invokeAsync(() -> executeRemoveAlls(2000, 4000, workMillis)),
+        accessor.invokeAsync(() -> executePutAlls(4000, 6000, workMillis)),
+        accessor.invokeAsync(() -> executeRemoveAlls(4000, 6000, workMillis)));
+
+    // Clear the region every half second for 15 seconds.
+    getVM(coordinatorVM.vmNumber).invoke(() -> executeClears(workMillis, 500));
+
+    // Let asyncInvocations finish.
+    for (AsyncInvocation<Void> asyncInvocation : asyncInvocationList) {
+      asyncInvocation.await();
+    }
+
+    // Assert Region Buckets are consistent.
+    asList(accessor, server1, server2).forEach(vm -> vm.invoke(this::waitForSilence));
+    accessor.invoke(this::assertRegionBucketsConsistency);
+  }
+
+  /**
+   * The test does the following (regionType is parametrized):
+   * - Populates the Partition Region.
+   * - Verifies that the entries are synchronized on all members.
+   * - Sets the {@link MemberKiller} as a {@link DistributionMessageObserver} to stop the
+   * coordinator VM while the clear is in progress.
+   * - Clears the Partition Region (at this point the coordinator is restarted).
+   * - Asserts that, after the member joins again, the Region Buckets are consistent.
+   */
+  @Test
+  @TestCaseName("[{index}] {method}(RegionType:{0})")
+  @Parameters(method = "regionTypes")
+  public void clearShouldFailWhenCoordinatorMemberIsBounced(RegionShortcut regionShortcut) {
+    final int entries = 1000;
+    parametrizedSetup(regionShortcut);
+    populateRegion(accessor, entries, asList(accessor, server1, server2));
+
+    // Set the CoordinatorMemberKiller and try to clear the region
+    server1.invoke(() -> {
+      DistributionMessageObserver.setInstance(new MemberKiller(true));
+      Region<String, String> region = cacheRule.getCache().getRegion(REGION_NAME);
+      assertThatThrownBy(region::clear)
+          .isInstanceOf(DistributedSystemDisconnectedException.class)
+          .hasCauseInstanceOf(ForcedDisconnectException.class);
+    });
+
+    // Wait for member to get back online and assign all buckets.
+    server1.invoke(() -> {
+      cacheRule.createCache();
+      initDataStore(regionShortcut);
+      await().untilAsserted(
+          () -> assertThat(InternalDistributedSystem.getConnectedInstance()).isNotNull());
+      PartitionRegionHelper.assignBucketsToPartitions(cacheRule.getCache().getRegion(REGION_NAME));
+    });
+
+    // Assert Region Buckets are consistent.
+    asList(accessor, server1, server2).forEach(vm -> vm.invoke(this::waitForSilence));
+    accessor.invoke(this::assertRegionBucketsConsistency);
+  }
+
+  /**
+   * The test does the following (clear coordinator is chosen through parameters):
+   * - Populates the Partition Region.
+   * - Verifies that the entries are synchronized on all members.
+   * - Sets the {@link MemberKiller} as a {@link DistributionMessageObserver} to stop a
+   * non-coordinator VM while the clear is in progress (the member has primary buckets, though, so
+   * participates on the clear operation).
+   * - Launches two threads per VM to continuously execute gets, puts and removes for a given time.
+   * - Clears the Partition Region (at this point the non-coordinator is restarted).
+   * - Asserts that, after the clear has finished, the Region Buckets are consistent across members.
+   */
+  @Test
+  @Parameters(method = "coordinators")
+  @TestCaseName("[{index}] {method}(Coordinator:{0})")
+  public void clearOnRedundantPartitionRegionWithConcurrentPutGetRemoveShouldWorkCorrectlyWhenNonCoordinatorMembersAreBounced(
+      TestVM coordinatorVM) throws InterruptedException {
+    final int entries = 7500;
+    final int workMillis = 30000;
+    parametrizedSetup(RegionShortcut.PARTITION_REDUNDANT);
+    populateRegion(accessor, entries, asList(accessor, server1, server2));
+    server2.invoke(() -> DistributionMessageObserver.setInstance(new MemberKiller(false)));
+
+    // Let all VMs (except the one to kill) continuously execute gets, put and removes for 30"
+    List<AsyncInvocation<Void>> asyncInvocationList = Arrays.asList(
+        server1.invokeAsync(() -> executeGets(entries, workMillis)),
+        server1.invokeAsync(() -> executePuts(entries, workMillis)),
+        accessor.invokeAsync(() -> executeGets(entries, workMillis)),
+        accessor.invokeAsync(() -> executeRemoves(entries, workMillis)));
+
+    // Retry the clear operation on the region until success (server2 will go down, but other
+    // members will eventually become primary for those buckets previously hosted by server2).
+    executeClearWithRetry(getVM(coordinatorVM.vmNumber));
+
+    // Wait for member to get back online.
+    server2.invoke(() -> {
+      cacheRule.createCache();
+      initDataStore(RegionShortcut.PARTITION_REDUNDANT);
+      await().untilAsserted(
+          () -> assertThat(InternalDistributedSystem.getConnectedInstance()).isNotNull());
+    });
+
+    // Let asyncInvocations finish.
+    for (AsyncInvocation<Void> asyncInvocation : asyncInvocationList) {
+      asyncInvocation.await();
+    }
+
+    // Assert Region Buckets are consistent.
+    asList(accessor, server1, server2).forEach(vm -> vm.invoke(this::waitForSilence));
+    accessor.invoke(this::assertRegionBucketsConsistency);
+  }
+
+  /**
+   * The test does the following (clear coordinator is chosen through parameters):
+   * - Populates the Partition Region.
+   * - Verifies that the entries are synchronized on all members.
+   * - Sets the {@link MemberKiller} as a {@link DistributionMessageObserver} to stop a
+   * non-coordinator VM while the clear is in progress (the member has primary buckets, though, so
+   * participates on the clear operation).
+   * - Launches two threads per VM to continuously execute gets, puts and removes for a given time.
+   * - Clears the Partition Region (at this point the non-coordinator is restarted).
+   * - Asserts that the clear operation failed with PartitionedRegionPartialClearException (primary
+   * buckets on the the restarted members are not available).
+   */
+  @Test
+  @Parameters(method = "coordinators")
+  @TestCaseName("[{index}] {method}(Coordinator:{0})")
+  public void clearOnNonRedundantPartitionRegionWithConcurrentPutGetRemoveShouldFailWhenNonCoordinatorMembersAreBounced(
+      TestVM coordinatorVM) throws InterruptedException {
+    final int entries = 7500;
+    final int workMillis = 30000;
+    parametrizedSetup(RegionShortcut.PARTITION);
+    populateRegion(accessor, entries, asList(accessor, server1, server2));
+    server2.invoke(() -> DistributionMessageObserver.setInstance(new MemberKiller(false)));
+
+    // Let all VMs (except the one to kill) continuously execute gets, put and removes for 30"
+    List<AsyncInvocation<Void>> asyncInvocationList = Arrays.asList(
+        server1.invokeAsync(() -> executeGets(entries, workMillis)),
+        server1.invokeAsync(() -> executePuts(entries, workMillis)),
+        accessor.invokeAsync(() -> executeGets(entries, workMillis)),
+        accessor.invokeAsync(() -> executeRemoves(entries, workMillis)));
+
+    // Clear the region.
+    getVM(coordinatorVM.vmNumber).invoke(() -> {
+      assertThatThrownBy(() -> cacheRule.getCache().getRegion(REGION_NAME).clear())
+          .isInstanceOf(PartitionedRegionPartialClearException.class);
+    });
+
+    // Let asyncInvocations finish.
+    for (AsyncInvocation<Void> asyncInvocation : asyncInvocationList) {
+      asyncInvocation.await();
+    }
+  }
+
+  /**
+   * The test does the following (clear coordinator is chosen through parameters):
+   * - Sets the {@link MemberKiller} as a {@link DistributionMessageObserver} to stop a
+   * non-coordinator VM while the clear is in progress (the member has primary buckets, though, so
+   * participates on the clear operation).
+   * - Launches one thread per VM to continuously execute putAll/removeAll for a given time.
+   * - Clears the Partition Region (at this point the non-coordinator is restarted).
+   * - Asserts that, after the clear has finished, the Region Buckets are consistent across members.
+   */
+  @Test
+  @Parameters(method = "coordinators")
+  @TestCaseName("[{index}] {method}(Coordinator:{0})")
+  public void clearOnRedundantPartitionRegionWithConcurrentPutAllRemoveAllShouldWorkCorrectlyWhenNonCoordinatorMembersAreBounced(
+      TestVM coordinatorVM) throws InterruptedException {
+    final int workMillis = 30000;
+    parametrizedSetup(RegionShortcut.PARTITION_REDUNDANT);
+    server2.invoke(() -> DistributionMessageObserver.setInstance(new MemberKiller(false)));
+
+    // Let all VMs continuously execute putAll/removeAll for 30 seconds.
+    List<AsyncInvocation<Void>> asyncInvocationList = Arrays.asList(
+        server1.invokeAsync(() -> executePutAlls(0, 6000, workMillis)),
+        accessor.invokeAsync(() -> executeRemoveAlls(2000, 4000, workMillis)));
+
+    // Retry the clear operation on the region until success (server2 will go down, but other
+    // members will eventually become primary for those buckets previously hosted by server2).
+    executeClearWithRetry(getVM(coordinatorVM.vmNumber));
+
+    // Wait for member to get back online.
+    server2.invoke(() -> {
+      cacheRule.createCache();
+      initDataStore(RegionShortcut.PARTITION_REDUNDANT);
+      await().untilAsserted(
+          () -> assertThat(InternalDistributedSystem.getConnectedInstance()).isNotNull());
+    });
+
+    // Let asyncInvocations finish.
+    for (AsyncInvocation<Void> asyncInvocation : asyncInvocationList) {
+      asyncInvocation.await();
+    }
+
+    // Assert Region Buckets are consistent.
+    asList(accessor, server1, server2).forEach(vm -> vm.invoke(this::waitForSilence));
+    accessor.invoke(this::assertRegionBucketsConsistency);
+  }
+
+  /**
+   * The test does the following (clear coordinator is chosen through parameters):
+   * - Sets the {@link MemberKiller} as a {@link DistributionMessageObserver} to stop a
+   * non-coordinator VM while the clear is in progress (the member has primary buckets, though, so
+   * participates on the clear operation).
+   * - Launches one thread per VM to continuously execute putAll/removeAll for a given time.
+   * - Clears the Partition Region (at this point the non-coordinator is restarted).
+   * - Asserts that the clear operation failed with PartitionedRegionPartialClearException (primary
+   * buckets on the the restarted members are not available).
+   */
+  @Test
+  @Parameters(method = "coordinators")
+  @TestCaseName("[{index}] {method}(Coordinator:{0})")
+  public void clearOnNonRedundantPartitionRegionWithConcurrentPutAllRemoveAllShouldFailWhenNonCoordinatorMembersAreBounced(
+      TestVM coordinatorVM) throws InterruptedException {
+    final int workMillis = 30000;
+    parametrizedSetup(RegionShortcut.PARTITION);
+    server2.invoke(() -> DistributionMessageObserver.setInstance(new MemberKiller(false)));
+
+    List<AsyncInvocation<Void>> asyncInvocationList = Arrays.asList(
+        server1.invokeAsync(() -> executePutAlls(0, 6000, workMillis)),
+        accessor.invokeAsync(() -> executeRemoveAlls(2000, 4000, workMillis)));
+
+    // Clear the region.
+    getVM(coordinatorVM.vmNumber).invoke(() -> {
+      assertThatThrownBy(() -> cacheRule.getCache().getRegion(REGION_NAME).clear())
+          .isInstanceOf(PartitionedRegionPartialClearException.class);
+    });
+
+    // Let asyncInvocations finish.
+    for (AsyncInvocation<Void> asyncInvocation : asyncInvocationList) {
+      asyncInvocation.await();
+    }
+  }
+
+  /**
+   * Shutdowns a coordinator member while the clear operation is in progress.
+   */
+  public static class MemberKiller extends DistributionMessageObserver {
+    private final boolean coordinator;
+
+    public MemberKiller(boolean coordinator) {
+      this.coordinator = coordinator;
+    }
+
+    /**
+     * Shutdowns the VM whenever the message is an instance of
+     * {@link PartitionedRegionClearMessage}.
+     */
+    private void shutdownMember(DistributionMessage message) {
+      if (message instanceof PartitionedRegionClearMessage) {
+        if (((PartitionedRegionClearMessage) message)
+            .getOp() == PartitionedRegionClearMessage.OperationType.OP_PR_CLEAR) {
+          DistributionMessageObserver.setInstance(null);
+          InternalDistributedSystem.getConnectedInstance().stopReconnectingNoDisconnect();
+          MembershipManagerHelper
+              .crashDistributedSystem(InternalDistributedSystem.getConnectedInstance());
+          await().untilAsserted(
+              () -> assertThat(InternalDistributedSystem.getConnectedInstance()).isNull());
+        }
+      }
+    }
+
+    /**
+     * Invoked only on clear coordinator VM.
+     *
+     * @param dm the distribution manager that received the message
+     * @param message The message itself
+     */
+    @Override
+    public void beforeSendMessage(ClusterDistributionManager dm, DistributionMessage message) {
+      if (coordinator) {
+        shutdownMember(message);
+      } else {
+        super.beforeSendMessage(dm, message);
+      }
+    }
+
+    /**
+     * Invoked only on non clear coordinator VM.
+     *
+     * @param dm the distribution manager that received the message
+     * @param message The message itself
+     */
+    @Override
+    public void beforeProcessMessage(ClusterDistributionManager dm, DistributionMessage message) {
+      if (!coordinator) {
+        shutdownMember(message);
+      } else {
+        super.beforeProcessMessage(dm, message);
+      }
+    }
+  }
+}
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionClearWithExpirationDUnitTest.java b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionClearWithExpirationDUnitTest.java
new file mode 100644
index 0000000000..dfc9470cbb
--- /dev/null
+++ b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionClearWithExpirationDUnitTest.java
@@ -0,0 +1,501 @@
+/*
+ * 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.cache;
+
+import static org.apache.geode.cache.ExpirationAction.DESTROY;
+import static org.apache.geode.cache.RegionShortcut.PARTITION;
+import static org.apache.geode.cache.RegionShortcut.PARTITION_OVERFLOW;
+import static org.apache.geode.cache.RegionShortcut.PARTITION_REDUNDANT;
+import static org.apache.geode.cache.RegionShortcut.PARTITION_REDUNDANT_OVERFLOW;
+import static org.apache.geode.internal.util.ArrayUtils.asList;
+import static org.apache.geode.test.awaitility.GeodeAwaitility.await;
+import static org.apache.geode.test.dunit.VM.getVM;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.IntStream;
+
+import junitparams.JUnitParamsRunner;
+import junitparams.Parameters;
+import junitparams.naming.TestCaseName;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import org.apache.geode.ForcedDisconnectException;
+import org.apache.geode.cache.Cache;
+import org.apache.geode.cache.CacheWriter;
+import org.apache.geode.cache.CacheWriterException;
+import org.apache.geode.cache.ExpirationAttributes;
+import org.apache.geode.cache.PartitionAttributes;
+import org.apache.geode.cache.PartitionAttributesFactory;
+import org.apache.geode.cache.PartitionedRegionPartialClearException;
+import org.apache.geode.cache.Region;
+import org.apache.geode.cache.RegionEvent;
+import org.apache.geode.cache.RegionShortcut;
+import org.apache.geode.cache.partition.PartitionRegionHelper;
+import org.apache.geode.cache.util.CacheWriterAdapter;
+import org.apache.geode.distributed.DistributedSystemDisconnectedException;
+import org.apache.geode.distributed.internal.DMStats;
+import org.apache.geode.distributed.internal.InternalDistributedSystem;
+import org.apache.geode.distributed.internal.membership.api.MembershipManagerHelper;
+import org.apache.geode.test.awaitility.GeodeAwaitility;
+import org.apache.geode.test.dunit.VM;
+import org.apache.geode.test.dunit.rules.CacheRule;
+import org.apache.geode.test.dunit.rules.DistributedDiskDirRule;
+import org.apache.geode.test.dunit.rules.DistributedRule;
+
+/**
+ * Tests to verify that {@link PartitionedRegion#clear()} cancels all remaining expiration tasks
+ * on the {@link PartitionedRegion} once the operation is executed.
+ */
+@RunWith(JUnitParamsRunner.class)
+public class PartitionedRegionClearWithExpirationDUnitTest implements Serializable {
+  private static final Integer BUCKETS = 13;
+  private static final Integer EXPIRATION_TIME = 5 * 60;
+  private static final Integer SMALL_EXPIRATION_TIME = 10;
+  private static final String REGION_NAME = "PartitionedRegion";
+
+  @Rule
+  public DistributedRule distributedRule = new DistributedRule(3);
+
+  @Rule
+  public CacheRule cacheRule = CacheRule.builder().createCacheInAll().build();
+
+  @Rule
+  public DistributedDiskDirRule distributedDiskDirRule = new DistributedDiskDirRule();
+
+  private VM accessor, server1, server2;
+
+  private enum TestVM {
+    ACCESSOR(0), SERVER1(1), SERVER2(2);
+
+    final int vmNumber;
+
+    TestVM(int vmNumber) {
+      this.vmNumber = vmNumber;
+    }
+  }
+
+  @SuppressWarnings("unused")
+  static RegionShortcut[] regionTypes() {
+    return new RegionShortcut[] {
+        PARTITION,
+        PARTITION_OVERFLOW,
+        PARTITION_REDUNDANT,
+        PARTITION_REDUNDANT_OVERFLOW,
+    };
+  }
+
+  @SuppressWarnings("unused")
+  static Object[] vmsAndRegionTypes() {
+    ArrayList<Object[]> parameters = new ArrayList<>();
+    RegionShortcut[] regionShortcuts = regionTypes();
+
+    Arrays.stream(regionShortcuts).forEach(regionShortcut -> {
+      parameters.add(new Object[] {TestVM.SERVER1, regionShortcut});
+      parameters.add(new Object[] {TestVM.ACCESSOR, regionShortcut});
+    });
+
+    return parameters.toArray();
+  }
+
+  @Before
+  public void setUp() throws Exception {
+    server1 = getVM(TestVM.SERVER1.vmNumber);
+    server2 = getVM(TestVM.SERVER2.vmNumber);
+    accessor = getVM(TestVM.ACCESSOR.vmNumber);
+  }
+
+  private void initAccessor(RegionShortcut regionShortcut,
+      ExpirationAttributes expirationAttributes) {
+    PartitionAttributes<String, String> attributes =
+        new PartitionAttributesFactory<String, String>()
+            .setTotalNumBuckets(BUCKETS)
+            .setLocalMaxMemory(0)
+            .create();
+
+    cacheRule.getCache()
+        .<String, String>createRegionFactory(regionShortcut)
+        .setPartitionAttributes(attributes)
+        .setEntryTimeToLive(expirationAttributes)
+        .setEntryIdleTimeout(expirationAttributes)
+        .create(REGION_NAME);
+  }
+
+  private void initDataStore(RegionShortcut regionShortcut,
+      ExpirationAttributes expirationAttributes) {
+    PartitionAttributes<String, String> attributes =
+        new PartitionAttributesFactory<String, String>()
+            .setTotalNumBuckets(BUCKETS)
+            .create();
+
+    cacheRule.getCache()
+        .<String, String>createRegionFactory(regionShortcut)
+        .setPartitionAttributes(attributes)
+        .setEntryTimeToLive(expirationAttributes)
+        .setEntryIdleTimeout(expirationAttributes)
+        .create(REGION_NAME);
+
+    ExpiryTask.expiryTaskListener = new ExpirationListener();
+  }
+
+  private void parametrizedSetup(RegionShortcut regionShortcut,
+      ExpirationAttributes expirationAttributes) {
+    server1.invoke(() -> initDataStore(regionShortcut, expirationAttributes));
+    server2.invoke(() -> initDataStore(regionShortcut, expirationAttributes));
+    accessor.invoke(() -> initAccessor(regionShortcut, expirationAttributes));
+  }
+
+  private void waitForSilence() {
+    DMStats dmStats = cacheRule.getSystem().getDistributionManager().getStats();
+    PartitionedRegion region = (PartitionedRegion) cacheRule.getCache().getRegion(REGION_NAME);
+    PartitionedRegionStats partitionedRegionStats = region.getPrStats();
+
+    await().untilAsserted(() -> {
+      assertThat(dmStats.getReplyWaitsInProgress()).isEqualTo(0);
+      assertThat(partitionedRegionStats.getVolunteeringInProgress()).isEqualTo(0);
+      assertThat(partitionedRegionStats.getBucketCreatesInProgress()).isEqualTo(0);
+      assertThat(partitionedRegionStats.getPrimaryTransfersInProgress()).isEqualTo(0);
+      assertThat(partitionedRegionStats.getRebalanceBucketCreatesInProgress()).isEqualTo(0);
+      assertThat(partitionedRegionStats.getRebalancePrimaryTransfersInProgress()).isEqualTo(0);
+    });
+  }
+
+  /**
+   * Populates the region and verifies the data on the selected VMs.
+   */
+  private void populateRegion(VM feeder, int entryCount, List<VM> vms) {
+    feeder.invoke(() -> {
+      Region<String, String> region = cacheRule.getCache().getRegion(REGION_NAME);
+      IntStream.range(0, entryCount).forEach(i -> region.put(String.valueOf(i), "Value_" + i));
+    });
+
+    vms.forEach(vm -> vm.invoke(() -> {
+      waitForSilence();
+      Region<String, String> region = cacheRule.getCache().getRegion(REGION_NAME);
+
+      IntStream.range(0, entryCount)
+          .forEach(i -> assertThat(region.get(String.valueOf(i))).isEqualTo("Value_" + i));
+    }));
+  }
+
+  /**
+   * Asserts that the region is empty on requested VMs.
+   */
+  private void assertRegionIsEmpty(List<VM> vms) {
+    vms.forEach(vm -> vm.invoke(() -> {
+      waitForSilence();
+      PartitionedRegion region = (PartitionedRegion) cacheRule.getCache().getRegion(REGION_NAME);
+
+      assertThat(region.getLocalSize()).isEqualTo(0);
+    }));
+  }
+
+  /**
+   * Asserts that the region data is consistent across buckets.
+   */
+  private void assertRegionBucketsConsistency() throws ForceReattemptException {
+    waitForSilence();
+    List<BucketDump> bucketDumps;
+    PartitionedRegion region = (PartitionedRegion) cacheRule.getCache().getRegion(REGION_NAME);
+    // Redundant copies + 1 primary.
+    int expectedCopies = region.getRedundantCopies() + 1;
+
+    for (int bucketId = 0; bucketId < BUCKETS; bucketId++) {
+      bucketDumps = region.getAllBucketEntries(bucketId);
+      assertThat(bucketDumps.size()).as("Bucket " + bucketId + " should have " + expectedCopies
+          + " copies, but has " + bucketDumps.size()).isEqualTo(expectedCopies);
+
+      // Check that all copies of the bucket have the same data.
+      if (bucketDumps.size() > 1) {
+        BucketDump firstDump = bucketDumps.get(0);
+
+        for (int j = 1; j < bucketDumps.size(); j++) {
+          BucketDump otherDump = bucketDumps.get(j);
+          assertThat(otherDump.getValues())
+              .as("Values for bucket " + bucketId + " on member " + otherDump.getMember()
+                  + " are not consistent with member " + firstDump.getMember())
+              .isEqualTo(firstDump.getValues());
+          assertThat(otherDump.getVersions())
+              .as("Versions for bucket " + bucketId + " on member " + otherDump.getMember()
+                  + " are not consistent with member " + firstDump.getMember())
+              .isEqualTo(firstDump.getVersions());
+        }
+      }
+    }
+  }
+
+  /**
+   * Register the MemberKiller CacheWriter on the given vms.
+   */
+  private void registerVMKillerAsCacheWriter(List<VM> vmsToBounce) {
+    vmsToBounce.forEach(vm -> vm.invoke(() -> {
+      Region<String, String> region = cacheRule.getCache().getRegion(REGION_NAME);
+      region.getAttributesMutator().setCacheWriter(new MemberKiller());
+    }));
+  }
+
+  private void doClear() {
+    Cache cache = cacheRule.getCache();
+    boolean retry;
+    do {
+      retry = false;
+      try {
+        cache.getRegion(REGION_NAME).clear();
+      } catch (PartitionedRegionPartialClearException | CacheWriterException ex) {
+        retry = true;
+      }
+    } while (retry);
+  }
+
+  /**
+   * The test does the following (clear coordinator and region type are parametrized):
+   * - Populates the Partition Region (entries have expiration).
+   * - Verifies that the entries are synchronized on all members.
+   * - Clears the Partition Region once.
+   * - Asserts that, after the clear is finished:
+   * . No expiration tasks were executed.
+   * . All expiration tasks were cancelled.
+   * . Map of expiry tasks per bucket is empty.
+   * . The Partition Region is empty on all members.
+   */
+  @Test
+  @Parameters(method = "vmsAndRegionTypes")
+  @TestCaseName("[{index}] {method}(Coordinator:{0}, RegionType:{1})")
+  public void clearShouldRemoveRegisteredExpirationTasks(TestVM coordinatorVM,
+      RegionShortcut regionShortcut) {
+    final int entries = 500;
+    int expirationTime = (int) GeodeAwaitility.getTimeout().getSeconds();
+    parametrizedSetup(regionShortcut, new ExpirationAttributes(expirationTime, DESTROY));
+    populateRegion(accessor, entries, asList(accessor, server1, server2));
+
+    // Clear the region.
+    getVM(coordinatorVM.vmNumber).invoke(() -> doClear());
+
+    // Assert all expiration tasks were cancelled and none were executed.
+    asList(server1, server2).forEach(vm -> vm.invoke(() -> {
+      ExpirationListener listener = (ExpirationListener) EntryExpiryTask.expiryTaskListener;
+      assertThat(listener.tasksRan.get()).isEqualTo(0);
+      assertThat(listener.tasksCanceled.get()).isEqualTo(listener.tasksScheduled.get());
+
+      PartitionedRegionDataStore dataStore =
+          ((PartitionedRegion) cacheRule.getCache().getRegion(REGION_NAME)).getDataStore();
+      Set<BucketRegion> bucketRegions = dataStore.getAllLocalBucketRegions();
+      bucketRegions
+          .forEach(bucketRegion -> assertThat(bucketRegion.entryExpiryTasks.isEmpty()).isTrue());
+    }));
+
+    // Assert Region Buckets are consistent and region is empty,
+    accessor.invoke(this::assertRegionBucketsConsistency);
+    assertRegionIsEmpty(asList(accessor, server1, server2));
+  }
+
+  /**
+   * The test does the following (region type is parametrized):
+   * - Populates the Partition Region (entries have expiration).
+   * - Verifies that the entries are synchronized on all members.
+   * - Sets the {@link MemberKiller} as a {@link CacheWriter} to stop the coordinator VM while the
+   * clear is in progress.
+   * - Clears the Partition Region (at this point the coordinator is restarted).
+   * - Asserts that, after the clear is finished and the expiration time is reached:
+   * . No expiration tasks were cancelled.
+   * . All entries were removed due to the expiration.
+   * . The Partition Region Buckets are consistent on all members.
+   */
+  @Test
+  @Parameters(method = "regionTypes")
+  @TestCaseName("[{index}] {method}(RegionType:{0})")
+  public void clearShouldFailWhenCoordinatorMemberIsBouncedAndExpirationTasksShouldSurvive(
+      RegionShortcut regionShortcut) {
+    final int entries = 1000;
+    ExpirationAttributes expirationAttributes =
+        new ExpirationAttributes(SMALL_EXPIRATION_TIME, DESTROY);
+    parametrizedSetup(regionShortcut, expirationAttributes);
+    populateRegion(accessor, entries, asList(accessor, server1, server2));
+    registerVMKillerAsCacheWriter(Collections.singletonList(server1));
+
+    // Clear the region (it should fail).
+    server1.invoke(() -> {
+      Region<String, String> region = cacheRule.getCache().getRegion(REGION_NAME);
+      assertThatThrownBy(region::clear)
+          .isInstanceOf(DistributedSystemDisconnectedException.class)
+          .hasCauseInstanceOf(ForcedDisconnectException.class);
+    });
+
+    // Wait for member to get back online and assign all buckets.
+    server1.invoke(() -> {
+      cacheRule.createCache();
+      initDataStore(regionShortcut, expirationAttributes);
+      await().untilAsserted(
+          () -> assertThat(InternalDistributedSystem.getConnectedInstance()).isNotNull());
+      PartitionRegionHelper.assignBucketsToPartitions(cacheRule.getCache().getRegion(REGION_NAME));
+    });
+
+    // Wait until all expiration tasks are executed.
+    asList(server1, server2).forEach(vm -> vm.invoke(() -> {
+      PartitionedRegionDataStore dataStore =
+          ((PartitionedRegion) cacheRule.getCache().getRegion(REGION_NAME)).getDataStore();
+      Set<BucketRegion> bucketRegions = dataStore.getAllLocalBucketRegions();
+      bucketRegions.forEach(bucketRegion -> await()
+          .untilAsserted(() -> assertThat(bucketRegion.entryExpiryTasks.isEmpty()).isTrue()));
+    }));
+
+    // At this point the entries should be either invalidated or destroyed (expiration tasks ran).
+    asList(accessor, server1, server2).forEach(vm -> vm.invoke(() -> {
+      Region<String, String> region = cacheRule.getCache().getRegion(REGION_NAME);
+      IntStream.range(0, entries).forEach(i -> {
+        String key = String.valueOf(i);
+        assertThat(region.get(key)).isNull();
+      });
+    }));
+
+    // Assert Region Buckets are consistent.
+    accessor.invoke(this::assertRegionBucketsConsistency);
+  }
+
+  /**
+   * The test does the following (clear coordinator and region type are parametrized):
+   * - Populates the Partition Region (entries have expiration).
+   * - Verifies that the entries are synchronized on all members.
+   * - Sets the {@link MemberKiller} as a {@link CacheWriter} to stop a non-coordinator VM while the
+   * clear is in progress (the member has primary buckets, though, so participates on
+   * the clear operation).
+   * - Clears the Partition Region (at this point the non-coordinator is restarted).
+   * - Asserts that, after the clear is finished:
+   * . No expiration tasks were executed on the non-restarted members.
+   * . All expiration tasks were cancelled on the non-restarted members.
+   * . Map of expiry tasks per bucket is empty on the non-restarted members.
+   * . All expiration tasks were executed and all expired on the restarted members.
+   * . The Partition Region is empty and buckets are consistent across all members.
+   */
+  @Test
+  @Parameters(method = "vmsAndRegionTypes")
+  @TestCaseName("[{index}] {method}(Coordinator:{0}, RegionType:{1})")
+  public void clearShouldSucceedAndRemoveRegisteredExpirationTasksWhenNonCoordinatorMemberIsBounced(
+      TestVM coordinatorVM, RegionShortcut regionShortcut) {
+    final int entries = 500;
+
+    RegionShortcut rs = regionShortcut;
+    ExpirationAttributes expirationAttributes = new ExpirationAttributes(EXPIRATION_TIME, DESTROY);
+    parametrizedSetup(regionShortcut, expirationAttributes);
+    registerVMKillerAsCacheWriter(Collections.singletonList(server2));
+    populateRegion(accessor, entries, asList(accessor, server1, server2));
+
+    // Clear the region.
+    getVM(coordinatorVM.vmNumber).invoke(() -> doClear());
+
+    // Wait for member to get back online and assign buckets.
+    server2.invoke(() -> {
+      cacheRule.createCache();
+      initDataStore(rs, expirationAttributes);
+      await().untilAsserted(
+          () -> assertThat(InternalDistributedSystem.getConnectedInstance()).isNotNull());
+      PartitionRegionHelper.assignBucketsToPartitions(cacheRule.getCache().getRegion(REGION_NAME));
+    });
+
+    // Assert all expiration tasks were cancelled and none were executed (surviving members).
+    server1.invoke(() -> {
+      PartitionedRegionDataStore dataStore =
+          ((PartitionedRegion) cacheRule.getCache().getRegion(REGION_NAME)).getDataStore();
+      Set<BucketRegion> bucketRegions = dataStore.getAllLocalBucketRegions();
+      bucketRegions
+          .forEach(bucketRegion -> assertThat(bucketRegion.entryExpiryTasks.isEmpty()).isTrue());
+
+      ExpirationListener listener = (ExpirationListener) EntryExpiryTask.expiryTaskListener;
+      assertThat(listener.tasksRan.get()).isEqualTo(0);
+      assertThat(listener.tasksCanceled.get()).isEqualTo(listener.tasksScheduled.get());
+    });
+
+    // Assert all expiration tasks were expired as the region is empty (restarted member).
+    server2.invoke(() -> {
+      PartitionedRegionDataStore dataStore =
+          ((PartitionedRegion) cacheRule.getCache().getRegion(REGION_NAME)).getDataStore();
+      Set<BucketRegion> bucketRegions = dataStore.getAllLocalBucketRegions();
+
+      // During restart, the member loads the region from disk and automatically registers
+      // expiration tasks for each entry. After GII, however, the region is empty due to the
+      // clear operation and the tasks will just expire as there are no entries.
+      bucketRegions.forEach(bucketRegion -> await()
+          .untilAsserted(() -> assertThat(bucketRegion.entryExpiryTasks.isEmpty()).isTrue()));
+
+      ExpirationListener listener = (ExpirationListener) EntryExpiryTask.expiryTaskListener;
+      assertThat(listener.tasksExpired.get()).isEqualTo(listener.tasksRan.get());
+    });
+
+    // Assert Region Buckets are consistent and region is empty,
+    accessor.invoke(this::assertRegionBucketsConsistency);
+    assertRegionIsEmpty(asList(accessor, server1, server2));
+  }
+
+  /**
+   * Tracks expiration tasks lifecycle.
+   */
+  public static class ExpirationListener implements ExpiryTask.ExpiryTaskListener {
+    final AtomicInteger tasksRan = new AtomicInteger(0);
+    final AtomicInteger tasksExpired = new AtomicInteger(0);
+    final AtomicInteger tasksCanceled = new AtomicInteger(0);
+    final AtomicInteger tasksScheduled = new AtomicInteger(0);
+
+    @Override
+    public void afterSchedule(ExpiryTask et) {
+      tasksScheduled.incrementAndGet();
+    }
+
+    @Override
+    public void afterTaskRan(ExpiryTask et) {
+      tasksRan.incrementAndGet();
+    }
+
+    @Override
+    public void afterReschedule(ExpiryTask et) {}
+
+    @Override
+    public void afterExpire(ExpiryTask et) {
+      tasksExpired.incrementAndGet();
+    }
+
+    @Override
+    public void afterCancel(ExpiryTask et) {
+      tasksCanceled.incrementAndGet();
+    }
+  }
+
+  /**
+   * Shutdowns a member while the clear operation is in progress.
+   * The writer is only installed on the member the test wants to shutdown, doesn't matter whether
+   * it's the clear coordinator or another member holding primary buckets.
+   */
+  public static class MemberKiller extends CacheWriterAdapter<String, String> {
+
+    @Override
+    public synchronized void beforeRegionClear(RegionEvent<String, String> event)
+        throws CacheWriterException {
+      InternalDistributedSystem.getConnectedInstance().stopReconnectingNoDisconnect();
+      MembershipManagerHelper.crashDistributedSystem(
+          InternalDistributedSystem.getConnectedInstance());
+      await().untilAsserted(
+          () -> assertThat(InternalDistributedSystem.getConnectedInstance()).isNull());
+    }
+  }
+}
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionClearWithRebalanceDUnitTest.java b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionClearWithRebalanceDUnitTest.java
new file mode 100644
index 0000000000..f53fab75c2
--- /dev/null
+++ b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionClearWithRebalanceDUnitTest.java
@@ -0,0 +1,578 @@
+/*
+ * 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.cache;
+
+import static org.apache.geode.cache.PartitionAttributesFactory.GLOBAL_MAX_BUCKETS_DEFAULT;
+import static org.apache.geode.cache.RegionShortcut.PARTITION;
+import static org.apache.geode.cache.RegionShortcut.PARTITION_REDUNDANT;
+import static org.apache.geode.cache.RegionShortcut.PARTITION_REDUNDANT_PERSISTENT;
+import static org.apache.geode.internal.util.ArrayUtils.asList;
+import static org.apache.geode.test.awaitility.GeodeAwaitility.await;
+import static org.apache.geode.test.dunit.VM.getVM;
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import java.util.stream.IntStream;
+
+import junitparams.JUnitParamsRunner;
+import junitparams.Parameters;
+import junitparams.naming.TestCaseName;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import org.apache.geode.cache.CacheWriterException;
+import org.apache.geode.cache.PartitionAttributesFactory;
+import org.apache.geode.cache.Region;
+import org.apache.geode.cache.RegionEvent;
+import org.apache.geode.cache.RegionFactory;
+import org.apache.geode.cache.RegionShortcut;
+import org.apache.geode.cache.control.RebalanceFactory;
+import org.apache.geode.cache.control.RebalanceOperation;
+import org.apache.geode.cache.control.RebalanceResults;
+import org.apache.geode.cache.util.CacheWriterAdapter;
+import org.apache.geode.distributed.internal.DMStats;
+import org.apache.geode.distributed.internal.InternalDistributedSystem;
+import org.apache.geode.distributed.internal.membership.api.MembershipManagerHelper;
+import org.apache.geode.test.awaitility.GeodeAwaitility;
+import org.apache.geode.test.dunit.AsyncInvocation;
+import org.apache.geode.test.dunit.DUnitBlackboard;
+import org.apache.geode.test.dunit.VM;
+import org.apache.geode.test.dunit.rules.CacheRule;
+import org.apache.geode.test.dunit.rules.DistributedDiskDirRule;
+import org.apache.geode.test.dunit.rules.DistributedRule;
+
+@RunWith(JUnitParamsRunner.class)
+public class PartitionedRegionClearWithRebalanceDUnitTest implements Serializable {
+  private static final long serialVersionUID = -7183993832801073933L;
+
+  private static final Integer BUCKETS = GLOBAL_MAX_BUCKETS_DEFAULT;
+  private static final String REGION_NAME = "testRegion";
+  private static final String COLOCATED_REGION = "childColocatedRegion";
+  private static final int ENTRIES = 10000;
+  private static final String DISK_STORE_SUFFIX = "DiskStore";
+  private static final String REBALANCE_HAS_BEGUN = "rebalance-begun";
+  private static final String CLEAR_HAS_BEGUN = "clear-begun";
+
+  @Rule
+  public DistributedRule distributedRule = new DistributedRule(4);
+
+  @Rule
+  public CacheRule cacheRule = CacheRule.builder().createCacheInAll().build();
+
+  @Rule
+  public DistributedDiskDirRule distributedDiskDirRule = new DistributedDiskDirRule();
+
+  private static transient DUnitBlackboard blackboard;
+
+  private VM accessor;
+  private VM server1;
+  private VM server2;
+  private VM server3;
+
+  private enum TestVM {
+    ACCESSOR(0), SERVER1(1), SERVER2(2), SERVER3(3);
+
+    final int vmNumber;
+
+    TestVM(int vmNumber) {
+      this.vmNumber = vmNumber;
+    }
+  }
+
+  @SuppressWarnings("unused")
+  static Object[] coordinatorVMsAndRegionTypes() {
+    return new Object[] {
+        // {ClearCoordinatorVM, regionShortcut}
+        new Object[] {TestVM.SERVER1, PARTITION_REDUNDANT},
+        new Object[] {TestVM.ACCESSOR, PARTITION_REDUNDANT},
+        new Object[] {TestVM.SERVER1, PARTITION_REDUNDANT_PERSISTENT},
+        new Object[] {TestVM.ACCESSOR, PARTITION_REDUNDANT_PERSISTENT}
+    };
+  }
+
+  @SuppressWarnings("unused")
+  static Object[] coordinatorVMsAndRegionTypesNoAccessor() {
+    return new Object[] {
+        // {ClearCoordinatorVM, regionShortcut}
+        new Object[] {TestVM.SERVER1, PARTITION_REDUNDANT},
+        new Object[] {TestVM.SERVER2, PARTITION_REDUNDANT},
+        new Object[] {TestVM.SERVER1, PARTITION_REDUNDANT_PERSISTENT},
+        new Object[] {TestVM.SERVER2, PARTITION_REDUNDANT_PERSISTENT}
+    };
+  }
+
+  @Before
+  public void setUp() throws Exception {
+    getBlackboard().initBlackboard();
+    server1 = getVM(TestVM.SERVER1.vmNumber);
+    server2 = getVM(TestVM.SERVER2.vmNumber);
+    server3 = getVM(TestVM.SERVER3.vmNumber);
+    accessor = getVM(TestVM.ACCESSOR.vmNumber);
+  }
+
+  private static DUnitBlackboard getBlackboard() {
+    if (blackboard == null) {
+      blackboard = new DUnitBlackboard();
+    }
+    return blackboard;
+  }
+
+  private RegionShortcut getRegionAccessorShortcut(RegionShortcut dataStoreRegionShortcut) {
+    if (dataStoreRegionShortcut.isPersistent()) {
+      switch (dataStoreRegionShortcut) {
+        case PARTITION_PERSISTENT:
+          return PARTITION;
+        case PARTITION_REDUNDANT_PERSISTENT:
+          return PARTITION_REDUNDANT;
+        default:
+          throw new IllegalArgumentException(
+              "Invalid RegionShortcut specified: " + dataStoreRegionShortcut);
+      }
+    }
+
+    return dataStoreRegionShortcut;
+  }
+
+  private void initAccessor(RegionShortcut regionShortcut, Collection<String> regionNames) {
+    RegionShortcut accessorShortcut = getRegionAccessorShortcut(regionShortcut);
+    // StartupRecoveryDelay is set to infinite to prevent automatic rebalancing when creating the
+    // region on other members
+    regionNames.forEach(regionName -> {
+      PartitionAttributesFactory<String, String> attributesFactory =
+          new PartitionAttributesFactory<String, String>()
+              .setTotalNumBuckets(BUCKETS)
+              .setStartupRecoveryDelay(-1)
+              .setLocalMaxMemory(0);
+
+      if (regionName.equals(COLOCATED_REGION)) {
+        attributesFactory.setColocatedWith(REGION_NAME);
+      }
+
+      cacheRule.getCache()
+          .<String, String>createRegionFactory(accessorShortcut)
+          .setPartitionAttributes(attributesFactory.create())
+          .create(regionName);
+    });
+  }
+
+  private void initDataStore(RegionShortcut regionShortcut, Collection<String> regionNames) {
+    // StartupRecoveryDelay is set to infinite to prevent automatic rebalancing when creating the
+    // region on other members
+    regionNames.forEach(regionName -> {
+      PartitionAttributesFactory<String, String> attributesFactory =
+          new PartitionAttributesFactory<String, String>()
+              .setTotalNumBuckets(BUCKETS)
+              .setStartupRecoveryDelay(-1);
+
+      if (regionName.equals(COLOCATED_REGION)) {
+        attributesFactory.setColocatedWith(REGION_NAME);
+      }
+
+      RegionFactory<String, String> factory = cacheRule.getCache()
+          .<String, String>createRegionFactory(regionShortcut)
+          .setPartitionAttributes(attributesFactory.create())
+          .setCacheWriter(new BlackboardSignaller());
+
+      // Set up the disk store if the region is persistent
+      if (regionShortcut.isPersistent()) {
+        factory.setDiskStoreName(cacheRule.getCache()
+            .createDiskStoreFactory()
+            .create(regionName + DISK_STORE_SUFFIX)
+            .getName());
+      }
+
+      factory.create(regionName);
+    });
+  }
+
+  private void parametrizedSetup(RegionShortcut regionShortcut, Collection<String> regionNames,
+      boolean useAccessor) {
+    // Create and populate the region on server1 first, to create an unbalanced distribution of data
+    server1.invoke(() -> {
+      initDataStore(regionShortcut, regionNames);
+      regionNames.forEach(regionName -> {
+        Region<String, String> region = cacheRule.getCache().getRegion(regionName);
+        IntStream.range(0, ENTRIES).forEach(i -> region.put("key" + i, "value" + i));
+      });
+    });
+    server2.invoke(() -> initDataStore(regionShortcut, regionNames));
+    if (useAccessor) {
+      accessor.invoke(() -> initAccessor(regionShortcut, regionNames));
+    } else {
+      server3.invoke(() -> initDataStore(regionShortcut, regionNames));
+    }
+  }
+
+  private void setBlackboardSignallerCacheWriter(String regionName) {
+    cacheRule.getCache().<String, String>getRegion(regionName).getAttributesMutator()
+        .setCacheWriter(new BlackboardSignaller());
+  }
+
+  private AsyncInvocation<?> startClearAsync(TestVM clearCoordinatorVM, String regionName,
+      boolean waitForRebalance) {
+    return getVM(clearCoordinatorVM.vmNumber).invokeAsync(() -> {
+      Region<String, String> region = cacheRule.getCache().getRegion(regionName);
+      if (waitForRebalance) {
+        // Wait for the signal from the blackboard before triggering the clear to start
+        getBlackboard().waitForGate(REBALANCE_HAS_BEGUN, GeodeAwaitility.getTimeout().toMillis(),
+            TimeUnit.MILLISECONDS);
+      }
+      region.clear();
+    });
+  }
+
+  // Trigger a rebalance and wait until it has started restoring redundancy before signalling the
+  // blackboard
+  private AsyncInvocation<?> startRebalanceAsyncAndSignalBlackboard(boolean waitForClear) {
+    return server1.invokeAsync(() -> {
+      RebalanceFactory rebalance =
+          cacheRule.getCache().getResourceManager().createRebalanceFactory();
+      if (waitForClear) {
+        // Wait for the signal from the blackboard before triggering the rebalance to start
+        getBlackboard().waitForGate(CLEAR_HAS_BEGUN, GeodeAwaitility.getTimeout().toMillis(),
+            TimeUnit.MILLISECONDS);
+      }
+      RebalanceOperation op = rebalance.start();
+      await().untilAsserted(() -> assertThat(cacheRule.getCache().getInternalResourceManager()
+          .getStats().getRebalanceBucketCreatesCompleted()).isGreaterThan(0));
+      getBlackboard().signalGate(REBALANCE_HAS_BEGUN);
+      op.getResults();
+    });
+  }
+
+  private void executeClearAndRebalanceAsyncInvocations(TestVM clearCoordinatorVM,
+      String regionToClear, boolean rebalanceFirst) throws InterruptedException {
+    getVM(clearCoordinatorVM.vmNumber)
+        .invoke(() -> setBlackboardSignallerCacheWriter(regionToClear));
+
+    AsyncInvocation<?> clearInvocation = startClearAsync(clearCoordinatorVM, regionToClear,
+        rebalanceFirst);
+
+    AsyncInvocation<?> rebalanceInvocation =
+        startRebalanceAsyncAndSignalBlackboard(!rebalanceFirst);
+
+    clearInvocation.await();
+    rebalanceInvocation.await();
+  }
+
+  private void prepareMemberToShutdownOnClear() throws TimeoutException, InterruptedException {
+    getBlackboard().waitForGate(CLEAR_HAS_BEGUN, GeodeAwaitility.getTimeout().toMillis(),
+        TimeUnit.MILLISECONDS);
+    InternalDistributedSystem.getConnectedInstance().stopReconnectingNoDisconnect();
+    MembershipManagerHelper.crashDistributedSystem(
+        InternalDistributedSystem.getConnectedInstance());
+    await().untilAsserted(
+        () -> assertThat(InternalDistributedSystem.getConnectedInstance()).isNull());
+  }
+
+  private void waitForSilenceOnRegion(String regionName) {
+    DMStats dmStats = cacheRule.getSystem().getDistributionManager().getStats();
+    PartitionedRegion region = (PartitionedRegion) cacheRule.getCache().getRegion(regionName);
+    PartitionedRegionStats partitionedRegionStats = region.getPrStats();
+    await().untilAsserted(() -> {
+      assertThat(dmStats.getReplyWaitsInProgress()).isEqualTo(0);
+      assertThat(partitionedRegionStats.getVolunteeringInProgress()).isEqualTo(0);
+      assertThat(partitionedRegionStats.getBucketCreatesInProgress()).isEqualTo(0);
+      assertThat(partitionedRegionStats.getPrimaryTransfersInProgress()).isEqualTo(0);
+      assertThat(partitionedRegionStats.getRebalanceBucketCreatesInProgress()).isEqualTo(0);
+      assertThat(partitionedRegionStats.getRebalancePrimaryTransfersInProgress()).isEqualTo(0);
+    });
+  }
+
+  private void assertRegionIsEmpty(List<VM> vms, String regionName) {
+    vms.forEach(vm -> vm.invoke(() -> {
+      waitForSilenceOnRegion(regionName);
+      PartitionedRegion region = (PartitionedRegion) cacheRule.getCache().getRegion(regionName);
+
+      assertThat(region.getLocalSize()).as("Region local size should be 0 for region " + regionName)
+          .isEqualTo(0);
+    }));
+  }
+
+  private void assertRegionIsNotEmpty(List<VM> vms, String regionName) {
+    vms.forEach(vm -> vm.invoke(() -> {
+      waitForSilenceOnRegion(regionName);
+      PartitionedRegion region = (PartitionedRegion) cacheRule.getCache().getRegion(regionName);
+
+      assertThat(region.size()).as("Region size should be " + ENTRIES + " for region " + regionName)
+          .isEqualTo(ENTRIES);
+    }));
+  }
+
+  private void assertRebalanceDoesNoWork() {
+    server1.invoke(() -> {
+      RebalanceResults results =
+          cacheRule.getCache().getResourceManager().createRebalanceFactory().start().getResults();
+
+      assertThat(results.getTotalBucketTransfersCompleted())
+          .as("Expected bucket transfers to be zero").isEqualTo(0);
+      assertThat(results.getTotalBucketCreatesCompleted()).as("Expected bucket creates to be zero")
+          .isEqualTo(0);
+      assertThat(results.getTotalPrimaryTransfersCompleted())
+          .as("Expected primary transfers to be zero").isEqualTo(0);
+    });
+  }
+
+  @Test
+  @Parameters(method = "coordinatorVMsAndRegionTypes")
+  @TestCaseName("[{index}] {method}(ClearCoordinator:{0}, RegionType:{1})")
+  public void clearRegionStartedAfterRebalanceClearsRegion(TestVM clearCoordinatorVM,
+      RegionShortcut regionType) throws InterruptedException {
+    parametrizedSetup(regionType, Collections.singleton(REGION_NAME), true);
+
+    executeClearAndRebalanceAsyncInvocations(clearCoordinatorVM, REGION_NAME, true);
+
+    // Assert that the region is empty
+    assertRegionIsEmpty(asList(accessor, server1, server2), REGION_NAME);
+
+    // Assert that the region was successfully rebalanced (a second rebalance should do no work)
+    assertRebalanceDoesNoWork();
+  }
+
+  @Test
+  @Parameters(method = "coordinatorVMsAndRegionTypes")
+  @TestCaseName("[{index}] {method}(ClearCoordinator:{0}, RegionType:{1})")
+  public void clearRegionStartedBeforeRebalanceClearsRegion(TestVM clearCoordinatorVM,
+      RegionShortcut regionType) throws InterruptedException {
+    parametrizedSetup(regionType, Collections.singleton(REGION_NAME), true);
+
+    executeClearAndRebalanceAsyncInvocations(clearCoordinatorVM, REGION_NAME, false);
+
+    // Assert that the region is empty
+    assertRegionIsEmpty(asList(accessor, server1, server2), REGION_NAME);
+
+    // Assert that the region was successfully rebalanced (a second rebalance should do no work)
+    assertRebalanceDoesNoWork();
+  }
+
+  @Test
+  @Parameters(method = "coordinatorVMsAndRegionTypes")
+  @TestCaseName("[{index}] {method}(ClearCoordinator:{0}, RegionType:{1})")
+  public void clearParentColocatedRegionStartedAfterRebalanceOfColocatedRegionsClearsRegionAndDoesNotInterfereWithRebalance(
+      TestVM clearCoordinatorVM, RegionShortcut regionType)
+      throws InterruptedException {
+    parametrizedSetup(regionType, asList(REGION_NAME, COLOCATED_REGION), true);
+
+    executeClearAndRebalanceAsyncInvocations(clearCoordinatorVM, REGION_NAME, true);
+
+    // Assert that the parent region is empty
+    assertRegionIsEmpty(asList(accessor, server1, server2), REGION_NAME);
+
+    // Assert that the colocated region is the correct size
+    assertRegionIsNotEmpty(asList(accessor, server1, server2), COLOCATED_REGION);
+
+    // Assert that the regions were successfully rebalanced (a second rebalance should do no work)
+    assertRebalanceDoesNoWork();
+  }
+
+  @Test
+  @Parameters(method = "coordinatorVMsAndRegionTypes")
+  @TestCaseName("[{index}] {method}(ClearCoordinator:{0}, RegionType:{1})")
+  public void clearParentColocatedRegionStartedBeforeRebalanceOfColocatedRegionsClearsRegionAndDoesNotInterfereWithRebalance(
+      TestVM clearCoordinatorVM, RegionShortcut regionType)
+      throws InterruptedException {
+    parametrizedSetup(regionType, asList(REGION_NAME, COLOCATED_REGION), true);
+
+    executeClearAndRebalanceAsyncInvocations(clearCoordinatorVM, REGION_NAME, false);
+
+    // Assert that the parent region is empty
+    assertRegionIsEmpty(asList(accessor, server1, server2), REGION_NAME);
+
+    // Assert that the colocated region is the correct size
+    assertRegionIsNotEmpty(asList(accessor, server1, server2), COLOCATED_REGION);
+
+    // Assert that the regions were successfully rebalanced (a second rebalance should do no work)
+    assertRebalanceDoesNoWork();
+  }
+
+  @Test
+  @Parameters(method = "coordinatorVMsAndRegionTypes")
+  @TestCaseName("[{index}] {method}(ClearCoordinator:{0}, RegionType:{1})")
+  public void clearChildColocatedRegionStartedAfterRebalanceOfColocatedRegionsClearsRegionAndDoesNotInterfereWithRebalance(
+      TestVM clearCoordinatorVM, RegionShortcut regionType)
+      throws InterruptedException {
+    parametrizedSetup(regionType, asList(REGION_NAME, COLOCATED_REGION), true);
+
+    executeClearAndRebalanceAsyncInvocations(clearCoordinatorVM, COLOCATED_REGION, true);
+
+    // Assert that the colocated region is empty
+    assertRegionIsEmpty(asList(accessor, server1, server2), COLOCATED_REGION);
+
+    // Assert that the parent region is the correct size
+    assertRegionIsNotEmpty(asList(accessor, server1, server2), REGION_NAME);
+
+    // Assert that the regions were successfully rebalanced (a second rebalance should do no work)
+    assertRebalanceDoesNoWork();
+  }
+
+  @Test
+  @Parameters(method = "coordinatorVMsAndRegionTypes")
+  @TestCaseName("[{index}] {method}(ClearCoordinator:{0}, RegionType:{1})")
+  public void clearChildColocatedRegionStartedBeforeRebalanceOfColocatedRegionsClearsRegionAndDoesNotInterfereWithRebalance(
+      TestVM clearCoordinatorVM, RegionShortcut regionType)
+      throws InterruptedException {
+    parametrizedSetup(regionType, asList(REGION_NAME, COLOCATED_REGION), true);
+
+    executeClearAndRebalanceAsyncInvocations(clearCoordinatorVM, COLOCATED_REGION, false);
+
+    // Assert that the colocated region is empty
+    assertRegionIsEmpty(asList(accessor, server1, server2), COLOCATED_REGION);
+
+    // Assert that the parent region is the correct size
+    assertRegionIsNotEmpty(asList(accessor, server1, server2), REGION_NAME);
+
+    // Assert that the regions were successfully rebalanced (a second rebalance should do no work)
+    assertRebalanceDoesNoWork();
+  }
+
+  @Test
+  @Parameters(method = "coordinatorVMsAndRegionTypesNoAccessor")
+  @TestCaseName("[{index}] {method}(ClearCoordinator:{0}, RegionType:{1})")
+  public void clearStartedBeforeRebalanceClearsRegionWhenNonCoordinatorMemberIsKilled(
+      TestVM clearCoordinatorVM, RegionShortcut regionType)
+      throws InterruptedException {
+    parametrizedSetup(regionType, Collections.singleton(REGION_NAME), false);
+
+    getVM(clearCoordinatorVM.vmNumber).invoke(() -> setBlackboardSignallerCacheWriter(REGION_NAME));
+
+    // Make server3 shut down when it receives the signal from the blackboard that clear has started
+    AsyncInvocation<?> shutdownInvocation =
+        server3.invokeAsync(this::prepareMemberToShutdownOnClear);
+
+    executeClearAndRebalanceAsyncInvocations(clearCoordinatorVM, REGION_NAME, false);
+
+    shutdownInvocation.await();
+
+    // Assert that the region is empty
+    assertRegionIsEmpty(asList(server1, server2), REGION_NAME);
+  }
+
+  @Test
+  @Parameters(method = "coordinatorVMsAndRegionTypesNoAccessor")
+  @TestCaseName("[{index}] {method}(ClearCoordinator:{0}, RegionType:{1})")
+  public void clearStartedAfterRebalanceClearsRegionWhenNewMemberJoins(TestVM clearCoordinatorVM,
+      RegionShortcut regionType) throws InterruptedException {
+
+    // Load the data on server1 before creating the region on other servers, to create an imbalanced
+    // system
+    server1.invoke(() -> {
+      initDataStore(regionType, Collections.singleton(REGION_NAME));
+      Region<String, String> region = cacheRule.getCache().getRegion(REGION_NAME);
+      IntStream.range(0, ENTRIES).forEach(i -> region.put("key" + i, "value" + i));
+    });
+    server2.invoke(() -> initDataStore(regionType, Collections.singleton(REGION_NAME)));
+
+    // Wait for rebalance to start, then create the region on server3
+    AsyncInvocation<?> createRegion = server3.invokeAsync(() -> {
+      cacheRule.createCache();
+
+      PartitionAttributesFactory<String, String> attributesFactory =
+          new PartitionAttributesFactory<String, String>()
+              .setTotalNumBuckets(BUCKETS)
+              .setStartupRecoveryDelay(-1);
+
+      RegionFactory<String, String> factory = cacheRule.getCache()
+          .<String, String>createRegionFactory(regionType)
+          .setPartitionAttributes(attributesFactory.create())
+          .setCacheWriter(new BlackboardSignaller());
+
+      if (regionType.isPersistent()) {
+        factory.setDiskStoreName(cacheRule.getCache()
+            .createDiskStoreFactory()
+            .create(REGION_NAME + DISK_STORE_SUFFIX)
+            .getName());
+      }
+
+      getBlackboard().waitForGate(REBALANCE_HAS_BEGUN, GeodeAwaitility.getTimeout().toMillis(),
+          TimeUnit.MILLISECONDS);
+
+      factory.create(REGION_NAME);
+    });
+
+    executeClearAndRebalanceAsyncInvocations(clearCoordinatorVM, REGION_NAME, true);
+
+    createRegion.await();
+
+    // Assert that the region is empty
+    assertRegionIsEmpty(asList(server1, server2, server3), REGION_NAME);
+  }
+
+
+  @Test
+  @Parameters(method = "coordinatorVMsAndRegionTypesNoAccessor")
+  @TestCaseName("[{index}] {method}(ClearCoordinator:{0}, RegionType:{1})")
+  public void clearStartedBeforeRebalanceClearsRegionWhenNewMemberJoins(TestVM clearCoordinatorVM,
+      RegionShortcut regionType) throws InterruptedException {
+
+    // Load the data on server1 before creating the region on other servers, to create an imbalanced
+    // system
+    server1.invoke(() -> {
+      initDataStore(regionType, Collections.singleton(REGION_NAME));
+      Region<String, String> region = cacheRule.getCache().getRegion(REGION_NAME);
+      IntStream.range(0, ENTRIES).forEach(i -> region.put("key" + i, "value" + i));
+    });
+
+    server2.invoke(() -> initDataStore(regionType, Collections.singleton(REGION_NAME)));
+
+    // Wait for clear to start, then create the region on server3
+    AsyncInvocation<?> createRegion = server3.invokeAsync(() -> {
+      cacheRule.createCache();
+
+      PartitionAttributesFactory<String, String> attributesFactory =
+          new PartitionAttributesFactory<String, String>()
+              .setTotalNumBuckets(BUCKETS)
+              .setStartupRecoveryDelay(-1);
+
+      RegionFactory<String, String> factory = cacheRule.getCache()
+          .<String, String>createRegionFactory(regionType)
+          .setPartitionAttributes(attributesFactory.create())
+          .setCacheWriter(new BlackboardSignaller());
+
+      if (regionType.isPersistent()) {
+        factory.setDiskStoreName(cacheRule.getCache()
+            .createDiskStoreFactory()
+            .create(REGION_NAME + DISK_STORE_SUFFIX)
+            .getName());
+      }
+
+      getBlackboard().waitForGate(CLEAR_HAS_BEGUN, GeodeAwaitility.getTimeout().toMillis(),
+          TimeUnit.MILLISECONDS);
+
+      factory.create(REGION_NAME);
+    });
+
+    executeClearAndRebalanceAsyncInvocations(clearCoordinatorVM, REGION_NAME, false);
+
+    createRegion.await();
+
+    // Assert that the region is empty
+    assertRegionIsEmpty(asList(server1, server2, server3), REGION_NAME);
+  }
+
+  public static class BlackboardSignaller extends CacheWriterAdapter<String, String> {
+    @Override
+    public synchronized void beforeRegionClear(RegionEvent<String, String> event)
+        throws CacheWriterException {
+      getBlackboard().signalGate(CLEAR_HAS_BEGUN);
+    }
+  }
+}
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionOverflowClearDUnitTest.java b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionOverflowClearDUnitTest.java
new file mode 100644
index 0000000000..c10d1dbe03
--- /dev/null
+++ b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionOverflowClearDUnitTest.java
@@ -0,0 +1,380 @@
+/*
+ * 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.cache;
+
+import static org.apache.geode.distributed.ConfigurationProperties.ENABLE_CLUSTER_CONFIGURATION;
+import static org.apache.geode.distributed.ConfigurationProperties.HTTP_SERVICE_PORT;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_PORT;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_START;
+import static org.apache.geode.distributed.ConfigurationProperties.LOCATORS;
+import static org.apache.geode.distributed.ConfigurationProperties.LOG_FILE;
+import static org.apache.geode.distributed.ConfigurationProperties.MAX_WAIT_TIME_RECONNECT;
+import static org.apache.geode.distributed.ConfigurationProperties.MEMBER_TIMEOUT;
+import static org.apache.geode.distributed.ConfigurationProperties.USE_CLUSTER_CONFIGURATION;
+import static org.apache.geode.internal.AvailablePortHelper.getRandomAvailableTCPPorts;
+import static org.apache.geode.test.awaitility.GeodeAwaitility.await;
+import static org.apache.geode.test.dunit.VM.getVM;
+import static org.apache.geode.test.dunit.VM.getVMId;
+import static org.apache.geode.test.dunit.VM.toArray;
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.io.File;
+import java.io.Serializable;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.stream.IntStream;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+import org.apache.geode.cache.DiskStoreFactory;
+import org.apache.geode.cache.EvictionAction;
+import org.apache.geode.cache.EvictionAttributes;
+import org.apache.geode.cache.PartitionAttributesFactory;
+import org.apache.geode.cache.Region;
+import org.apache.geode.cache.RegionShortcut;
+import org.apache.geode.cache.client.ClientCache;
+import org.apache.geode.cache.client.ClientCacheFactory;
+import org.apache.geode.cache.client.ClientRegionShortcut;
+import org.apache.geode.distributed.LocatorLauncher;
+import org.apache.geode.distributed.ServerLauncher;
+import org.apache.geode.distributed.internal.InternalLocator;
+import org.apache.geode.management.internal.cli.util.CommandStringBuilder;
+import org.apache.geode.test.dunit.AsyncInvocation;
+import org.apache.geode.test.dunit.VM;
+import org.apache.geode.test.dunit.rules.DistributedRule;
+import org.apache.geode.test.junit.rules.GfshCommandRule;
+import org.apache.geode.test.junit.rules.serializable.SerializableTemporaryFolder;
+
+public class PartitionedRegionOverflowClearDUnitTest implements Serializable {
+
+  @Rule
+  public DistributedRule distributedRule = new DistributedRule(5);
+
+  @Rule
+  public SerializableTemporaryFolder temporaryFolder = new SerializableTemporaryFolder();
+
+  @Rule
+  public transient GfshCommandRule gfsh = new GfshCommandRule();
+
+  private VM locator;
+  private VM server1;
+  private VM server2;
+  private VM accessor;
+  private VM client;
+
+  private static final String LOCATOR_NAME = "locator";
+  private static final String SERVER1_NAME = "server1";
+  private static final String SERVER2_NAME = "server2";
+  private static final String SERVER3_NAME = "server3";
+
+  private File locatorDir;
+  private File server1Dir;
+  private File server2Dir;
+  private File server3Dir;
+
+  private String locatorString;
+
+  private int locatorPort;
+  private int locatorJmxPort;
+  private int locatorHttpPort;
+  private int serverPort1;
+  private int serverPort2;
+  private int serverPort3;
+
+  private static final AtomicReference<LocatorLauncher> LOCATOR_LAUNCHER = new AtomicReference<>();
+
+  private static final AtomicReference<ServerLauncher> SERVER_LAUNCHER = new AtomicReference<>();
+
+  private static final AtomicReference<ClientCache> CLIENT_CACHE = new AtomicReference<>();
+
+  private static final String OVERFLOW_REGION_NAME = "testOverflowRegion";
+
+  public static final int NUM_ENTRIES = 1000;
+
+  @Before
+  public void setup() throws Exception {
+    locator = getVM(0);
+    server1 = getVM(1);
+    server2 = getVM(2);
+    accessor = getVM(3);
+    client = getVM(4);
+
+    locatorDir = temporaryFolder.newFolder(LOCATOR_NAME);
+    server1Dir = temporaryFolder.newFolder(SERVER1_NAME);
+    server2Dir = temporaryFolder.newFolder(SERVER2_NAME);
+    server3Dir = temporaryFolder.newFolder(SERVER3_NAME);
+
+    int[] ports = getRandomAvailableTCPPorts(6);
+    locatorPort = ports[0];
+    locatorJmxPort = ports[1];
+    locatorHttpPort = ports[2];
+    serverPort1 = ports[3];
+    serverPort2 = ports[4];
+    serverPort3 = ports[5];
+
+    locator.invoke(
+        () -> startLocator(locatorDir, locatorPort, locatorJmxPort, locatorHttpPort));
+    gfsh.connectAndVerify(locatorJmxPort, GfshCommandRule.PortType.jmxManager);
+
+    locatorString = "localhost[" + locatorPort + "]";
+    server1.invoke(() -> startServer(SERVER1_NAME, server1Dir, locatorString, serverPort1));
+    server2.invoke(() -> startServer(SERVER2_NAME, server2Dir, locatorString, serverPort2));
+  }
+
+  @After
+  public void tearDown() {
+    destroyRegion();
+    destroyDiskStore(DiskStoreFactory.DEFAULT_DISK_STORE_NAME);
+
+    for (VM vm : new VM[] {client, accessor, server1, server2, locator}) {
+      vm.invoke(() -> {
+        if (CLIENT_CACHE.get() != null) {
+          CLIENT_CACHE.get().close();
+        }
+        if (LOCATOR_LAUNCHER.get() != null) {
+          LOCATOR_LAUNCHER.get().stop();
+        }
+        if (SERVER_LAUNCHER.get() != null) {
+          SERVER_LAUNCHER.get().stop();
+        }
+
+        CLIENT_CACHE.set(null);
+        LOCATOR_LAUNCHER.set(null);
+        SERVER_LAUNCHER.set(null);
+      });
+    }
+  }
+
+  @Test
+  public void testGfshClearRegionWithOverflow() throws InterruptedException {
+    createPartitionRedundantPersistentOverflowRegion();
+
+    populateRegion();
+    assertRegionSize(NUM_ENTRIES);
+
+    gfsh.executeAndAssertThat("clear region --name=" + OVERFLOW_REGION_NAME).statusIsSuccess();
+    assertRegionSize(0);
+
+    restartServers();
+
+    assertRegionSize(0);
+  }
+
+  @Test
+  public void testClientRegionClearWithOverflow() throws InterruptedException {
+    createPartitionRedundantPersistentOverflowRegion();
+
+    populateRegion();
+    assertRegionSize(NUM_ENTRIES);
+
+    client.invoke(() -> {
+      if (CLIENT_CACHE.get() == null) {
+        ClientCache clientCache =
+            new ClientCacheFactory().addPoolLocator("localhost", locatorPort).create();
+        CLIENT_CACHE.set(clientCache);
+      }
+
+      CLIENT_CACHE.get().getRegion(OVERFLOW_REGION_NAME).clear();
+    });
+    assertRegionSize(0);
+
+    restartServers();
+
+    assertRegionSize(0);
+  }
+
+  @Test
+  public void testAccessorRegionClearWithOverflow() throws InterruptedException {
+
+    for (VM vm : toArray(server1, server2)) {
+      vm.invoke(this::createRegionWithDefaultDiskStore);
+    }
+
+    accessor.invoke(() -> {
+      startServer(SERVER3_NAME, server3Dir, locatorString, serverPort3);
+      SERVER_LAUNCHER.get().getCache()
+          .createRegionFactory(RegionShortcut.PARTITION_REDUNDANT_OVERFLOW)
+          .setPartitionAttributes(
+              new PartitionAttributesFactory().setLocalMaxMemory(0).create())
+          .create(OVERFLOW_REGION_NAME);
+    });
+
+    populateRegion();
+    assertRegionSize(NUM_ENTRIES);
+
+    accessor.invoke(() -> {
+      assertThat(SERVER_LAUNCHER.get().getCache().getRegion(OVERFLOW_REGION_NAME).size())
+          .isEqualTo(NUM_ENTRIES);
+      SERVER_LAUNCHER.get().getCache().getRegion(OVERFLOW_REGION_NAME).clear();
+      assertThat(SERVER_LAUNCHER.get().getCache().getRegion(OVERFLOW_REGION_NAME).size())
+          .isEqualTo(0);
+    });
+    assertRegionSize(0);
+
+    for (VM vm : toArray(server1, server2)) {
+      vm.invoke(PartitionedRegionOverflowClearDUnitTest::stopServer);
+    }
+
+    gfsh.executeAndAssertThat("list members").statusIsSuccess();
+    assertThat(gfsh.getGfshOutput()).contains("locator");
+    AsyncInvocation asyncInvocation1 = server1.invokeAsync(() -> {
+      startServer(SERVER1_NAME, server1Dir, locatorString, serverPort1);
+      createRegionWithDefaultDiskStore();
+    });
+    AsyncInvocation asyncInvocation2 = server2.invokeAsync(() -> {
+      startServer(SERVER2_NAME, server2Dir, locatorString, serverPort2);
+      createRegionWithDefaultDiskStore();
+    });
+    asyncInvocation1.get();
+    asyncInvocation2.get();
+    assertRegionSize(0);
+  }
+
+  private void restartServers() throws InterruptedException {
+    for (VM vm : toArray(server1, server2)) {
+      vm.invoke(PartitionedRegionOverflowClearDUnitTest::stopServer);
+    }
+
+    gfsh.executeAndAssertThat("list members").statusIsSuccess();
+    assertThat(gfsh.getGfshOutput()).contains("locator");
+    AsyncInvocation asyncInvocation1 =
+        server1
+            .invokeAsync(() -> startServer(SERVER1_NAME, server1Dir, locatorString, serverPort1));
+    AsyncInvocation asyncInvocation2 =
+        server2
+            .invokeAsync(() -> startServer(SERVER2_NAME, server2Dir, locatorString, serverPort2));
+    asyncInvocation1.get();
+    asyncInvocation2.get();
+  }
+
+  private void createPartitionRedundantPersistentOverflowRegion() {
+    String command = new CommandStringBuilder("create region")
+        .addOption("name", OVERFLOW_REGION_NAME)
+        .addOption("type", "PARTITION_REDUNDANT_PERSISTENT_OVERFLOW")
+        .addOption("redundant-copies", "1")
+        .addOption("eviction-entry-count", "1")
+        .addOption("eviction-action", "overflow-to-disk")
+        .getCommandString();
+    gfsh.executeAndAssertThat(command).statusIsSuccess();
+  }
+
+  private void destroyRegion() {
+    server1.invoke(() -> {
+      assertThat(SERVER_LAUNCHER.get().getCache().getRegion(OVERFLOW_REGION_NAME)).isNotNull();
+      SERVER_LAUNCHER.get().getCache().getRegion(OVERFLOW_REGION_NAME).destroyRegion();
+
+    });
+  }
+
+  private void destroyDiskStore(String diskStoreName) {
+    String command = new CommandStringBuilder("destroy disk-store")
+        .addOption("name", diskStoreName)
+        .getCommandString();
+    gfsh.executeAndAssertThat(command).statusIsSuccess();
+  }
+
+  private void createRegionWithDefaultDiskStore() {
+    SERVER_LAUNCHER.get().getCache().createDiskStoreFactory()
+        .create(DiskStoreFactory.DEFAULT_DISK_STORE_NAME);
+    SERVER_LAUNCHER.get().getCache()
+        .createRegionFactory(RegionShortcut.PARTITION_REDUNDANT_PERSISTENT_OVERFLOW)
+        .setPartitionAttributes(
+            new PartitionAttributesFactory().setRedundantCopies(1).create())
+        .setDiskStoreName(DiskStoreFactory.DEFAULT_DISK_STORE_NAME)
+        .setEvictionAttributes(
+            EvictionAttributes.createLRUEntryAttributes(1, EvictionAction.OVERFLOW_TO_DISK))
+        .create(OVERFLOW_REGION_NAME);
+  }
+
+  private void populateRegion() {
+    client.invoke(() -> {
+      if (CLIENT_CACHE.get() == null) {
+        ClientCache clientCache =
+            new ClientCacheFactory().addPoolLocator("localhost", locatorPort).create();
+        CLIENT_CACHE.set(clientCache);
+      }
+
+      Region<Object, Object> clientRegion = CLIENT_CACHE.get()
+          .createClientRegionFactory(ClientRegionShortcut.CACHING_PROXY)
+          .create(OVERFLOW_REGION_NAME);
+
+      IntStream.range(0, NUM_ENTRIES).forEach(i -> clientRegion.put("key-" + i, "value-" + i));
+    });
+  }
+
+  private void assertRegionSize(int size) {
+    server1.invoke(() -> {
+      assertThat(SERVER_LAUNCHER.get().getCache().getRegion(OVERFLOW_REGION_NAME)).isNotNull();
+      assertThat(SERVER_LAUNCHER.get().getCache().getRegion(OVERFLOW_REGION_NAME).size())
+          .isEqualTo(size);
+    });
+    server2.invoke(() -> {
+      assertThat(SERVER_LAUNCHER.get().getCache().getRegion(OVERFLOW_REGION_NAME)).isNotNull();
+      assertThat(SERVER_LAUNCHER.get().getCache().getRegion(OVERFLOW_REGION_NAME).size())
+          .isEqualTo(size);
+    });
+  }
+
+  private void startLocator(File directory, int port, int jmxPort, int httpPort) {
+    LOCATOR_LAUNCHER.set(new LocatorLauncher.Builder()
+        .setMemberName(LOCATOR_NAME)
+        .setPort(port)
+        .setWorkingDirectory(directory.getAbsolutePath())
+        .set(HTTP_SERVICE_PORT, httpPort + "")
+        .set(JMX_MANAGER, "true")
+        .set(JMX_MANAGER_PORT, String.valueOf(jmxPort))
+        .set(JMX_MANAGER_START, "true")
+        .set(LOG_FILE, new File(directory, LOCATOR_NAME + ".log").getAbsolutePath())
+        .set(MAX_WAIT_TIME_RECONNECT, "1000")
+        .set(MEMBER_TIMEOUT, "2000")
+        .set(ENABLE_CLUSTER_CONFIGURATION, "true")
+        .set(USE_CLUSTER_CONFIGURATION, "true")
+        .build());
+
+    LOCATOR_LAUNCHER.get().start();
+
+    await().untilAsserted(() -> {
+      InternalLocator locator = (InternalLocator) LOCATOR_LAUNCHER.get().getLocator();
+      assertThat(locator.isSharedConfigurationRunning())
+          .as("Locator shared configuration is running on locator" + getVMId())
+          .isTrue();
+    });
+  }
+
+  private void startServer(String name, File workingDirectory, String locator, int serverPort) {
+    SERVER_LAUNCHER.set(new ServerLauncher.Builder()
+        .setDeletePidFileOnStop(true)
+        .setMemberName(name)
+        .setWorkingDirectory(workingDirectory.getAbsolutePath())
+        .setServerPort(serverPort)
+        .set(HTTP_SERVICE_PORT, "0")
+        .set(LOCATORS, locator)
+        .set(LOG_FILE, new File(workingDirectory, name + ".log").getAbsolutePath())
+        .set(MAX_WAIT_TIME_RECONNECT, "1000")
+        .set(MEMBER_TIMEOUT, "2000")
+        .set(ENABLE_CLUSTER_CONFIGURATION, "true")
+        .set(USE_CLUSTER_CONFIGURATION, "true")
+        .build());
+
+    SERVER_LAUNCHER.get().start();
+  }
+
+  private static void stopServer() {
+    SERVER_LAUNCHER.get().stop();
+  }
+}
diff --git a/geode-junit/src/main/java/org/apache/geode/cache/query/data/City.java b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionPersistentClearDUnitTest.java
similarity index 51%
copy from geode-junit/src/main/java/org/apache/geode/cache/query/data/City.java
copy to geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionPersistentClearDUnitTest.java
index bed863bc91..c758446cb8 100644
--- a/geode-junit/src/main/java/org/apache/geode/cache/query/data/City.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionPersistentClearDUnitTest.java
@@ -12,41 +12,15 @@
  * or implied. See the License for the specific language governing permissions and limitations under
  * the License.
  */
+package org.apache.geode.internal.cache;
 
-/*
- * City.java
- *
- * Created on September 30, 2005, 6:20 PM
- */
-
-package org.apache.geode.cache.query.data;
 
-import java.io.Serializable;
 
-public class City implements Serializable {
-  public String name;
-  public int zip;
+import org.apache.geode.cache.RegionShortcut;
 
-  /* Creates a new instance of City */
-  public City(String name, int zip) {
-    this.name = name;
-    this.zip = zip;
-  }// end of constructor 1
-
-  public City(int i) {
-    String[] arr1 = {"MUMBAI", "PUNE", "GANDHINAGAR", "CHANDIGARH"};
-    /* this is for the test to have 50% of the objects belonging to one city */
-    name = arr1[i % 2];
-    zip = 425125 + i;
-  }// end of constructor 2
-
-  ////////////////////////////
-
-  public String getName() {
-    return name;
-  }
+public class PartitionedRegionPersistentClearDUnitTest extends PartitionedRegionClearDUnitTest {
 
-  public int getZip() {
-    return zip;
+  protected RegionShortcut getRegionShortCut() {
+    return RegionShortcut.PARTITION_REDUNDANT_PERSISTENT;
   }
-}// end of class
+}
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PersistentPartitionedRegionClearWithExpirationDUnitTest.java b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PersistentPartitionedRegionClearWithExpirationDUnitTest.java
new file mode 100644
index 0000000000..f6f25bdbb7
--- /dev/null
+++ b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PersistentPartitionedRegionClearWithExpirationDUnitTest.java
@@ -0,0 +1,530 @@
+/*
+ * 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.cache;
+
+import static org.apache.geode.cache.ExpirationAction.DESTROY;
+import static org.apache.geode.cache.RegionShortcut.PARTITION;
+import static org.apache.geode.cache.RegionShortcut.PARTITION_OVERFLOW;
+import static org.apache.geode.cache.RegionShortcut.PARTITION_PERSISTENT;
+import static org.apache.geode.cache.RegionShortcut.PARTITION_PERSISTENT_OVERFLOW;
+import static org.apache.geode.cache.RegionShortcut.PARTITION_REDUNDANT;
+import static org.apache.geode.cache.RegionShortcut.PARTITION_REDUNDANT_OVERFLOW;
+import static org.apache.geode.cache.RegionShortcut.PARTITION_REDUNDANT_PERSISTENT;
+import static org.apache.geode.cache.RegionShortcut.PARTITION_REDUNDANT_PERSISTENT_OVERFLOW;
+import static org.apache.geode.internal.util.ArrayUtils.asList;
+import static org.apache.geode.test.awaitility.GeodeAwaitility.await;
+import static org.apache.geode.test.dunit.VM.getVM;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.IntStream;
+
+import junitparams.JUnitParamsRunner;
+import junitparams.Parameters;
+import junitparams.naming.TestCaseName;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import org.apache.geode.ForcedDisconnectException;
+import org.apache.geode.cache.Cache;
+import org.apache.geode.cache.CacheWriter;
+import org.apache.geode.cache.CacheWriterException;
+import org.apache.geode.cache.ExpirationAttributes;
+import org.apache.geode.cache.PartitionAttributes;
+import org.apache.geode.cache.PartitionAttributesFactory;
+import org.apache.geode.cache.PartitionedRegionPartialClearException;
+import org.apache.geode.cache.Region;
+import org.apache.geode.cache.RegionEvent;
+import org.apache.geode.cache.RegionShortcut;
+import org.apache.geode.cache.partition.PartitionRegionHelper;
+import org.apache.geode.cache.util.CacheWriterAdapter;
+import org.apache.geode.distributed.DistributedSystemDisconnectedException;
+import org.apache.geode.distributed.internal.DMStats;
+import org.apache.geode.distributed.internal.InternalDistributedSystem;
+import org.apache.geode.distributed.internal.membership.api.MembershipManagerHelper;
+import org.apache.geode.test.awaitility.GeodeAwaitility;
+import org.apache.geode.test.dunit.VM;
+import org.apache.geode.test.dunit.rules.CacheRule;
+import org.apache.geode.test.dunit.rules.DistributedDiskDirRule;
+import org.apache.geode.test.dunit.rules.DistributedRule;
+
+/**
+ * Tests to verify that {@link PartitionedRegion#clear()} cancels all remaining expiration tasks
+ * on the {@link PartitionedRegion} once the operation is executed.
+ */
+@RunWith(JUnitParamsRunner.class)
+public class PersistentPartitionedRegionClearWithExpirationDUnitTest implements Serializable {
+  private static final Integer BUCKETS = 13;
+  private static final Integer EXPIRATION_TIME = 5 * 60;
+  private static final Integer SMALL_EXPIRATION_TIME = 10;
+  private static final String REGION_NAME = "PartitionedRegion";
+
+  @Rule
+  public DistributedRule distributedRule = new DistributedRule(3);
+
+  @Rule
+  public CacheRule cacheRule = CacheRule.builder().createCacheInAll().build();
+
+  @Rule
+  public DistributedDiskDirRule distributedDiskDirRule = new DistributedDiskDirRule();
+
+  private VM accessor, server1, server2;
+
+  private enum TestVM {
+    ACCESSOR(0), SERVER1(1), SERVER2(2);
+
+    final int vmNumber;
+
+    TestVM(int vmNumber) {
+      this.vmNumber = vmNumber;
+    }
+  }
+
+  @SuppressWarnings("unused")
+  static RegionShortcut[] regionTypes() {
+    return new RegionShortcut[] {
+        PARTITION_PERSISTENT,
+        PARTITION_PERSISTENT_OVERFLOW,
+        PARTITION_REDUNDANT_PERSISTENT,
+        PARTITION_REDUNDANT_PERSISTENT_OVERFLOW
+    };
+  }
+
+  @SuppressWarnings("unused")
+  static Object[] vmsAndRegionTypes() {
+    ArrayList<Object[]> parameters = new ArrayList<>();
+    RegionShortcut[] regionShortcuts = regionTypes();
+
+    Arrays.stream(regionShortcuts).forEach(regionShortcut -> {
+      parameters.add(new Object[] {TestVM.SERVER1, regionShortcut});
+      parameters.add(new Object[] {TestVM.ACCESSOR, regionShortcut});
+    });
+
+    return parameters.toArray();
+  }
+
+  @Before
+  public void setUp() throws Exception {
+    server1 = getVM(TestVM.SERVER1.vmNumber);
+    server2 = getVM(TestVM.SERVER2.vmNumber);
+    accessor = getVM(TestVM.ACCESSOR.vmNumber);
+  }
+
+  private RegionShortcut getRegionAccessorShortcut(RegionShortcut dataStoreRegionShortcut) {
+    if (dataStoreRegionShortcut.isPersistent()) {
+      switch (dataStoreRegionShortcut) {
+        case PARTITION_PERSISTENT:
+          return PARTITION;
+        case PARTITION_PERSISTENT_OVERFLOW:
+          return PARTITION_OVERFLOW;
+        case PARTITION_REDUNDANT_PERSISTENT:
+          return PARTITION_REDUNDANT;
+        case PARTITION_REDUNDANT_PERSISTENT_OVERFLOW:
+          return PARTITION_REDUNDANT_OVERFLOW;
+      }
+    }
+
+    return dataStoreRegionShortcut;
+  }
+
+  private void initAccessor(RegionShortcut regionShortcut,
+      ExpirationAttributes expirationAttributes) {
+    RegionShortcut accessorShortcut = getRegionAccessorShortcut(regionShortcut);
+    PartitionAttributes<String, String> attributes =
+        new PartitionAttributesFactory<String, String>()
+            .setTotalNumBuckets(BUCKETS)
+            .setLocalMaxMemory(0)
+            .create();
+
+    cacheRule.getCache()
+        .<String, String>createRegionFactory(accessorShortcut)
+        .setPartitionAttributes(attributes)
+        .setEntryTimeToLive(expirationAttributes)
+        .setEntryIdleTimeout(expirationAttributes)
+        .create(REGION_NAME);
+  }
+
+  private void initDataStore(RegionShortcut regionShortcut,
+      ExpirationAttributes expirationAttributes) {
+    PartitionAttributes<String, String> attributes =
+        new PartitionAttributesFactory<String, String>()
+            .setTotalNumBuckets(BUCKETS)
+            .create();
+
+    cacheRule.getCache()
+        .<String, String>createRegionFactory(regionShortcut)
+        .setPartitionAttributes(attributes)
+        .setEntryTimeToLive(expirationAttributes)
+        .setEntryIdleTimeout(expirationAttributes)
+        .create(REGION_NAME);
+
+    ExpiryTask.expiryTaskListener = new ExpirationListener();
+  }
+
+  private void parametrizedSetup(RegionShortcut regionShortcut,
+      ExpirationAttributes expirationAttributes) {
+    server1.invoke(() -> initDataStore(regionShortcut, expirationAttributes));
+    server2.invoke(() -> initDataStore(regionShortcut, expirationAttributes));
+    accessor.invoke(() -> initAccessor(regionShortcut, expirationAttributes));
+  }
+
+  private void waitForSilence() {
+    DMStats dmStats = cacheRule.getSystem().getDistributionManager().getStats();
+    PartitionedRegion region = (PartitionedRegion) cacheRule.getCache().getRegion(REGION_NAME);
+    PartitionedRegionStats partitionedRegionStats = region.getPrStats();
+
+    await().untilAsserted(() -> {
+      assertThat(dmStats.getReplyWaitsInProgress()).isEqualTo(0);
+      assertThat(partitionedRegionStats.getVolunteeringInProgress()).isEqualTo(0);
+      assertThat(partitionedRegionStats.getBucketCreatesInProgress()).isEqualTo(0);
+      assertThat(partitionedRegionStats.getPrimaryTransfersInProgress()).isEqualTo(0);
+      assertThat(partitionedRegionStats.getRebalanceBucketCreatesInProgress()).isEqualTo(0);
+      assertThat(partitionedRegionStats.getRebalancePrimaryTransfersInProgress()).isEqualTo(0);
+    });
+  }
+
+  /**
+   * Populates the region and verifies the data on the selected VMs.
+   */
+  private void populateRegion(VM feeder, int entryCount, List<VM> vms) {
+    feeder.invoke(() -> {
+      Region<String, String> region = cacheRule.getCache().getRegion(REGION_NAME);
+      IntStream.range(0, entryCount).forEach(i -> region.put(String.valueOf(i), "Value_" + i));
+    });
+
+    vms.forEach(vm -> vm.invoke(() -> {
+      waitForSilence();
+      Region<String, String> region = cacheRule.getCache().getRegion(REGION_NAME);
+
+      IntStream.range(0, entryCount)
+          .forEach(i -> assertThat(region.get(String.valueOf(i))).isEqualTo("Value_" + i));
+    }));
+  }
+
+  /**
+   * Asserts that the region is empty on requested VMs.
+   */
+  private void assertRegionIsEmpty(List<VM> vms) {
+    vms.forEach(vm -> vm.invoke(() -> {
+      waitForSilence();
+      PartitionedRegion region = (PartitionedRegion) cacheRule.getCache().getRegion(REGION_NAME);
+
+      assertThat(region.getLocalSize()).isEqualTo(0);
+    }));
+  }
+
+  /**
+   * Asserts that the region data is consistent across buckets.
+   */
+  private void assertRegionBucketsConsistency() throws ForceReattemptException {
+    waitForSilence();
+    List<BucketDump> bucketDumps;
+    PartitionedRegion region = (PartitionedRegion) cacheRule.getCache().getRegion(REGION_NAME);
+    // Redundant copies + 1 primary.
+    int expectedCopies = region.getRedundantCopies() + 1;
+
+    for (int bucketId = 0; bucketId < BUCKETS; bucketId++) {
+      bucketDumps = region.getAllBucketEntries(bucketId);
+      assertThat(bucketDumps.size()).as("Bucket " + bucketId + " should have " + expectedCopies
+          + " copies, but has " + bucketDumps.size()).isEqualTo(expectedCopies);
+
+      // Check that all copies of the bucket have the same data.
+      if (bucketDumps.size() > 1) {
+        BucketDump firstDump = bucketDumps.get(0);
+
+        for (int j = 1; j < bucketDumps.size(); j++) {
+          BucketDump otherDump = bucketDumps.get(j);
+          assertThat(otherDump.getValues())
+              .as("Values for bucket " + bucketId + " on member " + otherDump.getMember()
+                  + " are not consistent with member " + firstDump.getMember())
+              .isEqualTo(firstDump.getValues());
+          assertThat(otherDump.getVersions())
+              .as("Versions for bucket " + bucketId + " on member " + otherDump.getMember()
+                  + " are not consistent with member " + firstDump.getMember())
+              .isEqualTo(firstDump.getVersions());
+        }
+      }
+    }
+  }
+
+  /**
+   * Register the MemberKiller CacheWriter on the given vms.
+   */
+  private void registerVMKillerAsCacheWriter(List<VM> vmsToBounce) {
+    vmsToBounce.forEach(vm -> vm.invoke(() -> {
+      Region<String, String> region = cacheRule.getCache().getRegion(REGION_NAME);
+      region.getAttributesMutator().setCacheWriter(new MemberKiller());
+    }));
+  }
+
+  private void doClear() {
+    Cache cache = cacheRule.getCache();
+    boolean retry;
+    do {
+      retry = false;
+      try {
+        cache.getRegion(REGION_NAME).clear();
+      } catch (PartitionedRegionPartialClearException | CacheWriterException ex) {
+        retry = true;
+      }
+    } while (retry);
+  }
+
+  /**
+   * The test does the following (clear coordinator and region type are parametrized):
+   * - Populates the Partition Region (entries have expiration).
+   * - Verifies that the entries are synchronized on all members.
+   * - Clears the Partition Region once.
+   * - Asserts that, after the clear is finished:
+   * . No expiration tasks were executed.
+   * . All expiration tasks were cancelled.
+   * . Map of expiry tasks per bucket is empty.
+   * . The Partition Region is empty on all members.
+   */
+  @Test
+  @Parameters(method = "vmsAndRegionTypes")
+  @TestCaseName("[{index}] {method}(Coordinator:{0}, RegionType:{1})")
+  public void clearShouldRemoveRegisteredExpirationTasks(TestVM coordinatorVM,
+      RegionShortcut regionShortcut) {
+    final int entries = 500;
+    int expirationTime = (int) GeodeAwaitility.getTimeout().getSeconds();
+    parametrizedSetup(regionShortcut, new ExpirationAttributes(expirationTime, DESTROY));
+    populateRegion(accessor, entries, asList(accessor, server1, server2));
+
+    // Clear the region.
+    getVM(coordinatorVM.vmNumber).invoke(() -> doClear());
+
+    // Assert all expiration tasks were cancelled and none were executed.
+    asList(server1, server2).forEach(vm -> vm.invoke(() -> {
+      ExpirationListener listener = (ExpirationListener) EntryExpiryTask.expiryTaskListener;
+      assertThat(listener.tasksRan.get()).isEqualTo(0);
+      assertThat(listener.tasksCanceled.get()).isEqualTo(listener.tasksScheduled.get());
+
+      PartitionedRegionDataStore dataStore =
+          ((PartitionedRegion) cacheRule.getCache().getRegion(REGION_NAME)).getDataStore();
+      Set<BucketRegion> bucketRegions = dataStore.getAllLocalBucketRegions();
+      bucketRegions
+          .forEach(bucketRegion -> assertThat(bucketRegion.entryExpiryTasks.isEmpty()).isTrue());
+    }));
+
+    // Assert Region Buckets are consistent and region is empty,
+    accessor.invoke(this::assertRegionBucketsConsistency);
+    assertRegionIsEmpty(asList(accessor, server1, server2));
+  }
+
+  /**
+   * The test does the following (region type is parametrized):
+   * - Populates the Partition Region (entries have expiration).
+   * - Verifies that the entries are synchronized on all members.
+   * - Sets the {@link MemberKiller} as a {@link CacheWriter} to stop the coordinator VM while the
+   * clear is in progress.
+   * - Clears the Partition Region (at this point the coordinator is restarted).
+   * - Asserts that, after the clear is finished and the expiration time is reached:
+   * . No expiration tasks were cancelled.
+   * . All entries were removed due to the expiration.
+   * . The Partition Region Buckets are consistent on all members.
+   */
+  @Test
+  @Parameters(method = "regionTypes")
+  @TestCaseName("[{index}] {method}(RegionType:{0})")
+  public void clearShouldFailWhenCoordinatorMemberIsBouncedAndExpirationTasksShouldSurvive(
+      RegionShortcut regionShortcut) {
+    final int entries = 1000;
+    ExpirationAttributes expirationAttributes =
+        new ExpirationAttributes(SMALL_EXPIRATION_TIME, DESTROY);
+    parametrizedSetup(regionShortcut, expirationAttributes);
+    populateRegion(accessor, entries, asList(accessor, server1, server2));
+    registerVMKillerAsCacheWriter(Collections.singletonList(server1));
+
+    // Clear the region (it should fail).
+    server1.invoke(() -> {
+      Region<String, String> region = cacheRule.getCache().getRegion(REGION_NAME);
+      assertThatThrownBy(region::clear)
+          .isInstanceOf(DistributedSystemDisconnectedException.class)
+          .hasCauseInstanceOf(ForcedDisconnectException.class);
+    });
+
+    // Wait for member to get back online and assign all buckets.
+    server1.invoke(() -> {
+      cacheRule.createCache();
+      initDataStore(regionShortcut, expirationAttributes);
+      await().untilAsserted(
+          () -> assertThat(InternalDistributedSystem.getConnectedInstance()).isNotNull());
+      PartitionRegionHelper.assignBucketsToPartitions(cacheRule.getCache().getRegion(REGION_NAME));
+    });
+
+    // Wait until all expiration tasks are executed.
+    asList(server1, server2).forEach(vm -> vm.invoke(() -> {
+      PartitionedRegionDataStore dataStore =
+          ((PartitionedRegion) cacheRule.getCache().getRegion(REGION_NAME)).getDataStore();
+      Set<BucketRegion> bucketRegions = dataStore.getAllLocalBucketRegions();
+      bucketRegions.forEach(bucketRegion -> await()
+          .untilAsserted(() -> assertThat(bucketRegion.entryExpiryTasks.isEmpty()).isTrue()));
+    }));
+
+    // At this point the entries should be either invalidated or destroyed (expiration tasks ran).
+    asList(accessor, server1, server2).forEach(vm -> vm.invoke(() -> {
+      Region<String, String> region = cacheRule.getCache().getRegion(REGION_NAME);
+      IntStream.range(0, entries).forEach(i -> {
+        String key = String.valueOf(i);
+        assertThat(region.get(key)).isNull();
+      });
+    }));
+
+    // Assert Region Buckets are consistent.
+    accessor.invoke(this::assertRegionBucketsConsistency);
+  }
+
+  /**
+   * The test does the following (clear coordinator and region type are parametrized):
+   * - Populates the Partition Region (entries have expiration).
+   * - Verifies that the entries are synchronized on all members.
+   * - Sets the {@link MemberKiller} as a {@link CacheWriter} to stop a non-coordinator VM while the
+   * clear is in progress (the member has primary buckets, though, so participates on
+   * the clear operation).
+   * - Clears the Partition Region (at this point the non-coordinator is restarted).
+   * - Asserts that, after the clear is finished:
+   * . No expiration tasks were executed on the non-restarted members.
+   * . All expiration tasks were cancelled on the non-restarted members.
+   * . Map of expiry tasks per bucket is empty on the non-restarted members.
+   * . All expiration tasks were executed and all expired on the restarted members.
+   * . The Partition Region is empty and buckets are consistent across all members.
+   */
+  @Test
+  @Parameters(method = "vmsAndRegionTypes")
+  @TestCaseName("[{index}] {method}(Coordinator:{0}, RegionType:{1})")
+  public void clearShouldSucceedAndRemoveRegisteredExpirationTasksWhenNonCoordinatorMemberIsBounced(
+      TestVM coordinatorVM, RegionShortcut regionShortcut) throws Exception {
+    final int entries = 500;
+    // To avoid partition offline exception without redundancy.
+
+    if (regionShortcut == PARTITION_PERSISTENT) {
+      regionShortcut = PARTITION_REDUNDANT_PERSISTENT;
+    } else if (regionShortcut == PARTITION_PERSISTENT_OVERFLOW) {
+      regionShortcut = PARTITION_REDUNDANT_PERSISTENT_OVERFLOW;
+    }
+
+    final RegionShortcut rs = regionShortcut;
+    ExpirationAttributes expirationAttributes = new ExpirationAttributes(EXPIRATION_TIME, DESTROY);
+    parametrizedSetup(regionShortcut, expirationAttributes);
+    registerVMKillerAsCacheWriter(Collections.singletonList(server2));
+    populateRegion(accessor, entries, asList(accessor, server1, server2));
+
+    // Clear the region.
+    getVM(coordinatorVM.vmNumber).invoke(() -> doClear());
+
+    // Wait for member to get back online and assign buckets.
+    server2.invoke(() -> {
+      cacheRule.createCache();
+      initDataStore(rs, expirationAttributes);
+      await().untilAsserted(
+          () -> assertThat(InternalDistributedSystem.getConnectedInstance()).isNotNull());
+      PartitionRegionHelper.assignBucketsToPartitions(cacheRule.getCache().getRegion(REGION_NAME));
+    });
+
+    // Assert all expiration tasks were cancelled and none were executed (surviving members).
+    server1.invoke(() -> {
+      PartitionedRegionDataStore dataStore =
+          ((PartitionedRegion) cacheRule.getCache().getRegion(REGION_NAME)).getDataStore();
+      Set<BucketRegion> bucketRegions = dataStore.getAllLocalBucketRegions();
+      bucketRegions
+          .forEach(bucketRegion -> assertThat(bucketRegion.entryExpiryTasks.isEmpty()).isTrue());
+
+      ExpirationListener listener = (ExpirationListener) EntryExpiryTask.expiryTaskListener;
+      assertThat(listener.tasksRan.get()).isEqualTo(0);
+      assertThat(listener.tasksCanceled.get()).isEqualTo(listener.tasksScheduled.get());
+    });
+
+    // Assert all expiration tasks were expired as the region is empty (restarted member).
+    server2.invoke(() -> {
+      PartitionedRegionDataStore dataStore =
+          ((PartitionedRegion) cacheRule.getCache().getRegion(REGION_NAME)).getDataStore();
+      Set<BucketRegion> bucketRegions = dataStore.getAllLocalBucketRegions();
+
+      // During restart, the member loads the region from disk and automatically registers
+      // expiration tasks for each entry. After GII, however, the region is empty due to the
+      // clear operation and the tasks will just expire as there are no entries.
+      bucketRegions.forEach(bucketRegion -> await()
+          .untilAsserted(() -> assertThat(bucketRegion.entryExpiryTasks.isEmpty()).isTrue()));
+
+      ExpirationListener listener = (ExpirationListener) EntryExpiryTask.expiryTaskListener;
+      assertThat(listener.tasksExpired.get()).isEqualTo(listener.tasksRan.get());
+    });
+
+    // Assert Region Buckets are consistent and region is empty,
+    // accessor.invoke(this::assertRegionBucketsConsistency);
+    assertRegionIsEmpty(asList(accessor, server1, server2));
+  }
+
+  /**
+   * Tracks expiration tasks lifecycle.
+   */
+  public static class ExpirationListener implements ExpiryTask.ExpiryTaskListener {
+    final AtomicInteger tasksRan = new AtomicInteger(0);
+    final AtomicInteger tasksExpired = new AtomicInteger(0);
+    final AtomicInteger tasksCanceled = new AtomicInteger(0);
+    final AtomicInteger tasksScheduled = new AtomicInteger(0);
+
+    @Override
+    public void afterSchedule(ExpiryTask et) {
+      tasksScheduled.incrementAndGet();
+    }
+
+    @Override
+    public void afterTaskRan(ExpiryTask et) {
+      tasksRan.incrementAndGet();
+    }
+
+    @Override
+    public void afterReschedule(ExpiryTask et) {}
+
+    @Override
+    public void afterExpire(ExpiryTask et) {
+      tasksExpired.incrementAndGet();
+    }
+
+    @Override
+    public void afterCancel(ExpiryTask et) {
+      tasksCanceled.incrementAndGet();
+    }
+  }
+
+  /**
+   * Shutdowns a member while the clear operation is in progress.
+   * The writer is only installed on the member the test wants to shutdown, doesn't matter whether
+   * it's the clear coordinator or another member holding primary buckets.
+   */
+  public static class MemberKiller extends CacheWriterAdapter<String, String> {
+
+    @Override
+    public synchronized void beforeRegionClear(RegionEvent<String, String> event)
+        throws CacheWriterException {
+      InternalDistributedSystem.getConnectedInstance().stopReconnectingNoDisconnect();
+      MembershipManagerHelper.crashDistributedSystem(
+          InternalDistributedSystem.getConnectedInstance());
+      await().untilAsserted(
+          () -> assertThat(InternalDistributedSystem.getConnectedInstance()).isNull());
+    }
+  }
+}
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/cache/query/partitioned/PRClearIntegrationTest.java b/geode-core/src/integrationTest/java/org/apache/geode/cache/query/partitioned/PRClearIntegrationTest.java
new file mode 100644
index 0000000000..894db1b3f5
--- /dev/null
+++ b/geode-core/src/integrationTest/java/org/apache/geode/cache/query/partitioned/PRClearIntegrationTest.java
@@ -0,0 +1,73 @@
+/*
+ * 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.cache.query.partitioned;
+
+
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.IntStream;
+
+import org.junit.Rule;
+import org.junit.Test;
+
+import org.apache.geode.cache.EntryNotFoundException;
+import org.apache.geode.cache.Region;
+import org.apache.geode.internal.cache.InternalCache;
+import org.apache.geode.test.junit.rules.ExecutorServiceRule;
+import org.apache.geode.test.junit.rules.ServerStarterRule;
+
+public class PRClearIntegrationTest {
+
+  @Rule
+  public ServerStarterRule server = new ServerStarterRule().withAutoStart();
+
+  @Rule
+  public ExecutorServiceRule executor = new ExecutorServiceRule();
+
+  @Test
+  public void doesNotHangWhenClearWithConcurrentPutsAndInvalidates() throws Exception {
+    InternalCache cache = server.getCache();
+    Region<Object, Object> region = server.createPartitionRegion("regionA", f -> {
+    }, f -> f.setTotalNumBuckets(1));
+    cache.getQueryService().createIndex("indexA", "r", "/regionA r");
+    region.put(0, "value0");
+
+    CompletableFuture<Void> put = executor.runAsync(() -> {
+      Thread.currentThread().setName("put-Thread");
+      IntStream.range(0, 10).forEach(i -> region.put(i, "value" + i));
+    });
+
+    CompletableFuture<Void> invalidate = executor.runAsync(() -> {
+      Thread.currentThread().setName("invalidate-Thread");
+      IntStream.range(0, 10).forEach(i -> {
+        try {
+          region.invalidate(i);
+        } catch (EntryNotFoundException e) {
+          // ignore
+        }
+      });
+    });
+
+    CompletableFuture<Void> clear = executor.runAsync(() -> {
+      Thread.currentThread().setName("Clear-Thread");
+      IntStream.range(0, 10).forEach(i -> region.clear());
+    });
+
+    put.get(5, TimeUnit.SECONDS);
+    invalidate.get(5, TimeUnit.SECONDS);
+    clear.get(5, TimeUnit.SECONDS);
+  }
+}
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/internal/cache/PartitionedRegionIntegrationTest.java b/geode-core/src/integrationTest/java/org/apache/geode/internal/cache/PartitionedRegionIntegrationTest.java
index 818a855bc6..933bc3935b 100644
--- a/geode-core/src/integrationTest/java/org/apache/geode/internal/cache/PartitionedRegionIntegrationTest.java
+++ b/geode-core/src/integrationTest/java/org/apache/geode/internal/cache/PartitionedRegionIntegrationTest.java
@@ -16,15 +16,24 @@
 package org.apache.geode.internal.cache;
 
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
 
+import java.util.List;
 import java.util.concurrent.ScheduledExecutorService;
 
 import org.junit.Rule;
 import org.junit.Test;
 
+import org.apache.geode.cache.CacheEvent;
 import org.apache.geode.cache.EvictionAction;
 import org.apache.geode.cache.EvictionAttributes;
+import org.apache.geode.cache.Operation;
+import org.apache.geode.cache.Region;
 import org.apache.geode.cache.RegionShortcut;
+import org.apache.geode.cache30.TestCacheListener;
 import org.apache.geode.test.junit.rules.ServerStarterRule;
 
 public class PartitionedRegionIntegrationTest {
@@ -55,4 +64,40 @@ public class PartitionedRegionIntegrationTest {
     ScheduledExecutorService bucketSorter = region.getBucketSorter();
     assertThat(bucketSorter).isNull();
   }
+
+  @Test
+  public void prClearWithDataInvokesCacheListenerAfterClear() {
+    TestCacheListener prCacheListener = new TestCacheListener() {};
+    TestCacheListener spyPRCacheListener = spy(prCacheListener);
+
+    Region region = server.createPartitionRegion("PR1",
+        f -> f.addCacheListener(spyPRCacheListener), f -> f.setTotalNumBuckets(2));
+    region.put("key1", "value2");
+    region.put("key2", "value2");
+    spyPRCacheListener.enableEventHistory();
+
+    region.clear();
+
+    verify(spyPRCacheListener, times(1)).afterRegionClear(any());
+    List cacheEvents = spyPRCacheListener.getEventHistory();
+    assertThat(cacheEvents.size()).isEqualTo(1);
+    assertThat(((CacheEvent) cacheEvents.get(0)).getOperation()).isEqualTo(Operation.REGION_CLEAR);
+  }
+
+  @Test
+  public void prClearWithoutDataInvokesCacheListenerAfterClear() {
+    TestCacheListener prCacheListener = new TestCacheListener() {};
+    TestCacheListener spyPRCacheListener = spy(prCacheListener);
+
+    Region region = server.createPartitionRegion("PR1",
+        f -> f.addCacheListener(spyPRCacheListener), f -> f.setTotalNumBuckets(2));
+    spyPRCacheListener.enableEventHistory();
+
+    region.clear();
+
+    verify(spyPRCacheListener, times(1)).afterRegionClear(any());
+    List cacheEvents = spyPRCacheListener.getEventHistory();
+    assertThat(cacheEvents.size()).isEqualTo(1);
+    assertThat(((CacheEvent) cacheEvents.get(0)).getOperation()).isEqualTo(Operation.REGION_CLEAR);
+  }
 }
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/internal/cache/PartitionedRegionSingleNodeOperationsJUnitTest.java b/geode-core/src/integrationTest/java/org/apache/geode/internal/cache/PartitionedRegionSingleNodeOperationsJUnitTest.java
index e23f87105d..283db5657e 100644
--- a/geode-core/src/integrationTest/java/org/apache/geode/internal/cache/PartitionedRegionSingleNodeOperationsJUnitTest.java
+++ b/geode-core/src/integrationTest/java/org/apache/geode/internal/cache/PartitionedRegionSingleNodeOperationsJUnitTest.java
@@ -25,7 +25,6 @@ import static org.junit.Assert.fail;
 
 import java.util.Arrays;
 import java.util.Collections;
-import java.util.HashMap;
 import java.util.Iterator;
 import java.util.NoSuchElementException;
 import java.util.Set;
@@ -1298,71 +1297,6 @@ public class PartitionedRegionSingleNodeOperationsJUnitTest {
     }
   }
 
-  @Test
-  public void test023UnsupportedOps() throws Exception {
-    Region pr = null;
-    try {
-      pr = PartitionedRegionTestHelper.createPartitionedRegion("testUnsupportedOps",
-          String.valueOf(200), 0);
-
-      pr.put(1, "one");
-      pr.put(2, "two");
-      pr.put(3, "three");
-      pr.getEntry("key");
-
-      try {
-        pr.clear();
-        fail(
-            "PartitionedRegionSingleNodeOperationTest:testUnSupportedOps() operation failed on a blank PartitionedRegion");
-      } catch (UnsupportedOperationException ignored) {
-      }
-
-      // try {
-      // pr.entries(true);
-      // fail();
-      // }
-      // catch (UnsupportedOperationException expected) {
-      // }
-
-      // try {
-      // pr.entrySet(true);
-      // fail();
-      // }
-      // catch (UnsupportedOperationException expected) {
-      // }
-
-      try {
-        HashMap data = new HashMap();
-        data.put("foo", "bar");
-        data.put("bing", "bam");
-        data.put("supper", "hero");
-        pr.putAll(data);
-        // fail("testPutAll() does NOT throw UnsupportedOperationException");
-      } catch (UnsupportedOperationException ignored) {
-      }
-
-
-      // try {
-      // pr.values();
-      // fail("testValues() does NOT throw UnsupportedOperationException");
-      // }
-      // catch (UnsupportedOperationException expected) {
-      // }
-
-
-      try {
-        pr.containsValue("foo");
-      } catch (UnsupportedOperationException ex) {
-        fail("PartitionedRegionSingleNodeOperationTest:testContainsValue() operation failed");
-      }
-
-    } finally {
-      if (pr != null) {
-        pr.destroyRegion();
-      }
-    }
-  }
-
   /**
    * This method validates size operations. It verifies that it returns correct size of the
    * PartitionedRegion.
diff --git a/geode-core/src/integrationTest/resources/org/apache/geode/codeAnalysis/sanctionedDataSerializables.txt b/geode-core/src/integrationTest/resources/org/apache/geode/codeAnalysis/sanctionedDataSerializables.txt
index 90c0cd442d..1d7e9f920a 100644
--- a/geode-core/src/integrationTest/resources/org/apache/geode/codeAnalysis/sanctionedDataSerializables.txt
+++ b/geode-core/src/integrationTest/resources/org/apache/geode/codeAnalysis/sanctionedDataSerializables.txt
@@ -1065,6 +1065,14 @@ org/apache/geode/internal/cache/PartitionRegionConfig,2
 fromData,207
 toData,178
 
+org/apache/geode/internal/cache/PartitionedRegionClearMessage,2
+fromData,40
+toData,36
+
+org/apache/geode/internal/cache/PartitionedRegionClearMessage$PartitionedRegionClearReplyMessage,2
+fromData,32
+toData,28
+
 org/apache/geode/internal/cache/PoolFactoryImpl$PoolAttributes,2
 fromData,161
 toData,161
@@ -1366,6 +1374,14 @@ org/apache/geode/internal/cache/partitioned/BucketSizeMessage$BucketSizeReplyMes
 fromData,27
 toData,27
 
+org/apache/geode/internal/cache/partitioned/ClearPRMessage,2
+fromData,30
+toData,44
+
+org/apache/geode/internal/cache/partitioned/ClearPRMessage$ClearReplyMessage,2
+fromData,17
+toData,17
+
 org/apache/geode/internal/cache/partitioned/ColocatedRegionDetails,2
 fromData,81
 toData,133
diff --git a/geode-junit/src/main/java/org/apache/geode/cache/query/data/City.java b/geode-core/src/main/java/org/apache/geode/cache/PartitionedRegionPartialClearException.java
similarity index 51%
copy from geode-junit/src/main/java/org/apache/geode/cache/query/data/City.java
copy to geode-core/src/main/java/org/apache/geode/cache/PartitionedRegionPartialClearException.java
index bed863bc91..1ddb301441 100644
--- a/geode-junit/src/main/java/org/apache/geode/cache/query/data/City.java
+++ b/geode-core/src/main/java/org/apache/geode/cache/PartitionedRegionPartialClearException.java
@@ -12,41 +12,26 @@
  * or implied. See the License for the specific language governing permissions and limitations under
  * the License.
  */
+package org.apache.geode.cache;
 
-/*
- * City.java
- *
- * Created on September 30, 2005, 6:20 PM
+/**
+ * Indicates a failure to perform a distributed clear operation on a Partitioned Region
+ * after multiple attempts. The clear may not have been successfully applied on some of
+ * the members hosting the region.
  */
+public class PartitionedRegionPartialClearException extends CacheRuntimeException {
 
-package org.apache.geode.cache.query.data;
-
-import java.io.Serializable;
-
-public class City implements Serializable {
-  public String name;
-  public int zip;
+  public PartitionedRegionPartialClearException() {}
 
-  /* Creates a new instance of City */
-  public City(String name, int zip) {
-    this.name = name;
-    this.zip = zip;
-  }// end of constructor 1
-
-  public City(int i) {
-    String[] arr1 = {"MUMBAI", "PUNE", "GANDHINAGAR", "CHANDIGARH"};
-    /* this is for the test to have 50% of the objects belonging to one city */
-    name = arr1[i % 2];
-    zip = 425125 + i;
-  }// end of constructor 2
-
-  ////////////////////////////
+  public PartitionedRegionPartialClearException(String msg) {
+    super(msg);
+  }
 
-  public String getName() {
-    return name;
+  public PartitionedRegionPartialClearException(String msg, Throwable cause) {
+    super(msg, cause);
   }
 
-  public int getZip() {
-    return zip;
+  public PartitionedRegionPartialClearException(Throwable cause) {
+    super(cause);
   }
-}// end of class
+}
diff --git a/geode-core/src/main/java/org/apache/geode/cache/Region.java b/geode-core/src/main/java/org/apache/geode/cache/Region.java
index b787dc623f..f73be8222a 100644
--- a/geode-core/src/main/java/org/apache/geode/cache/Region.java
+++ b/geode-core/src/main/java/org/apache/geode/cache/Region.java
@@ -1329,7 +1329,11 @@ public interface Region<K, V> extends ConcurrentMap<K, V> {
    * @see java.util.Map#clear()
    * @see CacheListener#afterRegionClear
    * @see CacheWriter#beforeRegionClear
-   * @throws UnsupportedOperationException If the region is a partitioned region
+   * @throws PartitionedRegionPartialClearException when data is partially cleared on partitioned
+   *         region. It is caller responsibility to handle the partial data clear either by retrying
+   *         the clear operation or continue working with the partially cleared partitioned region.
+   * @throws UnsupportedOperationException when data was not cleared because one or more
+   *         of the member servers' version was too old to understand the clear message.
    */
   @Override
   void clear();
diff --git a/geode-core/src/main/java/org/apache/geode/cache/query/internal/DefaultQueryService.java b/geode-core/src/main/java/org/apache/geode/cache/query/internal/DefaultQueryService.java
index d7baa59c30..0ee3bee134 100644
--- a/geode-core/src/main/java/org/apache/geode/cache/query/internal/DefaultQueryService.java
+++ b/geode-core/src/main/java/org/apache/geode/cache/query/internal/DefaultQueryService.java
@@ -214,7 +214,7 @@ public class DefaultQueryService implements InternalQueryService {
       throw new UnsupportedOperationException(
           "Index creation on the server is not supported from the client.");
     }
-    PartitionedIndex parIndex = null;
+
     if (region == null) {
       region = getRegionFromPath(imports, fromClause);
     }
@@ -242,6 +242,7 @@ public class DefaultQueryService implements InternalQueryService {
       }
     }
     if (region instanceof PartitionedRegion) {
+      PartitionedIndex parIndex = null;
       try {
         parIndex = (PartitionedIndex) ((PartitionedRegion) region).createIndex(false, indexType,
             indexName, indexedExpression, fromClause, imports, loadEntries);
@@ -255,9 +256,7 @@ public class DefaultQueryService implements InternalQueryService {
             exx);
       }
       return parIndex;
-
     } else {
-
       IndexManager indexManager = IndexUtils.getIndexManager(cache, region, true);
       Index index = indexManager.createIndex(indexName, indexType, indexedExpression, fromClause,
           imports, null, null, loadEntries);
diff --git a/geode-core/src/main/java/org/apache/geode/cache/query/internal/index/IndexManager.java b/geode-core/src/main/java/org/apache/geode/cache/query/internal/index/IndexManager.java
index a297c3af20..a976812ecf 100644
--- a/geode-core/src/main/java/org/apache/geode/cache/query/internal/index/IndexManager.java
+++ b/geode-core/src/main/java/org/apache/geode/cache/query/internal/index/IndexManager.java
@@ -279,6 +279,8 @@ public class IndexManager {
     }
 
     try {
+      ((LocalRegion) this.region).lockRVVForBulkOp();
+
       String projectionAttributes = "*"; // for now this is the only option
 
       if (getIndex(indexName) != null) {
@@ -429,7 +431,7 @@ public class IndexManager {
     } finally {
       cache.setPdxReadSerializedOverride(oldReadSerialized);
       ((TXManagerImpl) cache.getCacheTransactionManager()).unpauseTransaction(tx);
-
+      ((LocalRegion) region).unlockRVVForBulkOp();
     }
   }
 
diff --git a/geode-core/src/main/java/org/apache/geode/internal/DSFIDFactory.java b/geode-core/src/main/java/org/apache/geode/internal/DSFIDFactory.java
index d11a9435b9..a89400ff75 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/DSFIDFactory.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/DSFIDFactory.java
@@ -235,6 +235,7 @@ import org.apache.geode.internal.cache.MemberFunctionStreamingMessage;
 import org.apache.geode.internal.cache.Node;
 import org.apache.geode.internal.cache.PRQueryProcessor;
 import org.apache.geode.internal.cache.PartitionRegionConfig;
+import org.apache.geode.internal.cache.PartitionedRegionClearMessage;
 import org.apache.geode.internal.cache.PreferBytesCachedDeserializable;
 import org.apache.geode.internal.cache.RegionEventImpl;
 import org.apache.geode.internal.cache.ReleaseClearLockMessage;
@@ -289,6 +290,7 @@ import org.apache.geode.internal.cache.partitioned.BucketCountLoadProbe;
 import org.apache.geode.internal.cache.partitioned.BucketProfileUpdateMessage;
 import org.apache.geode.internal.cache.partitioned.BucketSizeMessage;
 import org.apache.geode.internal.cache.partitioned.BucketSizeMessage.BucketSizeReplyMessage;
+import org.apache.geode.internal.cache.partitioned.ClearPRMessage;
 import org.apache.geode.internal.cache.partitioned.ContainsKeyValueMessage;
 import org.apache.geode.internal.cache.partitioned.ContainsKeyValueMessage.ContainsKeyValueReplyMessage;
 import org.apache.geode.internal.cache.partitioned.CreateBucketMessage;
@@ -684,6 +686,10 @@ public class DSFIDFactory implements DataSerializableFixedID {
     serializer.register(PR_DUMP_B2N_REPLY_MESSAGE, DumpB2NReplyMessage.class);
     serializer.register(DESTROY_PARTITIONED_REGION_MESSAGE,
         DestroyPartitionedRegionMessage.class);
+    serializer.register(CLEAR_PARTITIONED_REGION_MESSAGE,
+        PartitionedRegionClearMessage.class);
+    serializer.register(CLEAR_PARTITIONED_REGION_REPLY_MESSAGE,
+        PartitionedRegionClearMessage.PartitionedRegionClearReplyMessage.class);
     serializer.register(INVALIDATE_PARTITIONED_REGION_MESSAGE,
         InvalidatePartitionedRegionMessage.class);
     serializer.register(COMMIT_PROCESS_QUERY_MESSAGE, CommitProcessQueryMessage.class);
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/AbstractRegion.java b/geode-core/src/main/java/org/apache/geode/internal/cache/AbstractRegion.java
index d39e2fbffe..77b708339b 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/AbstractRegion.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/AbstractRegion.java
@@ -113,6 +113,7 @@ public abstract class AbstractRegion implements InternalRegion, AttributesMutato
   private static final Logger logger = LogService.getLogger();
   private final ReentrantReadWriteLock readWriteLockForCacheLoader = new ReentrantReadWriteLock();
   private final ReentrantReadWriteLock readWriteLockForCacheWriter = new ReentrantReadWriteLock();
+  @VisibleForTesting
   protected final ConcurrentHashMap<RegionEntry, EntryExpiryTask> entryExpiryTasks =
       new ConcurrentHashMap<>();
   /**
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/AbstractRegionMap.java b/geode-core/src/main/java/org/apache/geode/internal/cache/AbstractRegionMap.java
index e148b15dda..f0f533df50 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/AbstractRegionMap.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/AbstractRegionMap.java
@@ -322,7 +322,12 @@ public abstract class AbstractRegionMap extends BaseRegionMap
     if (lr != null && !(lr instanceof HARegion)) {
       CachePerfStats stats = lr.getCachePerfStats();
       if (stats != null) {
-        stats.incClearCount();
+        if (lr.isUsedForPartitionedRegionBucket()) {
+          stats.incBucketClearCount();
+        } else {
+          stats.incRegionClearCount();
+        }
+
       }
     }
   }
@@ -1253,16 +1258,19 @@ public abstract class AbstractRegionMap extends BaseRegionMap
     DiskRegion dr = owner.getDiskRegion();
     boolean ownerIsInitialized = owner.isInitialized();
 
-    // Fix for Bug #44431. We do NOT want to update the region and wait
-    // later for index INIT as region.clear() can cause inconsistency if
-    // happened in parallel as it also does index INIT.
-    IndexManager oqlIndexManager = owner.getIndexManager();
-    if (oqlIndexManager != null) {
-      oqlIndexManager.waitForIndexInit();
-    }
+    // lock before waitForIndexInit so that we should wait
+    // till a concurrent clear to finish
     lockForCacheModification(owner, event);
-    final boolean locked = owner.lockWhenRegionIsInitializing();
+    boolean locked = false;
     try {
+      // Fix for Bug #44431. We do NOT want to update the region and wait
+      // later for index INIT as region.clear() can cause inconsistency if
+      // happened in parallel as it also does index INIT.
+      IndexManager oqlIndexManager = owner.getIndexManager();
+      if (oqlIndexManager != null) {
+        oqlIndexManager.waitForIndexInit();
+      }
+      locked = owner.lockWhenRegionIsInitializing();
       try {
         try {
           if (forceNewEntry || forceCallbacks) {
@@ -1631,7 +1639,6 @@ public abstract class AbstractRegionMap extends BaseRegionMap
       }
       releaseCacheModificationLock(owner, event);
     }
-
   }
 
   /**
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/BucketAdvisor.java b/geode-core/src/main/java/org/apache/geode/internal/cache/BucketAdvisor.java
index e6dcd3fb8f..6c129fcc5e 100755
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/BucketAdvisor.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/BucketAdvisor.java
@@ -1614,7 +1614,7 @@ public class BucketAdvisor extends CacheDistributionAdvisor {
   /**
    * Returns true if the a primary is known.
    */
-  private boolean hasPrimary() {
+  protected boolean hasPrimary() {
     final byte primaryState = this.primaryState;
     return primaryState == OTHER_PRIMARY_NOT_HOSTING || primaryState == OTHER_PRIMARY_HOSTING
         || primaryState == IS_PRIMARY_HOSTING;
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/BucketRegion.java b/geode-core/src/main/java/org/apache/geode/internal/cache/BucketRegion.java
index ffb1109115..b068519528 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/BucketRegion.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/BucketRegion.java
@@ -571,6 +571,38 @@ public class BucketRegion extends DistributedRegion implements Bucket {
     }
   }
 
+  /**
+   * this starts with a primary bucket, clears it, and distribute a DistributedClearOperation
+   * .OperationType.OP_CLEAR operation to other members.
+   * If this member is not locked yet, lock it and send OP_LOCK_FOR_CLEAR to others first.
+   */
+  @Override
+  public void cmnClearRegion(RegionEventImpl regionEvent, boolean cacheWrite, boolean useRVV) {
+    if (!getBucketAdvisor().isPrimary()) {
+      if (logger.isDebugEnabled()) {
+        logger.debug("Not primary bucket when doing clear, do nothing");
+      }
+      return;
+    }
+
+    // get rvvLock
+    Set<InternalDistributedMember> participants =
+        getCacheDistributionAdvisor().adviseInvalidateRegion();
+    boolean isLockedAlready = this.partitionedRegion.getPartitionedRegionClear()
+        .isLockedForListenerAndClientNotification();
+
+    try {
+      obtainWriteLocksForClear(regionEvent, participants, isLockedAlready);
+      // no need to dominate my own rvv.
+      // Clear is on going here, there won't be GII for this member
+      clearRegionLocally(regionEvent, cacheWrite, null);
+      distributeClearOperation(regionEvent, null, participants);
+
+      // TODO: call reindexUserDataRegion if there're lucene indexes
+    } finally {
+      releaseWriteLocksForClear(regionEvent, participants, isLockedAlready);
+    }
+  }
 
   long generateTailKey() {
     long key = eventSeqNum.addAndGet(partitionedRegion.getTotalNumberOfBuckets());
@@ -2104,8 +2136,8 @@ public class BucketRegion extends DistributedRegion implements Bucket {
       // counters to 0.
       oldMemValue = bytesInMemory.getAndSet(0);
     } else {
-      throw new InternalGemFireError(
-          "Trying to clear a bucket region that was not destroyed or in initialization.");
+      // BucketRegion's clear is supported now
+      oldMemValue = bytesInMemory.getAndSet(0);
     }
     if (oldMemValue != BUCKET_DESTROYED) {
       partitionedRegion.getPrStats().incDataStoreEntryCount(-sizeBeforeClear);
@@ -2535,4 +2567,10 @@ public class BucketRegion extends DistributedRegion implements Bucket {
     return getSystem().getDistributionManager().getOtherDistributionManagerIds();
   }
 
+
+  @Override
+  protected void basicClear(RegionEventImpl regionEvent) {
+    basicClear(regionEvent, false);
+  }
+
 }
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/CachePerfStats.java b/geode-core/src/main/java/org/apache/geode/internal/cache/CachePerfStats.java
index 0e9f7ac69f..6f18b5540c 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/CachePerfStats.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/CachePerfStats.java
@@ -118,7 +118,11 @@ public class CachePerfStats {
   static final int indexUpdateInProgressId;
   static final int indexUpdateCompletedId;
   static final int indexUpdateTimeId;
-  static final int clearsId;
+  static final int bucketClearsId;
+  static final int regionClearsId;
+  static final int partitionedRegionClearLocalDurationId;
+  static final int partitionedRegionClearTotalDurationId;
+
   private static final int indexInitializationInProgressId;
   private static final int indexInitializationCompletedId;
   private static final int indexInitializationTimeId;
@@ -288,7 +292,14 @@ public class CachePerfStats {
         "Current number of regions configured for reliablity that are missing required roles with Limited access";
     final String reliableRegionsMissingNoAccessDesc =
         "Current number of regions configured for reliablity that are missing required roles with No access";
-    final String clearsDesc = "The total number of times a clear has been done on this cache.";
+    final String regionClearsDesc =
+        "The total number of times a clear has been done on this cache.";
+    final String bucketClearsDesc =
+        "The total number of times a clear has been done on this region and it's bucket regions";
+    final String partitionedRegionClearLocalDurationDesc =
+        "The time in nanoseconds partitioned region clear has been running for the region on this member";
+    final String partitionedRegionClearTotalDurationDesc =
+        "The time in nanoseconds partitioned region clear has been running for the region with this member as coordinator.";
     final String metaDataRefreshCountDesc =
         "Total number of times the meta data is refreshed due to hopping observed.";
     final String conflatedEventsDesc =
@@ -470,7 +481,12 @@ public class CachePerfStats {
             f.createLongCounter("retries",
                 "Number of times a concurrent destroy followed by a create has caused an entry operation to need to retry.",
                 "operations"),
-            f.createLongCounter("clears", clearsDesc, "operations"),
+            f.createLongCounter("regionClears", regionClearsDesc, "operations"),
+            f.createLongCounter("bucketClears", bucketClearsDesc, "operations"),
+            f.createLongCounter("partitionedRegionClearLocalDuration",
+                partitionedRegionClearLocalDurationDesc, "nanoseconds"),
+            f.createLongCounter("partitionedRegionClearTotalDuration",
+                partitionedRegionClearTotalDurationDesc, "nanoseconds"),
             f.createLongGauge("diskTasksWaiting",
                 "Current number of disk tasks (oplog compactions, asynchronous recoveries, etc) that are waiting for a thread to run the operation",
                 "operations"),
@@ -614,7 +630,10 @@ public class CachePerfStats {
     eventsQueuedId = type.nameToId("eventsQueued");
 
     retriesId = type.nameToId("retries");
-    clearsId = type.nameToId("clears");
+    regionClearsId = type.nameToId("regionClears");
+    bucketClearsId = type.nameToId("bucketClears");
+    partitionedRegionClearLocalDurationId = type.nameToId("partitionedRegionClearLocalDuration");
+    partitionedRegionClearTotalDurationId = type.nameToId("partitionedRegionClearTotalDuration");
 
     diskTasksWaitingId = type.nameToId("diskTasksWaiting");
     evictorJobsStartedId = type.nameToId("evictorJobsStarted");
@@ -1404,12 +1423,36 @@ public class CachePerfStats {
     };
   }
 
-  public long getClearCount() {
-    return stats.getLong(clearsId);
+  public long getRegionClearCount() {
+    return stats.getLong(regionClearsId);
+  }
+
+  public long getBucketClearCount() {
+    return stats.getLong(bucketClearsId);
+  }
+
+  public long getPartitionedRegionClearLocalDuration() {
+    return stats.getLong(partitionedRegionClearLocalDurationId);
+  }
+
+  public long getPartitionedRegionClearTotalDuration() {
+    return stats.getLong(partitionedRegionClearTotalDurationId);
+  }
+
+  public void incRegionClearCount() {
+    stats.incLong(regionClearsId, 1L);
+  }
+
+  public void incBucketClearCount() {
+    stats.incLong(bucketClearsId, 1L);
+  }
+
+  public void incPartitionedRegionClearLocalDuration(long durationNanos) {
+    stats.incLong(partitionedRegionClearLocalDurationId, durationNanos);
   }
 
-  public void incClearCount() {
-    stats.incLong(clearsId, 1L);
+  public void incPartitionedRegionClearTotalDuration(long durationNanos) {
+    stats.incLong(partitionedRegionClearTotalDurationId, durationNanos);
   }
 
   public long getConflatedEventsCount() {
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/ColocationHelper.java b/geode-core/src/main/java/org/apache/geode/internal/cache/ColocationHelper.java
index b23e4d26da..3c29e339aa 100755
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/ColocationHelper.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/ColocationHelper.java
@@ -271,15 +271,11 @@ public class ColocationHelper {
   }
 
   /**
-   * An utility method to retrieve all partitioned regions(excluding self) in a colocation chain<br>
+   * A utility method to retrieve all partitioned regions(excluding self) in a colocation chain<br>
    * <p>
-   * For example, shipmentPR is colocated with orderPR and orderPR is colocated with customerPR <br>
-   * <br>
-   * getAllColocationRegions(customerPR) --> List{orderPR, shipmentPR}<br>
-   * getAllColocationRegions(orderPR) --> List{customerPR, shipmentPR}<br>
-   * getAllColocationRegions(shipmentPR) --> List{customerPR, orderPR}<br>
    *
-   * @return List of all partitioned regions (excluding self) in a colocated chain
+   * @return Map<String, PartitionedRegion> of all partitioned regions (excluding self) in a
+   *         colocated chain. Keys are the full paths of the PartitionedRegion values.
    * @since GemFire 5.8Beta
    */
   public static Map<String, PartitionedRegion> getAllColocationRegions(
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/DistributedClearOperation.java b/geode-core/src/main/java/org/apache/geode/internal/cache/DistributedClearOperation.java
index bba3441315..5b2e3d76d0 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/DistributedClearOperation.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/DistributedClearOperation.java
@@ -163,6 +163,10 @@ public class DistributedClearOperation extends DistributedCacheOperation {
   }
 
 
+  /**
+   * this message is to operate on the BucketRegion level, used by the primary member to distribute
+   * clear message to secondary buckets
+   */
   public static class ClearRegionMessage extends CacheOperationMessage {
 
     protected EventID eventID;
@@ -186,6 +190,10 @@ public class DistributedClearOperation extends DistributedCacheOperation {
       return OperationExecutors.HIGH_PRIORITY_EXECUTOR;
     }
 
+    public OperationType getOperationType() {
+      return clearOp;
+    }
+
     @Override
     protected InternalCacheEvent createEvent(DistributedRegion rgn) throws EntryNotFoundException {
       RegionEventImpl event = createRegionEvent(rgn);
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/DistributedRegion.java b/geode-core/src/main/java/org/apache/geode/internal/cache/DistributedRegion.java
index faadd1ad0e..8998cc88ee 100755
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/DistributedRegion.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/DistributedRegion.java
@@ -192,10 +192,6 @@ public class DistributedRegion extends LocalRegion implements InternalDistribute
   @MutableForTesting
   public static boolean ignoreReconnect = false;
 
-  /**
-   * Lock to prevent multiple threads on this member from performing a clear at the same time.
-   */
-  private final Object clearLock = new Object();
   private final ReentrantReadWriteLock failedInitialImageLock = new ReentrantReadWriteLock(true);
 
   @MakeNotStatic
@@ -947,11 +943,6 @@ public class DistributedRegion extends LocalRegion implements InternalDistribute
     }
   }
 
-  private void lockCheckReadiness() {
-    cache.getCancelCriterion().checkCancelInProgress(null);
-    checkReadiness();
-  }
-
   @Override
   Object validatedDestroy(Object key, EntryEventImpl event)
       throws TimeoutException, EntryNotFoundException, CacheWriterException {
@@ -2026,6 +2017,10 @@ public class DistributedRegion extends LocalRegion implements InternalDistribute
     super.basicClear(regionEvent, cacheWrite);
   }
 
+  void distributeClearOperation(RegionEventImpl regionEvent, RegionVersionVector rvv,
+      Set<InternalDistributedMember> participants) {
+    DistributedClearOperation.clear(regionEvent, rvv, participants);
+  }
 
   @Override
   void cmnClearRegion(RegionEventImpl regionEvent, boolean cacheWrite, boolean useRVV) {
@@ -2045,13 +2040,13 @@ public class DistributedRegion extends LocalRegion implements InternalDistribute
               getCacheDistributionAdvisor().adviseInvalidateRegion();
           // pause all generation of versions and flush from the other members to this one
           try {
-            obtainWriteLocksForClear(regionEvent, participants);
+            obtainWriteLocksForClear(regionEvent, participants, false);
             clearRegionLocally(regionEvent, cacheWrite, null);
             if (!regionEvent.isOriginRemote() && regionEvent.getOperation().isDistributed()) {
-              DistributedClearOperation.clear(regionEvent, null, participants);
+              distributeClearOperation(regionEvent, null, participants);
             }
           } finally {
-            releaseWriteLocksForClear(regionEvent, participants);
+            releaseWriteLocksForClear(regionEvent, participants, false);
           }
         } finally {
           distributedUnlockForClear();
@@ -2061,7 +2056,7 @@ public class DistributedRegion extends LocalRegion implements InternalDistribute
             getCacheDistributionAdvisor().adviseInvalidateRegion();
         clearRegionLocally(regionEvent, cacheWrite, null);
         if (!regionEvent.isOriginRemote() && regionEvent.getOperation().isDistributed()) {
-          DistributedClearOperation.clear(regionEvent, null, participants);
+          distributeClearOperation(regionEvent, null, participants);
         }
       }
     }
@@ -2104,9 +2099,28 @@ public class DistributedRegion extends LocalRegion implements InternalDistribute
   /**
    * obtain locks preventing generation of new versions in other members
    */
-  private void obtainWriteLocksForClear(RegionEventImpl regionEvent,
+  protected void obtainWriteLocksForClear(RegionEventImpl regionEvent,
+      Set<InternalDistributedMember> participants, boolean localLockedAlready) {
+    if (!localLockedAlready) {
+      lockLocallyForClear(getDistributionManager(), getMyId(), regionEvent);
+    }
+    lockAndFlushClearToOthers(regionEvent, participants);
+  }
+
+  /**
+   * releases the locks obtained in obtainWriteLocksForClear
+   */
+  protected void releaseWriteLocksForClear(RegionEventImpl regionEvent,
+      Set<InternalDistributedMember> participants,
+      boolean localLockedAlready) {
+    if (!localLockedAlready) {
+      releaseLockLocallyForClear(regionEvent);
+    }
+    DistributedClearOperation.releaseLocks(regionEvent, participants);
+  }
+
+  void lockAndFlushClearToOthers(RegionEventImpl regionEvent,
       Set<InternalDistributedMember> participants) {
-    lockLocallyForClear(getDistributionManager(), getMyId(), regionEvent);
     DistributedClearOperation.lockAndFlushToOthers(regionEvent, participants);
   }
 
@@ -2141,19 +2155,16 @@ public class DistributedRegion extends LocalRegion implements InternalDistribute
     }
   }
 
-  /**
-   * releases the locks obtained in obtainWriteLocksForClear
-   */
-  private void releaseWriteLocksForClear(RegionEventImpl regionEvent,
-      Set<InternalDistributedMember> participants) {
-
+  protected void releaseLockLocallyForClear(RegionEventImpl regionEvent) {
     ARMLockTestHook armLockTestHook = getRegionMap().getARMLockTestHook();
     if (armLockTestHook != null) {
       armLockTestHook.beforeRelease(this, regionEvent);
     }
 
-    getVersionVector().unlockForClear(getMyId());
-    DistributedClearOperation.releaseLocks(regionEvent, participants);
+    RegionVersionVector rvv = getVersionVector();
+    if (rvv != null) {
+      rvv.unlockForClear(getMyId());
+    }
 
     if (armLockTestHook != null) {
       armLockTestHook.afterRelease(this, regionEvent);
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/InternalRegion.java b/geode-core/src/main/java/org/apache/geode/internal/cache/InternalRegion.java
index a929ad3ac9..4988275112 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/InternalRegion.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/InternalRegion.java
@@ -473,4 +473,7 @@ public interface InternalRegion extends Region, HasCachePerfStats, RegionEntryCo
   boolean isRegionCreateNotified();
 
   void setRegionCreateNotified(boolean notified);
+
+  void clearRegionLocally(RegionEventImpl regionEvent, boolean cacheWrite,
+      RegionVersionVector vector);
 }
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/LocalRegion.java b/geode-core/src/main/java/org/apache/geode/internal/cache/LocalRegion.java
index dbc6006088..643c3605d7 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/LocalRegion.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/LocalRegion.java
@@ -327,6 +327,7 @@ public class LocalRegion extends AbstractRegion implements LoaderHelperFactory,
    */
   private int txRefCount;
 
+
   private volatile boolean regionInvalid;
 
   /**
@@ -475,6 +476,11 @@ public class LocalRegion extends AbstractRegion implements LoaderHelperFactory,
    */
   private final Lock clientMetaDataLock = new ReentrantLock();
 
+  /**
+   * Lock to prevent multiple threads on this member from performing a clear at the same time.
+   */
+  protected final Object clearLock = new Object();
+
   /**
    * Lock for updating the cache service profile for the region.
    */
@@ -2788,6 +2794,11 @@ public class LocalRegion extends AbstractRegion implements LoaderHelperFactory,
     checkRegionDestroyed(true);
   }
 
+  protected void lockCheckReadiness() {
+    cache.getCancelCriterion().checkCancelInProgress(null);
+    checkReadiness();
+  }
+
   /**
    * This method should be called when the caller cannot locate an entry and that condition is
    * unexpected. This will first double check the cache and region state before throwing an
@@ -3030,7 +3041,7 @@ public class LocalRegion extends AbstractRegion implements LoaderHelperFactory,
   /**
    * @since GemFire 5.7
    */
-  private void serverRegionClear(RegionEventImpl regionEvent) {
+  protected void serverRegionClear(RegionEventImpl regionEvent) {
     if (regionEvent.getOperation().isDistributed()) {
       ServerRegionProxy mySRP = getServerProxy();
       if (mySRP != null) {
@@ -3149,7 +3160,7 @@ public class LocalRegion extends AbstractRegion implements LoaderHelperFactory,
     return result;
   }
 
-  private void cacheWriteBeforeRegionClear(RegionEventImpl event)
+  void cacheWriteBeforeRegionClear(RegionEventImpl event)
       throws CacheWriterException, TimeoutException {
     // copy into local var to prevent race condition
     CacheWriter writer = basicGetWriter();
@@ -8016,7 +8027,8 @@ public class LocalRegion extends AbstractRegion implements LoaderHelperFactory,
     }
   }
 
-  private void cancelAllEntryExpiryTasks() {
+  @VisibleForTesting
+  void cancelAllEntryExpiryTasks() {
     // This method gets called during LocalRegion construction
     // in which case the final entryExpiryTasks field can still be null
     if (entryExpiryTasks.isEmpty()) {
@@ -8031,6 +8043,10 @@ public class LocalRegion extends AbstractRegion implements LoaderHelperFactory,
       task.cancel();
       doPurge = true;
     }
+
+    // Clear the map after canceling each expiry task.
+    entryExpiryTasks.clear();
+
     if (doPurge) {
       // do a force to not leave any refs to this region
       cache.getExpirationScheduler().forcePurge();
@@ -8502,7 +8518,8 @@ public class LocalRegion extends AbstractRegion implements LoaderHelperFactory,
    * will not take distributedLock. The clear operation will also clear the local transactional
    * entries. The clear operation will have immediate committed state.
    */
-  void clearRegionLocally(RegionEventImpl regionEvent, boolean cacheWrite,
+  @Override
+  public void clearRegionLocally(RegionEventImpl regionEvent, boolean cacheWrite,
       RegionVersionVector vector) {
     final boolean isRvvDebugEnabled = logger.isTraceEnabled(LogMarker.RVV_VERBOSE);
 
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegion.java b/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegion.java
index 03dd3de027..f5d7bfa21b 100755
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegion.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegion.java
@@ -181,6 +181,7 @@ import org.apache.geode.internal.cache.execute.PartitionedRegionFunctionResultWa
 import org.apache.geode.internal.cache.execute.RegionFunctionContextImpl;
 import org.apache.geode.internal.cache.execute.ServerToClientFunctionResultSender;
 import org.apache.geode.internal.cache.ha.ThreadIdentifier;
+import org.apache.geode.internal.cache.partitioned.ClearPRMessage;
 import org.apache.geode.internal.cache.partitioned.ContainsKeyValueMessage;
 import org.apache.geode.internal.cache.partitioned.ContainsKeyValueMessage.ContainsKeyValueResponse;
 import org.apache.geode.internal.cache.partitioned.DestroyMessage;
@@ -319,6 +320,8 @@ public class PartitionedRegion extends LocalRegion
     }
   };
 
+  private final PartitionedRegionClear partitionedRegionClear = new PartitionedRegionClear(this);
+
   /**
    * Global Region for storing PR config ( PRName->PRConfig). This region would be used to resolve
    * PR name conflict.*
@@ -570,6 +573,14 @@ public class PartitionedRegion extends LocalRegion
     return partitionListeners;
   }
 
+  public CachePerfStats getRegionCachePerfStats() {
+    if (dataStore != null && dataStore.getAllLocalBucketRegions().size() > 0) {
+      BucketRegion bucket = dataStore.getAllLocalBucketRegions().iterator().next();
+      return bucket.getCachePerfStats();
+    }
+    return null;
+  }
+
   /**
    * Return canonical representation for a bucket (for logging)
    *
@@ -2204,18 +2215,13 @@ public class PartitionedRegion extends LocalRegion
     throw new UnsupportedOperationException();
   }
 
-  /**
-   * @since GemFire 5.0
-   * @throws UnsupportedOperationException OVERRIDES
-   */
-  @Override
-  public void clear() {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
-  void basicClear(RegionEventImpl regionEvent, boolean cacheWrite) {
-    throw new UnsupportedOperationException();
+  List<ClearPRMessage> createClearPRMessages(EventID eventID) {
+    ArrayList<ClearPRMessage> clearMsgList = new ArrayList<>();
+    for (int bucketId = 0; bucketId < getTotalNumberOfBuckets(); bucketId++) {
+      ClearPRMessage clearPRMessage = new ClearPRMessage(bucketId, eventID);
+      clearMsgList.add(clearPRMessage);
+    }
+    return clearMsgList;
   }
 
   @Override
@@ -2631,7 +2637,7 @@ public class PartitionedRegion extends LocalRegion
             retryTime = new RetryTimeKeeper(retryTimeout);
           }
 
-          currentTarget = waitForNodeOrCreateBucket(retryTime, event, bucketId);
+          currentTarget = waitForNodeOrCreateBucket(retryTime, event, bucketId, true);
           if (isDebugEnabled) {
             logger.debug("PR.sendMsgByBucket: event size is {}, new currentTarget is {}",
                 getEntrySize(event), currentTarget);
@@ -2770,7 +2776,7 @@ public class PartitionedRegion extends LocalRegion
             retryTime = new RetryTimeKeeper(retryTimeout);
           }
 
-          currentTarget = waitForNodeOrCreateBucket(retryTime, event, bucketId);
+          currentTarget = waitForNodeOrCreateBucket(retryTime, event, bucketId, true);
           if (logger.isDebugEnabled()) {
             logger.debug("PR.sendMsgByBucket: event size is {}, new currentTarget is {}",
                 getEntrySize(event), currentTarget);
@@ -3015,7 +3021,7 @@ public class PartitionedRegion extends LocalRegion
         if (retryTime == null) {
           retryTime = new RetryTimeKeeper(retryTimeout);
         }
-        currentTarget = waitForNodeOrCreateBucket(retryTime, event, bucketId);
+        currentTarget = waitForNodeOrCreateBucket(retryTime, event, bucketId, true);
 
         // It's possible this is a GemFire thread e.g. ServerConnection
         // which got to this point because of a distributed system shutdown or
@@ -3174,10 +3180,11 @@ public class PartitionedRegion extends LocalRegion
    * @param retryTime the RetryTimeKeeper to track retry times
    * @param event the event used to get the entry size in the event a new bucket should be created
    * @param bucketId the identity of the bucket should it be created
+   * @param createIfNotExist boolean to indicate if to create a bucket if found not exist
    * @return a Node which contains the bucket, potentially null
    */
   private InternalDistributedMember waitForNodeOrCreateBucket(RetryTimeKeeper retryTime,
-      EntryEventImpl event, Integer bucketId) {
+      EntryEventImpl event, Integer bucketId, boolean createIfNotExist) {
     InternalDistributedMember newNode;
     if (retryTime.overMaximum()) {
       PRHARedundancyProvider.timedOut(this, null, null, "allocate a bucket",
@@ -3187,7 +3194,7 @@ public class PartitionedRegion extends LocalRegion
 
     retryTime.waitForBucketsRecovery();
     newNode = getNodeForBucketWrite(bucketId, retryTime);
-    if (newNode == null) {
+    if (newNode == null && createIfNotExist) {
       newNode = createBucket(bucketId, getEntrySize(event), retryTime);
     }
 
@@ -4301,6 +4308,26 @@ public class PartitionedRegion extends LocalRegion
     return null;
   }
 
+  boolean triggerWriter(RegionEventImpl event, SearchLoadAndWriteProcessor processor, int paction,
+      String theKey) {
+    CacheWriter localWriter = basicGetWriter();
+    Set netWriteRecipients = localWriter == null ? this.distAdvisor.adviseNetWrite() : null;
+
+    if (localWriter == null && (netWriteRecipients == null || netWriteRecipients.isEmpty())) {
+      return false;
+    }
+
+    final long start = getCachePerfStats().startCacheWriterCall();
+    try {
+      processor.initialize(this, theKey, null);
+      processor.doNetWrite(event, netWriteRecipients, localWriter, paction);
+      processor.release();
+    } finally {
+      getCachePerfStats().endCacheWriterCall(start);
+    }
+    return true;
+  }
+
   /**
    * This invokes a cache writer before a destroy operation. Although it has the same method
    * signature as the method in LocalRegion, it is invoked in a different code path. LocalRegion
@@ -4310,31 +4337,26 @@ public class PartitionedRegion extends LocalRegion
   @Override
   boolean cacheWriteBeforeRegionDestroy(RegionEventImpl event)
       throws CacheWriterException, TimeoutException {
-
     if (event.getOperation().isDistributed()) {
       serverRegionDestroy(event);
-      CacheWriter localWriter = basicGetWriter();
-      Set netWriteRecipients = localWriter == null ? distAdvisor.adviseNetWrite() : null;
-
-      if (localWriter == null && (netWriteRecipients == null || netWriteRecipients.isEmpty())) {
-        return false;
-      }
-
-      final long start = getCachePerfStats().startCacheWriterCall();
-      try {
-        SearchLoadAndWriteProcessor processor = SearchLoadAndWriteProcessor.getProcessor();
-        processor.initialize(this, "preDestroyRegion", null);
-        processor.doNetWrite(event, netWriteRecipients, localWriter,
-            SearchLoadAndWriteProcessor.BEFOREREGIONDESTROY);
-        processor.release();
-      } finally {
-        getCachePerfStats().endCacheWriterCall(start);
-      }
-      return true;
+      SearchLoadAndWriteProcessor processor = SearchLoadAndWriteProcessor.getProcessor();
+      return triggerWriter(event, processor, SearchLoadAndWriteProcessor.BEFOREREGIONDESTROY,
+          "preDestroyRegion");
     }
     return false;
   }
 
+  @Override
+  void cacheWriteBeforeRegionClear(RegionEventImpl event)
+      throws CacheWriterException, TimeoutException {
+    if (event.getOperation().isDistributed()) {
+      serverRegionClear(event);
+      SearchLoadAndWriteProcessor processor = SearchLoadAndWriteProcessor.getProcessor();
+      triggerWriter(event, processor, SearchLoadAndWriteProcessor.BEFOREREGIONCLEAR,
+          "preClearRegion");
+    }
+  }
+
   /**
    * Test Method: Get the DistributedMember identifier for the vm containing a key
    *
@@ -5205,6 +5227,7 @@ public class PartitionedRegion extends LocalRegion
     return totalNumberOfBuckets;
   }
 
+
   @Override
   public void basicDestroy(final EntryEventImpl event, final boolean cacheWrite,
       final Object expectedOldValue)
@@ -10167,6 +10190,29 @@ public class PartitionedRegion extends LocalRegion
     regionCreationNotified = true;
   }
 
+  protected PartitionedRegionClear getPartitionedRegionClear() {
+    return partitionedRegionClear;
+  }
+
+  @Override
+  void cmnClearRegion(RegionEventImpl regionEvent, boolean cacheWrite, boolean useRVV) {
+    // Synchronized to avoid other threads invoking clear on this vm/node.
+    synchronized (clearLock) {
+      partitionedRegionClear.doClear(regionEvent, cacheWrite);
+    }
+  }
+
+  boolean hasAnyClientsInterested() {
+    // Check local filter
+    if (getFilterProfile() != null && (getFilterProfile().hasInterest() || getFilterProfile()
+        .hasCQs())) {
+      return true;
+    }
+    // check peer server filters
+    return (getRegionAdvisor().hasPRServerWithInterest()
+        || getRegionAdvisor().hasPRServerWithCQs());
+  }
+
   public boolean areRecoveriesInProgress() {
     return prStats.getRecoveriesInProgress() > 0;
   }
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionClear.java b/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionClear.java
new file mode 100644
index 0000000000..539f682667
--- /dev/null
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionClear.java
@@ -0,0 +1,506 @@
+/*
+ * 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.cache;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.logging.log4j.Logger;
+
+import org.apache.geode.CancelException;
+import org.apache.geode.cache.CacheWriterException;
+import org.apache.geode.cache.Operation;
+import org.apache.geode.cache.OperationAbortedException;
+import org.apache.geode.cache.PartitionedRegionPartialClearException;
+import org.apache.geode.cache.partition.PartitionRegionHelper;
+import org.apache.geode.distributed.internal.DistributionManager;
+import org.apache.geode.distributed.internal.MembershipListener;
+import org.apache.geode.distributed.internal.ReplyException;
+import org.apache.geode.distributed.internal.membership.InternalDistributedMember;
+import org.apache.geode.internal.serialization.KnownVersion;
+import org.apache.geode.logging.internal.log4j.api.LogService;
+
+public class PartitionedRegionClear {
+
+  private static final Logger logger = LogService.getLogger();
+
+  protected static final String CLEAR_OPERATION = "_clearOperation";
+
+  private final int retryTime = 2 * 60 * 1000;
+
+  private final PartitionedRegion partitionedRegion;
+
+  protected final LockForListenerAndClientNotification lockForListenerAndClientNotification =
+      new LockForListenerAndClientNotification();
+
+  private volatile boolean membershipChange = false;
+
+  protected final PartitionedRegionClearListener partitionedRegionClearListener =
+      new PartitionedRegionClearListener();
+
+  public PartitionedRegionClear(PartitionedRegion partitionedRegion) {
+    this.partitionedRegion = partitionedRegion;
+    partitionedRegion.getDistributionManager()
+        .addMembershipListener(partitionedRegionClearListener);
+  }
+
+  public boolean isLockedForListenerAndClientNotification() {
+    return lockForListenerAndClientNotification.isLocked();
+  }
+
+  void acquireDistributedClearLock(String clearLock) {
+    try {
+      partitionedRegion.getPartitionedRegionLockService().lock(clearLock, -1, -1);
+    } catch (IllegalStateException e) {
+      partitionedRegion.lockCheckReadiness();
+      throw e;
+    }
+  }
+
+  void releaseDistributedClearLock(String clearLock) {
+    try {
+      partitionedRegion.getPartitionedRegionLockService().unlock(clearLock);
+    } catch (IllegalStateException e) {
+      partitionedRegion.lockCheckReadiness();
+    } catch (Exception ex) {
+      logger.warn("Caught exception while unlocking clear distributed lock. " + ex.getMessage());
+    }
+  }
+
+  protected PartitionedRegionClearListener getPartitionedRegionClearListener() {
+    return partitionedRegionClearListener;
+  }
+
+  /**
+   * only called if there are any listeners or clients interested.
+   */
+  void obtainLockForClear(RegionEventImpl event) {
+    obtainClearLockLocal(partitionedRegion.getDistributionManager().getId());
+    sendPartitionedRegionClearMessage(event,
+        PartitionedRegionClearMessage.OperationType.OP_LOCK_FOR_PR_CLEAR);
+  }
+
+  /**
+   * only called if there are any listeners or clients interested.
+   */
+  void releaseLockForClear(RegionEventImpl event) {
+    releaseClearLockLocal();
+    sendPartitionedRegionClearMessage(event,
+        PartitionedRegionClearMessage.OperationType.OP_UNLOCK_FOR_PR_CLEAR);
+  }
+
+  /**
+   * clears local primaries and send message to remote primaries to clear
+   */
+  Set<Integer> clearRegion(RegionEventImpl regionEvent) {
+    // this includes all local primary buckets and their remote secondaries
+    Set<Integer> localPrimaryBuckets = clearRegionLocal(regionEvent);
+    // this includes all remote primary buckets and their secondaries
+    Set<Integer> remotePrimaryBuckets = sendPartitionedRegionClearMessage(regionEvent,
+        PartitionedRegionClearMessage.OperationType.OP_PR_CLEAR);
+
+    Set<Integer> allBucketsCleared = new HashSet<>();
+    allBucketsCleared.addAll(localPrimaryBuckets);
+    allBucketsCleared.addAll(remotePrimaryBuckets);
+    return allBucketsCleared;
+  }
+
+  protected void waitForPrimary(PartitionedRegion.RetryTimeKeeper retryTimer) {
+    boolean retry;
+    do {
+      retry = false;
+      for (BucketRegion bucketRegion : partitionedRegion.getDataStore()
+          .getAllLocalBucketRegions()) {
+        if (!bucketRegion.getBucketAdvisor().hasPrimary()) {
+          if (retryTimer.overMaximum()) {
+            throw new PartitionedRegionPartialClearException(
+                "Unable to find primary bucket region during clear operation on "
+                    + partitionedRegion.getName() + " region.");
+          }
+          retryTimer.waitForBucketsRecovery();
+          retry = true;
+        }
+      }
+    } while (retry);
+  }
+
+  /**
+   * this clears all local primary buckets (each will distribute the clear operation to its
+   * secondary members) and all of their remote secondaries
+   */
+  public Set<Integer> clearRegionLocal(RegionEventImpl regionEvent) {
+    Set<Integer> clearedBuckets = new HashSet<>();
+    long clearStartTime = System.nanoTime();
+    setMembershipChange(false);
+    // Synchronized to handle the requester departure.
+    synchronized (lockForListenerAndClientNotification) {
+      if (partitionedRegion.getDataStore() != null) {
+        partitionedRegion.getDataStore().lockBucketCreationForRegionClear();
+        try {
+          boolean retry;
+          do {
+            waitForPrimary(new PartitionedRegion.RetryTimeKeeper(retryTime));
+            RegionEventImpl bucketRegionEvent;
+            for (BucketRegion localPrimaryBucketRegion : partitionedRegion.getDataStore()
+                .getAllLocalPrimaryBucketRegions()) {
+              if (localPrimaryBucketRegion.size() > 0) {
+                bucketRegionEvent =
+                    new RegionEventImpl(localPrimaryBucketRegion, Operation.REGION_CLEAR, null,
+                        false, partitionedRegion.getMyId(), regionEvent.getEventId());
+                localPrimaryBucketRegion.cmnClearRegion(bucketRegionEvent, false, true);
+              }
+              clearedBuckets.add(localPrimaryBucketRegion.getId());
+            }
+
+            if (getMembershipChange()) {
+              // Retry and reset the membership change status.
+              setMembershipChange(false);
+              retry = true;
+            } else {
+              retry = false;
+            }
+
+          } while (retry);
+          doAfterClear(regionEvent);
+        } finally {
+          partitionedRegion.getDataStore().unlockBucketCreationForRegionClear();
+          if (clearedBuckets.size() != 0 && partitionedRegion.getCachePerfStats() != null) {
+            partitionedRegion.getRegionCachePerfStats().incRegionClearCount();
+            partitionedRegion.getRegionCachePerfStats()
+                .incPartitionedRegionClearLocalDuration(System.nanoTime() - clearStartTime);
+          }
+        }
+      } else {
+        // Non data-store with client queue and listener
+        doAfterClear(regionEvent);
+      }
+    }
+    return clearedBuckets;
+  }
+
+  protected void doAfterClear(RegionEventImpl regionEvent) {
+    if (partitionedRegion.hasAnyClientsInterested()) {
+      notifyClients(regionEvent);
+    }
+
+    if (partitionedRegion.hasListener()) {
+      partitionedRegion.dispatchListenerEvent(EnumListenerEvent.AFTER_REGION_CLEAR, regionEvent);
+    }
+  }
+
+  void notifyClients(RegionEventImpl event) {
+    // Set client routing information into the event
+    // The clear operation in case of PR is distributed differently
+    // hence the FilterRoutingInfo is set here instead of
+    // DistributedCacheOperation.distribute().
+    event.setEventType(EnumListenerEvent.AFTER_REGION_CLEAR);
+    if (!partitionedRegion.isUsedForMetaRegion() && !partitionedRegion
+        .isUsedForPartitionedRegionAdmin()
+        && !partitionedRegion.isUsedForPartitionedRegionBucket() && !partitionedRegion
+            .isUsedForParallelGatewaySenderQueue()) {
+
+      FilterRoutingInfo localCqFrInfo =
+          partitionedRegion.getFilterProfile().getFilterRoutingInfoPart1(event,
+              FilterProfile.NO_PROFILES, Collections.emptySet());
+
+      FilterRoutingInfo localCqInterestFrInfo =
+          partitionedRegion.getFilterProfile().getFilterRoutingInfoPart2(localCqFrInfo, event);
+
+      if (localCqInterestFrInfo != null) {
+        event.setLocalFilterInfo(localCqInterestFrInfo.getLocalFilterInfo());
+      }
+    }
+    partitionedRegion.notifyBridgeClients(event);
+  }
+
+  /**
+   * obtain locks for all local buckets
+   */
+  protected void obtainClearLockLocal(InternalDistributedMember requester) {
+    synchronized (lockForListenerAndClientNotification) {
+      // Check if the member is still part of the distributed system
+      if (!partitionedRegion.getDistributionManager().isCurrentMember(requester)) {
+        return;
+      }
+
+      lockForListenerAndClientNotification.setLocked(requester);
+      if (partitionedRegion.getDataStore() != null) {
+        for (BucketRegion localPrimaryBucketRegion : partitionedRegion.getDataStore()
+            .getAllLocalPrimaryBucketRegions()) {
+          try {
+            localPrimaryBucketRegion.lockLocallyForClear(partitionedRegion.getDistributionManager(),
+                partitionedRegion.getMyId(), null);
+          } catch (Exception ex) {
+            partitionedRegion.checkClosed();
+          }
+        }
+      }
+    }
+  }
+
+  protected void releaseClearLockLocal() {
+    synchronized (lockForListenerAndClientNotification) {
+      if (lockForListenerAndClientNotification.getLockRequester() == null) {
+        // The member has left.
+        return;
+      }
+      try {
+        if (partitionedRegion.getDataStore() != null) {
+
+          for (BucketRegion localPrimaryBucketRegion : partitionedRegion.getDataStore()
+              .getAllLocalPrimaryBucketRegions()) {
+            try {
+              localPrimaryBucketRegion.releaseLockLocallyForClear(null);
+            } catch (Exception ex) {
+              logger.debug(
+                  "Unable to acquire clear lock for bucket region " + localPrimaryBucketRegion
+                      .getName(),
+                  ex.getMessage());
+              partitionedRegion.checkClosed();
+            }
+          }
+        }
+      } finally {
+        lockForListenerAndClientNotification.setUnLocked();
+      }
+    }
+  }
+
+  protected Set<Integer> sendPartitionedRegionClearMessage(RegionEventImpl event,
+      PartitionedRegionClearMessage.OperationType op) {
+    RegionEventImpl eventForLocalClear = (RegionEventImpl) event.clone();
+    eventForLocalClear.setOperation(Operation.REGION_LOCAL_CLEAR);
+
+    do {
+      try {
+        return attemptToSendPartitionedRegionClearMessage(event, op);
+      } catch (ForceReattemptException reattemptException) {
+        // retry
+      }
+    } while (true);
+  }
+
+  /**
+   * @return buckets that are cleared. empty set if any exception happened
+   */
+  protected Set<Integer> attemptToSendPartitionedRegionClearMessage(RegionEventImpl event,
+      PartitionedRegionClearMessage.OperationType op)
+      throws ForceReattemptException {
+    Set<Integer> bucketsOperated = new HashSet<>();
+
+    if (partitionedRegion.getPRRoot() == null) {
+      if (logger.isDebugEnabled()) {
+        logger.debug(
+            "Partition region {} failed to initialize. Remove its profile from remote members.",
+            this.partitionedRegion);
+      }
+      new UpdateAttributesProcessor(partitionedRegion, true).distribute(false);
+      return bucketsOperated;
+    }
+
+    final Set<InternalDistributedMember> configRecipients =
+        new HashSet<>(partitionedRegion.getRegionAdvisor()
+            .adviseAllPRNodes());
+
+    try {
+      final PartitionRegionConfig prConfig =
+          partitionedRegion.getPRRoot().get(partitionedRegion.getRegionIdentifier());
+
+      if (prConfig != null) {
+        for (Node node : prConfig.getNodes()) {
+          InternalDistributedMember idm = node.getMemberId();
+          if (!idm.equals(partitionedRegion.getMyId())) {
+            configRecipients.add(idm);
+          }
+        }
+      }
+    } catch (CancelException ignore) {
+      // ignore
+    }
+
+    try {
+      PartitionedRegionClearMessage.PartitionedRegionClearResponse resp =
+          new PartitionedRegionClearMessage.PartitionedRegionClearResponse(
+              partitionedRegion.getSystem(), configRecipients);
+      PartitionedRegionClearMessage partitionedRegionClearMessage =
+          new PartitionedRegionClearMessage(configRecipients, partitionedRegion, resp, op, event);
+      partitionedRegionClearMessage.send();
+
+      resp.waitForRepliesUninterruptibly();
+      bucketsOperated = resp.bucketsCleared;
+
+    } catch (ReplyException e) {
+      Throwable t = e.getCause();
+      if (t instanceof ForceReattemptException) {
+        throw (ForceReattemptException) t;
+      }
+      if (t instanceof PartitionedRegionPartialClearException) {
+        throw new PartitionedRegionPartialClearException(t.getMessage(), t);
+      }
+      logger.warn(
+          "PartitionedRegionClear#sendPartitionedRegionClearMessage: Caught exception during ClearRegionMessage send and waiting for response",
+          e);
+    }
+    return bucketsOperated;
+  }
+
+  /**
+   * This method returns a boolean to indicate if all server versions support Partition Region clear
+   */
+  public void allServerVersionsSupportPartitionRegionClear() {
+    List<String> memberNames = new ArrayList<>();
+    for (int i = 0; i < partitionedRegion.getTotalNumberOfBuckets(); i++) {
+      InternalDistributedMember internalDistributedMember = partitionedRegion.getBucketPrimary(i);
+      if ((internalDistributedMember != null)
+          && (internalDistributedMember.getVersion().isOlderThan(KnownVersion.GEODE_1_14_0))) {
+        if (!memberNames.contains(internalDistributedMember.getName())) {
+          memberNames.add(internalDistributedMember.getName());
+        }
+      }
+    }
+    if (!memberNames.isEmpty()) {
+      throw new UnsupportedOperationException(
+          "A server's " + memberNames + " version was too old (< "
+              + KnownVersion.GEODE_1_14_0 + ") for : Partitioned Region Clear");
+
+    }
+  }
+
+
+  void doClear(RegionEventImpl regionEvent, boolean cacheWrite) {
+    String lockName = CLEAR_OPERATION + partitionedRegion.getName();
+    long clearStartTime = 0;
+
+    allServerVersionsSupportPartitionRegionClear();
+
+    try {
+      // distributed lock to make sure only one clear op is in progress in the cluster.
+      acquireDistributedClearLock(lockName);
+      clearStartTime = System.nanoTime();
+
+      // Force all primary buckets to be created before clear.
+      assignAllPrimaryBuckets();
+
+      // do cacheWrite
+      if (cacheWrite) {
+        invokeCacheWriter(regionEvent);
+      }
+
+      // Check if there are any listeners or clients interested. If so, then clear write
+      // locks needs to be taken on all local and remote primary buckets in order to
+      // preserve the ordering of client events (for concurrent operations on the region).
+      boolean acquireClearLockForNotification =
+          (partitionedRegion.hasAnyClientsInterested() || partitionedRegion.hasListener());
+      if (acquireClearLockForNotification) {
+        obtainLockForClear(regionEvent);
+      }
+      try {
+        Set<Integer> bucketsCleared = clearRegion(regionEvent);
+
+        if (partitionedRegion.getTotalNumberOfBuckets() != bucketsCleared.size()) {
+          String message = "Unable to clear all the buckets from the partitioned region "
+              + partitionedRegion.getName()
+              + ", either data (buckets) moved or member departed.";
+
+          logger.warn(message + " expected to clear number of buckets: "
+              + partitionedRegion.getTotalNumberOfBuckets() +
+              " actual cleared: " + bucketsCleared.size());
+
+          throw new PartitionedRegionPartialClearException(message);
+        }
+      } finally {
+        if (acquireClearLockForNotification) {
+          releaseLockForClear(regionEvent);
+        }
+      }
+    } finally {
+      releaseDistributedClearLock(lockName);
+      CachePerfStats stats = partitionedRegion.getRegionCachePerfStats();
+      if (stats != null) {
+        partitionedRegion.getRegionCachePerfStats()
+            .incPartitionedRegionClearTotalDuration(System.nanoTime() - clearStartTime);
+      }
+    }
+  }
+
+  protected void invokeCacheWriter(RegionEventImpl regionEvent) {
+    try {
+      partitionedRegion.cacheWriteBeforeRegionClear(regionEvent);
+    } catch (OperationAbortedException operationAbortedException) {
+      throw new CacheWriterException(operationAbortedException);
+    }
+  }
+
+  protected void assignAllPrimaryBuckets() {
+    PartitionedRegion leader = ColocationHelper.getLeaderRegion(partitionedRegion);
+    PartitionRegionHelper.assignBucketsToPartitions(leader);
+  }
+
+  protected void handleClearFromDepartedMember(InternalDistributedMember departedMember) {
+    if (departedMember.equals(lockForListenerAndClientNotification.getLockRequester())) {
+      synchronized (lockForListenerAndClientNotification) {
+        if (lockForListenerAndClientNotification.getLockRequester() != null) {
+          releaseClearLockLocal();
+        }
+      }
+    }
+  }
+
+  class LockForListenerAndClientNotification {
+
+    private boolean locked = false;
+
+    private InternalDistributedMember lockRequester;
+
+    synchronized void setLocked(InternalDistributedMember member) {
+      locked = true;
+      lockRequester = member;
+    }
+
+    synchronized void setUnLocked() {
+      locked = false;
+      lockRequester = null;
+    }
+
+    synchronized boolean isLocked() {
+      return locked;
+    }
+
+    synchronized InternalDistributedMember getLockRequester() {
+      return lockRequester;
+    }
+  }
+
+  protected void setMembershipChange(boolean membershipChange) {
+    this.membershipChange = membershipChange;
+  }
+
+  protected boolean getMembershipChange() {
+    return membershipChange;
+  }
+
+  protected class PartitionedRegionClearListener implements MembershipListener {
+
+    @Override
+    public synchronized void memberDeparted(DistributionManager distributionManager,
+        InternalDistributedMember id, boolean crashed) {
+      setMembershipChange(true);
+      handleClearFromDepartedMember(id);
+    }
+  }
+}
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionClearMessage.java b/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionClearMessage.java
new file mode 100755
index 0000000000..724256b365
--- /dev/null
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionClearMessage.java
@@ -0,0 +1,289 @@
+/*
+ * 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.cache;
+
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+import java.util.Set;
+
+import org.apache.geode.DataSerializer;
+import org.apache.geode.cache.CacheException;
+import org.apache.geode.cache.Operation;
+import org.apache.geode.distributed.internal.ClusterDistributionManager;
+import org.apache.geode.distributed.internal.DistributionManager;
+import org.apache.geode.distributed.internal.DistributionMessage;
+import org.apache.geode.distributed.internal.InternalDistributedSystem;
+import org.apache.geode.distributed.internal.ReplyException;
+import org.apache.geode.distributed.internal.ReplyMessage;
+import org.apache.geode.distributed.internal.ReplyProcessor21;
+import org.apache.geode.distributed.internal.ReplySender;
+import org.apache.geode.distributed.internal.membership.InternalDistributedMember;
+import org.apache.geode.internal.Assert;
+import org.apache.geode.internal.CopyOnWriteHashSet;
+import org.apache.geode.internal.NanoTimer;
+import org.apache.geode.internal.cache.partitioned.PartitionMessage;
+import org.apache.geode.internal.logging.log4j.LogMarker;
+import org.apache.geode.internal.serialization.DeserializationContext;
+import org.apache.geode.internal.serialization.SerializationContext;
+import org.apache.geode.logging.internal.log4j.api.LogService;
+
+/**
+ * this message is for operations no the partition region level, could be sent by any originating
+ * member to the other members hosting this partition region
+ */
+public class PartitionedRegionClearMessage extends PartitionMessage {
+
+  public enum OperationType {
+    OP_LOCK_FOR_PR_CLEAR, OP_UNLOCK_FOR_PR_CLEAR, OP_PR_CLEAR,
+  }
+
+  private Object cbArg;
+
+  private OperationType op;
+
+  private EventID eventID;
+
+  private PartitionedRegion partitionedRegion;
+
+  private Set<Integer> bucketsCleared;
+
+  @Override
+  public EventID getEventID() {
+    return eventID;
+  }
+
+  public PartitionedRegionClearMessage() {}
+
+  PartitionedRegionClearMessage(Set<InternalDistributedMember> recipients, PartitionedRegion region,
+      ReplyProcessor21 processor, PartitionedRegionClearMessage.OperationType operationType,
+      final RegionEventImpl event) {
+    super(recipients, region.getPRId(), processor);
+    partitionedRegion = region;
+    op = operationType;
+    cbArg = event.getRawCallbackArgument();
+    eventID = event.getEventId();
+  }
+
+  public OperationType getOp() {
+    return op;
+  }
+
+  public void send() {
+    Assert.assertTrue(getRecipients() != null, "ClearMessage NULL recipients set");
+    setTransactionDistributed(partitionedRegion.getCache().getTxManager().isDistributed());
+    partitionedRegion.getDistributionManager().putOutgoing(this);
+  }
+
+  @Override
+  protected Throwable processCheckForPR(PartitionedRegion pr,
+      DistributionManager distributionManager) {
+    if (pr != null && !pr.getDistributionAdvisor().isInitialized()) {
+      return new ForceReattemptException(
+          String.format("%s : could not find partitioned region with Id %s",
+              distributionManager.getDistributionManagerId(),
+              pr.getRegionIdentifier()));
+    }
+    return null;
+  }
+
+  @Override
+  protected boolean operateOnPartitionedRegion(ClusterDistributionManager dm,
+      PartitionedRegion partitionedRegion,
+      long startTime) throws CacheException {
+
+    if (partitionedRegion == null) {
+      return true;
+    }
+
+    if (partitionedRegion.isDestroyed()) {
+      return true;
+    }
+
+    if (op == OperationType.OP_LOCK_FOR_PR_CLEAR) {
+      partitionedRegion.getPartitionedRegionClear().obtainClearLockLocal(getSender());
+    } else if (op == OperationType.OP_UNLOCK_FOR_PR_CLEAR) {
+      partitionedRegion.getPartitionedRegionClear().releaseClearLockLocal();
+    } else {
+      RegionEventImpl event =
+          new RegionEventImpl(partitionedRegion, Operation.REGION_CLEAR, this.cbArg, true,
+              partitionedRegion.getMyId(),
+              getEventID());
+      bucketsCleared = partitionedRegion.getPartitionedRegionClear().clearRegionLocal(event);
+    }
+    return true;
+  }
+
+  @Override
+  protected void appendFields(StringBuilder buff) {
+    super.appendFields(buff);
+    buff.append(" cbArg=").append(this.cbArg).append(" op=").append(this.op);
+  }
+
+  @Override
+  public int getDSFID() {
+    return CLEAR_PARTITIONED_REGION_MESSAGE;
+  }
+
+  @Override
+  public void fromData(DataInput in,
+      DeserializationContext context) throws IOException, ClassNotFoundException {
+    super.fromData(in, context);
+    this.cbArg = DataSerializer.readObject(in);
+    op = PartitionedRegionClearMessage.OperationType.values()[in.readByte()];
+    eventID = DataSerializer.readObject(in);
+  }
+
+  @Override
+  public void toData(DataOutput out,
+      SerializationContext context) throws IOException {
+    super.toData(out, context);
+    DataSerializer.writeObject(this.cbArg, out);
+    out.writeByte(op.ordinal());
+    DataSerializer.writeObject(eventID, out);
+  }
+
+  /**
+   * The response on which to wait for all the replies. This response ignores any exceptions
+   * received from the "far side"
+   */
+  public static class PartitionedRegionClearResponse extends ReplyProcessor21 {
+    CopyOnWriteHashSet<Integer> bucketsCleared = new CopyOnWriteHashSet<>();
+
+    public PartitionedRegionClearResponse(InternalDistributedSystem system,
+        Set<InternalDistributedMember> initMembers) {
+      super(system, initMembers);
+    }
+
+    @Override
+    public void process(DistributionMessage msg) {
+      if (msg instanceof PartitionedRegionClearReplyMessage) {
+        Set<Integer> buckets = ((PartitionedRegionClearReplyMessage) msg).bucketsCleared;
+        if (buckets != null) {
+          bucketsCleared.addAll(buckets);
+        }
+      }
+      super.process(msg, true);
+    }
+  }
+
+  @Override
+  protected void sendReply(InternalDistributedMember member, int processorId,
+      DistributionManager distributionManager, ReplyException ex,
+      PartitionedRegion partitionedRegion, long startTime) {
+    if (partitionedRegion != null) {
+      if (startTime > 0) {
+        partitionedRegion.getPrStats().endPartitionMessagesProcessing(startTime);
+      }
+    }
+    PartitionedRegionClearMessage.PartitionedRegionClearReplyMessage
+        .send(member, processorId, getReplySender(distributionManager), op, bucketsCleared,
+            ex);
+  }
+
+  public static class PartitionedRegionClearReplyMessage extends ReplyMessage {
+
+    private Set<Integer> bucketsCleared;
+
+    private OperationType op;
+
+    @Override
+    public boolean getInlineProcess() {
+      return true;
+    }
+
+    /**
+     * Empty constructor to conform to DataSerializable interface
+     */
+    public PartitionedRegionClearReplyMessage() {}
+
+    private PartitionedRegionClearReplyMessage(int processorId, OperationType op,
+        Set<Integer> bucketsCleared, ReplyException ex) {
+      super();
+      this.bucketsCleared = bucketsCleared;
+      this.op = op;
+      setProcessorId(processorId);
+      setException(ex);
+    }
+
+    /** Send an ack */
+    public static void send(InternalDistributedMember recipient, int processorId, ReplySender dm,
+        OperationType op, Set<Integer> bucketsCleared, ReplyException ex) {
+
+      Assert.assertTrue(recipient != null, "partitionedRegionClearReplyMessage NULL reply message");
+
+      PartitionedRegionClearMessage.PartitionedRegionClearReplyMessage m =
+          new PartitionedRegionClearMessage.PartitionedRegionClearReplyMessage(processorId, op,
+              bucketsCleared, ex);
+
+      m.setRecipient(recipient);
+      dm.putOutgoing(m);
+    }
+
+    /**
+     * Processes this message. This method is invoked by the receiver of the message.
+     *
+     * @param dm the distribution manager that is processing the message.
+     */
+    @Override
+    public void process(final DistributionManager dm, final ReplyProcessor21 rp) {
+      final long startTime = getTimestamp();
+
+      if (rp == null) {
+        if (LogService.getLogger().isTraceEnabled(LogMarker.DM_VERBOSE)) {
+          LogService.getLogger().trace(LogMarker.DM_VERBOSE, "{}: processor not found", this);
+        }
+        return;
+      }
+
+      rp.process(this);
+
+      dm.getStats().incReplyMessageTime(NanoTimer.getTime() - startTime);
+    }
+
+    @Override
+    public int getDSFID() {
+      return CLEAR_PARTITIONED_REGION_REPLY_MESSAGE;
+    }
+
+    @Override
+    public void fromData(DataInput in,
+        DeserializationContext context) throws IOException, ClassNotFoundException {
+      super.fromData(in, context);
+      op = PartitionedRegionClearMessage.OperationType.values()[in.readByte()];
+      bucketsCleared = DataSerializer.readObject(in);
+    }
+
+    @Override
+    public void toData(DataOutput out,
+        SerializationContext context) throws IOException {
+      super.toData(out, context);
+      out.writeByte(op.ordinal());
+      DataSerializer.writeObject(bucketsCleared, out);
+    }
+
+    @Override
+    public String toString() {
+      StringBuffer sb = new StringBuffer();
+      sb.append("PartitionedRegionClearReplyMessage ")
+          .append("processorId=").append(this.processorId)
+          .append(" sender=").append(sender)
+          .append(" bucketsCleared ").append(this.bucketsCleared)
+          .append(" exception=").append(getException());
+      return sb.toString();
+    }
+  }
+}
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionDataStore.java b/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionDataStore.java
index 7bfb4f17f1..baf5f35ebb 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionDataStore.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionDataStore.java
@@ -960,6 +960,14 @@ public class PartitionedRegionDataStore implements HasCachePerfStats {
     }
   }
 
+  protected void lockBucketCreationForRegionClear() {
+    bucketCreationLock.writeLock().lock();
+  }
+
+  protected void unlockBucketCreationForRegionClear() {
+    bucketCreationLock.writeLock().unlock();
+  }
+
   /**
    * Gets the total amount of memory in bytes allocated for all values for this PR in this VM. This
    * is the current memory (MB) watermark for data in this PR.
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/RegionEventImpl.java b/geode-core/src/main/java/org/apache/geode/internal/cache/RegionEventImpl.java
index 201a9d17ab..3c52fd466d 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/RegionEventImpl.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/RegionEventImpl.java
@@ -118,6 +118,11 @@ public class RegionEventImpl
     return region;
   }
 
+  public void setRegion(LocalRegion region) {
+    this.region = region;
+    this.distributedMember = region.getMyId();
+  }
+
   @Override
   public Operation getOperation() {
     return op;
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/RegionPerfStats.java b/geode-core/src/main/java/org/apache/geode/internal/cache/RegionPerfStats.java
index 498b2462e7..cfdc8b69bc 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/RegionPerfStats.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/RegionPerfStats.java
@@ -520,9 +520,15 @@ class RegionPerfStats extends CachePerfStats implements RegionStats {
   }
 
   @Override
-  public void incClearCount() {
-    stats.incLong(clearsId, 1L);
-    cachePerfStats.incClearCount();
+  public void incRegionClearCount() {
+    stats.incLong(regionClearsId, 1L);
+    cachePerfStats.incRegionClearCount();
+  }
+
+  @Override
+  public void incBucketClearCount() {
+    stats.incLong(bucketClearsId, 1L);
+    cachePerfStats.incBucketClearCount();
   }
 
   @Override
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/RegionStats.java b/geode-core/src/main/java/org/apache/geode/internal/cache/RegionStats.java
index e5e76ad53a..8f1e0a4414 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/RegionStats.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/RegionStats.java
@@ -135,7 +135,9 @@ public interface RegionStats {
 
   void incEvictWorkTime(long delta);
 
-  void incClearCount();
+  void incBucketClearCount();
+
+  void incRegionClearCount();
 
   void incPRQueryRetries();
 
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/partitioned/ClearPRMessage.java b/geode-core/src/main/java/org/apache/geode/internal/cache/partitioned/ClearPRMessage.java
new file mode 100644
index 0000000000..2603b785ff
--- /dev/null
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/partitioned/ClearPRMessage.java
@@ -0,0 +1,320 @@
+/*
+ * 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.cache.partitioned;
+
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.Set;
+
+import org.apache.logging.log4j.Logger;
+
+import org.apache.geode.DataSerializer;
+import org.apache.geode.annotations.VisibleForTesting;
+import org.apache.geode.cache.CacheException;
+import org.apache.geode.cache.Operation;
+import org.apache.geode.cache.persistence.PartitionOfflineException;
+import org.apache.geode.distributed.DistributedMember;
+import org.apache.geode.distributed.internal.ClusterDistributionManager;
+import org.apache.geode.distributed.internal.DirectReplyProcessor;
+import org.apache.geode.distributed.internal.DistributionManager;
+import org.apache.geode.distributed.internal.InternalDistributedSystem;
+import org.apache.geode.distributed.internal.ReplyException;
+import org.apache.geode.distributed.internal.ReplyMessage;
+import org.apache.geode.distributed.internal.ReplyProcessor21;
+import org.apache.geode.distributed.internal.ReplySender;
+import org.apache.geode.distributed.internal.membership.InternalDistributedMember;
+import org.apache.geode.internal.Assert;
+import org.apache.geode.internal.InternalDataSerializer;
+import org.apache.geode.internal.NanoTimer;
+import org.apache.geode.internal.cache.BucketRegion;
+import org.apache.geode.internal.cache.EventID;
+import org.apache.geode.internal.cache.ForceReattemptException;
+import org.apache.geode.internal.cache.PartitionedRegion;
+import org.apache.geode.internal.cache.RegionEventImpl;
+import org.apache.geode.internal.logging.log4j.LogMarker;
+import org.apache.geode.internal.serialization.DeserializationContext;
+import org.apache.geode.internal.serialization.SerializationContext;
+import org.apache.geode.logging.internal.log4j.api.LogService;
+
+public class ClearPRMessage extends PartitionMessageWithDirectReply {
+  private static final Logger logger = LogService.getLogger();
+
+  private Integer bucketId;
+
+  private EventID eventID;
+
+  public static final String BUCKET_NON_PRIMARY_MESSAGE =
+      "The bucket region on target member is no longer primary";
+  public static final String EXCEPTION_THROWN_DURING_CLEAR_OPERATION =
+      "An exception was thrown during the local clear operation: ";
+
+  /**
+   * state from operateOnRegion that must be preserved for transmission from the waiting pool
+   */
+  transient boolean result = false;
+
+  /**
+   * Empty constructor to satisfy {@link DataSerializer}requirements
+   */
+  public ClearPRMessage() {}
+
+  public ClearPRMessage(int bucketId, EventID eventID) {
+    this.bucketId = bucketId;
+    this.eventID = eventID;
+  }
+
+  public void initMessage(PartitionedRegion region, Set<InternalDistributedMember> recipients,
+      DirectReplyProcessor replyProcessor) {
+    this.resetRecipients();
+    if (recipients != null) {
+      setRecipients(recipients);
+    }
+    this.regionId = region.getPRId();
+    this.processor = replyProcessor;
+    this.processorId = replyProcessor == null ? 0 : replyProcessor.getProcessorId();
+    if (replyProcessor != null) {
+      replyProcessor.enableSevereAlertProcessing();
+    }
+  }
+
+  public ClearResponse send(DistributedMember recipient, PartitionedRegion region)
+      throws ForceReattemptException {
+    Set<InternalDistributedMember> recipients =
+        Collections.singleton((InternalDistributedMember) recipient);
+    ClearResponse clearResponse = new ClearResponse(region.getSystem(), recipients);
+    initMessage(region, recipients, clearResponse);
+    if (logger.isDebugEnabled()) {
+      logger.debug("ClearPRMessage.send: recipient is {}, msg is {}", recipient, this);
+    }
+
+    Set<InternalDistributedMember> failures = region.getDistributionManager().putOutgoing(this);
+    if (failures != null && failures.size() > 0) {
+      throw new ForceReattemptException("Failed sending <" + this + "> due to " + failures);
+    }
+    return clearResponse;
+  }
+
+  @Override
+  public int getDSFID() {
+    return PR_CLEAR_MESSAGE;
+  }
+
+  @Override
+  public void toData(DataOutput out, SerializationContext context) throws IOException {
+    super.toData(out, context);
+    if (bucketId == null) {
+      InternalDataSerializer.writeSignedVL(-1, out);
+    } else {
+      InternalDataSerializer.writeSignedVL(bucketId, out);
+    }
+    DataSerializer.writeObject(this.eventID, out);
+  }
+
+  @Override
+  public void fromData(DataInput in, DeserializationContext context)
+      throws IOException, ClassNotFoundException {
+    super.fromData(in, context);
+    this.bucketId = (int) InternalDataSerializer.readSignedVL(in);
+    this.eventID = (EventID) DataSerializer.readObject(in);
+  }
+
+  @Override
+  public EventID getEventID() {
+    return null;
+  }
+
+  /**
+   * This method is called upon receipt and make the desired changes to the PartitionedRegion Note:
+   * It is very important that this message does NOT cause any deadlocks as the sender will wait
+   * indefinitely for the acknowledgement
+   */
+  @Override
+  @VisibleForTesting
+  protected boolean operateOnPartitionedRegion(ClusterDistributionManager distributionManager,
+      PartitionedRegion region, long startTime) {
+    try {
+      this.result = doLocalClear(region);
+    } catch (ForceReattemptException ex) {
+      sendReply(getSender(), getProcessorId(), distributionManager, new ReplyException(ex), region,
+          startTime);
+      return false;
+    }
+    return this.result;
+  }
+
+  public Integer getBucketId() {
+    return this.bucketId;
+  }
+
+  public boolean doLocalClear(PartitionedRegion region)
+      throws ForceReattemptException {
+    // Retrieve local bucket region which matches target bucketId
+    BucketRegion bucketRegion =
+        region.getDataStore().getInitializedBucketForId(null, this.bucketId);
+
+    boolean lockedForPrimary = bucketRegion.doLockForPrimary(false);
+    // Check if we obtained primary lock, throw exception if not
+    if (!lockedForPrimary) {
+      throw new ForceReattemptException(BUCKET_NON_PRIMARY_MESSAGE);
+    }
+    try {
+      RegionEventImpl regionEvent = new RegionEventImpl(bucketRegion, Operation.REGION_CLEAR, null,
+          false, region.getMyId(), eventID);
+      bucketRegion.cmnClearRegion(regionEvent, false, true);
+    } catch (PartitionOfflineException poe) {
+      logger.info(
+          "All members holding data for bucket {} are offline, no more retries will be attempted",
+          this.bucketId,
+          poe);
+      throw poe;
+    } catch (Exception ex) {
+      throw new ForceReattemptException(
+          EXCEPTION_THROWN_DURING_CLEAR_OPERATION + ex.getClass().getName(), ex);
+    } finally {
+      bucketRegion.doUnlockForPrimary();
+    }
+
+    return true;
+  }
+
+  @Override
+  public boolean canStartRemoteTransaction() {
+    return false;
+  }
+
+  @Override
+  protected void sendReply(InternalDistributedMember member, int processorId,
+      DistributionManager distributionManager, ReplyException ex,
+      PartitionedRegion partitionedRegion, long startTime) {
+    if (partitionedRegion != null) {
+      if (startTime > 0) {
+        partitionedRegion.getPrStats().endPartitionMessagesProcessing(startTime);
+      }
+    }
+    ClearReplyMessage.send(member, processorId, getReplySender(distributionManager), this.result,
+        ex);
+  }
+
+  @Override
+  protected void appendFields(StringBuilder buff) {
+    super.appendFields(buff);
+    buff.append("; bucketId=").append(this.bucketId);
+  }
+
+  public static class ClearReplyMessage extends ReplyMessage {
+    @Override
+    public boolean getInlineProcess() {
+      return true;
+    }
+
+    /**
+     * Empty constructor to conform to DataSerializable interface
+     */
+    @SuppressWarnings("unused")
+    public ClearReplyMessage() {}
+
+    private ClearReplyMessage(int processorId, boolean result, ReplyException ex) {
+      super();
+      setProcessorId(processorId);
+      if (ex != null) {
+        setException(ex);
+      } else {
+        setReturnValue(result);
+      }
+    }
+
+    /**
+     * Send an ack
+     */
+    public static void send(InternalDistributedMember recipient, int processorId,
+        ReplySender replySender,
+        boolean result, ReplyException ex) {
+      Assert.assertNotNull(recipient, "ClearReplyMessage recipient was NULL.");
+      ClearReplyMessage message = new ClearReplyMessage(processorId, result, ex);
+      message.setRecipient(recipient);
+      replySender.putOutgoing(message);
+    }
+
+    /**
+     * Processes this message. This method is invoked by the receiver of the message.
+     *
+     * @param distributionManager the distribution manager that is processing the message.
+     */
+    @Override
+    public void process(final DistributionManager distributionManager,
+        final ReplyProcessor21 replyProcessor) {
+      final long startTime = getTimestamp();
+      if (replyProcessor == null) {
+        if (logger.isTraceEnabled(LogMarker.DM_VERBOSE)) {
+          logger.trace(LogMarker.DM_VERBOSE, "{}: processor not found", this);
+        }
+        return;
+      }
+      if (replyProcessor instanceof ClearResponse) {
+        ((ClearResponse) replyProcessor).setResponse(this);
+      }
+      replyProcessor.process(this);
+
+      if (logger.isTraceEnabled(LogMarker.DM_VERBOSE)) {
+        logger.trace(LogMarker.DM_VERBOSE, "{} processed {}", replyProcessor, this);
+      }
+      distributionManager.getStats().incReplyMessageTime(NanoTimer.getTime() - startTime);
+    }
+
+    @Override
+    public int getDSFID() {
+      return PR_CLEAR_REPLY_MESSAGE;
+    }
+
+    @Override
+    public String toString() {
+      StringBuilder stringBuilder = new StringBuilder(super.toString());
+      stringBuilder.append(" returnValue=");
+      stringBuilder.append(getReturnValue());
+      return stringBuilder.toString();
+    }
+  }
+
+  /**
+   * A processor to capture the value returned by {@link ClearPRMessage}
+   */
+  public static class ClearResponse extends PartitionResponse {
+    private volatile boolean returnValue;
+
+    public ClearResponse(InternalDistributedSystem distributedSystem,
+        Set<InternalDistributedMember> recipients) {
+      super(distributedSystem, recipients, false);
+    }
+
+    public void setResponse(ClearReplyMessage response) {
+      if (response.getException() == null) {
+        this.returnValue = (boolean) response.getReturnValue();
+      }
+    }
+
+    /**
+     * @return the result of the remote clear operation
+     * @throws ForceReattemptException if the peer is no longer available
+     * @throws CacheException if the peer generates an error
+     */
+    public boolean waitForResult() throws CacheException, ForceReattemptException {
+      waitForCacheException();
+      return this.returnValue;
+    }
+  }
+}
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/partitioned/PutAllPRMessage.java b/geode-core/src/main/java/org/apache/geode/internal/cache/partitioned/PutAllPRMessage.java
index bf8dd2138f..00125874ab 100755
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/partitioned/PutAllPRMessage.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/partitioned/PutAllPRMessage.java
@@ -415,6 +415,7 @@ public class PutAllPRMessage extends PartitionMessageWithDirectReply {
       Object[] keys = getKeysToBeLocked();
       if (!notificationOnly) {
         boolean locked = false;
+        boolean rvvLocked = false;
         try {
           if (putAllPRData.length > 0) {
             if (posDup && bucketRegion.getConcurrencyChecksEnabled()) {
@@ -440,6 +441,10 @@ public class PutAllPRMessage extends PartitionMessageWithDirectReply {
             bucketRegion.recordBulkOpStart(membershipID, eventID);
           }
           locked = bucketRegion.waitUntilLocked(keys);
+          if (!rvvLocked) {
+            bucketRegion.lockRVVForBulkOp();
+            rvvLocked = true;
+          }
           boolean lockedForPrimary = false;
           final HashMap succeeded = new HashMap();
           PutAllPartialResult partialKeys = new PutAllPartialResult(putAllPRDataSize);
@@ -520,6 +525,10 @@ public class PutAllPRMessage extends PartitionMessageWithDirectReply {
         } catch (RegionDestroyedException e) {
           ds.checkRegionDestroyedOnBucket(bucketRegion, true, e);
         } finally {
+          if (rvvLocked) {
+            bucketRegion.unlockRVVForBulkOp();
+            rvvLocked = false;
+          }
           if (locked) {
             bucketRegion.removeAndNotifyKeys(keys);
           }
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/partitioned/RegionAdvisor.java b/geode-core/src/main/java/org/apache/geode/internal/cache/partitioned/RegionAdvisor.java
index b19c263cb1..10794b8df0 100755
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/partitioned/RegionAdvisor.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/partitioned/RegionAdvisor.java
@@ -878,10 +878,21 @@ public class RegionAdvisor extends CacheDistributionAdvisor {
         && prof.filterProfile.hasInterest();
   };
 
+  @Immutable
+  private static final Filter prServerWithCqFilter = profile -> {
+    CacheProfile prof = (CacheProfile) profile;
+    return prof.isPartitioned && prof.hasCacheServer && prof.filterProfile != null
+        && prof.filterProfile.hasCQs();
+  };
+
   public boolean hasPRServerWithInterest() {
     return satisfiesFilter(prServerWithInterestFilter);
   }
 
+  public boolean hasPRServerWithCQs() {
+    return satisfiesFilter(prServerWithCqFilter);
+  }
+
   /**
    * return the set of all members who must receive operation notifications
    *
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/partitioned/RemoveAllPRMessage.java b/geode-core/src/main/java/org/apache/geode/internal/cache/partitioned/RemoveAllPRMessage.java
index ccf37197d2..416ec1c457 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/partitioned/RemoveAllPRMessage.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/partitioned/RemoveAllPRMessage.java
@@ -408,6 +408,7 @@ public class RemoveAllPRMessage extends PartitionMessageWithDirectReply {
 
       if (!notificationOnly) {
         boolean locked = false;
+        boolean rvvLocked = false;
         try {
           if (removeAllPRData.length > 0) {
             if (posDup && bucketRegion.getConcurrencyChecksEnabled()) {
@@ -433,6 +434,10 @@ public class RemoveAllPRMessage extends PartitionMessageWithDirectReply {
             bucketRegion.recordBulkOpStart(membershipID, eventID);
           }
           locked = bucketRegion.waitUntilLocked(keys);
+          if (!rvvLocked) {
+            bucketRegion.lockRVVForBulkOp();
+            rvvLocked = true;
+          }
           boolean lockedForPrimary = false;
           final ArrayList<Object> succeeded = new ArrayList<>();
           PutAllPartialResult partialKeys = new PutAllPartialResult(removeAllPRDataSize);
@@ -526,6 +531,10 @@ public class RemoveAllPRMessage extends PartitionMessageWithDirectReply {
         } catch (RegionDestroyedException e) {
           ds.checkRegionDestroyedOnBucket(bucketRegion, true, e);
         } finally {
+          if (rvvLocked) {
+            bucketRegion.unlockRVVForBulkOp();
+            rvvLocked = false;
+          }
           if (locked) {
             bucketRegion.removeAndNotifyKeys(keys);
           }
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/versions/RegionVersionVector.java b/geode-core/src/main/java/org/apache/geode/internal/cache/versions/RegionVersionVector.java
index de6e48b477..f638ef2b43 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/versions/RegionVersionVector.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/versions/RegionVersionVector.java
@@ -321,7 +321,7 @@ public abstract class RegionVersionVector<T extends VersionSource<?>>
         // this method is invoked by memberDeparted events and may not be for the current lock owner
         return;
       }
-      unlockVersionGeneration(locker);
+      unlockVersionGeneration();
     }
   }
 
@@ -417,7 +417,7 @@ public abstract class RegionVersionVector<T extends VersionSource<?>>
 
   }
 
-  private void unlockVersionGeneration(final InternalDistributedMember locker) {
+  private void unlockVersionGeneration() {
     synchronized (clearLockSync) {
       doUnlock = true;
       clearLockSync.notifyAll();
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/i18n/CliStrings.java b/geode-core/src/main/java/org/apache/geode/management/internal/i18n/CliStrings.java
index 26d5ed7da2..71ffa46aa6 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/i18n/CliStrings.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/i18n/CliStrings.java
@@ -864,6 +864,14 @@ public class CliStrings {
   public static final String CLEAR_DEFINED_INDEX__SUCCESS__MSG =
       "Index definitions successfully cleared";
 
+  /* clear region */
+  public static final String CLEAR_REGION = "clear region";
+  public static final String CLEAR_REGION_HELP =
+      "Clears/Removes all keys from the specified region.";
+  public static final String CLEAR_REGION_REGION_NAME = "name";
+  public static final String CLEAR_REGION_REGION_NAME_HELP = "Region to clear keys from.";
+  public static final String CLEAR_REGION_CLEARED_ALL_KEYS = "Cleared all keys in the region";
+
   /* create region */
   public static final String CREATE_REGION = "create region";
   public static final String CREATE_REGION__HELP =
@@ -1998,9 +2006,9 @@ public class CliStrings {
   public static final String REMOVE__MSG__KEY_EMPTY = "Key is Null";
   public static final String REMOVE__MSG__REGION_NOT_FOUND = "Region <{0}> Not Found";
   public static final String REMOVE__MSG__KEY_NOT_FOUND_REGION = "Key is not present in the region";
-  public static final String REMOVE__MSG__CLEARED_ALL_CLEARS = "Cleared all keys in the region";
-  public static final String REMOVE__MSG__CLEARALL_NOT_SUPPORTED_FOR_PARTITIONREGION =
-      "Option --" + REMOVE__ALL + " is not supported on partitioned region";
+  public static final String REMOVE__MSG__CLEARALL_DEPRECATION_WARNING =
+      "Warning: The --all option for the 'remove' command is deprecated. Please"
+          + " use the 'clear' command instead.";
 
   /* resume gateway-sender */
   public static final String RESUME_GATEWAYSENDER = "resume gateway-sender";
diff --git a/geode-core/src/main/resources/org/apache/geode/internal/sanctioned-geode-core-serializables.txt b/geode-core/src/main/resources/org/apache/geode/internal/sanctioned-geode-core-serializables.txt
index 6a13d82c42..2800154e84 100644
--- a/geode-core/src/main/resources/org/apache/geode/internal/sanctioned-geode-core-serializables.txt
+++ b/geode-core/src/main/resources/org/apache/geode/internal/sanctioned-geode-core-serializables.txt
@@ -79,6 +79,7 @@ org/apache/geode/cache/NoSubscriptionServersAvailableException,true,848408601915
 org/apache/geode/cache/Operation,true,-7521751729852504238,ordinal:byte
 org/apache/geode/cache/OperationAbortedException,true,-8293166225026556949
 org/apache/geode/cache/PartitionedRegionDistributionException,true,-3004093739855972548
+org/apache/geode/cache/PartitionedRegionPartialClearException,false
 org/apache/geode/cache/PartitionedRegionStorageException,true,5905463619475329732
 org/apache/geode/cache/RegionAccessException,true,3142958723089038406
 org/apache/geode/cache/RegionDestroyedException,true,319804842308010754,regionFullPath:java/lang/String
@@ -302,6 +303,7 @@ org/apache/geode/internal/cache/PRContainsValueFunction,false
 org/apache/geode/internal/cache/PRHARedundancyProvider$ArrayListWithClearState,true,1,wasCleared:boolean
 org/apache/geode/internal/cache/PartitionedRegion$PRIdMap,true,3667357372967498179,cleared:boolean
 org/apache/geode/internal/cache/PartitionedRegion$SizeEntry,false,isPrimary:boolean,size:int
+org/apache/geode/internal/cache/PartitionedRegionClearMessage$OperationType,false
 org/apache/geode/internal/cache/PartitionedRegionDataStore$CreateBucketResult,false,nowExists:boolean
 org/apache/geode/internal/cache/PartitionedRegionException,true,5113786059279106007
 org/apache/geode/internal/cache/PartitionedRegionQueryEvaluator$MemberResultsList,false,isLastChunkReceived:boolean
diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/BucketRegionJUnitTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/BucketRegionJUnitTest.java
index 71e2f36737..591dc95585 100755
--- a/geode-core/src/test/java/org/apache/geode/internal/cache/BucketRegionJUnitTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/cache/BucketRegionJUnitTest.java
@@ -14,9 +14,11 @@
  */
 package org.apache.geode.internal.cache;
 
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.Mockito.anyLong;
 import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doReturn;
@@ -31,7 +33,10 @@ import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReadWriteLock;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 
+import org.junit.Test;
+
 import org.apache.geode.cache.RegionAttributes;
+import org.apache.geode.internal.cache.versions.RegionVersionVector;
 import org.apache.geode.internal.statistics.StatisticsClock;
 
 public class BucketRegionJUnitTest extends DistributedRegionJUnitTest {
@@ -46,7 +51,9 @@ public class BucketRegionJUnitTest extends DistributedRegionJUnitTest {
     when(ba.getPrimaryMoveReadLock()).thenReturn(primaryMoveReadLock);
     when(ba.getProxyBucketRegion()).thenReturn(mock(ProxyBucketRegion.class));
     when(ba.isPrimary()).thenReturn(true);
-
+    PartitionedRegionClear clearPR = mock(PartitionedRegionClear.class);
+    when(clearPR.isLockedForListenerAndClientNotification()).thenReturn(true);
+    when(pr.getPartitionedRegionClear()).thenReturn(clearPR);
     ira.setPartitionedRegion(pr).setPartitionedRegionBucketRedundancy(1).setBucketAdvisor(ba);
   }
 
@@ -128,4 +135,80 @@ public class BucketRegionJUnitTest extends DistributedRegionJUnitTest {
     }
   }
 
+  @Test
+  public void cmnClearRegionWillDoNothingIfNotPrimary() {
+    RegionEventImpl event = createClearRegionEvent();
+    BucketRegion region = (BucketRegion) event.getRegion();
+    BucketAdvisor ba = mock(BucketAdvisor.class);
+    RegionVersionVector rvv = mock(RegionVersionVector.class);
+    doReturn(rvv).when(region).getVersionVector();
+    doReturn(ba).when(region).getBucketAdvisor();
+    when(ba.isPrimary()).thenReturn(false);
+    region.cmnClearRegion(event, true, true);
+    verify(region, never()).clearRegionLocally(eq(event), eq(true), eq(rvv));
+  }
+
+  @Test
+  public void cmnClearRegionCalledOnPrimary() {
+    RegionEventImpl event = createClearRegionEvent();
+    BucketRegion region = (BucketRegion) event.getRegion();
+    BucketAdvisor ba = mock(BucketAdvisor.class);
+    RegionVersionVector rvv = mock(RegionVersionVector.class);
+    doReturn(rvv).when(region).getVersionVector();
+    doReturn(true).when(region).getConcurrencyChecksEnabled();
+    doReturn(ba).when(region).getBucketAdvisor();
+    doNothing().when(region).distributeClearOperation(any(), any(), any());
+    doNothing().when(region).lockLocallyForClear(any(), any(), any());
+    doNothing().when(region).lockAndFlushClearToOthers(any(), any());
+    doNothing().when(region).clearRegionLocally(event, true, null);
+    when(ba.isPrimary()).thenReturn(true);
+    region.cmnClearRegion(event, true, true);
+    verify(region, times(1)).clearRegionLocally(eq(event), eq(true), eq(null));
+  }
+
+  @Test
+  public void clearWillUseNullAsRVVWhenConcurrencyCheckDisabled() {
+    RegionEventImpl event = createClearRegionEvent();
+    BucketRegion region = (BucketRegion) event.getRegion();
+    BucketAdvisor ba = mock(BucketAdvisor.class);
+    doReturn(false).when(region).getConcurrencyChecksEnabled();
+    doReturn(ba).when(region).getBucketAdvisor();
+    doNothing().when(region).distributeClearOperation(any(), any(), any());
+    doNothing().when(region).lockLocallyForClear(any(), any(), any());
+    doNothing().when(region).lockAndFlushClearToOthers(any(), any());
+    doNothing().when(region).clearRegionLocally(event, true, null);
+    when(ba.isPrimary()).thenReturn(true);
+    region.cmnClearRegion(event, true, true);
+    verify(region, times(1)).clearRegionLocally(eq(event), eq(true), eq(null));
+  }
+
+  @Test
+  public void obtainWriteLocksForClearInBRShouldDistribute() {
+    RegionEventImpl event = createClearRegionEvent();
+    BucketRegion region = (BucketRegion) event.getRegion();
+    doNothing().when(region).lockLocallyForClear(any(), any(), any());
+    doNothing().when(region).lockAndFlushClearToOthers(any(), any());
+    region.obtainWriteLocksForClear(event, null, false);
+    verify(region).lockLocallyForClear(any(), any(), eq(event));
+    verify(region).lockAndFlushClearToOthers(eq(event), eq(null));
+  }
+
+  @Test
+  public void updateSizeToZeroOnClearBucketRegion() {
+    RegionEventImpl event = createClearRegionEvent();
+    BucketRegion region = (BucketRegion) event.getRegion();
+    PartitionedRegion pr = region.getPartitionedRegion();
+    PartitionedRegionDataStore prds = mock(PartitionedRegionDataStore.class);
+    PartitionedRegionStats prStats = mock(PartitionedRegionStats.class);
+    when(pr.getPrStats()).thenReturn(prStats);
+    doNothing().when(prStats).incDataStoreEntryCount(anyInt());
+    doNothing().when(prds).updateMemoryStats(anyInt());
+    when(pr.getDataStore()).thenReturn(prds);
+    region.updateSizeOnCreate("key1", 20);
+    long sizeBeforeClear = region.getTotalBytes();
+    assertEquals(20, sizeBeforeClear);
+    region.updateSizeOnClearRegion((int) sizeBeforeClear);
+    long sizeAfterClear = region.getTotalBytes();
+    assertEquals(0, sizeAfterClear);
+  }
 }
diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/CachePerfStatsTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/CachePerfStatsTest.java
index f5dcd8eed4..a80e6672df 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/cache/CachePerfStatsTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/cache/CachePerfStatsTest.java
@@ -14,9 +14,9 @@
  */
 package org.apache.geode.internal.cache;
 
+import static org.apache.geode.internal.cache.CachePerfStats.bucketClearsId;
 import static org.apache.geode.internal.cache.CachePerfStats.cacheListenerCallsCompletedId;
 import static org.apache.geode.internal.cache.CachePerfStats.cacheWriterCallsCompletedId;
-import static org.apache.geode.internal.cache.CachePerfStats.clearsId;
 import static org.apache.geode.internal.cache.CachePerfStats.createsId;
 import static org.apache.geode.internal.cache.CachePerfStats.deltaFailedUpdatesId;
 import static org.apache.geode.internal.cache.CachePerfStats.deltaFullValuesRequestedId;
@@ -43,11 +43,14 @@ import static org.apache.geode.internal.cache.CachePerfStats.loadsCompletedId;
 import static org.apache.geode.internal.cache.CachePerfStats.missesId;
 import static org.apache.geode.internal.cache.CachePerfStats.netloadsCompletedId;
 import static org.apache.geode.internal.cache.CachePerfStats.netsearchesCompletedId;
+import static org.apache.geode.internal.cache.CachePerfStats.partitionedRegionClearLocalDurationId;
+import static org.apache.geode.internal.cache.CachePerfStats.partitionedRegionClearTotalDurationId;
 import static org.apache.geode.internal.cache.CachePerfStats.previouslySeenEventsId;
 import static org.apache.geode.internal.cache.CachePerfStats.putAllsId;
 import static org.apache.geode.internal.cache.CachePerfStats.putTimeId;
 import static org.apache.geode.internal.cache.CachePerfStats.putsId;
 import static org.apache.geode.internal.cache.CachePerfStats.queryExecutionsId;
+import static org.apache.geode.internal.cache.CachePerfStats.regionClearsId;
 import static org.apache.geode.internal.cache.CachePerfStats.removeAllsId;
 import static org.apache.geode.internal.cache.CachePerfStats.retriesId;
 import static org.apache.geode.internal.cache.CachePerfStats.txCommitChangesId;
@@ -429,30 +432,60 @@ public class CachePerfStatsTest {
 
   @Test
   public void getClearsDelegatesToStatistics() {
-    statistics.incLong(clearsId, Long.MAX_VALUE);
+    statistics.incLong(regionClearsId, Long.MAX_VALUE);
 
-    assertThat(cachePerfStats.getClearCount()).isEqualTo(Long.MAX_VALUE);
+    assertThat(cachePerfStats.getRegionClearCount()).isEqualTo(Long.MAX_VALUE);
   }
 
+  @Test
+  public void incRegionClearCountIncrementsClears() {
+    cachePerfStats.incRegionClearCount();
 
+    assertThat(statistics.getLong(regionClearsId)).isEqualTo(1L);
+  }
 
   @Test
-  public void incClearCountIncrementsClears() {
-    cachePerfStats.incClearCount();
+  public void incBucketClearCountIncrementsClears() {
+    cachePerfStats.incBucketClearCount();
 
-    assertThat(statistics.getLong(clearsId)).isEqualTo(1L);
+    assertThat(statistics.getLong(bucketClearsId)).isEqualTo(1L);
+  }
+
+  @Test
+  public void incPartitionedRegionClearLocalDurationIncrementsPartitionedRegionClearLocalDuration() {
+    cachePerfStats.incPartitionedRegionClearLocalDuration(100L);
+
+    assertThat(statistics.getLong(partitionedRegionClearLocalDurationId)).isEqualTo(100L);
+  }
+
+
+
+  @Test
+  public void incPartitionedRegionClearTotalDurationIncrementsPartitionedRegionClearTotalDuration() {
+    cachePerfStats.incPartitionedRegionClearTotalDuration(100L);
+
+    assertThat(statistics.getLong(partitionedRegionClearTotalDurationId)).isEqualTo(100L);
   }
 
   /**
    * Characterization test: {@code clears} currently wraps to negative from max long value.
    */
   @Test
-  public void clearsWrapsFromMaxLongToNegativeValue() {
-    statistics.incLong(clearsId, Long.MAX_VALUE);
+  public void regionClearsWrapsFromMaxLongToNegativeValue() {
+    statistics.incLong(regionClearsId, Long.MAX_VALUE);
+
+    cachePerfStats.incRegionClearCount();
+
+    assertThat(cachePerfStats.getRegionClearCount()).isNegative();
+  }
+
+  @Test
+  public void bucketClearsWrapsFromMaxLongToNegativeValue() {
+    statistics.incLong(bucketClearsId, Long.MAX_VALUE);
 
-    cachePerfStats.incClearCount();
+    cachePerfStats.incBucketClearCount();
 
-    assertThat(cachePerfStats.getClearCount()).isNegative();
+    assertThat(cachePerfStats.getBucketClearCount()).isNegative();
   }
 
   @Test
diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/DistributedRegionJUnitTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/DistributedRegionJUnitTest.java
index 9070bc06ed..74bc5fdbcf 100755
--- a/geode-core/src/test/java/org/apache/geode/internal/cache/DistributedRegionJUnitTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/cache/DistributedRegionJUnitTest.java
@@ -14,6 +14,7 @@
  */
 package org.apache.geode.internal.cache;
 
+import static org.apache.geode.internal.Assert.fail;
 import static org.apache.geode.internal.statistics.StatisticsClockFactory.disabledClock;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.Assert.assertFalse;
@@ -53,6 +54,14 @@ public class DistributedRegionJUnitTest
   @Override
   protected void setInternalRegionArguments(InternalRegionArguments ira) {}
 
+  protected RegionEventImpl createClearRegionEvent() {
+    DistributedRegion region = prepare(true, true);
+    DistributedMember member = mock(DistributedMember.class);
+    RegionEventImpl regionEvent = new RegionEventImpl(region, Operation.REGION_CLEAR, null, false,
+        member, true);
+    return regionEvent;
+  }
+
   @Override
   protected DistributedRegion createAndDefineRegion(boolean isConcurrencyChecksEnabled,
       RegionAttributes ra, InternalRegionArguments ira, GemFireCacheImpl cache,
@@ -246,4 +255,13 @@ public class DistributedRegionJUnitTest
     region.basicBridgeReplace("key1", "value1", false, null, client, true, clientEvent);
     assertThat(clientEvent.getVersionTag().equals(tag));
   }
+
+  @Test(expected = UnsupportedOperationException.class)
+  public void localClearIsNotSupportedOnReplicatedRegion() {
+    RegionEventImpl event = createClearRegionEvent();
+    DistributedRegion region = (DistributedRegion) event.getRegion();
+    region.basicLocalClear(event);
+    fail("Expect UnsupportedOperationException");
+  }
+
 }
diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/LocalRegionTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/LocalRegionTest.java
index 02924ee301..97b2b49ef7 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/cache/LocalRegionTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/cache/LocalRegionTest.java
@@ -26,6 +26,7 @@ import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
@@ -404,4 +405,25 @@ public class LocalRegionTest {
     verify(region).checkReadiness();
     verify(region).checkRegionDestroyed(true);
   }
+
+  @Test
+  public void cancelAllEntryExpiryTasksShouldClearMapOfExpiryTasks() {
+    when(cache.getExpirationScheduler()).thenReturn(mock(ExpirationScheduler.class));
+    LocalRegion region =
+        spy(new LocalRegion("region", regionAttributes, null, cache, internalRegionArguments,
+            internalDataView, regionMapConstructor, serverRegionProxyConstructor, entryEventFactory,
+            poolFinder, regionPerfStatsFactory, disabledClock()));
+
+    RegionEntry regionEntry1 = mock(RegionEntry.class);
+    RegionEntry regionEntry2 = mock(RegionEntry.class);
+    EntryExpiryTask entryExpiryTask1 = spy(new EntryExpiryTask(region, regionEntry1));
+    EntryExpiryTask entryExpiryTask2 = spy(new EntryExpiryTask(region, regionEntry2));
+    region.entryExpiryTasks.put(regionEntry1, entryExpiryTask1);
+    region.entryExpiryTasks.put(regionEntry2, entryExpiryTask2);
+
+    region.cancelAllEntryExpiryTasks();
+    assertThat(region.entryExpiryTasks).isEmpty();
+    verify(entryExpiryTask1, times(1)).cancel();
+    verify(entryExpiryTask2, times(1)).cancel();
+  }
 }
diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/PartitionedRegionClearTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/PartitionedRegionClearTest.java
new file mode 100644
index 0000000000..3b66e67a59
--- /dev/null
+++ b/geode-core/src/test/java/org/apache/geode/internal/cache/PartitionedRegionClearTest.java
@@ -0,0 +1,897 @@
+/*
+ * 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.cache;
+
+import static java.util.Collections.emptySet;
+import static java.util.Collections.singleton;
+import static org.apache.geode.internal.cache.FilterProfile.NO_PROFILES;
+import static org.apache.geode.util.internal.UncheckedUtils.uncheckedCast;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.catchThrowable;
+import static org.mockito.ArgumentCaptor.forClass;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.ArgumentCaptor;
+
+import org.apache.geode.CancelCriterion;
+import org.apache.geode.cache.PartitionedRegionPartialClearException;
+import org.apache.geode.cache.Region;
+import org.apache.geode.distributed.DistributedLockService;
+import org.apache.geode.distributed.internal.DMStats;
+import org.apache.geode.distributed.internal.DistributionManager;
+import org.apache.geode.distributed.internal.InternalDistributedSystem;
+import org.apache.geode.distributed.internal.MembershipListener;
+import org.apache.geode.distributed.internal.membership.InternalDistributedMember;
+import org.apache.geode.internal.cache.PartitionedRegion.RetryTimeKeeper;
+import org.apache.geode.internal.cache.PartitionedRegionClear.PartitionedRegionClearListener;
+import org.apache.geode.internal.cache.PartitionedRegionClearMessage.OperationType;
+import org.apache.geode.internal.cache.partitioned.RegionAdvisor;
+import org.apache.geode.internal.serialization.KnownVersion;
+
+public class PartitionedRegionClearTest {
+
+  private DistributionManager distributionManager;
+  private PartitionedRegion partitionedRegion;
+  private RegionAdvisor regionAdvisor;
+  private InternalDistributedMember internalDistributedMember;
+
+  private PartitionedRegionClear partitionedRegionClear;
+
+  @Before
+  public void setUp() {
+    distributionManager = mock(DistributionManager.class);
+    internalDistributedMember = mock(InternalDistributedMember.class);
+    partitionedRegion = mock(PartitionedRegion.class);
+    regionAdvisor = mock(RegionAdvisor.class);
+
+    when(distributionManager.getDistributionManagerId()).thenReturn(internalDistributedMember);
+    when(distributionManager.getId()).thenReturn(internalDistributedMember);
+    when(internalDistributedMember.getVersion()).thenReturn(KnownVersion.CURRENT);
+    when(partitionedRegion.getDistributionManager()).thenReturn(distributionManager);
+    when(partitionedRegion.getName()).thenReturn("prRegion");
+    when(partitionedRegion.getRegionAdvisor()).thenReturn(regionAdvisor);
+    when(regionAdvisor.getDistributionManager()).thenReturn(distributionManager);
+
+    partitionedRegionClear = new PartitionedRegionClear(partitionedRegion);
+  }
+
+  @Test
+  public void isLockedForListenerAndClientNotificationReturnsTrueWhenLocked() {
+    // arrange
+    when(distributionManager.isCurrentMember(internalDistributedMember)).thenReturn(true);
+    partitionedRegionClear.obtainClearLockLocal(internalDistributedMember);
+
+    // act
+    boolean result = partitionedRegionClear.isLockedForListenerAndClientNotification();
+
+    // assert
+    assertThat(result).isTrue();
+  }
+
+  @Test
+  public void isLockedForListenerAndClientNotificationReturnsFalseWhenMemberNotInTheSystemRequestsLock() {
+    // arrange
+    when(distributionManager.isCurrentMember(internalDistributedMember)).thenReturn(false);
+
+    // act
+    boolean result = partitionedRegionClear.isLockedForListenerAndClientNotification();
+
+    // assert
+    assertThat(result).isFalse();
+  }
+
+  @Test
+  public void acquireDistributedClearLockGetsDistributedLock() {
+    // arrange
+    DistributedLockService distributedLockService = mock(DistributedLockService.class);
+    String lockName = PartitionedRegionClear.CLEAR_OPERATION + partitionedRegion.getName();
+    when(partitionedRegion.getPartitionedRegionLockService()).thenReturn(distributedLockService);
+
+    // act
+    partitionedRegionClear.acquireDistributedClearLock(lockName);
+
+    // assert
+    verify(distributedLockService).lock(lockName, -1, -1);
+  }
+
+  @Test
+  public void releaseDistributedClearLockReleasesDistributedLock() {
+    // arrange
+    DistributedLockService distributedLockService = mock(DistributedLockService.class);
+    String lockName = PartitionedRegionClear.CLEAR_OPERATION + partitionedRegion.getName();
+    when(partitionedRegion.getPartitionedRegionLockService()).thenReturn(distributedLockService);
+
+    // act
+    partitionedRegionClear.releaseDistributedClearLock(lockName);
+
+    // assert
+    verify(distributedLockService).unlock(lockName);
+  }
+
+  @Test
+  public void obtainLockForClearGetsLocalLockAndSendsMessageForRemote() throws Exception {
+    // arrange
+    Region<String, PartitionRegionConfig> region = uncheckedCast(mock(Region.class));
+    RegionEventImpl regionEvent = mock(RegionEventImpl.class);
+
+    // partial mocking to stub some methods and verify
+    PartitionedRegionClear spyPartitionedRegionClear = spy(partitionedRegionClear);
+    when(partitionedRegion.getPRRoot())
+        .thenReturn(region);
+    when(regionEvent.clone())
+        .thenReturn(mock(RegionEventImpl.class));
+    doReturn(emptySet())
+        .when(spyPartitionedRegionClear)
+        .attemptToSendPartitionedRegionClearMessage(regionEvent,
+            OperationType.OP_LOCK_FOR_PR_CLEAR);
+
+    // act
+    spyPartitionedRegionClear.obtainLockForClear(regionEvent);
+
+    // assert
+    verify(spyPartitionedRegionClear)
+        .obtainClearLockLocal(internalDistributedMember);
+    verify(spyPartitionedRegionClear)
+        .sendPartitionedRegionClearMessage(regionEvent, OperationType.OP_LOCK_FOR_PR_CLEAR);
+  }
+
+  @Test
+  public void releaseLockForClearReleasesLocalLockAndSendsMessageForRemote() throws Exception {
+    // arrange
+    Region<String, PartitionRegionConfig> region = uncheckedCast(mock(Region.class));
+    RegionEventImpl regionEvent = mock(RegionEventImpl.class);
+
+    when(partitionedRegion.getPRRoot())
+        .thenReturn(region);
+    when(regionEvent.clone())
+        .thenReturn(mock(RegionEventImpl.class));
+
+    // partial mocking to stub some methods and verify
+    PartitionedRegionClear spyPartitionedRegionClear = spy(partitionedRegionClear);
+    doReturn(emptySet())
+        .when(spyPartitionedRegionClear)
+        .attemptToSendPartitionedRegionClearMessage(regionEvent,
+            OperationType.OP_UNLOCK_FOR_PR_CLEAR);
+
+    // act
+    spyPartitionedRegionClear.releaseLockForClear(regionEvent);
+
+    // assert
+    verify(spyPartitionedRegionClear)
+        .releaseClearLockLocal();
+    verify(spyPartitionedRegionClear)
+        .sendPartitionedRegionClearMessage(regionEvent, OperationType.OP_UNLOCK_FOR_PR_CLEAR);
+  }
+
+  @Test
+  public void clearRegionClearsLocalAndSendsMessageForRemote() throws Exception {
+    // arrange
+    Region<String, PartitionRegionConfig> region = uncheckedCast(mock(Region.class));
+    RegionEventImpl regionEvent = mock(RegionEventImpl.class);
+
+    when(partitionedRegion.getPRRoot())
+        .thenReturn(region);
+    when(regionEvent.clone())
+        .thenReturn(mock(RegionEventImpl.class));
+
+    // partial mocking to stub some methods and verify
+    PartitionedRegionClear spyPartitionedRegionClear = spy(partitionedRegionClear);
+    doReturn(emptySet())
+        .when(spyPartitionedRegionClear)
+        .attemptToSendPartitionedRegionClearMessage(regionEvent, OperationType.OP_PR_CLEAR);
+
+    // act
+    spyPartitionedRegionClear.clearRegion(regionEvent);
+
+    // assert
+    verify(spyPartitionedRegionClear)
+        .clearRegionLocal(regionEvent);
+    verify(spyPartitionedRegionClear)
+        .sendPartitionedRegionClearMessage(regionEvent, OperationType.OP_PR_CLEAR);
+  }
+
+  @Test
+  public void waitForPrimaryReturnsAfterFindingAllPrimary() {
+    // arrange
+    BucketAdvisor bucketAdvisor = mock(BucketAdvisor.class);
+    PartitionedRegionDataStore dataStore = mock(PartitionedRegionDataStore.class);
+    RetryTimeKeeper retryTimer = mock(RetryTimeKeeper.class);
+    when(bucketAdvisor.hasPrimary()).thenReturn(true);
+    when(partitionedRegion.getDataStore()).thenReturn(dataStore);
+    setupBucketRegions(dataStore, bucketAdvisor);
+
+    // act
+    partitionedRegionClear.waitForPrimary(retryTimer);
+
+    // assert
+    verify(retryTimer, never()).waitForBucketsRecovery();
+  }
+
+  @Test
+  public void waitForPrimaryReturnsAfterRetryForPrimary() {
+    // arrange
+    BucketAdvisor bucketAdvisor = mock(BucketAdvisor.class);
+    PartitionedRegionDataStore dataStore = mock(PartitionedRegionDataStore.class);
+    RetryTimeKeeper retryTimer = mock(RetryTimeKeeper.class);
+    when(bucketAdvisor.hasPrimary()).thenReturn(false).thenReturn(true);
+    when(partitionedRegion.getDataStore()).thenReturn(dataStore);
+    setupBucketRegions(dataStore, bucketAdvisor);
+
+    // act
+    partitionedRegionClear.waitForPrimary(retryTimer);
+
+    // assert
+    verify(retryTimer).waitForBucketsRecovery();
+  }
+
+  @Test
+  public void waitForPrimaryThrowsPartitionedRegionPartialClearException() {
+    // arrange
+    BucketAdvisor bucketAdvisor = mock(BucketAdvisor.class);
+    PartitionedRegionDataStore dataStore = mock(PartitionedRegionDataStore.class);
+    RetryTimeKeeper retryTimer = mock(RetryTimeKeeper.class);
+    when(partitionedRegion.getDataStore())
+        .thenReturn(dataStore);
+    when(retryTimer.overMaximum())
+        .thenReturn(true);
+    setupBucketRegions(dataStore, bucketAdvisor);
+
+    // act
+    Throwable thrown = catchThrowable(() -> partitionedRegionClear.waitForPrimary(retryTimer));
+
+    // assert
+    assertThat(thrown)
+        .isInstanceOf(PartitionedRegionPartialClearException.class)
+        .hasMessage(
+            "Unable to find primary bucket region during clear operation on prRegion region.");
+    verify(retryTimer, never())
+        .waitForBucketsRecovery();
+  }
+
+  @Test
+  public void clearRegionLocalCallsClearOnLocalPrimaryBucketRegions() {
+    // arrange
+    BucketAdvisor bucketAdvisor = mock(BucketAdvisor.class);
+    PartitionedRegionDataStore dataStore = mock(PartitionedRegionDataStore.class);
+    RegionEventImpl regionEvent = mock(RegionEventImpl.class);
+    when(bucketAdvisor.hasPrimary()).thenReturn(true);
+    when(partitionedRegion.getDataStore()).thenReturn(dataStore);
+    doNothing().when(dataStore).lockBucketCreationForRegionClear();
+    Set<BucketRegion> buckets = setupBucketRegions(dataStore, bucketAdvisor);
+
+    // act
+    Set<Integer> bucketsCleared = partitionedRegionClear.clearRegionLocal(regionEvent);
+
+    // assert
+    assertThat(bucketsCleared).hasSameSizeAs(buckets);
+    ArgumentCaptor<RegionEventImpl> captor = forClass(RegionEventImpl.class);
+    for (BucketRegion bucketRegion : buckets) {
+      verify(bucketRegion).cmnClearRegion(captor.capture(), eq(false), eq(true));
+      Region<?, ?> region = captor.getValue().getRegion();
+      assertThat(region).isEqualTo(bucketRegion);
+    }
+  }
+
+  @Test
+  public void clearRegionLocalRetriesClearOnNonClearedLocalPrimaryBucketRegionsWhenMembershipChanges() {
+    // arrange
+    BucketAdvisor bucketAdvisor = mock(BucketAdvisor.class);
+    PartitionedRegionDataStore dataStore = mock(PartitionedRegionDataStore.class);
+    RegionEventImpl regionEvent = mock(RegionEventImpl.class);
+
+    when(bucketAdvisor.hasPrimary())
+        .thenReturn(true);
+    doNothing()
+        .when(dataStore)
+        .lockBucketCreationForRegionClear();
+
+    Set<BucketRegion> buckets = setupBucketRegions(dataStore, bucketAdvisor);
+
+    Set<BucketRegion> allBuckets = new HashSet<>(buckets);
+    for (int i = 0; i < 3; i++) {
+      BucketRegion bucketRegion = mock(BucketRegion.class);
+      when(bucketRegion.getBucketAdvisor())
+          .thenReturn(bucketAdvisor);
+      when(bucketRegion.getId())
+          .thenReturn(i + buckets.size());
+      when(bucketRegion.size())
+          .thenReturn(1);
+      allBuckets.add(bucketRegion);
+    }
+
+    // After the first try, add 3 extra buckets to the local bucket regions
+    when(dataStore.getAllLocalBucketRegions())
+        .thenReturn(buckets)
+        .thenReturn(allBuckets);
+    when(dataStore.getAllLocalPrimaryBucketRegions())
+        .thenReturn(buckets)
+        .thenReturn(allBuckets);
+    when(partitionedRegion.getDataStore())
+        .thenReturn(dataStore);
+
+    // partial mocking to stub some methods
+    PartitionedRegionClear spyPartitionedRegionClear = spy(partitionedRegionClear);
+    when(spyPartitionedRegionClear.getMembershipChange())
+        .thenReturn(true)
+        .thenReturn(false);
+
+    // act
+    Set<Integer> bucketsCleared = spyPartitionedRegionClear.clearRegionLocal(regionEvent);
+
+    // assert
+    assertThat(bucketsCleared).hasSameSizeAs(allBuckets);
+    ArgumentCaptor<RegionEventImpl> captor = forClass(RegionEventImpl.class);
+    for (BucketRegion bucketRegion : allBuckets) {
+      verify(bucketRegion)
+          .cmnClearRegion(captor.capture(), eq(false), eq(true));
+      Region<?, ?> region = captor.getValue().getRegion();
+      assertThat(region).isEqualTo(bucketRegion);
+    }
+  }
+
+  @Test
+  public void doAfterClearCallsNotifyClientsWhenClientHaveInterests() {
+    // arrange
+    FilterProfile filterProfile = mock(FilterProfile.class);
+    FilterRoutingInfo filterRoutingInfo = mock(FilterRoutingInfo.class);
+    RegionEventImpl regionEvent = mock(RegionEventImpl.class);
+
+    when(filterProfile.getFilterRoutingInfoPart1(regionEvent, NO_PROFILES, emptySet()))
+        .thenReturn(filterRoutingInfo);
+    when(filterProfile.getFilterRoutingInfoPart2(filterRoutingInfo, regionEvent))
+        .thenReturn(filterRoutingInfo);
+    when(partitionedRegion.getFilterProfile()).thenReturn(filterProfile);
+    when(partitionedRegion.hasAnyClientsInterested())
+        .thenReturn(true);
+
+    // act
+    partitionedRegionClear.doAfterClear(regionEvent);
+
+    // assert
+    verify(regionEvent)
+        .setLocalFilterInfo(any());
+    verify(partitionedRegion)
+        .notifyBridgeClients(regionEvent);
+  }
+
+  @Test
+  public void doAfterClearDispatchesListenerEvents() {
+    // arrange
+    RegionEventImpl regionEvent = mock(RegionEventImpl.class);
+    when(partitionedRegion.hasListener())
+        .thenReturn(true);
+
+    // act
+    partitionedRegionClear.doAfterClear(regionEvent);
+
+    verify(partitionedRegion)
+        .dispatchListenerEvent(EnumListenerEvent.AFTER_REGION_CLEAR, regionEvent);
+  }
+
+  @Test
+  public void obtainClearLockLocalGetsLockOnPrimaryBuckets() {
+    // arrange
+    BucketAdvisor bucketAdvisor = mock(BucketAdvisor.class);
+    PartitionedRegionDataStore dataStore = mock(PartitionedRegionDataStore.class);
+
+    when(bucketAdvisor.hasPrimary())
+        .thenReturn(true);
+    when(distributionManager.isCurrentMember(internalDistributedMember))
+        .thenReturn(true);
+    when(partitionedRegion.getDataStore())
+        .thenReturn(dataStore);
+
+    Set<BucketRegion> buckets = setupBucketRegions(dataStore, bucketAdvisor);
+
+    // act
+    partitionedRegionClear.obtainClearLockLocal(internalDistributedMember);
+
+    // assert
+    // TODO: encapsulate lockForListenerAndClientNotification
+    assertThat(partitionedRegionClear.lockForListenerAndClientNotification.getLockRequester())
+        .isSameAs(internalDistributedMember);
+    for (BucketRegion bucketRegion : buckets) {
+      verify(bucketRegion)
+          .lockLocallyForClear(partitionedRegion.getDistributionManager(),
+              partitionedRegion.getMyId(), null);
+    }
+  }
+
+  @Test
+  public void obtainClearLockLocalDoesNotGetLocksOnPrimaryBucketsWhenMemberIsNotCurrent() {
+    // arrange
+    BucketAdvisor bucketAdvisor = mock(BucketAdvisor.class);
+    PartitionedRegionDataStore dataStore = mock(PartitionedRegionDataStore.class);
+
+    when(bucketAdvisor.hasPrimary())
+        .thenReturn(true);
+    when(distributionManager.isCurrentMember(internalDistributedMember))
+        .thenReturn(false);
+    when(partitionedRegion.getDataStore())
+        .thenReturn(dataStore);
+
+    Set<BucketRegion> buckets = setupBucketRegions(dataStore, bucketAdvisor);
+
+    // act
+    partitionedRegionClear.obtainClearLockLocal(internalDistributedMember);
+
+    // assert
+    assertThat(partitionedRegionClear.lockForListenerAndClientNotification.getLockRequester())
+        .isNull();
+    for (BucketRegion bucketRegion : buckets) {
+      verify(bucketRegion, never())
+          .lockLocallyForClear(partitionedRegion.getDistributionManager(),
+              partitionedRegion.getMyId(), null);
+    }
+  }
+
+  @Test
+  public void releaseClearLockLocalReleasesLockOnPrimaryBuckets() {
+    // arrange
+    BucketAdvisor bucketAdvisor = mock(BucketAdvisor.class);
+    PartitionedRegionDataStore dataStore = mock(PartitionedRegionDataStore.class);
+
+    when(bucketAdvisor.hasPrimary())
+        .thenReturn(true);
+    when(distributionManager.isCurrentMember(internalDistributedMember))
+        .thenReturn(true);
+    when(partitionedRegion.getDataStore())
+        .thenReturn(dataStore);
+
+    Set<BucketRegion> buckets = setupBucketRegions(dataStore, bucketAdvisor);
+
+    partitionedRegionClear.lockForListenerAndClientNotification
+        .setLocked(internalDistributedMember);
+
+    // act
+    partitionedRegionClear.releaseClearLockLocal();
+
+    // assert
+    for (BucketRegion bucketRegion : buckets) {
+      verify(bucketRegion)
+          .releaseLockLocallyForClear(null);
+    }
+  }
+
+  @Test
+  public void releaseClearLockLocalDoesNotReleaseLocksOnPrimaryBucketsWhenMemberIsNotCurrent() {
+    // arrange
+    BucketAdvisor bucketAdvisor = mock(BucketAdvisor.class);
+    PartitionedRegionDataStore dataStore = mock(PartitionedRegionDataStore.class);
+
+    when(bucketAdvisor.hasPrimary())
+        .thenReturn(true);
+    when(partitionedRegion.getDataStore())
+        .thenReturn(dataStore);
+
+    Set<BucketRegion> buckets = setupBucketRegions(dataStore, bucketAdvisor);
+
+    // act
+    partitionedRegionClear.releaseClearLockLocal();
+
+    // assert
+    assertThat(partitionedRegionClear.lockForListenerAndClientNotification.getLockRequester())
+        .isNull();
+    for (BucketRegion bucketRegion : buckets) {
+      verify(bucketRegion, never())
+          .releaseLockLocallyForClear(null);
+    }
+  }
+
+  @Test
+  public void sendPartitionedRegionClearMessageSendsClearMessageToPRNodes() {
+    // arrange
+    InternalCache internalCache = mock(InternalCache.class);
+    InternalDistributedMember member = mock(InternalDistributedMember.class);
+    Node node = mock(Node.class);
+    PartitionRegionConfig partitionRegionConfig = mock(PartitionRegionConfig.class);
+    Region<String, PartitionRegionConfig> prRoot = uncheckedCast(mock(Region.class));
+    RegionEventImpl regionEvent = mock(RegionEventImpl.class);
+    InternalDistributedSystem system = mock(InternalDistributedSystem.class);
+    TXManagerImpl txManager = mock(TXManagerImpl.class);
+
+    Set<InternalDistributedMember> prNodes = singleton(member);
+    Set<Node> configNodes = singleton(node);
+
+    when(distributionManager.getCancelCriterion())
+        .thenReturn(mock(CancelCriterion.class));
+    when(distributionManager.getStats())
+        .thenReturn(mock(DMStats.class));
+    when(internalCache.getTxManager())
+        .thenReturn(txManager);
+    when(member.getVersion())
+        .thenReturn(KnownVersion.getCurrentVersion());
+    when(node.getMemberId())
+        .thenReturn(member);
+    when(partitionRegionConfig.getNodes())
+        .thenReturn(configNodes);
+    when(partitionedRegion.getPRRoot())
+        .thenReturn(prRoot);
+    when(regionAdvisor.adviseAllPRNodes())
+        .thenReturn(prNodes);
+    when(regionEvent.clone())
+        .thenReturn(mock(RegionEventImpl.class));
+    when(partitionedRegion.getSystem())
+        .thenReturn(system);
+    when(prRoot.get(anyString()))
+        .thenReturn(partitionRegionConfig);
+    when(system.getDistributionManager())
+        .thenReturn(distributionManager);
+    when(txManager.isDistributed())
+        .thenReturn(false);
+    when(partitionedRegion.getCache())
+        .thenReturn(internalCache);
+
+    // act
+    partitionedRegionClear
+        .sendPartitionedRegionClearMessage(regionEvent, OperationType.OP_PR_CLEAR);
+
+    // assert
+    verify(distributionManager)
+        .putOutgoing(any());
+  }
+
+  @Test
+  public void doClearAcquiresAndReleasesDistributedClearLockAndCreatesAllPrimaryBuckets() {
+    // arrange
+    RegionEventImpl regionEvent = mock(RegionEventImpl.class);
+
+    // partial mocking to stub some methods and verify
+    PartitionedRegionClear spyPartitionedRegionClear = spy(partitionedRegionClear);
+    doNothing().when(spyPartitionedRegionClear).acquireDistributedClearLock(any());
+    doNothing().when(spyPartitionedRegionClear).assignAllPrimaryBuckets();
+    doReturn(emptySet()).when(spyPartitionedRegionClear).clearRegion(regionEvent);
+
+    // act
+    spyPartitionedRegionClear.doClear(regionEvent, false);
+
+    // assert
+    verify(spyPartitionedRegionClear).acquireDistributedClearLock(any());
+    verify(spyPartitionedRegionClear).releaseDistributedClearLock(any());
+    verify(spyPartitionedRegionClear).assignAllPrimaryBuckets();
+  }
+
+  @Test
+  public void doClearInvokesCacheWriterWhenCacheWriteIsSet() {
+    // arrange
+    RegionEventImpl regionEvent = mock(RegionEventImpl.class);
+
+    // partial mocking to stub some methods and verify
+    PartitionedRegionClear spyPartitionedRegionClear = spy(partitionedRegionClear);
+    doNothing().when(spyPartitionedRegionClear).acquireDistributedClearLock(any());
+    doNothing().when(spyPartitionedRegionClear).assignAllPrimaryBuckets();
+    doReturn(emptySet()).when(spyPartitionedRegionClear).clearRegion(regionEvent);
+
+    // act
+    spyPartitionedRegionClear.doClear(regionEvent, true);
+
+    // assert
+    verify(spyPartitionedRegionClear).invokeCacheWriter(regionEvent);
+  }
+
+  @Test
+  public void doClearDoesNotInvokesCacheWriterWhenCacheWriteIsNotSet() {
+    // arrange
+    RegionEventImpl regionEvent = mock(RegionEventImpl.class);
+
+    // partial mocking to stub some methods and verify
+    PartitionedRegionClear spyPartitionedRegionClear = spy(partitionedRegionClear);
+    doNothing().when(spyPartitionedRegionClear).acquireDistributedClearLock(any());
+    doNothing().when(spyPartitionedRegionClear).assignAllPrimaryBuckets();
+    doReturn(emptySet()).when(spyPartitionedRegionClear).clearRegion(regionEvent);
+
+    // act
+    spyPartitionedRegionClear.doClear(regionEvent, false);
+
+    // assert
+    verify(spyPartitionedRegionClear, never()).invokeCacheWriter(regionEvent);
+  }
+
+  @Test
+  public void doClearObtainsAndReleasesLockForClearWhenRegionHasListener() {
+    // arrange
+    RegionEventImpl regionEvent = mock(RegionEventImpl.class);
+
+    when(partitionedRegion.hasAnyClientsInterested()).thenReturn(false);
+    when(partitionedRegion.hasListener()).thenReturn(true);
+
+    // partial mocking to stub some methods and verify
+    PartitionedRegionClear spyPartitionedRegionClear = spy(partitionedRegionClear);
+    doNothing().when(spyPartitionedRegionClear).acquireDistributedClearLock(any());
+    doNothing().when(spyPartitionedRegionClear).assignAllPrimaryBuckets();
+    doNothing().when(spyPartitionedRegionClear).obtainLockForClear(regionEvent);
+    doNothing().when(spyPartitionedRegionClear).releaseLockForClear(regionEvent);
+    doReturn(emptySet()).when(spyPartitionedRegionClear).clearRegion(regionEvent);
+
+    // act
+    spyPartitionedRegionClear.doClear(regionEvent, false);
+
+    // assert
+    verify(spyPartitionedRegionClear).obtainLockForClear(regionEvent);
+    verify(spyPartitionedRegionClear).releaseLockForClear(regionEvent);
+  }
+
+  @Test
+  public void doClearObtainsAndReleasesLockForClearWhenRegionHasClientInterest() {
+    // arrange
+    boolean cacheWrite = false;
+    RegionEventImpl regionEvent = mock(RegionEventImpl.class);
+
+    when(partitionedRegion.hasAnyClientsInterested()).thenReturn(true);
+    when(partitionedRegion.hasListener()).thenReturn(false);
+
+    // partial mocking to stub some methods and verify
+    PartitionedRegionClear spyPartitionedRegionClear = spy(partitionedRegionClear);
+    doNothing().when(spyPartitionedRegionClear).acquireDistributedClearLock(any());
+    doNothing().when(spyPartitionedRegionClear).assignAllPrimaryBuckets();
+    doNothing().when(spyPartitionedRegionClear).obtainLockForClear(regionEvent);
+    doNothing().when(spyPartitionedRegionClear).releaseLockForClear(regionEvent);
+    doReturn(emptySet()).when(spyPartitionedRegionClear).clearRegion(regionEvent);
+
+    // act
+    spyPartitionedRegionClear.doClear(regionEvent, cacheWrite);
+
+    // assert
+    verify(spyPartitionedRegionClear).obtainLockForClear(regionEvent);
+    verify(spyPartitionedRegionClear).releaseLockForClear(regionEvent);
+  }
+
+  @Test
+  public void doClearDoesNotObtainLockForClearWhenRegionHasNoListenerAndNoClientInterest() {
+    // arrange
+    RegionEventImpl regionEvent = mock(RegionEventImpl.class);
+
+    when(partitionedRegion.hasAnyClientsInterested()).thenReturn(false);
+    when(partitionedRegion.hasListener()).thenReturn(false);
+
+    // partial mocking to stub some methods and verify
+    PartitionedRegionClear spyPartitionedRegionClear = spy(partitionedRegionClear);
+    doNothing().when(spyPartitionedRegionClear).acquireDistributedClearLock(any());
+    doNothing().when(spyPartitionedRegionClear).assignAllPrimaryBuckets();
+    doNothing().when(spyPartitionedRegionClear).obtainLockForClear(regionEvent);
+    doNothing().when(spyPartitionedRegionClear).releaseLockForClear(regionEvent);
+    doReturn(emptySet()).when(spyPartitionedRegionClear).clearRegion(regionEvent);
+
+    // act
+    spyPartitionedRegionClear.doClear(regionEvent, false);
+
+    // assert
+    verify(spyPartitionedRegionClear, never()).obtainLockForClear(regionEvent);
+    verify(spyPartitionedRegionClear, never()).releaseLockForClear(regionEvent);
+  }
+
+  @Test
+  public void doClearThrowsPartitionedRegionPartialClearException() {
+    // arrange
+    RegionEventImpl regionEvent = mock(RegionEventImpl.class);
+
+    when(partitionedRegion.hasListener()).thenReturn(false);
+    when(partitionedRegion.hasAnyClientsInterested()).thenReturn(false);
+    when(partitionedRegion.getTotalNumberOfBuckets()).thenReturn(1);
+    when(partitionedRegion.getName()).thenReturn("prRegion");
+
+    // partial mocking to stub some methods
+    PartitionedRegionClear spyPartitionedRegionClear = spy(partitionedRegionClear);
+    doNothing().when(spyPartitionedRegionClear).acquireDistributedClearLock(any());
+    doNothing().when(spyPartitionedRegionClear).assignAllPrimaryBuckets();
+    doNothing().when(spyPartitionedRegionClear).obtainLockForClear(regionEvent);
+    doNothing().when(spyPartitionedRegionClear).releaseLockForClear(regionEvent);
+    doReturn(emptySet()).when(spyPartitionedRegionClear).clearRegion(regionEvent);
+
+    // act
+    Throwable thrown =
+        catchThrowable(() -> spyPartitionedRegionClear.doClear(regionEvent, false));
+
+    // assert
+    assertThat(thrown)
+        .isInstanceOf(PartitionedRegionPartialClearException.class)
+        .hasMessage(
+            "Unable to clear all the buckets from the partitioned region prRegion, either data (buckets) moved or member departed.");
+  }
+
+  @Test
+  public void doClearThrowsUnsupportedOperationException() {
+    // arrange
+    InternalDistributedMember member = mock(InternalDistributedMember.class);
+    InternalDistributedMember oldMember = mock(InternalDistributedMember.class);
+    Node node = mock(Node.class);
+    Node oldNode = mock(Node.class);
+
+    Set<InternalDistributedMember> prNodes = new HashSet<>();
+    prNodes.add(member);
+    prNodes.add(oldMember);
+
+    Set<Node> configNodes = new HashSet<>();
+    configNodes.add(node);
+    configNodes.add(oldNode);
+
+    InternalCache cache = mock(InternalCache.class);
+    PartitionRegionConfig partitionRegionConfig = mock(PartitionRegionConfig.class);
+    Region<String, PartitionRegionConfig> prRoot = uncheckedCast(mock(Region.class));
+    RegionEventImpl regionEvent = mock(RegionEventImpl.class);
+    InternalDistributedSystem system = mock(InternalDistributedSystem.class);
+    TXManagerImpl txManager = mock(TXManagerImpl.class);
+
+    when(member.getName()).thenReturn("member");
+    when(oldMember.getName()).thenReturn("oldMember");
+    when(node.getMemberId()).thenReturn(member);
+    when(oldNode.getMemberId()).thenReturn(oldMember);
+    when(member.getVersion()).thenReturn(KnownVersion.getCurrentVersion());
+    when(oldMember.getVersion()).thenReturn(KnownVersion.GEODE_1_11_0);
+
+    when(cache.getTxManager()).thenReturn(txManager);
+    when(distributionManager.getCancelCriterion()).thenReturn(mock(CancelCriterion.class));
+    when(distributionManager.getStats()).thenReturn(mock(DMStats.class));
+    when(partitionRegionConfig.getNodes()).thenReturn(configNodes);
+    when(partitionedRegion.getBucketPrimary(0)).thenReturn(member);
+    when(partitionedRegion.getBucketPrimary(1)).thenReturn(oldMember);
+    when(partitionedRegion.getCache()).thenReturn(cache);
+    when(partitionedRegion.getName()).thenReturn("prRegion");
+    when(partitionedRegion.getPRRoot()).thenReturn(prRoot);
+    when(partitionedRegion.getSystem()).thenReturn(system);
+    when(partitionedRegion.getTotalNumberOfBuckets()).thenReturn(2);
+    when(partitionedRegion.hasListener()).thenReturn(false);
+    when(partitionedRegion.hasAnyClientsInterested()).thenReturn(false);
+    when(prRoot.get(anyString())).thenReturn(partitionRegionConfig);
+    when(regionAdvisor.adviseAllPRNodes()).thenReturn(prNodes);
+    when(regionEvent.clone()).thenReturn(mock(RegionEventImpl.class));
+    when(system.getDistributionManager()).thenReturn(distributionManager);
+    when(txManager.isDistributed()).thenReturn(false);
+
+    // partial mocking to stub some methods
+    PartitionedRegionClear spyPartitionedRegionClear = spy(partitionedRegionClear);
+    doNothing().when(spyPartitionedRegionClear).acquireDistributedClearLock(any());
+    doNothing().when(spyPartitionedRegionClear).assignAllPrimaryBuckets();
+    doNothing().when(spyPartitionedRegionClear).obtainLockForClear(regionEvent);
+    doNothing().when(spyPartitionedRegionClear).releaseLockForClear(regionEvent);
+    doReturn(singleton("2")).when(spyPartitionedRegionClear).clearRegion(regionEvent);
+
+    // act
+    Throwable thrown =
+        catchThrowable(() -> spyPartitionedRegionClear.doClear(regionEvent, false));
+
+    // assert
+    assertThat(thrown)
+        .isInstanceOf(UnsupportedOperationException.class)
+        .hasMessage(
+            "A server's [oldMember] version was too old (< GEODE 1.14.0) for : Partitioned Region Clear");
+  }
+
+  @Test
+  public void handleClearFromDepartedMemberReleasesTheLockForRequesterDeparture() {
+    // arrange
+    InternalDistributedMember member = mock(InternalDistributedMember.class);
+    partitionedRegionClear.lockForListenerAndClientNotification.setLocked(member);
+
+    // partial mocking to verify
+    PartitionedRegionClear spyPartitionedRegionClear = spy(partitionedRegionClear);
+
+    // act
+    spyPartitionedRegionClear.handleClearFromDepartedMember(member);
+
+    // assert
+    verify(spyPartitionedRegionClear).releaseClearLockLocal();
+  }
+
+  @Test
+  public void handleClearFromDepartedMemberDoesNotReleasesTheLockForNonRequesterDeparture() {
+    // arrange
+    InternalDistributedMember requesterMember = mock(InternalDistributedMember.class);
+    InternalDistributedMember member = mock(InternalDistributedMember.class);
+    partitionedRegionClear.lockForListenerAndClientNotification.setLocked(requesterMember);
+
+    // partial mocking to verify
+    PartitionedRegionClear spyPartitionedRegionClear = spy(partitionedRegionClear);
+
+    // act
+    spyPartitionedRegionClear.handleClearFromDepartedMember(member);
+
+    // assert
+    verify(spyPartitionedRegionClear, never()).releaseClearLockLocal();
+  }
+
+  @Test
+  public void partitionedRegionClearRegistersMembershipListener() {
+    // assert
+    MembershipListener membershipListener =
+        partitionedRegionClear.getPartitionedRegionClearListener();
+    verify(distributionManager).addMembershipListener(membershipListener);
+  }
+
+  @Test
+  public void lockRequesterDepartureReleasesTheLock() {
+    // arrange
+    InternalDistributedMember member = mock(InternalDistributedMember.class);
+    partitionedRegionClear.lockForListenerAndClientNotification.setLocked(member);
+    PartitionedRegionClearListener partitionedRegionClearListener =
+        partitionedRegionClear.getPartitionedRegionClearListener();
+
+    // act
+    partitionedRegionClearListener.memberDeparted(distributionManager, member, true);
+
+    // assert
+    assertThat(partitionedRegionClear.getMembershipChange())
+        .isTrue();
+    assertThat(partitionedRegionClear.lockForListenerAndClientNotification.getLockRequester())
+        .isNull();
+  }
+
+  @Test
+  public void nonLockRequesterDepartureDoesNotReleasesTheLock() {
+    // arrange
+    InternalDistributedMember requesterMember = mock(InternalDistributedMember.class);
+    InternalDistributedMember member = mock(InternalDistributedMember.class);
+    partitionedRegionClear.lockForListenerAndClientNotification.setLocked(requesterMember);
+    PartitionedRegionClearListener partitionedRegionClearListener =
+        partitionedRegionClear.getPartitionedRegionClearListener();
+
+    // act
+    partitionedRegionClearListener.memberDeparted(distributionManager, member, true);
+
+    // assert
+    assertThat(partitionedRegionClear.getMembershipChange())
+        .isTrue();
+    assertThat(partitionedRegionClear.lockForListenerAndClientNotification.getLockRequester())
+        .isNotNull();
+  }
+
+  private Set<BucketRegion> setupBucketRegions(
+      PartitionedRegionDataStore dataStore,
+      BucketAdvisor bucketAdvisor) {
+    return setupBucketRegions(dataStore, bucketAdvisor, 2);
+  }
+
+  private Set<BucketRegion> setupBucketRegions(
+      PartitionedRegionDataStore dataStore,
+      BucketAdvisor bucketAdvisor,
+      int bucketCount) {
+    Set<BucketRegion> bucketRegions = new HashSet<>();
+
+    for (int i = 0; i < bucketCount; i++) {
+      BucketRegion bucketRegion = mock(BucketRegion.class);
+
+      when(bucketRegion.getBucketAdvisor())
+          .thenReturn(bucketAdvisor);
+      when(bucketRegion.getId())
+          .thenReturn(i);
+      when(bucketRegion.size())
+          .thenReturn(1)
+          .thenReturn(0);
+
+      bucketRegions.add(bucketRegion);
+    }
+
+    when(dataStore.getAllLocalBucketRegions())
+        .thenReturn(bucketRegions);
+    when(dataStore.getAllLocalPrimaryBucketRegions())
+        .thenReturn(bucketRegions);
+
+    return bucketRegions;
+  }
+}
diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/PartitionedRegionTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/PartitionedRegionTest.java
index b50e74b32c..3f958f8171 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/cache/PartitionedRegionTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/cache/PartitionedRegionTest.java
@@ -29,6 +29,7 @@ import static org.mockito.ArgumentMatchers.anyLong;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.ArgumentMatchers.isNull;
 import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doCallRealMethod;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.mock;
@@ -41,6 +42,7 @@ import static org.mockito.quality.Strictness.STRICT_STUBS;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
@@ -84,6 +86,7 @@ import org.apache.geode.distributed.internal.InternalDistributedSystem;
 import org.apache.geode.distributed.internal.membership.InternalDistributedMember;
 import org.apache.geode.internal.cache.control.InternalResourceManager;
 import org.apache.geode.internal.cache.partitioned.RegionAdvisor;
+import org.apache.geode.internal.cache.partitioned.ClearPRMessage;
 import org.apache.geode.internal.cache.partitioned.colocation.ColocationLoggerFactory;
 import org.apache.geode.test.junit.runners.GeodeParamsRunner;
 
@@ -239,6 +242,28 @@ public class PartitionedRegionTest {
         .isEqualTo(cacheWriter != null);
   }
 
+  @Test
+  public void clearShouldNotThrowUnsupportedOperationException() {
+    PartitionedRegion spyPartitionedRegion = spy(partitionedRegion);
+    doNothing().when(spyPartitionedRegion).checkReadiness();
+    doCallRealMethod().when(spyPartitionedRegion).basicClear(any());
+    doNothing().when(spyPartitionedRegion).basicClear(any(), anyBoolean());
+    spyPartitionedRegion.clear();
+  }
+
+  @Test
+  public void createClearPRMessagesShouldCreateMessagePerBucket() {
+    PartitionedRegion spyPartitionedRegion = spy(partitionedRegion);
+    RegionEventImpl regionEvent =
+        new RegionEventImpl(spyPartitionedRegion, Operation.REGION_CLEAR, null, false,
+            spyPartitionedRegion.getMyId(), true);
+    when(spyPartitionedRegion.getTotalNumberOfBuckets()).thenReturn(3);
+    EventID eventID = new EventID(spyPartitionedRegion.getCache().getDistributedSystem());
+    List<ClearPRMessage> msgs = spyPartitionedRegion.createClearPRMessages(eventID);
+    assertThat(msgs.size()).isEqualTo(3);
+  }
+
+
   @Test
   public void getBucketNodeForReadOrWriteReturnsPrimaryNodeForRegisterInterest() {
     // ARRANGE
diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/partitioned/ClearPRMessageTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/partitioned/ClearPRMessageTest.java
new file mode 100644
index 0000000000..acdd4fc368
--- /dev/null
+++ b/geode-core/src/test/java/org/apache/geode/internal/cache/partitioned/ClearPRMessageTest.java
@@ -0,0 +1,260 @@
+/*
+ * 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.cache.partitioned;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.anyInt;
... 1633 lines suppressed ...


[geode] 06/22: GEODE-9132: Remove unused DSFID constants

Posted by ji...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

jinmeiliao pushed a commit to branch feature/GEODE-7665
in repository https://gitbox.apache.org/repos/asf/geode.git

commit a4eedde17a52b710a0dbfd6c04ec5ed043fa964a
Author: Kirk Lund <kl...@apache.org>
AuthorDate: Thu Apr 15 17:07:43 2021 -0700

    GEODE-9132: Remove unused DSFID constants
---
 .../apache/geode/internal/serialization/DataSerializableFixedID.java   | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/DataSerializableFixedID.java b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/DataSerializableFixedID.java
index e216356682..9e337b4c6d 100644
--- a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/DataSerializableFixedID.java
+++ b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/DataSerializableFixedID.java
@@ -59,9 +59,6 @@ public interface DataSerializableFixedID extends SerializationVersions, BasicSer
   short CLEAR_PARTITIONED_REGION_REPLY_MESSAGE = -166;
   short CLEAR_PARTITIONED_REGION_MESSAGE = -165;
 
-  short PR_CLEAR_REPLY_MESSAGE = -164;
-  short PR_CLEAR_MESSAGE = -163;
-
   short DISTRIBUTED_PING_MESSAGE = -162;
 
   short REGION_REDUNDANCY_STATUS = -161;