You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@oozie.apache.org by rk...@apache.org on 2016/09/13 20:47:02 UTC

oozie git commit: OOZIE-2584 Eliminate Thread.sleep() calls in TestMemoryLocks (pbacsko via rkanter)

Repository: oozie
Updated Branches:
  refs/heads/master 48515adef -> d7b7878ce


OOZIE-2584 Eliminate Thread.sleep() calls in TestMemoryLocks (pbacsko via rkanter)


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

Branch: refs/heads/master
Commit: d7b7878ce86d5094d512c979fbbf2a33df674ccc
Parents: 48515ad
Author: Robert Kanter <rk...@cloudera.com>
Authored: Tue Sep 13 13:45:32 2016 -0700
Committer: Robert Kanter <rk...@cloudera.com>
Committed: Tue Sep 13 13:45:32 2016 -0700

----------------------------------------------------------------------
 .../org/apache/oozie/lock/TestMemoryLocks.java  | 216 ++++++++++++-------
 release-log.txt                                 |   1 +
 2 files changed, 137 insertions(+), 80 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/oozie/blob/d7b7878c/core/src/test/java/org/apache/oozie/lock/TestMemoryLocks.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/oozie/lock/TestMemoryLocks.java b/core/src/test/java/org/apache/oozie/lock/TestMemoryLocks.java
index 61fec19..f0a87e5 100644
--- a/core/src/test/java/org/apache/oozie/lock/TestMemoryLocks.java
+++ b/core/src/test/java/org/apache/oozie/lock/TestMemoryLocks.java
@@ -19,6 +19,9 @@
 package org.apache.oozie.lock;
 
 import java.util.UUID;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
 import org.apache.oozie.service.MemoryLocksService;
 import org.apache.oozie.service.ServiceException;
 import org.apache.oozie.service.Services;
