You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by zh...@apache.org on 2020/08/21 06:45:03 UTC

[geode] branch feature/GEODE-8444 created (now b5c69f6)

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

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


      at b5c69f6  GEODE-8444: When requester's RVV equals provider's rvvGC, should do fullGII

This branch includes the following new commits:

     new b5c69f6  GEODE-8444: When requester's RVV equals provider's rvvGC, should do fullGII

The 1 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.



[geode] 01/01: GEODE-8444: When requester's RVV equals provider's rvvGC, should do fullGII

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

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

commit b5c69f60c1e4f68023c6dffde295be299f6e5914
Author: zhouxh <gz...@pivotal.io>
AuthorDate: Thu Aug 20 23:43:46 2020 -0700

    GEODE-8444: When requester's RVV equals provider's rvvGC, should do fullGII
---
 .../geode/internal/cache/GIIDeltaDUnitTest.java    | 85 ++++++++++++++++++++--
 .../internal/cache/InitialImageOperation.java      |  3 +-
 .../cache/versions/RegionVersionVector.java        |  6 +-
 3 files changed, 86 insertions(+), 8 deletions(-)

diff --git a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/GIIDeltaDUnitTest.java b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/GIIDeltaDUnitTest.java
index 1f3fcc1..4c59e5b 100644
--- a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/GIIDeltaDUnitTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/GIIDeltaDUnitTest.java
@@ -784,6 +784,8 @@ public class GIIDeltaDUnitTest extends JUnit4CacheTestCase {
     doOnePut(P, 9, "key3");
     waitForToVerifyRVV(P, memberP, 9, null, 0);
     waitForToVerifyRVV(R, memberP, 9, exceptionlist2, 0);
+    verifyTombstoneExist(P, "key1", true, false);
+    waitToVerifyKey(R, "key1", generateValue(P));
 
     byte[] R_rvv_bytes = getRVVByteArray(R, REGION_NAME);
     closeCache(R);
@@ -794,6 +796,7 @@ public class GIIDeltaDUnitTest extends JUnit4CacheTestCase {
     P.invoke(() -> GIIDeltaDUnitTest.resetSlowGII());
 
     // restart and gii, R's rvv should be the same as P's
+    // should do full GII because P8 at P is GCed, but R still has key1
     checkIfFullGII(P, REGION_NAME, R_rvv_bytes, true);
     createDistributedRegion(R);
     waitForToVerifyRVV(R, memberP, 9, null, 8); // R's rvv=p9, gc=8
@@ -805,6 +808,8 @@ public class GIIDeltaDUnitTest extends JUnit4CacheTestCase {
 
     // In fullGII, the key size in gii chunk is 2. They are: key3, key5
     verifyDeltaSizeFromStats(R, 2, 0);
+    waitToVerifyKey(P, "key1", null);
+    waitToVerifyKey(R, "key1", null);
   }
 
   /**
@@ -1695,8 +1700,9 @@ public class GIIDeltaDUnitTest extends JUnit4CacheTestCase {
 
   /**
    * P and R are peers, each holds a DR. Each does a few operations to make RVV=P7,R6, RVVGC=P0,R0
-   * for both members. P8 is clear() operation. After that, R offline. Run P9 is a put. Restart R. R
-   * will do deltaGII to get P9 as delta
+   * for both members. P8 is clear() operation. After that, run P9 R7 as put. R offline. Run P10 as
+   * another put.
+   * Restart R. R will do deltaGII to get P10 as delta
    */
   @Test
   public void testDeltaGIIAfterClear() throws Throwable {
@@ -1728,18 +1734,85 @@ public class GIIDeltaDUnitTest extends JUnit4CacheTestCase {
     waitForToVerifyRVV(P, memberR, 6, null, 6); // P's rvv=r6, gc=6
     waitForToVerifyRVV(R, memberP, 8, null, 8); // R's rvv=p8, gc=8
     waitForToVerifyRVV(R, memberR, 6, null, 6); // R's rvv=r6, gc=6
+    doOnePut(R, 7, "key5");
+    doOnePut(P, 9, "key3");
 
     // shutdown R
     byte[] R_rvv_bytes = getRVVByteArray(R, REGION_NAME);
     closeCache(R);
 
     // do a put at P to get some delta
-    doOnePut(P, 9, "key3");
+    doOnePut(P, 10, "key4");
+    waitForToVerifyRVV(P, memberP, 10, null, 8);
+    waitForToVerifyRVV(P, memberR, 7, null, 6);
+
+    // restart R to deltaGII
+    checkIfFullGII(P, REGION_NAME, R_rvv_bytes, false);
+
+    // shutdown P and restart
+    closeCache(P);
+    createDistributedRegion(P);
+    waitForToVerifyRVV(P, memberP, 10, null, 8);
+    waitForToVerifyRVV(P, memberR, 7, null, 6);
+
+    createDistributedRegion(R);
+    waitForToVerifyRVV(R, memberP, 10, null, 8);
+    waitForToVerifyRVV(R, memberR, 7, null, 6);
+
+    RegionVersionVector p_rvv = getRVV(P);
+    RegionVersionVector r_rvv = getRVV(R);
+    assertSameRVV(p_rvv, r_rvv); // after gii, rvv should be the same
+
+    verifyDeltaSizeFromStats(R, 1, 1);
+  }
+
+  /**
+   * P and R are peers, each holds a DR. Each does a few operations to make RVV=P7,R6, RVVGC=P0,R0
+   * for both members. P8 is clear() operation. After that, R offline. Run P9 as another put.
+   * Restart R. R will do FullGII to get P9 because R's rvv==P's rvvGC on R
+   */
+  @Test
+  public void GIIAfterClearWillBeFullGII() throws Throwable {
+    prepareForEachTest();
+    final DiskStoreID memberP = getMemberID(P);
+    final DiskStoreID memberR = getMemberID(R);
+    final long[] exceptionlist = {4, 5};
+
+    assertEquals(0, DistributedCacheOperation.SLOW_DISTRIBUTION_MS);
+    prepareCommonTestData(6);
+    // let r4,r5,r6 to succeed
+    doOnePut(R, 4, "key4");
+    doOneDestroy(R, 5, "key5");
+    doOnePut(R, 6, "key1");
+
+    doOnePut(P, 7, "key1");
+
+    waitForToVerifyRVV(P, memberP, 7, null, 0); // P's rvv=p7, gc=0
+    waitForToVerifyRVV(P, memberR, 6, null, 0); // P's rvv=r6, gc=0
+    waitForToVerifyRVV(R, memberP, 7, null, 0); // R's rvv=P7, gc=0
+    waitForToVerifyRVV(R, memberR, 6, null, 0); // R's rvv=r6, gc=0
+
+    // Note: since R is still online, clear will do flush message which will be blocked by the
+    // test CDL (to create unfinished operation). So in this test, no exception
+    doOneClear(P, 8);
+    // clear() increased P's version with 1 to P8
+    // after clear, P and R's RVVGC == RVV
+    waitForToVerifyRVV(P, memberP, 8, null, 8); // P's rvv=p8, gc=8
+    waitForToVerifyRVV(P, memberR, 6, null, 6); // P's rvv=r6, gc=6
+    waitForToVerifyRVV(R, memberP, 8, null, 8); // R's rvv=p8, gc=8
+    waitForToVerifyRVV(R, memberR, 6, null, 6); // R's rvv=r6, gc=6
+
+    // shutdown R
+    byte[] R_rvv_bytes = getRVVByteArray(R, REGION_NAME);
+    closeCache(R);
+
+    // do a put at P to get some delta
+    doOnePut(P, 9, "key4");
     waitForToVerifyRVV(P, memberP, 9, null, 8);
     waitForToVerifyRVV(P, memberR, 6, null, 6);
 
     // restart R to deltaGII
-    checkIfFullGII(P, REGION_NAME, R_rvv_bytes, false);
+    checkIfFullGII(P, REGION_NAME, R_rvv_bytes, true);
 
     // shutdown P and restart
     closeCache(P);
@@ -1755,7 +1828,7 @@ public class GIIDeltaDUnitTest extends JUnit4CacheTestCase {
     RegionVersionVector r_rvv = getRVV(R);
     assertSameRVV(p_rvv, r_rvv); // after gii, rvv should be the same
 
-    verifyDeltaSizeFromStats(R, 1, 1);
+    verifyDeltaSizeFromStats(R, 1, 0);
   }
 
   /**
@@ -1828,7 +1901,7 @@ public class GIIDeltaDUnitTest extends JUnit4CacheTestCase {
     waitForToVerifyRVV(R, memberR, 6, null, 6); // R's rvv=r6, gc=6
     waitToVerifyKey(P, "key1", null);
     waitToVerifyKey(R, "key1", null);
-    verifyDeltaSizeFromStats(R, 0, 1);
+    verifyDeltaSizeFromStats(R, 0, 0);
   }
 
   /**
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/InitialImageOperation.java b/geode-core/src/main/java/org/apache/geode/internal/cache/InitialImageOperation.java
index 3698dbb..6d3ba1e 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/InitialImageOperation.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/InitialImageOperation.java
@@ -1670,7 +1670,8 @@ public class InitialImageOperation {
           // [bruce] I suppose it's possible to have this check return a list of
           // specific versions that the sender is missing. The current check
           // just stops when it finds the first inconsistency
-          if (!rgn.getVersionVector().isNewerThanOrCanFillExceptionsFor(this.versionVector)) {
+          if (!rgn.getVersionVector().isNewerThanOrCanFillExceptionsFor(this.versionVector)
+              && rgn.getVersionVector().isRVVGCDominatedBy(this.versionVector)) {
             // Delta GII might have unfinished operations to send. Otherwise,
             // no need to send any data. This is a synchronization request and this region's
             // vector doesn't have anything that the other region needs
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 13a0da7..a80943c 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
@@ -1000,7 +1000,11 @@ public abstract class RegionVersionVector<T extends VersionSource<?>>
       return true;
     } else {
       RegionVersionHolder<T> holder = new RegionVersionHolder<T>(gcVersion.longValue());
-      return !holder.isNewerThanOrCanFillExceptionsFor(otherHolder);
+      if (otherHolder == null) {
+        return false;
+      } else {
+        return otherHolder.dominates(holder) && otherHolder.getVersion() > gcVersion;
+      }
     }
   }