hadoop-common-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From sur...@apache.org
Subject svn commit: r1410993 - in /hadoop/common/branches/branch-1-win: CHANGES.txt src/test/org/apache/hadoop/metrics2/impl/TestSinkQueue.java
Date Sun, 18 Nov 2012 21:36:17 GMT
Author: suresh
Date: Sun Nov 18 21:36:16 2012
New Revision: 1410993

URL: http://svn.apache.org/viewvc?rev=1410993&view=rev
Log:
HADOOP-9036. Merge change 1410992 from branch-1

Modified:
    hadoop/common/branches/branch-1-win/CHANGES.txt
    hadoop/common/branches/branch-1-win/src/test/org/apache/hadoop/metrics2/impl/TestSinkQueue.java

Modified: hadoop/common/branches/branch-1-win/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-1-win/CHANGES.txt?rev=1410993&r1=1410992&r2=1410993&view=diff
==============================================================================
--- hadoop/common/branches/branch-1-win/CHANGES.txt (original)
+++ hadoop/common/branches/branch-1-win/CHANGES.txt Sun Nov 18 21:36:16 2012
@@ -30,6 +30,9 @@ Release 1.2.0 - unreleased
     HADOOP-8900. BuiltInGzipDecompressor throws IOException - stored gzip size
     doesn't match decompressed size. (Andy Isaacson via suresh)
 
+    HADOOP-9036. Fix racy test case TestSinkQueue (Backport HADOOP-7292).
+    (Luke Lu backport by suresh)
+
 Release 1.1.1 - Unreleased
 
   INCOMPATIBLE CHANGES

Modified: hadoop/common/branches/branch-1-win/src/test/org/apache/hadoop/metrics2/impl/TestSinkQueue.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-1-win/src/test/org/apache/hadoop/metrics2/impl/TestSinkQueue.java?rev=1410993&r1=1410992&r2=1410993&view=diff
==============================================================================
--- hadoop/common/branches/branch-1-win/src/test/org/apache/hadoop/metrics2/impl/TestSinkQueue.java
(original)
+++ hadoop/common/branches/branch-1-win/src/test/org/apache/hadoop/metrics2/impl/TestSinkQueue.java
Sun Nov 18 21:36:16 2012
@@ -24,13 +24,13 @@ import org.apache.commons.logging.LogFac
 import org.junit.Test;
 import static org.junit.Assert.*;
 import static org.mockito.Mockito.*;
+import java.util.concurrent.CountDownLatch;
 
 /**
  * Test the half-blocking metrics sink queue
  */
 public class TestSinkQueue {
-
-  private final Log LOG = LogFactory.getLog(TestSinkQueue.class);
+  private static final Log LOG = LogFactory.getLog(TestSinkQueue.class);
 
   /**
    * Test common use case
@@ -61,6 +61,11 @@ public class TestSinkQueue {
    * @throws Exception
    */
   @Test public void testEmptyBlocking() throws Exception {
+    testEmptyBlocking(0);
+    testEmptyBlocking(100);
+  }
+
+  private void testEmptyBlocking(int awhile) throws Exception {
     final SinkQueue<Integer> q = new SinkQueue<Integer>(2);
     final Runnable trigger = mock(Runnable.class);
     // try consuming emtpy equeue and blocking
@@ -81,7 +86,10 @@ public class TestSinkQueue {
       }
     };
     t.start();
-    Thread.yield(); // Let the other block
+    // Should work with or without sleep
+    if (awhile > 0) {
+      Thread.sleep(awhile);
+    }
     q.enqueue(1);
     q.enqueue(2);
     t.join();
@@ -226,21 +234,25 @@ public class TestSinkQueue {
       LOG.info(e);
       return;
     }
-    fail("should've thrown");
+    LOG.error("should've thrown CME");
+    fail("should've thrown CME");
   }
 
-  private SinkQueue<Integer>
-  newSleepingConsumerQueue(int capacity, int... values) {
+  private SinkQueue<Integer> newSleepingConsumerQueue(int capacity,
+       int... values) throws Exception {
     final SinkQueue<Integer> q = new SinkQueue<Integer>(capacity);
     for (int i : values) {
       q.enqueue(i);
     }
+    final CountDownLatch barrier = new CountDownLatch(1);
     Thread t = new Thread() {
       @Override public void run() {
         try {
+          Thread.sleep(10); // causes failure without barrier
           q.consume(new Consumer<Integer>() {
             public void consume(Integer e) throws InterruptedException {
               LOG.info("sleeping");
+              barrier.countDown();
               Thread.sleep(1000 * 86400); // a long time
             }
           });
@@ -253,7 +265,7 @@ public class TestSinkQueue {
     t.setName("Sleeping consumer");
     t.setDaemon(true);  // so jvm can exit
     t.start();
-    Thread.yield(); // Let the consumer consume
+    barrier.await();
     LOG.debug("Returning new sleeping consumer queue");
     return q;
   }



Mime
View raw message