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

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


The following commit(s) were added to refs/heads/feature/GEODE-6886 by this 
push:
     new 67fc72b  GEODE-6886: Do not region sync if lost member is an empty 
accessor
67fc72b is described below

commit 67fc72b75276733d3e41d0edaf9c7953cafe35b1
Author: eshu <e...@pivotal.io>
AuthorDate: Tue Jun 18 10:09:13 2019 -0700

    GEODE-6886: Do not region sync if lost member is an empty accessor
    
      * Avoid region sync for empty accessor of persistent replicate region in 
correct place.
---
 .../distributed/internal/DistributionAdvisor.java  | 16 ++++++++
 .../geode/internal/cache/DistributedRegion.java    | 20 +++-------
 .../internal/DistributionAdvisorTest.java          | 43 +++++++++++++++++++---
 .../internal/cache/DistributedRegionTest.java      | 12 +++---
 4 files changed, 63 insertions(+), 28 deletions(-)

diff --git 
a/geode-core/src/main/java/org/apache/geode/distributed/internal/DistributionAdvisor.java
 
b/geode-core/src/main/java/org/apache/geode/distributed/internal/DistributionAdvisor.java
index 7093360..e4716ab 100644
--- 
a/geode-core/src/main/java/org/apache/geode/distributed/internal/DistributionAdvisor.java
+++ 
b/geode-core/src/main/java/org/apache/geode/distributed/internal/DistributionAdvisor.java
@@ -277,6 +277,22 @@ public class DistributionAdvisor {
     // through the sync operation. Without associated event information this 
could cause the
     // retried operation to be mishandled. See GEODE-5505
     final long delay = getDelay(dr);
+
+    if (!dr.isInitializedWithWait()) {
+      return;
+    }
+    if (dr.getDataPolicy().withPersistence() && persistentId == null) {
+      // Fix for GEODE-6886 (#46704). The lost member may be an empty accessor
+      // of a persistent replicate region. We don't need to do a 
synchronization
+      // in that case, because those members send their writes to a persistent 
member.
+      // Only a persistent member can generate the version.
+      if (logger.isDebugEnabled()) {
+        logger.debug(
+            "da.syncForCrashedMember skipping sync because crashed member is 
not persistent: {}",
+            id);
+      }
+      return;
+    }
     dr.scheduleSynchronizeForLostMember(id, lostVersionID, delay);
     if (dr.getConcurrencyChecksEnabled()) {
       dr.setRegionSynchronizeScheduled(lostVersionID);
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 a8022b6..43897a4 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
@@ -1286,18 +1286,7 @@ public class DistributedRegion extends LocalRegion 
implements InternalDistribute
 
   void performSynchronizeForLostMemberTask(InternalDistributedMember member,
       VersionSource lostVersionID) {
-    waitUntilInitialized();
-
-    if (getDataPolicy().withPersistence() && getPersistentID() == null) {
-      // Fix for 46704. The lost member may be a replicate
-      // or an empty accessor. We don't need to do a synchronization
-      // in that case, because those members send their writes to
-      // a persistent member.
-      if (logger.isDebugEnabled()) {
-        logger.debug(
-            "da.syncForCrashedMember skipping sync because crashed member is 
not persistent: {}",
-            member);
-      }
+    if (!isInitializedWithWait()) {
       return;
     }
     synchronizeForLostMember(member, lostVersionID);
@@ -1358,10 +1347,10 @@ public class DistributedRegion extends LocalRegion 
implements InternalDistribute
     return false;
   }
 
-  void waitUntilInitialized() {
+  public boolean isInitializedWithWait() {
     while (!isInitialized()) {
       if (isDestroyed()) {
-        return;
+        return false;
       } else {
         try {
           if (logger.isDebugEnabled()) {
@@ -1370,10 +1359,11 @@ public class DistributedRegion extends LocalRegion 
implements InternalDistribute
           }
           Thread.sleep(100);
         } catch (InterruptedException e) {
-          return;
+          return false;
         }
       }
     }
+    return true;
   }
 
   /** remove any partial entries received in a failed GII */
diff --git 
a/geode-core/src/test/java/org/apache/geode/distributed/internal/DistributionAdvisorTest.java
 
b/geode-core/src/test/java/org/apache/geode/distributed/internal/DistributionAdvisorTest.java
index a541338..51be3c2 100644
--- 
a/geode-core/src/test/java/org/apache/geode/distributed/internal/DistributionAdvisorTest.java
+++ 
b/geode-core/src/test/java/org/apache/geode/distributed/internal/DistributionAdvisorTest.java
@@ -16,6 +16,7 @@ package org.apache.geode.distributed.internal;
 
 import static org.mockito.Mockito.doCallRealMethod;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -23,6 +24,7 @@ import static org.mockito.Mockito.when;
 import org.junit.Before;
 import org.junit.Test;
 
+import org.apache.geode.cache.DataPolicy;
 import 
org.apache.geode.distributed.internal.membership.InternalDistributedMember;
 import org.apache.geode.internal.cache.CacheDistributionAdvisor;
 import org.apache.geode.internal.cache.DistributedRegion;
@@ -38,6 +40,7 @@ public class DistributionAdvisorTest {
   private VersionSource lostVersionID;
   private PersistentMemberID persistentMemberID;
   private long delay = 100;
+  private DataPolicy dataPolicy;
 
   @Before
   public void setup() {
@@ -47,6 +50,13 @@ public class DistributionAdvisorTest {
     profile = mock(CacheDistributionAdvisor.CacheProfile.class);
     lostVersionID = mock(VersionSource.class);
     persistentMemberID = mock(PersistentMemberID.class);
+    dataPolicy = mock(DataPolicy.class);
+
+    
when(distributionAdvisor.getRegionForDeltaGII()).thenReturn(distributedRegion);
+    when(distributionAdvisor.getDelay(distributedRegion)).thenReturn(delay);
+    when(distributedRegion.getDataPolicy()).thenReturn(dataPolicy);
+    when(distributedRegion.getConcurrencyChecksEnabled()).thenReturn(true);
+    when(distributedRegion.isInitializedWithWait()).thenReturn(true);
   }
 
   @Test
@@ -58,9 +68,7 @@ public class DistributionAdvisorTest {
 
   @Test
   public void regionSyncScheduledForLostMember() {
-    
when(distributionAdvisor.getRegionForDeltaGII()).thenReturn(distributedRegion);
-    when(distributionAdvisor.getDelay(distributedRegion)).thenReturn(delay);
-    when(distributedRegion.getConcurrencyChecksEnabled()).thenReturn(true);
+    when(dataPolicy.withPersistence()).thenReturn(false);
     doCallRealMethod().when(distributionAdvisor).syncForCrashedMember(member, 
profile);
 
     distributionAdvisor.syncForCrashedMember(member, profile);
@@ -71,12 +79,10 @@ public class DistributionAdvisorTest {
 
   @Test
   public void regionSyncScheduledForLostPersistentMember() {
-    
when(distributionAdvisor.getRegionForDeltaGII()).thenReturn(distributedRegion);
     
when(distributionAdvisor.getPersistentID((CacheDistributionAdvisor.CacheProfile)
 profile))
         .thenReturn(persistentMemberID);
     when(persistentMemberID.getVersionMember()).thenReturn(lostVersionID);
-    when(distributionAdvisor.getDelay(distributedRegion)).thenReturn(delay);
-    when(distributedRegion.getConcurrencyChecksEnabled()).thenReturn(true);
+    when(dataPolicy.withPersistence()).thenReturn(true);
     doCallRealMethod().when(distributionAdvisor).syncForCrashedMember(member, 
profile);
 
     distributionAdvisor.syncForCrashedMember(member, profile);
@@ -84,4 +90,29 @@ public class DistributionAdvisorTest {
     verify(distributedRegion).scheduleSynchronizeForLostMember(member, 
lostVersionID, delay);
     verify(distributedRegion).setRegionSynchronizeScheduled(lostVersionID);
   }
+
+  @Test
+  public void regionSyncIsNotScheduledIfRegionIsNotInitialized() {
+    when(distributedRegion.isInitializedWithWait()).thenReturn(false);
+    doCallRealMethod().when(distributionAdvisor).syncForCrashedMember(member, 
profile);
+
+    distributionAdvisor.syncForCrashedMember(member, profile);
+
+    verify(distributedRegion, 
never()).scheduleSynchronizeForLostMember(member, lostVersionID,
+        delay);
+    verify(distributedRegion, 
never()).setRegionSynchronizeScheduled(lostVersionID);
+  }
+
+  @Test
+  public void emptyAccessorOfPersistentRegionDoesNotSynchronizeForLostMember() 
{
+    when(dataPolicy.withPersistence()).thenReturn(true);
+    when(distributedRegion.getPersistentID()).thenReturn(null);
+    doCallRealMethod().when(distributionAdvisor).syncForCrashedMember(member, 
profile);
+
+    distributionAdvisor.syncForCrashedMember(member, profile);
+
+    verify(distributedRegion, 
never()).scheduleSynchronizeForLostMember(member, lostVersionID,
+        delay);
+    verify(distributedRegion, 
never()).setRegionSynchronizeScheduled(lostVersionID);
+  }
 }
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 23640a4..913b5e3 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
@@ -157,29 +157,27 @@ public class DistributedRegionTest {
   public void 
regionSyncInvokedInPerformSynchronizeForLostMemberTaskAfterRegionInitialized() {
     DistributedRegion distributedRegion = mock(DistributedRegion.class);
     when(distributedRegion.getDataPolicy()).thenReturn(mock(DataPolicy.class));
+    when(distributedRegion.isInitializedWithWait()).thenReturn(true);
     
doCallRealMethod().when(distributedRegion).performSynchronizeForLostMemberTask(member,
         lostMemberVersionID);
     InOrder inOrder = inOrder(distributedRegion);
 
     distributedRegion.performSynchronizeForLostMemberTask(member, 
lostMemberVersionID);
 
-    inOrder.verify(distributedRegion).waitUntilInitialized();
+    inOrder.verify(distributedRegion).isInitializedWithWait();
     inOrder.verify(distributedRegion).synchronizeForLostMember(member, 
lostMemberVersionID);
   }
 
   @Test
-  public void emptyAccessorOfPersistentRegionDoesNotSynchronizeForLostMember() 
{
-    DataPolicy dataPolicy = mock(DataPolicy.class);
+  public void 
regionSyncNotInvokedInPerformSynchronizeForLostMemberTaskIfRegionNotInitialized()
 {
     DistributedRegion distributedRegion = mock(DistributedRegion.class);
-    when(distributedRegion.getDataPolicy()).thenReturn(dataPolicy);
-    when(dataPolicy.withPersistence()).thenReturn(true);
-    when(distributedRegion.getPersistentID()).thenReturn(null);
+    when(distributedRegion.getDataPolicy()).thenReturn(mock(DataPolicy.class));
+    when(distributedRegion.isInitializedWithWait()).thenReturn(false);
     
doCallRealMethod().when(distributedRegion).performSynchronizeForLostMemberTask(member,
         lostMemberVersionID);
 
     distributedRegion.performSynchronizeForLostMemberTask(member, 
lostMemberVersionID);
 
-    verify(distributedRegion).waitUntilInitialized();
     verify(distributedRegion, never()).synchronizeForLostMember(member, 
lostMemberVersionID);
   }
 }

Reply via email to