@@ -26,6 +29,7 @@ import org.apache.oozie.test.XTestCase;
 import org.apache.oozie.util.XLog;
 
 public class TestMemoryLocks extends XTestCase {
+    private static final int LATCH_TIMEOUT = 10;
     private XLog log = XLog.getLog(getClass());
 
     private MemoryLocks locks;
@@ -40,13 +44,35 @@ public class TestMemoryLocks extends XTestCase {
         super.tearDown();
     }
 
-    public abstract class Locker implements Runnable {
+    public abstract class LatchHandler {
+        protected CountDownLatch startLatch = new CountDownLatch(1);
+        protected CountDownLatch acquireLockLatch = new CountDownLatch(1);
+        protected CountDownLatch proceedingLatch = new CountDownLatch(1);
+        protected CountDownLatch terminationLatch = new CountDownLatch(1);
+
+        public void awaitStart() throws InterruptedException {
+            startLatch.await(LATCH_TIMEOUT, TimeUnit.SECONDS);
+        }
+
+        public void awaitTermination() throws InterruptedException {
+            terminationLatch.await(LATCH_TIMEOUT, TimeUnit.SECONDS);
+        }
+
+        public void awaitLockAcquire() throws InterruptedException {
+            acquireLockLatch.await(LATCH_TIMEOUT, TimeUnit.SECONDS);
+        }
+
+        public void proceed() {
+            proceedingLatch.countDown();
+        }
+    }
+
+    public abstract class Locker extends LatchHandler implements Runnable {
         protected String name;
         private String nameIndex;
         private StringBuffer sb;
         protected long timeout;
 
-
         public Locker(String name, int nameIndex, long timeout, StringBuffer buffer) {
             this.name = name;
             this.nameIndex = name + ":" + nameIndex;
@@ -57,36 +83,32 @@ public class TestMemoryLocks extends XTestCase {
         public void run() {
             try {
                 log.info("Getting lock [{0}]", nameIndex);
+                startLatch.countDown();
                 MemoryLocks.MemoryLockToken token = getLock();
                 if (token != null) {
                     log.info("Got lock [{0}]", nameIndex);
                     sb.append(nameIndex + "-L ");
-                    synchronized (this) {
-                        wait();
-                    }
+
+                    acquireLockLatch.countDown();
+                    proceedingLatch.await(LATCH_TIMEOUT, TimeUnit.SECONDS);
+
                     sb.append(nameIndex + "-U ");
                     token.release();
                     log.info("Release lock [{0}]", nameIndex);
                 }
                 else {
+                    proceedingLatch.await(LATCH_TIMEOUT, TimeUnit.SECONDS);
                     sb.append(nameIndex + "-N ");
                     log.info("Did not get lock [{0}]", nameIndex);
                 }
+                terminationLatch.countDown();
             }
             catch (Exception ex) {
                 throw new RuntimeException(ex);
             }
         }
 
-        public void finish() {
-            synchronized (this) {
-                notify();
-            }
-        }
-
         protected abstract MemoryLocks.MemoryLockToken getLock() throws InterruptedException;
-
-
     }
 
     public class ReadLocker extends Locker {
@@ -117,13 +139,17 @@ public class TestMemoryLocks extends XTestCase {
         Locker l2 = new WriteLocker("a", 2, -1, sb);
 
         new Thread(l1).start();
-        Thread.sleep(500);
+        l1.awaitLockAcquire();
+
         new Thread(l2).start();
-        Thread.sleep(500);
-        l1.finish();
-        Thread.sleep(500);
-        l2.finish();
-        Thread.sleep(500);
+        l2.awaitStart();
+
+        l1.proceed();
+        l2.proceed();
+
+        l1.awaitTermination();
+        l2.awaitTermination();
+
         assertEquals("a:1-L a:1-U a:2-L a:2-U", sb.toString().trim());
     }
 
@@ -133,29 +159,37 @@ public class TestMemoryLocks extends XTestCase {
         Locker l2 = new WriteLocker("a", 2, 0, sb);
 
         new Thread(l1).start();
-        Thread.sleep(500);
+        l1.awaitLockAcquire();
+
         new Thread(l2).start();
-        Thread.sleep(500);
-        l1.finish();
-        Thread.sleep(500);
-        l2.finish();
-        Thread.sleep(500);
+        l2.awaitStart();
+
+        l2.proceed();
+        l2.awaitTermination();
+
+        l1.proceed();
+        l1.awaitTermination();
+
         assertEquals("a:1-L a:2-N a:1-U", sb.toString().trim());
     }
 
     public void testTimeoutWaitingWriteLock() throws Exception {
         StringBuffer sb = new StringBuffer("");
         Locker l1 = new WriteLocker("a", 1, 0, sb);
-        Locker l2 = new WriteLocker("a", 2, 1000, sb);
+        Locker l2 = new WriteLocker("a", 2, 10000, sb);
 
         new Thread(l1).start();
-        Thread.sleep(500);
+        l1.awaitLockAcquire();
+
         new Thread(l2).start();
-        Thread.sleep(500);
-        l1.finish();
-        Thread.sleep(500);
-        l2.finish();
-        Thread.sleep(500);
+        l2.awaitStart();
+
+        l1.proceed();
+        l1.awaitTermination();
+
+        l2.proceed();
+        l2.awaitTermination();
+
         assertEquals("a:1-L a:1-U a:2-L a:2-U", sb.toString().trim());
     }
 
@@ -165,13 +199,17 @@ public class TestMemoryLocks extends XTestCase {
         Locker l2 = new WriteLocker("a", 2, 50, sb);
 
         new Thread(l1).start();
-        Thread.sleep(500);
+        l1.awaitLockAcquire();
+
         new Thread(l2).start();
-        Thread.sleep(500);
-        l1.finish();
-        Thread.sleep(500);
-        l2.finish();
-        Thread.sleep(500);
+        l2.awaitStart();
+
+        l2.proceed();
+        l2.awaitTermination();  // L2 will time out after 50ms
+
+        l1.proceed();
+        l1.awaitTermination();
+
         assertEquals("a:1-L a:2-N a:1-U", sb.toString().trim());
     }
 
@@ -181,13 +219,17 @@ public class TestMemoryLocks extends XTestCase {
         Locker l2 = new ReadLocker("a", 2, -1, sb);
 
         new Thread(l1).start();
-        Thread.sleep(500);
+        l1.awaitLockAcquire();  // L1 is holding a readlock
+
         new Thread(l2).start();
-        Thread.sleep(500);
-        l1.finish();
-        Thread.sleep(500);
-        l2.finish();
-        Thread.sleep(500);
+        l2.awaitLockAcquire();  // both L1 & L2 are holding a readlock
+
+        l1.proceed();
+        l1.awaitTermination();
+
+        l2.proceed();
+        l2.awaitTermination();
+
         assertEquals("a:1-L a:2-L a:1-U a:2-U", sb.toString().trim());
     }
 
@@ -197,13 +239,17 @@ public class TestMemoryLocks extends XTestCase {
         Locker l2 = new WriteLocker("a", 2, -1, sb);
 
         new Thread(l1).start();
-        Thread.sleep(500);
+        l1.awaitLockAcquire();
+
         new Thread(l2).start();
-        Thread.sleep(500);
-        l1.finish();
-        Thread.sleep(500);
-        l2.finish();
-        Thread.sleep(500);
+        l2.awaitStart();
+
+        l1.proceed();
+        l1.awaitTermination();
+
+        l2.proceed();
+        l2.awaitTermination();
+
         assertEquals("a:1-L a:1-U a:2-L a:2-U", sb.toString().trim());
     }
 
@@ -213,17 +259,21 @@ public class TestMemoryLocks extends XTestCase {
         Locker l2 = new ReadLocker("a", 2, -1, sb);
 
         new Thread(l1).start();
-        Thread.sleep(500);
+        l1.awaitLockAcquire();
+
         new Thread(l2).start();
-        Thread.sleep(500);
-        l1.finish();
-        Thread.sleep(500);
-        l2.finish();
-        Thread.sleep(500);
+        l2.awaitStart();
+
+        l1.proceed();
+        l1.awaitTermination();
+
+        l2.proceed();
+        l2.awaitTermination();
+
         assertEquals("a:1-L a:1-U a:2-L a:2-U", sb.toString().trim());
     }
 
-    public class SameThreadWriteLocker implements Runnable {
+    public class SameThreadWriteLocker extends LatchHandler implements Runnable {
         protected String name;
         private String nameIndex;
         private StringBuffer sb;
@@ -238,45 +288,43 @@ public class TestMemoryLocks extends XTestCase {
 
         public void run() {
             try {
+                startLatch.countDown();
                 log.info("Getting lock [{0}]", nameIndex);
                 MemoryLocks.MemoryLockToken token = getLock();
                 MemoryLocks.MemoryLockToken token2 = getLock();
 
                 if (token != null) {
+                    acquireLockLatch.countDown();
+
                     log.info("Got lock [{0}]", nameIndex);
                     sb.append(nameIndex + "-L1 ");
                     if (token2 != null) {
                         sb.append(nameIndex + "-L2 ");
                     }
                     sb.append(nameIndex + "-U1 ");
+
+                    proceedingLatch.await(LATCH_TIMEOUT, TimeUnit.SECONDS);
+
                     token.release();
-                    synchronized (this) {
-                        wait();
-                    }
                     sb.append(nameIndex + "-U2 ");
                     token2.release();
                     log.info("Release lock [{0}]", nameIndex);
                 }
                 else {
+                    proceedingLatch.await(LATCH_TIMEOUT, TimeUnit.SECONDS);
                     sb.append(nameIndex + "-N ");
                     log.info("Did not get lock [{0}]", nameIndex);
                 }
+                terminationLatch.countDown();
             }
             catch (Exception ex) {
                 throw new RuntimeException(ex);
             }
         }
 
-        public void finish() {
-            synchronized (this) {
-                notify();
-            }
-        }
-
         protected MemoryLocks.MemoryLockToken getLock() throws InterruptedException {
             return locks.getWriteLock(name, timeout);
         }
-
     }
 
     public void testWriteLockSameThreadNoWait() throws Exception {
@@ -285,29 +333,37 @@ public class TestMemoryLocks extends XTestCase {
         Locker l2 = new WriteLocker("a", 2, 0, sb);
 
         new Thread(l1).start();
-        Thread.sleep(500);
+        l1.awaitLockAcquire();
+
         new Thread(l2).start();
-        Thread.sleep(500);
-        l1.finish();
-        Thread.sleep(500);
-        l2.finish();
-        Thread.sleep(500);
+        l1.awaitStart();
+
+        l2.proceed();
+        l2.awaitTermination();
+
+        l1.proceed();
+        l1.awaitTermination();
+
         assertEquals("a:1-L1 a:1-L2 a:1-U1 a:2-N a:1-U2", sb.toString().trim());
     }
 
     public void testWriteLockSameThreadWait() throws Exception {
         StringBuffer sb = new StringBuffer("");
         SameThreadWriteLocker l1 = new SameThreadWriteLocker("a", 1, 0, sb);
-        Locker l2 = new WriteLocker("a", 2, 1000, sb);
+        Locker l2 = new WriteLocker("a", 2, 10000, sb);
 
         new Thread(l1).start();
-        Thread.sleep(500);
+        l1.awaitLockAcquire();
+
         new Thread(l2).start();
-        Thread.sleep(500);
-        l1.finish();
-        Thread.sleep(500);
-        l2.finish();
-        Thread.sleep(500);
+        l1.awaitStart();
+
+        l1.proceed();
+        l1.awaitTermination();
+
+        l2.proceed();
+        l2.awaitTermination();
+
         assertEquals("a:1-L1 a:1-L2 a:1-U1 a:1-U2 a:2-L a:2-U", sb.toString().trim());
     }
 

http://git-wip-us.apache.org/repos/asf/oozie/blob/d7b7878c/release-log.txt
----------------------------------------------------------------------
diff --git a/release-log.txt b/release-log.txt
index bb8ca5a..a525fd1 100644
--- a/release-log.txt
+++ b/release-log.txt
@@ -1,5 +1,6 @@
 -- Oozie 4.3.0 release (trunk - unreleased)
 
+OOZIE-2584 Eliminate Thread.sleep() calls in TestMemoryLocks (pbacsko via rkanter)
 OOZIE-2635 TimeZone.getTimeZone has performance issue. (satishsaley via rkanter)
 OOZIE-2583 oozie throws EL Exception when reference variable name containing dot (abhishekbafna via jaydeepvishwakarma)
 OOZIE-2653 Close active connection to hcat server in fs action (satishsaley via puru)