You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@accumulo.apache.org by ct...@apache.org on 2018/05/03 21:07:21 UTC

[accumulo] branch master updated: Fix #461 Handle race condition in AccumuloMonitorAppenderTest

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

ctubbsii pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/accumulo.git


The following commit(s) were added to refs/heads/master by this push:
     new 8679827  Fix #461 Handle race condition in AccumuloMonitorAppenderTest
8679827 is described below

commit 8679827e5c14c2147c58cf18d357c591bbe2a161
Author: Christopher Tubbs <ct...@apache.org>
AuthorDate: Thu May 3 16:59:34 2018 -0400

    Fix #461 Handle race condition in AccumuloMonitorAppenderTest
    
    Catch NoSuchElementException and handle it in the
    AccumuloMonitorAppenderTest. This can happen if the test sees the state
    of the appender while it is being updated from the old monitor location
    to the new location.
    
    Updates to the appender occurs in a single thread. Dispatching log
    events are synchronized, and thread-safe, so this only ever affected the
    test itself.
---
 .../monitor/util/AccumuloMonitorAppenderTest.java         | 15 ++++++++++++---
 1 file changed, 12 insertions(+), 3 deletions(-)

diff --git a/server/monitor/src/test/java/org/apache/accumulo/monitor/util/AccumuloMonitorAppenderTest.java b/server/monitor/src/test/java/org/apache/accumulo/monitor/util/AccumuloMonitorAppenderTest.java
index 91f9b96..4b03abc 100644
--- a/server/monitor/src/test/java/org/apache/accumulo/monitor/util/AccumuloMonitorAppenderTest.java
+++ b/server/monitor/src/test/java/org/apache/accumulo/monitor/util/AccumuloMonitorAppenderTest.java
@@ -20,6 +20,7 @@ import static java.nio.charset.StandardCharsets.UTF_8;
 import static org.junit.Assert.fail;
 
 import java.util.Enumeration;
+import java.util.NoSuchElementException;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.RejectedExecutionException;
 import java.util.concurrent.ScheduledExecutorService;
@@ -168,11 +169,13 @@ public class AccumuloMonitorAppenderTest {
   }
 
   private static void updateLocAndVerify(AtomicLong currentLoc, AccumuloMonitorAppender parent,
-      int newLoc) {
+      int newLoc) throws InterruptedException {
     // set the new location
     currentLoc.set(newLoc);
     // wait for the appender to notice the change
-    while (!verifyAppender(parent, newLoc == 0 ? null : ("loc" + newLoc))) {}
+    while (!verifyAppender(parent, newLoc == 0 ? null : ("loc" + newLoc))) {
+      Thread.sleep(10);
+    }
   }
 
   private static boolean verifyAppender(AccumuloMonitorAppender parent, String newLocName) {
@@ -183,7 +186,13 @@ public class AccumuloMonitorAppenderTest {
     if (childAppenders == null || !childAppenders.hasMoreElements()) {
       return false;
     }
-    AppenderSkeleton child = (AppenderSkeleton) childAppenders.nextElement();
+    AppenderSkeleton child = null;
+    try {
+      child = (AppenderSkeleton) childAppenders.nextElement();
+    } catch (NoSuchElementException e) {
+      // Enumeration not thread safe; appender for old loc was removed after we did hasMoreElements
+      return false;
+    }
     if (childAppenders.hasMoreElements()) {
       Assert.fail("Appender should never have more than one child");
     }

-- 
To stop receiving notification emails like this one, please contact
ctubbsii@apache.org.