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 <rkan...@cloudera.com> Authored: Tue Sep 13 13:45:32 2016 -0700 Committer: Robert Kanter <rkan...@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)