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

2020-03-05 Thread nnag
This is an automated email from the ASF dual-hosted git repository.

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

commit ccb543fc2b3911304d15c84cda36b6ede0c2a41b
Author: zhouxh 
AuthorDate: Mon Jan 27 17:02:48 2020 -0800

GEODE-7683: introduce BR.cmnClearRegion

Co-authored-by: Xiaojian Zhou 

GEODE-7684: Create messaging class for PR Clear (#4689)

* Added new message class and test

Co-authored-by: Benjamin Ross 
Co-authored-by: Donal Evans 
---
 .../codeAnalysis/sanctionedDataSerializables.txt   |   8 +
 .../apache/geode/internal/cache/BucketRegion.java  |  38 +-
 .../geode/internal/cache/DistributedRegion.java|  23 +-
 .../internal/cache/partitioned/ClearPRMessage.java | 388 +
 .../internal/cache/BucketRegionJUnitTest.java  |  77 
 .../internal/cache/DistributedRegionJUnitTest.java |  18 +
 .../cache/partitioned/ClearPRMessageTest.java  | 288 +++
 .../serialization/DataSerializableFixedID.java |   3 +
 8 files changed, 832 insertions(+), 11 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 3076db7..d6806f2 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
@@ -1435,6 +1435,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-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 ac20526..db8c057 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
@@ -557,6 +557,36 @@ public class BucketRegion extends DistributedRegion 
implements Bucket {
 }
   }
 
