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

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


The following commit(s) were added to refs/heads/develop by this push:
     new 4edacb1  GEODE-567: Wait for async datastore creation to reach 
appropriate point (#2143)
4edacb1 is described below

commit 4edacb13854c35e73dc1b8b27b39c9bf9bb24179
Author: Dan Smith <[email protected]>
AuthorDate: Thu Jul 19 09:35:37 2018 -0700

    GEODE-567: Wait for async datastore creation to reach appropriate point 
(#2143)
    
    GEODE-567: Wait for async datastore creation to reach appropriate point
    
    This test appears like it was trying to test what happens if a put
    happens when data store creation is at a particular point.
    
    Unfortunately, it failed to do so correctly because it just spun off the
    data store creation in separate threads and then did the put. The wait
    criterion used was also completely wrong, so the test would always wait
    for 1 minute.
    
    Finally, there were some race conditions caused by passing the same
    array list to multiple async tasks.
    
    Changed the code to wait until the data stores are at the given point in
    region creation and then do the put.
---
 .../fixed/FixedPartitioningDUnitTest.java          | 239 +++++++++++----------
 .../fixed/FixedPartitioningTestBase.java           |  39 +---
 .../dunit/internal/JUnit4DistributedTestCase.java  |   2 +-
 3 files changed, 142 insertions(+), 138 deletions(-)

diff --git 
a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/partitioned/fixed/FixedPartitioningDUnitTest.java
 
b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/partitioned/fixed/FixedPartitioningDUnitTest.java
index 729d2f5..9c0977e 100644
--- 
a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/partitioned/fixed/FixedPartitioningDUnitTest.java
+++ 
b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/partitioned/fixed/FixedPartitioningDUnitTest.java
@@ -17,23 +17,27 @@ package org.apache.geode.internal.cache.partitioned.fixed;
 import static org.junit.Assert.fail;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Properties;
+import java.util.concurrent.TimeUnit;
 
+import org.assertj.core.api.Assertions;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
 
 import org.apache.geode.cache.DuplicatePrimaryPartitionException;
 import org.apache.geode.cache.EntryNotFoundException;
 import org.apache.geode.cache.FixedPartitionAttributes;
+import org.apache.geode.cache.PartitionedRegionStorageException;
 import org.apache.geode.cache.partition.PartitionNotAvailableException;
 import org.apache.geode.distributed.ConfigurationProperties;
 import org.apache.geode.test.dunit.Assert;
 import org.apache.geode.test.dunit.AsyncInvocation;
 import org.apache.geode.test.dunit.Host;
 import org.apache.geode.test.dunit.IgnoredException;
+import org.apache.geode.test.dunit.VM;
 import org.apache.geode.test.dunit.Wait;
-import org.apache.geode.test.junit.categories.FlakyTest;
 import org.apache.geode.test.junit.categories.PartitioningTest;
 
 /**
@@ -42,6 +46,8 @@ import 
org.apache.geode.test.junit.categories.PartitioningTest;
 @Category({PartitioningTest.class})
 public class FixedPartitioningDUnitTest extends FixedPartitioningTestBase {
 
+  public static final String REGION_NAME = "Quarter";
+
   public FixedPartitioningDUnitTest() {
     super();
   }
@@ -67,7 +73,8 @@ public class FixedPartitioningDUnitTest extends 
FixedPartitioningTestBase {
       FixedPartitionAttributes fpa = 
FixedPartitionAttributes.createFixedPartition(null, true, 3);
       List<FixedPartitionAttributes> fpaList = new 
ArrayList<FixedPartitionAttributes>();
       fpaList.add(fpa);
-      member1.invoke(() -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes("Quarter",
+      member1.invoke(() -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes(
+          REGION_NAME,
           fpaList, 0, 40, 3, new QuarterPartitionResolver(), null, false));
       fail("IllegalStateException Expected");
     } catch (Exception illegal) {
@@ -95,8 +102,9 @@ public class FixedPartitioningDUnitTest extends 
FixedPartitioningTestBase {
       List<FixedPartitionAttributes> fpaList = new 
ArrayList<FixedPartitionAttributes>();
       fpaList.add(fpa1);
       fpaList.add(fpa2);
-      member1.invoke(() -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes("Quarter",
-          fpaList, 0, 40, 3, new QuarterPartitionResolver(), null, false));
+      member1
+          .invoke(() -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes(REGION_NAME,
+              fpaList, 0, 40, 3, new QuarterPartitionResolver(), null, false));
       fail("IllegalStateException Expected");
     } catch (Exception illegal) {
       if (!((illegal.getCause() instanceof IllegalStateException) && 
(illegal.getCause()
@@ -120,8 +128,9 @@ public class FixedPartitioningDUnitTest extends 
FixedPartitioningTestBase {
       List<FixedPartitionAttributes> fpaList = new 
ArrayList<FixedPartitionAttributes>();
       fpaList.add(fpa1);
       fpaList.add(fpa2);
-      member1.invoke(() -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes("Quarter",
-          fpaList, 0, 0, 3, new QuarterPartitionResolver(), null, false));
+      member1
+          .invoke(() -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes(REGION_NAME,
+              fpaList, 0, 0, 3, new QuarterPartitionResolver(), null, false));
       fail("IllegalStateException Expected");
     } catch (Exception illegal) {
       if (!((illegal.getCause() instanceof IllegalStateException)
@@ -147,22 +156,25 @@ public class FixedPartitioningDUnitTest extends 
FixedPartitioningTestBase {
           FixedPartitionAttributes.createFixedPartition(Quarter1, true, 3);
       List<FixedPartitionAttributes> fpaList = new 
ArrayList<FixedPartitionAttributes>();
       fpaList.add(fpa1);
-      member1.invoke(() -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes("Quarter",
-          fpaList, 0, 40, 9, new QuarterPartitionResolver(), null, false));
+      member1
+          .invoke(() -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes(REGION_NAME,
+              fpaList, 0, 40, 9, new QuarterPartitionResolver(), null, false));
 
       member2.invoke(() -> FixedPartitioningTestBase.createCacheOnMember());
       fpa1 = FixedPartitionAttributes.createFixedPartition(Quarter2, true, 3);
       fpaList.clear();
       fpaList.add(fpa1);
-      member2.invoke(() -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes("Quarter",
-          fpaList, 0, 40, 9, new QuarterPartitionResolver(), null, false));
+      member2
+          .invoke(() -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes(REGION_NAME,
+              fpaList, 0, 40, 9, new QuarterPartitionResolver(), null, false));
 
       member3.invoke(() -> FixedPartitioningTestBase.createCacheOnMember());
       fpa1 = FixedPartitionAttributes.createFixedPartition(Quarter2, true, 3);
       fpaList.clear();
       fpaList.add(fpa1);
-      member3.invoke(() -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes("Quarter",
-          fpaList, 0, 40, 9, new QuarterPartitionResolver(), null, false));
+      member3
+          .invoke(() -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes(REGION_NAME,
+              fpaList, 0, 40, 9, new QuarterPartitionResolver(), null, false));
       fail("DuplicatePrimaryPartitionException Expected");
     } catch (Exception duplicate) {
       if (!((duplicate.getCause() instanceof 
DuplicatePrimaryPartitionException)
@@ -192,8 +204,9 @@ public class FixedPartitioningDUnitTest extends 
FixedPartitioningTestBase {
       List<FixedPartitionAttributes> fpaList = new 
ArrayList<FixedPartitionAttributes>();
       fpaList.add(fpa1);
       fpaList.add(fpa2);
-      member1.invoke(() -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes("Quarter",
-          fpaList, 1, 40, 9, new QuarterPartitionResolver(), null, false));
+      member1
+          .invoke(() -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes(REGION_NAME,
+              fpaList, 1, 40, 9, new QuarterPartitionResolver(), null, false));
 
       member2.invoke(() -> FixedPartitioningTestBase.createCacheOnMember());
       fpa1 = FixedPartitionAttributes.createFixedPartition(Quarter2, true, 3);
@@ -201,8 +214,9 @@ public class FixedPartitioningDUnitTest extends 
FixedPartitioningTestBase {
       fpaList.clear();
       fpaList.add(fpa1);
       fpaList.add(fpa2);
-      member2.invoke(() -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes("Quarter",
-          fpaList, 1, 40, 9, new QuarterPartitionResolver(), null, false));
+      member2
+          .invoke(() -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes(REGION_NAME,
+              fpaList, 1, 40, 9, new QuarterPartitionResolver(), null, false));
       fail("IllegalStateException Expected");
     } catch (Exception illegal) {
       if (!((illegal.getCause() instanceof IllegalStateException)
@@ -225,8 +239,9 @@ public class FixedPartitioningDUnitTest extends 
FixedPartitioningTestBase {
     IgnoredException expected = 
IgnoredException.addIgnoredException("IllegalStateException");
     try {
       member1.invoke(() -> FixedPartitioningTestBase.createCacheOnMember());
-      member1.invoke(() -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes("Quarter",
-          null, 1, 0, 9, new QuarterPartitionResolver(), null, false));
+      member1
+          .invoke(() -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes(REGION_NAME,
+              null, 1, 0, 9, new QuarterPartitionResolver(), null, false));
 
       member2.invoke(() -> FixedPartitioningTestBase.createCacheOnMember());
       FixedPartitionAttributes fpa1 = 
FixedPartitionAttributes.createFixedPartition("Q11", true, 3);
@@ -235,8 +250,9 @@ public class FixedPartitioningDUnitTest extends 
FixedPartitioningTestBase {
       List<FixedPartitionAttributes> fpaList = new 
ArrayList<FixedPartitionAttributes>();
       fpaList.add(fpa1);
       fpaList.add(fpa2);
-      member2.invoke(() -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes("Quarter",
-          fpaList, 1, 40, 9, new QuarterPartitionResolver(), null, false));
+      member2
+          .invoke(() -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes(REGION_NAME,
+              fpaList, 1, 40, 9, new QuarterPartitionResolver(), null, false));
 
       member3.invoke(() -> FixedPartitioningTestBase.createCacheOnMember());
       fpa1 = FixedPartitionAttributes.createFixedPartition("Q12", true, 3);
@@ -247,8 +263,9 @@ public class FixedPartitioningDUnitTest extends 
FixedPartitioningTestBase {
       fpaList.add(fpa1);
       fpaList.add(fpa2);
       fpaList.add(fpa3);
-      member3.invoke(() -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes("Quarter",
-          fpaList, 1, 40, 9, new QuarterPartitionResolver(), null, false));
+      member3
+          .invoke(() -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes(REGION_NAME,
+              fpaList, 1, 40, 9, new QuarterPartitionResolver(), null, false));
 
       member4.invoke(() -> FixedPartitioningTestBase.createCacheOnMember());
       fpa1 = FixedPartitionAttributes.createFixedPartition("Q13", true, 3);
@@ -256,8 +273,9 @@ public class FixedPartitioningDUnitTest extends 
FixedPartitioningTestBase {
       fpaList.clear();
       fpaList.add(fpa1);
       fpaList.add(fpa2);
-      member4.invoke(() -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes("Quarter",
-          fpaList, 1, 40, 9, new QuarterPartitionResolver(), null, false));
+      member4
+          .invoke(() -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes(REGION_NAME,
+              fpaList, 1, 40, 9, new QuarterPartitionResolver(), null, false));
       fail("IllegalStateException expected");
     } catch (Exception ex) {
       if (!((ex.getCause() instanceof IllegalStateException) && 
(ex.getCause().getMessage()
@@ -278,8 +296,9 @@ public class FixedPartitioningDUnitTest extends 
FixedPartitioningTestBase {
     IgnoredException expected = 
IgnoredException.addIgnoredException("IllegalStateException");
     try {
       member1.invoke(() -> FixedPartitioningTestBase.createCacheOnMember());
-      member1.invoke(() -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes("Quarter",
-          null, 1, 0, 5, new QuarterPartitionResolver(), null, false));
+      member1
+          .invoke(() -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes(REGION_NAME,
+              null, 1, 0, 5, new QuarterPartitionResolver(), null, false));
 
       member2.invoke(() -> FixedPartitioningTestBase.createCacheOnMember());
       FixedPartitionAttributes fpa1 =
@@ -289,8 +308,9 @@ public class FixedPartitioningDUnitTest extends 
FixedPartitioningTestBase {
       List<FixedPartitionAttributes> fpaList = new 
ArrayList<FixedPartitionAttributes>();
       fpaList.add(fpa1);
       fpaList.add(fpa2);
-      member2.invoke(() -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes("Quarter",
-          fpaList, 1, 40, 5, new QuarterPartitionResolver(), null, false));
+      member2
+          .invoke(() -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes(REGION_NAME,
+              fpaList, 1, 40, 5, new QuarterPartitionResolver(), null, false));
 
       member3.invoke(() -> FixedPartitioningTestBase.createCacheOnMember());
       fpa1 = FixedPartitionAttributes.createFixedPartition(Quarter2, true, 3);
@@ -298,8 +318,9 @@ public class FixedPartitioningDUnitTest extends 
FixedPartitioningTestBase {
       fpaList.clear();
       fpaList.add(fpa1);
       fpaList.add(fpa2);
-      member3.invoke(() -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes("Quarter",
-          fpaList, 1, 40, 5, new QuarterPartitionResolver(), null, false));
+      member3
+          .invoke(() -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes(REGION_NAME,
+              fpaList, 1, 40, 5, new QuarterPartitionResolver(), null, false));
 
       fail("IllegalStateException expected");
     } catch (Exception ex) {
@@ -322,25 +343,28 @@ public class FixedPartitioningDUnitTest extends 
FixedPartitioningTestBase {
   public void testPut_PartitionNotAvailableException() {
     try {
       member1.invoke(() -> FixedPartitioningTestBase.createCacheOnMember());
-      member1.invoke(() -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes("Quarter",
-          null, 1, 0, 12, new QuarterPartitionResolver(), null, false));
+      member1
+          .invoke(() -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes(REGION_NAME,
+              null, 1, 0, 12, new QuarterPartitionResolver(), null, false));
 
       member2.invoke(() -> FixedPartitioningTestBase.createCacheOnMember());
       FixedPartitionAttributes fpa1 =
           FixedPartitionAttributes.createFixedPartition(Quarter1, true, 3);
       List<FixedPartitionAttributes> fpaList = new 
ArrayList<FixedPartitionAttributes>();
       fpaList.add(fpa1);
-      member2.invoke(() -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes("Quarter",
-          fpaList, 1, 40, 12, new QuarterPartitionResolver(), null, false));
+      member2
+          .invoke(() -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes(REGION_NAME,
+              fpaList, 1, 40, 12, new QuarterPartitionResolver(), null, 
false));
 
       member3.invoke(() -> FixedPartitioningTestBase.createCacheOnMember());
       fpa1 = FixedPartitionAttributes.createFixedPartition(Quarter2, true, 3);
       fpaList.clear();
       fpaList.add(fpa1);
-      member3.invoke(() -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes("Quarter",
-          fpaList, 1, 40, 12, new QuarterPartitionResolver(), null, false));
+      member3
+          .invoke(() -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes(REGION_NAME,
+              fpaList, 1, 40, 12, new QuarterPartitionResolver(), null, 
false));
 
-      member1.invoke(() -> 
FixedPartitioningTestBase.putThorughAccessor("Quarter"));
+      member1.invoke(() -> 
FixedPartitioningTestBase.putThroughAccessor(REGION_NAME));
       fail("PartitionNotAvailableException Expected");
     } catch (Exception ex) {
       if (!((ex.getCause() instanceof PartitionNotAvailableException))) {
@@ -359,16 +383,18 @@ public class FixedPartitioningDUnitTest extends 
FixedPartitioningTestBase {
     IgnoredException expected = 
IgnoredException.addIgnoredException("IllegalStateException");
     try {
       member1.invoke(() -> FixedPartitioningTestBase.createCacheOnMember());
-      member1.invoke(() -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes("Quarter",
-          null, 1, 40, 12, new QuarterPartitionResolver(), null, false));
+      member1
+          .invoke(() -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes(REGION_NAME,
+              null, 1, 40, 12, new QuarterPartitionResolver(), null, false));
 
       member2.invoke(() -> FixedPartitioningTestBase.createCacheOnMember());
       FixedPartitionAttributes fpa1 =
           FixedPartitionAttributes.createFixedPartition(Quarter1, true, 3);
       List<FixedPartitionAttributes> fpaList = new 
ArrayList<FixedPartitionAttributes>();
       fpaList.add(fpa1);
-      member2.invoke(() -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes("Quarter",
-          fpaList, 1, 40, 12, new QuarterPartitionResolver(), null, false));
+      member2
+          .invoke(() -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes(REGION_NAME,
+              fpaList, 1, 40, 12, new QuarterPartitionResolver(), null, 
false));
     } catch (Exception ex) {
       if (!((ex.getCause() instanceof IllegalStateException))) {
         Assert.fail("Expected IllegalStateException ", ex);
@@ -392,12 +418,14 @@ public class FixedPartitioningDUnitTest extends 
FixedPartitioningTestBase {
           FixedPartitionAttributes.createFixedPartition(Quarter1, true, 3);
       List<FixedPartitionAttributes> fpaList = new 
ArrayList<FixedPartitionAttributes>();
       fpaList.add(fpa1);
-      member2.invoke(() -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes("Quarter",
-          fpaList, 1, 40, 12, new QuarterPartitionResolver(), null, false));
+      member2
+          .invoke(() -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes(REGION_NAME,
+              fpaList, 1, 40, 12, new QuarterPartitionResolver(), null, 
false));
 
       member1.invoke(() -> FixedPartitioningTestBase.createCacheOnMember());
-      member1.invoke(() -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes("Quarter",
-          null, 1, 40, 12, new QuarterPartitionResolver(), null, false));
+      member1
+          .invoke(() -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes(REGION_NAME,
+              null, 1, 40, 12, new QuarterPartitionResolver(), null, false));
     } catch (Exception ex) {
       if (!((ex.getCause() instanceof IllegalStateException))) {
         Assert.fail("Expected IllegalStateException ", ex);
@@ -414,7 +442,7 @@ public class FixedPartitioningDUnitTest extends 
FixedPartitioningTestBase {
   @Test
   public void testPut_ValidateDataOnMember_OnlyPrimary_Accessor() {
     member1.invoke(() -> FixedPartitioningTestBase.createCacheOnMember());
-    member1.invoke(() -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes("Quarter",
+    member1.invoke(() -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes(REGION_NAME,
         null, 0, 0, 12, new QuarterPartitionResolver(), null, false));
 
     member2.invoke(() -> FixedPartitioningTestBase.createCacheOnMember());
@@ -422,24 +450,24 @@ public class FixedPartitioningDUnitTest extends 
FixedPartitioningTestBase {
         FixedPartitionAttributes.createFixedPartition(Quarter1, true, 3);
     List<FixedPartitionAttributes> fpaList = new 
ArrayList<FixedPartitionAttributes>();
     fpaList.add(fpa1);
-    member2.invoke(() -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes("Quarter",
+    member2.invoke(() -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes(REGION_NAME,
         fpaList, 0, 40, 12, new QuarterPartitionResolver(), null, false));
 
     member3.invoke(() -> FixedPartitioningTestBase.createCacheOnMember());
     fpa1 = FixedPartitionAttributes.createFixedPartition(Quarter2, true, 3);
     fpaList.clear();
     fpaList.add(fpa1);
-    member3.invoke(() -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes("Quarter",
+    member3.invoke(() -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes(REGION_NAME,
         fpaList, 0, 40, 12, new QuarterPartitionResolver(), null, false));
 
     member4.invoke(() -> FixedPartitioningTestBase.createCacheOnMember());
     fpa1 = FixedPartitionAttributes.createFixedPartition(Quarter3, true, 3);
     fpaList.clear();
     fpaList.add(fpa1);
-    member4.invoke(() -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes("Quarter",
+    member4.invoke(() -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes(REGION_NAME,
         fpaList, 0, 40, 12, new QuarterPartitionResolver(), null, false));
 
-    member1.invoke(() -> 
FixedPartitioningTestBase.putThorughAccessor("Quarter"));
+    member1.invoke(() -> 
FixedPartitioningTestBase.putThroughAccessor(REGION_NAME));
 
     member2.invoke(() -> FixedPartitioningTestBase.checkPrimaryData(Quarter1));
     member3.invoke(() -> FixedPartitioningTestBase.checkPrimaryData(Quarter2));
@@ -447,76 +475,71 @@ public class FixedPartitioningDUnitTest extends 
FixedPartitioningTestBase {
 
   }
 
-  @Category(FlakyTest.class) // GEODE-567: async actions, waitForCriterion, 
time sensitive,
-  // non-thread-safe test hook, eats exceptions (partially fixed)
   @Test
-  public void testBug43283() {
-    member1.invoke(() -> FixedPartitioningTestBase.createCacheOnMember());
-    member2.invoke(() -> FixedPartitioningTestBase.createCacheOnMember());
-    member3.invoke(() -> FixedPartitioningTestBase.createCacheOnMember());
-    member4.invoke(() -> FixedPartitioningTestBase.createCacheOnMember());
+  public void putWhileDataStoresAreBeingCreatedFails() throws Exception {
+
+    VM accessor = VM.getVM(0);
+    VM datastore1 = VM.getVM(1);
+    VM datastore2 = VM.getVM(2);
+    VM datastore3 = VM.getVM(3);
+    accessor.invoke(() -> FixedPartitioningTestBase.createCacheOnMember());
+    datastore1.invoke(() -> FixedPartitioningTestBase.createCacheOnMember());
+    datastore2.invoke(() -> FixedPartitioningTestBase.createCacheOnMember());
+    datastore3.invoke(() -> FixedPartitioningTestBase.createCacheOnMember());
+
+    getBlackboard().initBlackboard();
+
+    // Create an accessor for the PR
+    accessor.invoke(() -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes(REGION_NAME,
+        null, 0, 0, 12, new QuarterPartitionResolver(), null, false));
 
-    member1.invoke(() -> 
FixedPartitioningTestBase.setPRObserverBeforeCalculateStartingBucketId());
-    member2.invoke(() -> 
FixedPartitioningTestBase.setPRObserverBeforeCalculateStartingBucketId());
-    member3.invoke(() -> 
FixedPartitioningTestBase.setPRObserverBeforeCalculateStartingBucketId());
-    member4.invoke(() -> 
FixedPartitioningTestBase.setPRObserverBeforeCalculateStartingBucketId());
+    // Set an observer in datastore 1 that will wait in the middle of PR 
creation
+    datastore1
+        .invoke(() -> 
FixedPartitioningTestBase.setPRObserverBeforeCalculateStartingBucketId());
     try {
+      // Start datstore1 asynchronously. This will get stuck waiting in the PR 
observer
+      AsyncInvocation inv1 = datastore1.invokeAsync(() -> 
createRegionWithQuarter(Quarter1));
 
-      FixedPartitionAttributes fpa1 =
-          FixedPartitionAttributes.createFixedPartition(Quarter1, true, 3);
-      List<FixedPartitionAttributes> fpaList = new 
ArrayList<FixedPartitionAttributes>();
-      fpaList.add(fpa1);
-      AsyncInvocation inv1 = member1.invokeAsync(
-          () -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes("Quarter", 
fpaList, 0,
-              40, 12, new QuarterPartitionResolver(), null, false));
+      // Make sure datastore 1 gets stuck waiting on the observer
+      getBlackboard().waitForGate("waiting", 1, TimeUnit.MINUTES);
 
-      FixedPartitionAttributes fpa2 =
-          FixedPartitionAttributes.createFixedPartition(Quarter2, true, 3);
-      fpaList.clear();
-      fpaList.add(fpa2);
-      AsyncInvocation inv2 = member2.invokeAsync(
-          () -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes("Quarter", 
fpaList, 0,
-              40, 12, new QuarterPartitionResolver(), null, false));
+      // Start two more data stores asynchronously. These will get stuck 
waiting for a dlock behind
+      // datatstore1
+      AsyncInvocation inv2 = datastore2.invokeAsync(() -> 
createRegionWithQuarter(Quarter2));
+      AsyncInvocation inv3 = datastore3.invokeAsync(() -> 
createRegionWithQuarter(Quarter3));
 
-      FixedPartitionAttributes fpa3 =
-          FixedPartitionAttributes.createFixedPartition(Quarter3, true, 3);
-      fpaList.clear();
-      fpaList.add(fpa3);
-      AsyncInvocation inv3 = member3.invokeAsync(
-          () -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes("Quarter", 
fpaList, 0,
-              40, 12, new QuarterPartitionResolver(), null, false));
-
-      member4.invoke(() -> 
FixedPartitioningTestBase.createRegionWithPartitionAttributes("Quarter",
-          null, 0, 0, 12, new QuarterPartitionResolver(), null, false));
-      try {
-        member4.invoke(() -> 
FixedPartitioningTestBase.putThorughAccessor_Immediate("Quarter"));
-      } catch (Exception e) {
-        e.printStackTrace();
-        if (!(e.getCause() instanceof PartitionNotAvailableException)) {
-          Assert.fail("exception thrown is not 
PartitionNotAvailableException", e);
-        }
-      }
-      try {
-        inv1.join();
-        inv2.join();
-        inv3.join();
-      } catch (InterruptedException e) {
-        e.printStackTrace();
-        Assert.fail("Unexpected Exception", e);
-      }
+
+      // Make sure a put to datastore1, which is in the middle of pr 
initialization, fails correctly
+      Assertions.assertThatThrownBy(() -> accessor
+          .invoke(() -> FixedPartitioningTestBase.putForQuarter(REGION_NAME, 
Quarter1)))
+          .hasCauseInstanceOf(PartitionedRegionStorageException.class);
+
+      // Make sure a put to datastore2, which stuck behind datastore1 in 
initialization, fails
+      // correctly
+      Assertions.assertThatThrownBy(() -> accessor
+          .invoke(() -> FixedPartitioningTestBase.putForQuarter(REGION_NAME, 
Quarter2)))
+          .hasCauseInstanceOf(PartitionedRegionStorageException.class);
+
+      getBlackboard().signalGate("done");
+
+      inv1.get();
+      inv2.get();
+      inv3.get();
     } finally {
-      member1
-          .invoke(() -> 
FixedPartitioningTestBase.resetPRObserverBeforeCalculateStartingBucketId());
-      member2
-          .invoke(() -> 
FixedPartitioningTestBase.resetPRObserverBeforeCalculateStartingBucketId());
-      member3
-          .invoke(() -> 
FixedPartitioningTestBase.resetPRObserverBeforeCalculateStartingBucketId());
-      member4
+      datastore1
           .invoke(() -> 
FixedPartitioningTestBase.resetPRObserverBeforeCalculateStartingBucketId());
     }
 
   }
 
+  private void createRegionWithQuarter(String quarter) {
+    FixedPartitionAttributes partition =
+        FixedPartitionAttributes.createFixedPartition(quarter, true, 3);
+    FixedPartitioningTestBase.createRegionWithPartitionAttributes("Quarter",
+        Arrays.asList(partition), 0,
+        40, 12, new QuarterPartitionResolver(), null, false);
+  }
+
   /**
    * This tests validate that datastore member does the put on itself as well 
as other datastores as
    * per primary FixedPartitionAttributes defined on datastores.
diff --git 
a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/partitioned/fixed/FixedPartitioningTestBase.java
 
b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/partitioned/fixed/FixedPartitioningTestBase.java
index 0d06400..6f3b57f 100644
--- 
a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/partitioned/fixed/FixedPartitioningTestBase.java
+++ 
b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/partitioned/fixed/FixedPartitioningTestBase.java
@@ -32,6 +32,7 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Properties;
 import java.util.Set;
+import java.util.concurrent.TimeUnit;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang.StringUtils;
@@ -56,9 +57,7 @@ import 
org.apache.geode.distributed.internal.membership.InternalDistributedMembe
 import org.apache.geode.internal.cache.FixedPartitionAttributesImpl;
 import org.apache.geode.internal.cache.HARegion;
 import org.apache.geode.internal.cache.InternalCache;
-import org.apache.geode.internal.cache.PartitionRegionConfig;
 import org.apache.geode.internal.cache.PartitionedRegion;
-import org.apache.geode.internal.cache.PartitionedRegionHelper;
 import org.apache.geode.internal.cache.execute.data.CustId;
 import org.apache.geode.internal.cache.execute.data.Customer;
 import org.apache.geode.internal.cache.execute.data.Order;
@@ -71,8 +70,6 @@ import 
org.apache.geode.internal.cache.partitioned.PartitionedRegionObserverHold
 import org.apache.geode.test.dunit.Host;
 import org.apache.geode.test.dunit.LogWriterUtils;
 import org.apache.geode.test.dunit.VM;
-import org.apache.geode.test.dunit.Wait;
-import org.apache.geode.test.dunit.WaitCriterion;
 import org.apache.geode.test.dunit.internal.JUnit4DistributedTestCase;
 
 /**
@@ -207,7 +204,7 @@ public class FixedPartitioningTestBase extends 
JUnit4DistributedTestCase {
     return dir;
   }
 
-  public static void putThorughAccessor(String regionName) {
+  public static void putThroughAccessor(String regionName) {
     region_FPR = (PartitionedRegion) cache.getRegion(regionName);
     assertNotNull(region_FPR);
     for (Months_Accessor month : Months_Accessor.values()) {
@@ -219,7 +216,7 @@ public class FixedPartitioningTestBase extends 
JUnit4DistributedTestCase {
     }
   }
 
-  public static void putThorughAccessor_Immediate(String regionName) {
+  public static void putThroughAccessor_Immediate(String regionName) {
     region_FPR = (PartitionedRegion) cache.getRegion(regionName);
     assertNotNull(region_FPR);
     for (int i = 1; i < 10; i++) {
@@ -1191,29 +1188,13 @@ public class FixedPartitioningTestBase extends 
JUnit4DistributedTestCase {
     origObserver =
         PartitionedRegionObserverHolder.setInstance(new 
PartitionedRegionObserverAdapter() {
           public void beforeCalculatingStartingBucketId() {
-            WaitCriterion wc = new WaitCriterion() {
-              String excuse;
-
-              public boolean done() {
-                Region prRoot = PartitionedRegionHelper.getPRRoot(cache);
-                PartitionRegionConfig regionConfig = (PartitionRegionConfig) 
prRoot.get("#Quarter");
-                if (regionConfig == null) {
-                  return false;
-                } else {
-                  if (!regionConfig.isFirstDataStoreCreated()) {
-                    return true;
-                  } else {
-                    return false;
-                  }
-                }
-              }
-
-              public String description() {
-                return excuse;
-              }
-            };
-            Wait.waitForCriterion(wc, 20000, 500, false);
-            LogWriterUtils.getLogWriter().info("end of 
beforeCalculatingStartingBucketId");
+            getBlackboard().signalGate("waiting");
+            try {
+              getBlackboard().waitForGate("done", 1, TimeUnit.MINUTES);
+            } catch (Exception e) {
+              throw new RuntimeException("Failed waiting to be signaled to 
continue in PR observer",
+                  e);
+            }
           }
         });
   }
diff --git 
a/geode-core/src/integrationTest/java/org/apache/geode/test/dunit/internal/JUnit4DistributedTestCase.java
 
b/geode-core/src/integrationTest/java/org/apache/geode/test/dunit/internal/JUnit4DistributedTestCase.java
index 334eb2b..72733a9 100644
--- 
a/geode-core/src/integrationTest/java/org/apache/geode/test/dunit/internal/JUnit4DistributedTestCase.java
+++ 
b/geode-core/src/integrationTest/java/org/apache/geode/test/dunit/internal/JUnit4DistributedTestCase.java
@@ -333,7 +333,7 @@ public abstract class JUnit4DistributedTestCase implements 
DistributedTestFixtur
    *
    * @return the blackboard
    */
-  public DUnitBlackboard getBlackboard() {
+  public static DUnitBlackboard getBlackboard() {
     return blackboard;
   }
 

Reply via email to