ACCUMULO-4035 Retry assertions when data is not propagated to ZK.

Simply waiting an arbitrary amount of time is insufficient
to have reliably-passing tests. Convert sleep+check into a
loop of check+sleep-on-failure.


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

Branch: refs/heads/1.7
Commit: ddace50491f205a1b501de088c90aa956c11796f
Parents: deef535
Author: Josh Elser <els...@apache.org>
Authored: Wed Oct 21 13:44:49 2015 -0400
Committer: Josh Elser <els...@apache.org>
Committed: Wed Oct 21 13:44:49 2015 -0400

----------------------------------------------------------------------
 .../org/apache/accumulo/test/NamespacesIT.java  | 99 +++++++++++++++-----
 1 file changed, 77 insertions(+), 22 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/accumulo/blob/ddace504/test/src/test/java/org/apache/accumulo/test/NamespacesIT.java
----------------------------------------------------------------------
diff --git a/test/src/test/java/org/apache/accumulo/test/NamespacesIT.java 
b/test/src/test/java/org/apache/accumulo/test/NamespacesIT.java
index 2a57a7b..6fbf247 100644
--- a/test/src/test/java/org/apache/accumulo/test/NamespacesIT.java
+++ b/test/src/test/java/org/apache/accumulo/test/NamespacesIT.java
@@ -496,12 +496,38 @@ public class NamespacesIT extends AccumuloIT {
     
assertFalse(c.tableOperations().listConstraints(t1).containsKey(constraintClassName));
 
     c.namespaceOperations().addConstraint(namespace, constraintClassName);
-    
assertTrue(c.namespaceOperations().listConstraints(namespace).containsKey(constraintClassName));
-    
assertTrue(c.tableOperations().listConstraints(t1).containsKey(constraintClassName));
-    int num = 
c.namespaceOperations().listConstraints(namespace).get(constraintClassName);
-    assertEquals(num, (int) 
c.tableOperations().listConstraints(t1).get(constraintClassName));
-    // doesn't take effect immediately, needs time to propagate to tserver's 
ZooKeeper cache
-    UtilWaitThread.sleep(250);
+    boolean passed = false;
+    for (int i = 0; i < 5; i++) {
+      if 
(!c.namespaceOperations().listConstraints(namespace).containsKey(constraintClassName))
 {
+        Thread.sleep(500);
+        continue;
+      }
+      if 
(!c.tableOperations().listConstraints(t1).containsKey(constraintClassName)) {
+        Thread.sleep(500);
+        continue;
+      }
+      passed = true;
+      break;
+    }
+    assertTrue("Failed to observe newly-added constraint", passed);
+
+    passed = false;
+    Integer namespaceNum = null;
+    for (int i = 0; i < 5; i++) {
+      namespaceNum = 
c.namespaceOperations().listConstraints(namespace).get(constraintClassName);
+      if (null == namespaceNum) {
+        Thread.sleep(500);
+        continue;
+      }
+      Integer tableNum = 
c.tableOperations().listConstraints(t1).get(constraintClassName);
+      if (null == tableNum) {
+        Thread.sleep(500);
+        continue;
+      }
+      assertEquals(namespaceNum, tableNum);
+      passed = true;
+    }
+    assertTrue("Failed to observe constraint in both table and namespace", 
passed);
 
     Mutation m1 = new Mutation("r1");
     Mutation m2 = new Mutation("r2");
@@ -509,24 +535,53 @@ public class NamespacesIT extends AccumuloIT {
     m1.put("a", "b", new Value("abcde".getBytes(UTF_8)));
     m2.put("e", "f", new Value("123".getBytes(UTF_8)));
     m3.put("c", "d", new Value("zyxwv".getBytes(UTF_8)));
-    BatchWriter bw = c.createBatchWriter(t1, new BatchWriterConfig());
-    bw.addMutations(Arrays.asList(m1, m2, m3));
-    try {
-      bw.close();
-      fail();
-    } catch (MutationsRejectedException e) {
-      assertEquals(1, e.getConstraintViolationSummaries().size());
-      assertEquals(2, 
e.getConstraintViolationSummaries().get(0).getNumberOfViolatingMutations());
+
+    passed = false;
+    for (int i = 0; i < 5; i++) {
+      BatchWriter bw = c.createBatchWriter(t1, new BatchWriterConfig());
+      bw.addMutations(Arrays.asList(m1, m2, m3));
+      try {
+        bw.close();
+        Thread.sleep(500);
+      } catch (MutationsRejectedException e) {
+        passed = true;
+        assertEquals(1, e.getConstraintViolationSummaries().size());
+        assertEquals(2, 
e.getConstraintViolationSummaries().get(0).getNumberOfViolatingMutations());
+        break;
+      }
     }
-    c.namespaceOperations().removeConstraint(namespace, num);
-    
assertFalse(c.namespaceOperations().listConstraints(namespace).containsKey(constraintClassName));
-    
assertFalse(c.tableOperations().listConstraints(t1).containsKey(constraintClassName));
-    // doesn't take effect immediately, needs time to propagate to tserver's 
ZooKeeper cache
-    UtilWaitThread.sleep(250);
 
-    bw = c.createBatchWriter(t1, new BatchWriterConfig());
-    bw.addMutations(Arrays.asList(m1, m2, m3));
-    bw.close();
+    assertTrue("Failed to see mutations rejected after constraint was added", 
passed);
+
+    assertNotNull("Namespace constraint ID should not be null", namespaceNum);
+    c.namespaceOperations().removeConstraint(namespace, namespaceNum);
+    passed = false;
+    for (int i = 0; i < 5; i++) {
+      if 
(c.namespaceOperations().listConstraints(namespace).containsKey(constraintClassName))
 {
+        Thread.sleep(500);
+        continue;
+      }
+      if 
(c.tableOperations().listConstraints(t1).containsKey(constraintClassName)) {
+        Thread.sleep(500);
+        continue;
+      }
+      passed = true;
+    }
+    assertTrue("Failed to verify that constraint was removed from namespace 
and table", passed);
+
+    passed = false;
+    for (int i = 0; i < 5; i++) {
+      BatchWriter bw = c.createBatchWriter(t1, new BatchWriterConfig());
+      try {
+        bw.addMutations(Arrays.asList(m1, m2, m3));
+        bw.close();
+      } catch (MutationsRejectedException e) {
+        Thread.sleep(500);
+        continue;
+      }
+      passed = true;
+    }
+    assertTrue("Failed to add mutations that should be allowed", passed);
   }
 
   @Test

Reply via email to