+  @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;
+}
+
+boolean enableRVV = useRVV && getConcurrencyChecksEnabled();
+RegionVersionVector rvv = null;
+if (enableRVV) {
+  rvv = getVersionVector().getCloneForTransmission();
+}
+
+// get rvvLock
+Set 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
+  clearRegionLocally(regionEvent, cacheWrite, null);
+  distributeClearOperation(regionEvent, rvv, participants);
+
+  // TODO: call reindexUserDataRegion if there're lucene indexes
+} finally {
+  releaseWriteLocksForClear(regionEvent, participants);
+}
+  }
 
   long generateTailKey() {
 long key = 
eventSeqNum.addAndGet(partitionedRegion.getTotalNumberOfBuckets());
@@ -2094,11 +2124,9 @@ public class BucketRegion extends DistributedRegion 
implements Bucket {
   // if GII has failed, because there is not primary. So it's safe to set 
these
   // counters to 0.
   oldMemValue = bytesInMemory.getAndSet(0);
-}
-
-else {
-  throw new InternalGemFireError(
-  "Trying to clear a bucket region that was not destroyed or in 
initialization.");
+} else {
+  // BucketRegion's clear is supported now
+  oldMemValue = bytesInMemory.getAndSet(0);
 }
 if (oldMemValue != BUCKET_DESTROYED) {
   partitionedRegion.getPrStats().incDataStoreEntryCount(-sizeBeforeClear);
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 dd73b20..1465eef 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
@@ -2003,6 +2003,10 @@ public class DistributedRegion extends LocalRegion 
implements InternalDistribute
 super.basicClear(regionEvent, cacheWrite);
   }
 
+  void distributeClearOperation(RegionEventImpl regionEvent, 
RegionVersionVector rvv,
+  Set participants) {
+

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

2020-02-28 Thread zhouxj
This is an automated email from the ASF dual-hosted git repository.

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

commit 15c800304a507855cd04a9948d24d61b5da54211
Author: zhouxh 
AuthorDate: Mon Jan 27 17:02:48 2020 -0800

GEODE-7683: introduce BR.cmnClearRegion

Co-authored-by: Xiaojian Zhou 

GEODE-7684: Create messaging class for PR Clear (#4689)

* Added new message class and test

Co-authored-by: Benjamin Ross 
Co-authored-by: Donal Evans 
---
 .../codeAnalysis/sanctionedDataSerializables.txt   |   8 +
 .../apache/geode/internal/cache/BucketRegion.java  |  38 +-
 .../geode/internal/cache/DistributedRegion.java|  23 +-
 .../internal/cache/partitioned/ClearPRMessage.java | 388 +
 .../internal/cache/BucketRegionJUnitTest.java  |  77 
 .../internal/cache/DistributedRegionJUnitTest.java |  18 +
 .../cache/partitioned/ClearPRMessageTest.java  | 288 +++
 .../serialization/DataSerializableFixedID.java |   3 +
 8 files changed, 832 insertions(+), 11 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 3076db7..d6806f2 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
@@ -1435,6 +1435,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-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 ac20526..db8c057 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
@@ -557,6 +557,36 @@ public class BucketRegion extends DistributedRegion 
implements Bucket {
 }
   }
 
+  @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;
+}
+
+boolean enableRVV = useRVV && getConcurrencyChecksEnabled();
+RegionVersionVector rvv = null;
+if (enableRVV) {
+  rvv = getVersionVector().getCloneForTransmission();
+}
+
+// get rvvLock
+Set 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
+  clearRegionLocally(regionEvent, cacheWrite, null);
+  distributeClearOperation(regionEvent, rvv, participants);
+
+  // TODO: call reindexUserDataRegion if there're lucene indexes
+} finally {
+  releaseWriteLocksForClear(regionEvent, participants);
+}
+  }
 
   long generateTailKey() {
 long key = 
eventSeqNum.addAndGet(partitionedRegion.getTotalNumberOfBuckets());
@@ -2094,11 +2124,9 @@ public class BucketRegion extends DistributedRegion 
implements Bucket {
   // if GII has failed, because there is not primary. So it's safe to set 
these
   // counters to 0.
   oldMemValue = bytesInMemory.getAndSet(0);
-}
-
-else {
-  throw new InternalGemFireError(
-  "Trying to clear a bucket region that was not destroyed or in 
initialization.");
+} else {
+  // BucketRegion's clear is supported now
+  oldMemValue = bytesInMemory.getAndSet(0);
 }
 if (oldMemValue != BUCKET_DESTROYED) {
   partitionedRegion.getPrStats().incDataStoreEntryCount(-sizeBeforeClear);
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 9964978..1a62919 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
@@ -2003,6 +2003,10 @@ public class DistributedRegion extends LocalRegion 
implements InternalDistribute
 super.basicClear(regionEvent, cacheWrite);
   }
 
+  void distributeClearOperation(RegionEventImpl regionEvent, 
RegionVersionVector rvv,
+  Set participants) {
+

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

2020-02-12 Thread nnag
This is an automated email from the ASF dual-hosted git repository.

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

commit d0daa20440449b4120015554cd7b10608f6e9e81
Author: zhouxh 
AuthorDate: Mon Jan 27 17:02:48 2020 -0800

GEODE-7683: introduce BR.cmnClearRegion
---
 .../apache/geode/internal/cache/BucketRegion.java  | 38 +--
 .../geode/internal/cache/DistributedRegion.java| 23 +--
 .../internal/cache/BucketRegionJUnitTest.java  | 77 ++
 .../internal/cache/DistributedRegionJUnitTest.java | 18 +
 4 files changed, 145 insertions(+), 11 deletions(-)

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 ac20526..761c1b1 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
@@ -557,6 +557,36 @@ public class BucketRegion extends DistributedRegion 
implements Bucket {
 }
   }
 
+  @Override
+  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;
+}
+
+boolean enableRVV = useRVV && getConcurrencyChecksEnabled();
+RegionVersionVector rvv = null;
+if (enableRVV) {
+  rvv = getVersionVector().getCloneForTransmission();
+}
+
+// get rvvLock
+Set 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
+  clearRegionLocally(regionEvent, cacheWrite, null);
+  distributeClearOperation(regionEvent, rvv, participants);
+
+  // TODO: call reindexUserDataRegion if there're lucene indexes
+} finally {
+  releaseWriteLocksForClear(regionEvent, participants);
+}
+  }
 
   long generateTailKey() {
 long key = 
eventSeqNum.addAndGet(partitionedRegion.getTotalNumberOfBuckets());
@@ -2094,11 +2124,9 @@ public class BucketRegion extends DistributedRegion 
implements Bucket {
   // if GII has failed, because there is not primary. So it's safe to set 
these
   // counters to 0.
   oldMemValue = bytesInMemory.getAndSet(0);
-}
-
-else {
-  throw new InternalGemFireError(
-  "Trying to clear a bucket region that was not destroyed or in 
initialization.");
+} else {
+  // BucketRegion's clear is supported now
+  oldMemValue = bytesInMemory.getAndSet(0);
 }
 if (oldMemValue != BUCKET_DESTROYED) {
   partitionedRegion.getPrStats().incDataStoreEntryCount(-sizeBeforeClear);
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 9964978..1a62919 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
@@ -2003,6 +2003,10 @@ public class DistributedRegion extends LocalRegion 
implements InternalDistribute
 super.basicClear(regionEvent, cacheWrite);
   }
 
+  void distributeClearOperation(RegionEventImpl regionEvent, 
RegionVersionVector rvv,
+  Set participants) {
+DistributedClearOperation.clear(regionEvent, rvv, participants);
+  }
 
   @Override
   void cmnClearRegion(RegionEventImpl regionEvent, boolean cacheWrite, boolean 
useRVV) {
@@ -2025,7 +2029,7 @@ public class DistributedRegion extends LocalRegion 
implements InternalDistribute
 obtainWriteLocksForClear(regionEvent, participants);
 clearRegionLocally(regionEvent, cacheWrite, null);
 if (!regionEvent.isOriginRemote() && 
regionEvent.getOperation().isDistributed()) {
-  DistributedClearOperation.clear(regionEvent, null, participants);
+  distributeClearOperation(regionEvent, null, participants);
 }
   } finally {
 releaseWriteLocksForClear(regionEvent, participants);
@@ -2081,10 +2085,12 @@ 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 participants) {
 lockLocallyForClear(getDistributionManager(), getMyId(), regionEvent);
-DistributedClearOperation.lockAndFlushToOthers(regionEvent, participants);
+if (!isUsedForPartitionedRegionBucket()) {
+  

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

2020-02-11 Thread nnag
This is an automated email from the ASF dual-hosted git repository.

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

commit c64039411520f2925ea6f3dcfd9a35c04d794980
Author: zhouxh 
AuthorDate: Mon Jan 27 17:02:48 2020 -0800

GEODE-7683: introduce BR.cmnClearRegion
---
 .../apache/geode/internal/cache/BucketRegion.java  | 38 +--
 .../geode/internal/cache/DistributedRegion.java| 23 +--
 .../internal/cache/BucketRegionJUnitTest.java  | 77 ++
 .../internal/cache/DistributedRegionJUnitTest.java | 18 +
 4 files changed, 145 insertions(+), 11 deletions(-)

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 ac20526..761c1b1 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
@@ -557,6 +557,36 @@ public class BucketRegion extends DistributedRegion 
implements Bucket {
 }
   }
 
+  @Override
+  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;
+}
+
+boolean enableRVV = useRVV && getConcurrencyChecksEnabled();
+RegionVersionVector rvv = null;
+if (enableRVV) {
+  rvv = getVersionVector().getCloneForTransmission();
+}
+
+// get rvvLock
+Set 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
+  clearRegionLocally(regionEvent, cacheWrite, null);
+  distributeClearOperation(regionEvent, rvv, participants);
+
+  // TODO: call reindexUserDataRegion if there're lucene indexes
+} finally {
+  releaseWriteLocksForClear(regionEvent, participants);
+}
+  }
 
   long generateTailKey() {
 long key = 
eventSeqNum.addAndGet(partitionedRegion.getTotalNumberOfBuckets());
@@ -2094,11 +2124,9 @@ public class BucketRegion extends DistributedRegion 
implements Bucket {
   // if GII has failed, because there is not primary. So it's safe to set 
these
   // counters to 0.
   oldMemValue = bytesInMemory.getAndSet(0);
-}
-
-else {
-  throw new InternalGemFireError(
-  "Trying to clear a bucket region that was not destroyed or in 
initialization.");
+} else {
+  // BucketRegion's clear is supported now
+  oldMemValue = bytesInMemory.getAndSet(0);
 }
 if (oldMemValue != BUCKET_DESTROYED) {
   partitionedRegion.getPrStats().incDataStoreEntryCount(-sizeBeforeClear);
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 9964978..1a62919 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
@@ -2003,6 +2003,10 @@ public class DistributedRegion extends LocalRegion 
implements InternalDistribute
 super.basicClear(regionEvent, cacheWrite);
   }
 
+  void distributeClearOperation(RegionEventImpl regionEvent, 
RegionVersionVector rvv,
+  Set participants) {
+DistributedClearOperation.clear(regionEvent, rvv, participants);
+  }
 
   @Override
   void cmnClearRegion(RegionEventImpl regionEvent, boolean cacheWrite, boolean 
useRVV) {
@@ -2025,7 +2029,7 @@ public class DistributedRegion extends LocalRegion 
implements InternalDistribute
 obtainWriteLocksForClear(regionEvent, participants);
 clearRegionLocally(regionEvent, cacheWrite, null);
 if (!regionEvent.isOriginRemote() && 
regionEvent.getOperation().isDistributed()) {
-  DistributedClearOperation.clear(regionEvent, null, participants);
+  distributeClearOperation(regionEvent, null, participants);
 }
   } finally {
 releaseWriteLocksForClear(regionEvent, participants);
@@ -2081,10 +2085,12 @@ 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 participants) {
 lockLocallyForClear(getDistributionManager(), getMyId(), regionEvent);
-DistributedClearOperation.lockAndFlushToOthers(regionEvent, participants);
+if (!isUsedForPartitionedRegionBucket()) {
+  

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

2020-01-27 Thread zhouxj
This is an automated email from the ASF dual-hosted git repository.

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

commit debcb4ddde543f6e8396b4cdb895642b4474d27b
Author: zhouxh 
AuthorDate: Mon Jan 27 17:02:48 2020 -0800

GEODE-7683: introduce BR.cmnClearRegion
---
 .../apache/geode/internal/cache/BucketRegion.java  | 37 ++
 .../geode/internal/cache/DistributedRegion.java| 12 ---
 .../lucene/internal/IndexRepositoryFactory.java|  2 +-
 3 files changed, 46 insertions(+), 5 deletions(-)

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 ac20526..3b8a56e 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
@@ -50,6 +50,7 @@ import org.apache.geode.cache.RegionAttributes;
 import org.apache.geode.cache.RegionDestroyedException;
 import org.apache.geode.cache.TimeoutException;
 import org.apache.geode.cache.partition.PartitionListener;
+import org.apache.geode.distributed.DistributedLockService;
 import org.apache.geode.distributed.DistributedMember;
 import org.apache.geode.distributed.DistributedSystem;
 import org.apache.geode.distributed.internal.AtomicLongWithTerminalState;
@@ -557,6 +558,42 @@ public class BucketRegion extends DistributedRegion 
implements Bucket {
 }
   }
 
+  @Override
+  void cmnClearRegion(RegionEventImpl regionEvent, boolean cacheWrite, boolean 
useRVV) {
+boolean enableRVV = useRVV && getConcurrencyChecksEnabled();
+RegionVersionVector rvv = null;
+if (enableRVV) {
+  rvv = getVersionVector();
+}
+
+// lock the primary from moving
+DistributedLockService lockService = DistributedLockService
+.getServiceNamed(PartitionedRegionHelper.PARTITION_LOCK_SERVICE_NAME);
+String lockName = this.getFullPath();
+while (!lockService.lock(lockName, 100, -1)) {
+  if (!getBucketAdvisor().isPrimary()) {
+PartitionedRegionException pre =
+new PartitionedRegionException(
+"The bucket " + this.getId() + " is no longer a primary. Retry 
the clear");
+throw pre;
+  }
+}
+
+// get rvvLock
+Set participants =
+getCacheDistributionAdvisor().adviseInvalidateRegion();
+try {
+  obtainWriteLocksForClear(regionEvent, participants);
+  clearRegionLocally(regionEvent, cacheWrite, null);
+  if (!regionEvent.isOriginRemote() && 
regionEvent.getOperation().isDistributed()) {
+DistributedClearOperation.clear(regionEvent, rvv, participants);
+  }
+
+  // TODO: call reindexUserDataRegion if there're lucene indexes
+} finally {
+  releaseWriteLocksForClear(regionEvent, participants);
+}
+  }
 
   long generateTailKey() {
 long key = 
eventSeqNum.addAndGet(partitionedRegion.getTotalNumberOfBuckets());
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 9964978..ceb0402 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
@@ -2081,10 +2081,12 @@ 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 participants) {
 lockLocallyForClear(getDistributionManager(), getMyId(), regionEvent);
-DistributedClearOperation.lockAndFlushToOthers(regionEvent, participants);
+if (!isUsedForPartitionedRegionBucket()) {
+  DistributedClearOperation.lockAndFlushToOthers(regionEvent, 
participants);
+}
   }
 
   /**
@@ -2121,7 +2123,7 @@ public class DistributedRegion extends LocalRegion 
implements InternalDistribute
   /**
* releases the locks obtained in obtainWriteLocksForClear
*/
-  private void releaseWriteLocksForClear(RegionEventImpl regionEvent,
+  protected void releaseWriteLocksForClear(RegionEventImpl regionEvent,
   Set participants) {
 
 ARMLockTestHook armLockTestHook = getRegionMap().getARMLockTestHook();
@@ -2130,7 +2132,9 @@ public class DistributedRegion extends LocalRegion 
implements InternalDistribute
 }
 
 getVersionVector().unlockForClear(getMyId());
-DistributedClearOperation.releaseLocks(regionEvent, participants);
+if (!isUsedForPartitionedRegionBucket()) {
+  DistributedClearOperation.releaseLocks(regionEvent, participants);
+}
 
 if (armLockTestHook != null) {
   armLockTestHook.afterRelease(this, regionEvent);
diff --git