GEODE-2683: let BR.putAll/removeAll to distribute before notify gateway, which
is the same order as put/destroy


Project: http://git-wip-us.apache.org/repos/asf/geode/repo
Commit: http://git-wip-us.apache.org/repos/asf/geode/commit/e26799ad
Tree: http://git-wip-us.apache.org/repos/asf/geode/tree/e26799ad
Diff: http://git-wip-us.apache.org/repos/asf/geode/diff/e26799ad

Branch: refs/heads/feature/GEODE-2420
Commit: e26799ad4661cd869616db3fa87b50a4cb02b366
Parents: 9ade1d3
Author: zhouxh <gz...@pivotal.io>
Authored: Fri Mar 17 14:37:10 2017 -0700
Committer: Ken Howe <kh...@pivotal.io>
Committed: Mon Mar 27 14:00:41 2017 -0700

----------------------------------------------------------------------
 .../geode/internal/cache/LocalRegion.java       | 39 ++++++++++++++------
 1 file changed, 28 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/geode/blob/e26799ad/geode-core/src/main/java/org/apache/geode/internal/cache/LocalRegion.java
----------------------------------------------------------------------
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 5d5c7e2..45540ee 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
@@ -5908,8 +5908,15 @@ public class LocalRegion extends AbstractRegion 
implements LoaderHelperFactory,
         doCallback = true;
       }
       if (doCallback) {
-        notifyGatewaySender(event.getOperation().isUpdate() ? 
EnumListenerEvent.AFTER_UPDATE
-            : EnumListenerEvent.AFTER_CREATE, event);
+        if (event.isBulkOpInProgress() && 
this.isUsedForPartitionedRegionBucket) {
+          if (logger.isDebugEnabled()) {
+            logger.debug(
+                "For bulk operation on bucket region, not to notify gateway 
sender earlier.");
+          }
+        } else {
+          notifyGatewaySender(event.getOperation().isUpdate() ? 
EnumListenerEvent.AFTER_UPDATE
+              : EnumListenerEvent.AFTER_CREATE, event);
+        }
         // Notify listeners
         if (!event.isBulkOpInProgress()) {
           try {
@@ -6968,7 +6975,13 @@ public class LocalRegion extends AbstractRegion 
implements LoaderHelperFactory,
      * throw new IndexMaintenanceException(e); } } }
      */
 
-    notifyGatewaySender(EnumListenerEvent.AFTER_DESTROY, event);
+    if (event.isBulkOpInProgress() && this.isUsedForPartitionedRegionBucket) {
+      if (logger.isDebugEnabled()) {
+        logger.debug("For bulk operation on bucket region, not to notify 
gateway sender earlier.");
+      }
+    } else {
+      notifyGatewaySender(EnumListenerEvent.AFTER_DESTROY, event);
+    }
 
     // invoke callbacks if initialized and told to do so, or if this
     // is a bucket in a partitioned region
@@ -10406,10 +10419,12 @@ public class LocalRegion extends AbstractRegion 
implements LoaderHelperFactory,
         EnumListenerEvent op = event.getOperation().isCreate() ? 
EnumListenerEvent.AFTER_CREATE
             : EnumListenerEvent.AFTER_UPDATE;
         invokePutCallbacks(op, event, !event.callbacksInvoked() && 
!event.isPossibleDuplicate(),
-            false /*
-                   * We must notify gateways inside RegionEntry lock, NOT 
here, to preserve the
-                   * order of events sent by gateways for same key
-                   */);
+            this.isUsedForPartitionedRegionBucket
+        /*
+         * If this is replicated region, use "false". We must notify gateways 
inside RegionEntry
+         * lock, NOT here, to preserve the order of events sent by gateways 
for same key. If this is
+         * bucket region, use "true", because the event order is guaranteed
+         */);
       }
     }
   }
@@ -10433,10 +10448,12 @@ public class LocalRegion extends AbstractRegion 
implements LoaderHelperFactory,
       if (successfulKeys.contains(event.getKey())) {
         invokeDestroyCallbacks(EnumListenerEvent.AFTER_DESTROY, event,
             !event.callbacksInvoked() && !event.isPossibleDuplicate(),
-            false /*
-                   * We must notify gateways inside RegionEntry lock, NOT 
here, to preserve the
-                   * order of events sent by gateways for same key
-                   */);
+            this.isUsedForPartitionedRegionBucket
+        /*
+         * If this is replicated region, use "false". We must notify gateways 
inside RegionEntry
+         * lock, NOT here, to preserve the order of events sent by gateways 
for same key. If this is
+         * bucket region, use "true", because the event order is guaranteed
+         */);
       }
     }
   }

Reply via email to