You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@helix.apache.org by jx...@apache.org on 2020/04/23 20:02:44 UTC
[helix] 09/20: Added test to acquire lock simultaneously
This is an automated email from the ASF dual-hosted git repository.
jxue pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/helix.git
commit 5da48757d72730e0d21db1ef5268ef55776ffa7d
Author: Molly Gao <mg...@mgao-mn1.linkedin.biz>
AuthorDate: Tue Feb 4 17:38:13 2020 -0800
Added test to acquire lock simultaneously
---
.../apache/helix/lock/ZKHelixNonblockingLock.java | 5 +--
.../helix/lock/TestZKHelixNonblockingLock.java | 39 +++++++++++++++++++---
2 files changed, 36 insertions(+), 8 deletions(-)
diff --git a/helix-lock/src/main/java/org/apache/helix/lock/ZKHelixNonblockingLock.java b/helix-lock/src/main/java/org/apache/helix/lock/ZKHelixNonblockingLock.java
index 44b5aa9..57ff9aa 100644
--- a/helix-lock/src/main/java/org/apache/helix/lock/ZKHelixNonblockingLock.java
+++ b/helix-lock/src/main/java/org/apache/helix/lock/ZKHelixNonblockingLock.java
@@ -152,10 +152,7 @@ public class ZKHelixNonblockingLock implements HelixLock {
if (curLockInfo == null) {
return false;
}
- if (userIdMatches(curLockInfo)) {
- return !hasTimedOut(curLockInfo);
- }
- return false;
+ return userIdMatches(curLockInfo) && !hasTimedOut(curLockInfo);
}
/**
diff --git a/helix-lock/src/test/java/org/apache/helix/lock/TestZKHelixNonblockingLock.java b/helix-lock/src/test/java/org/apache/helix/lock/TestZKHelixNonblockingLock.java
index 37daf7b..f2308c1 100644
--- a/helix-lock/src/test/java/org/apache/helix/lock/TestZKHelixNonblockingLock.java
+++ b/helix-lock/src/test/java/org/apache/helix/lock/TestZKHelixNonblockingLock.java
@@ -19,12 +19,21 @@
package org.apache.helix.lock;
+import java.util.ArrayList;
import java.util.Date;
+import java.util.List;
+import java.util.Map;
import java.util.UUID;
+import java.util.concurrent.Callable;
+import org.apache.helix.AccessOption;
+import org.apache.helix.PropertyPathBuilder;
import org.apache.helix.TestHelper;
import org.apache.helix.ZNRecord;
import org.apache.helix.ZkUnitTestBase;
+import org.apache.helix.manager.zk.TestWtCacheAsyncOpMultiThread;
+import org.apache.helix.manager.zk.ZKHelixDataAccessor;
+import org.apache.helix.manager.zk.ZkCacheBaseDataAccessor;
import org.apache.helix.model.HelixConfigScope;
import org.apache.helix.model.HelixConfigScope.ConfigScopeProperty;
import org.apache.helix.model.builder.HelixConfigScopeBuilder;
@@ -44,6 +53,7 @@ public class TestZKHelixNonblockingLock extends ZkUnitTestBase {
private String _lockPath;
private ZKHelixNonblockingLock _lock;
private String _userId;
+ private HelixConfigScope _participantScope;
@BeforeClass
public void beforeClass() throws Exception {
@@ -53,14 +63,13 @@ public class TestZKHelixNonblockingLock extends ZkUnitTestBase {
TestHelper.setupCluster(_clusterName, ZK_ADDR, 12918, "localhost", "TestDB", 1, 10, 5, 3,
"MasterSlave", true);
_userId = UUID.randomUUID().toString();
- HelixConfigScope participantScope =
+ _participantScope =
new HelixConfigScopeBuilder(ConfigScopeProperty.PARTICIPANT).forCluster(_clusterName)
.forParticipant("localhost_12918").build();
- _lockPath = "/" + _clusterName + '/' + "LOCKS" + '/' + participantScope;
- _lock = new ZKHelixNonblockingLock(_clusterName, participantScope, ZK_ADDR, Long.MAX_VALUE,
+ _lockPath = "/" + _clusterName + '/' + "LOCKS" + '/' + _participantScope;
+ _lock = new ZKHelixNonblockingLock(_clusterName, _participantScope, ZK_ADDR, Long.MAX_VALUE,
_lockMessage, _userId);
-
}
@BeforeMethod
@@ -134,7 +143,29 @@ public class TestZKHelixNonblockingLock extends ZkUnitTestBase {
@Test
public void testSimultaneousAcquire() {
+ List<Callable<Boolean>> threads = new ArrayList<>();
+ for (int i = 0; i < 2; i++) {
+ ZKHelixNonblockingLock lock =
+ new ZKHelixNonblockingLock(_clusterName, _participantScope, ZK_ADDR, Long.MAX_VALUE,
+ _lockMessage, UUID.randomUUID().toString());
+ threads.add(new TestSimultaneousAcquireLock(lock));
+ }
+ Map<String, Boolean> resultMap = TestHelper.startThreadsConcurrently(threads, 1000);
+ Assert.assertEquals(resultMap.size(), 2);
+ Assert.assertEqualsNoOrder(resultMap.values().toArray(), new Boolean[]{true, false});
+ }
+
+ private static class TestSimultaneousAcquireLock implements Callable<Boolean> {
+ final ZKHelixNonblockingLock _lock;
+
+ TestSimultaneousAcquireLock(ZKHelixNonblockingLock lock) {
+ _lock = lock;
+ }
+ @Override
+ public Boolean call() throws Exception {
+ return _lock.acquireLock();
+ }
}
}