You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by ag...@apache.org on 2017/10/11 01:12:59 UTC

[geode] 01/02: GEODE-3796 Changes are made to validate region version after the region is initialized.

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

agingade pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/geode.git

commit df7f72cd9087b8cc367fe43002c4a605b782e792
Author: Anil <ag...@pivotal.io>
AuthorDate: Mon Oct 9 17:09:55 2017 -0700

    GEODE-3796 Changes are made to validate region version after the region is initialized.
---
 .../cache/versions/RegionVersionVector.java        |  9 +--
 .../versions/RegionVersionVectorJUnitTest.java     | 68 +++++++++++++++++++++-
 2 files changed, 72 insertions(+), 5 deletions(-)

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 aa9ba38..af59f06 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
@@ -113,7 +113,7 @@ public abstract class RegionVersionVector<T extends VersionSource<?>>
   private transient boolean isLiveVector;
 
   /** for debugging we keep a reference to the region for use in log messages */
-  private transient String regionName;
+  private transient LocalRegion region;
 
   private ConcurrentHashMap<T, Long> memberToGCVersion;
 
@@ -153,7 +153,7 @@ public abstract class RegionVersionVector<T extends VersionSource<?>>
   public RegionVersionVector(T ownerId, LocalRegion owner) {
     this.myId = ownerId;
     this.isLiveVector = true;
-    this.regionName = owner == null ? "" : "region " + owner.getFullPath();
+    this.region = owner;
 
     this.localExceptions = new RegionVersionHolder<T>(0);
     this.memberToVersion = new ConcurrentHashMap<T, RegionVersionHolder<T>>(INITIAL_CAPACITY,
@@ -606,10 +606,11 @@ public abstract class RegionVersionVector<T extends VersionSource<?>>
       // recovers. So we can only assert that the local member has already seen
       // the replayed event.
       synchronized (localExceptions) {
-        if (this.localVersion.get() < tag.getRegionVersion()) {
+        if (region != null && region.isInitialized()
+            && this.localVersion.get() < tag.getRegionVersion()) {
           Assert.fail(
               "recordVersion invoked for a local version tag that is higher than our local version. rvv="
-                  + this + ", tag=" + tag + " " + regionName);
+                  + this + ", tag=" + tag + " " + region.getName());
         }
       }
     }
diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/versions/RegionVersionVectorJUnitTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/versions/RegionVersionVectorJUnitTest.java
index 17a6db1..b9d3cf6 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/cache/versions/RegionVersionVectorJUnitTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/cache/versions/RegionVersionVectorJUnitTest.java
@@ -15,23 +15,31 @@
 package org.apache.geode.internal.cache.versions;
 
 import static org.junit.Assert.*;
+import static org.mockito.Mockito.*;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
+import java.io.DataInput;
 import java.io.DataInputStream;
+import java.io.DataOutput;
 import java.io.DataOutputStream;
+import java.io.IOException;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
 
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
-
+import org.junit.rules.ExpectedException;
 import org.apache.geode.DataSerializer;
+import org.apache.geode.InternalGemFireError;
 import org.apache.geode.distributed.internal.membership.InternalDistributedMember;
 import org.apache.geode.internal.HeapDataOutputStream;
 import org.apache.geode.internal.InternalDataSerializer;
 import org.apache.geode.internal.Version;
+import org.apache.geode.internal.cache.LocalRegion;
 import org.apache.geode.internal.cache.persistence.DiskStoreID;
 import org.apache.geode.test.dunit.NetworkUtils;
 import org.apache.geode.test.junit.categories.UnitTest;
@@ -39,6 +47,9 @@ import org.apache.geode.test.junit.categories.UnitTest;
 @Category(UnitTest.class)
 public class RegionVersionVectorJUnitTest {
 
+  @Rule
+  public ExpectedException expectedException = ExpectedException.none();
+
   @Test
   public void testExceptionsWithContains() {
     DiskStoreID ownerId = new DiskStoreID(0, 0);
@@ -527,6 +538,61 @@ public class RegionVersionVectorJUnitTest {
     assertEquals("failed test for bug #48576", version, tag.getRegionVersion());
   }
 
+  @Test
+  public void testRecordVersionDuringRegionInit() {
+    LocalRegion mockRegion = mock(LocalRegion.class);
+    when(mockRegion.isInitialized()).thenReturn(false);
+    final String local = NetworkUtils.getIPLiteral();
+    InternalDistributedMember ownerId = new InternalDistributedMember(local, 101);
+    VMVersionTag tag = new VMVersionTag();
+    tag.setRegionVersion(1L);
+
+    RegionVersionVector rvv = createRegionVersionVector(ownerId, mockRegion);
+    rvv.recordVersion(ownerId, tag);
+    assertEquals(1, rvv.getVersionForMember(ownerId));
+  }
+
+  @Test
+  public void testRecordVersionAfterRegionInitThrowsException() {
+    expectedException.expect(InternalGemFireError.class);
+    LocalRegion mockRegion = mock(LocalRegion.class);
+    when(mockRegion.isInitialized()).thenReturn(true);
+    final String local = NetworkUtils.getIPLiteral();
+    InternalDistributedMember ownerId = new InternalDistributedMember(local, 101);
+    VMVersionTag tag = new VMVersionTag();
+    tag.setRegionVersion(1L);
+
+    RegionVersionVector rvv = createRegionVersionVector(ownerId, mockRegion);
+    rvv.recordVersion(ownerId, tag);
+  }
+
+  public RegionVersionVector createRegionVersionVector(InternalDistributedMember ownerId,
+      LocalRegion owner) {
+    @SuppressWarnings({"unchecked", "rawtypes"})
+    RegionVersionVector rvv = new RegionVersionVector(ownerId, owner) {
+      @Override
+      public int getDSFID() {
+        return 0;
+      }
+
+      @Override
+      protected RegionVersionVector createCopy(VersionSource ownerId, ConcurrentHashMap vector,
+          long version, ConcurrentHashMap gcVersions, long gcVersion, boolean singleMember,
+          RegionVersionHolder clonedLocalHolder) {
+        return null;
+      }
+
+      @Override
+      protected void writeMember(VersionSource member, DataOutput out) throws IOException {}
+
+      @Override
+      protected VersionSource readMember(DataInput in) throws IOException, ClassNotFoundException {
+        return null;
+      }
+    };
+    return rvv;
+  }
+
   private void doExceptionsWithContains(DiskStoreID id, DiskRegionVersionVector rvv) {
     rvv.recordVersion(id, 10);
 

-- 
To stop receiving notification emails like this one, please contact
"commits@geode.apache.org" <co...@geode.apache.org>.