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)