@Override public LockRefreshToken lock(String client, LockRequest request) throws InterruptedException { Preconditions.checkArgument(request.getLockGroupBehavior() == LockGroupBehavior.LOCK_ALL_OR_NONE, "lock() only supports LockGroupBehavior.LOCK_ALL_OR_NONE. Consider using lockAndGetHeldLocks()."); LockResponse result = lockWithFullLockResponse(LockClient.of(client), request); return result.success() ? result.getLockRefreshToken() : null; }
/** Tests lockAndRelease */ @Test public void testLockAndRelease() throws Exception { LockRequest hasLock2 = LockRequest.builder(ImmutableSortedMap.of(lock2, LockMode.WRITE)).build(); final LockRequest request = LockRequest.builder(ImmutableSortedMap.of(lock1, LockMode.WRITE, lock2, LockMode.WRITE)).lockAndRelease().build(); LockResponse resp2 = server.lockWithFullLockResponse(LockClient.ANONYMOUS, hasLock2); Assert.assertTrue(resp2.success()); Future<?> future = executor.submit((Callable<Void>) () -> { LockResponse resp = server.lockWithFullLockResponse(LockClient.ANONYMOUS, request); Assert.assertNotNull(resp); Assert.assertTrue(resp.success()); return null; }); try { future.get(1, TimeUnit.MILLISECONDS); Assert.fail(); } catch (TimeoutException e) { // good } server.unlock(resp2.getToken()); future.get(150, TimeUnit.SECONDS); resp2 = server.lockWithFullLockResponse(LockClient.ANONYMOUS, hasLock2); server.unlock(resp2.getToken()); }
/** Tests lockAndRelease with perf optimization */ @Test public void testLockAndRelease2() throws Exception { LockRequest hasLock1 = LockRequest.builder(ImmutableSortedMap.of(lock1, LockMode.WRITE)).build(); LockRequest hasLock2 = LockRequest.builder(ImmutableSortedMap.of(lock2, LockMode.WRITE)).build(); final LockRequest request = LockRequest.builder(ImmutableSortedMap.of(lock1, LockMode.WRITE, lock2, LockMode.WRITE)).lockAndRelease().build(); LockResponse resp2 = server.lockWithFullLockResponse(LockClient.ANONYMOUS, hasLock2); Assert.assertTrue(resp2.success()); Future<?> future = executor.submit((Callable<Void>) () -> { LockResponse resp = server.lockWithFullLockResponse(LockClient.ANONYMOUS, request); Assert.assertNotNull(resp); Assert.assertTrue(resp.success()); return null; }); Thread.sleep(10); try { future.get(1, TimeUnit.MILLISECONDS); Assert.fail(); } catch (TimeoutException e) { // good } LockResponse resp1 = server.lockWithFullLockResponse(client, hasLock1); server.unlock(resp2.getToken()); future.get(150, TimeUnit.SECONDS); server.unlock(resp1.getToken()); resp2 = server.lockWithFullLockResponse(LockClient.ANONYMOUS, hasLock2); server.unlock(resp2.getToken()); }
long currentTimeMs = System.currentTimeMillis(); LockResponse response1 = server.lockWithFullLockResponse(LockClient.ANONYMOUS, request1); Assert.assertTrue(response1.success()); Assert.assertTrue(response1.getLockHolders().isEmpty()); HeldLocksToken token1 = response1.getToken();
long currentTimeMs = System.currentTimeMillis(); LockResponse response = server.lockWithFullLockResponse(client, request); Assert.assertTrue(response.success()); Assert.assertTrue(response.getLockHolders().isEmpty()); HeldLocksToken token1 = response.getToken();
long currentTimeMs = System.currentTimeMillis(); LockResponse response = server.lockWithFullLockResponse(client, request); Assert.assertTrue(response.success()); Assert.assertTrue(response.getLockHolders().isEmpty()); HeldLocksToken token1 = response.getToken(); ImmutableSortedMap.of(lock2, LockMode.READ)) .blockForAtMost(SimpleTimeDuration.of(10, TimeUnit.MILLISECONDS)).build()); Assert.assertFalse(response1.success()); Assert.assertFalse(response1.getLockHolders().isEmpty()); Assert.assertEquals(ImmutableSortedMap.of(lock2, client), response1.getLockHolders()); ImmutableSortedMap.of(lock2, LockMode.READ)) .blockForAtMost(SimpleTimeDuration.of(100, TimeUnit.MILLISECONDS)).build()); Assert.assertTrue(response1.success()); Assert.assertTrue(response1.getLockHolders().isEmpty()); HeldLocksToken validToken = response1.getToken(); ImmutableSortedMap.of(lock1, LockMode.READ)) .blockForAtMost(SimpleTimeDuration.of(0, TimeUnit.MILLISECONDS)).build()); Assert.assertTrue(response.success()); Assert.assertTrue(response.getLockHolders().isEmpty()); HeldLocksToken anonymousReadToken = response.getToken(); .withLockedInVersionId(5) .blockForAtMost(SimpleTimeDuration.of(10, TimeUnit.MILLISECONDS)).build()); Assert.assertTrue(response.success()); Assert.assertTrue(response.getLockHolders().isEmpty()); HeldLocksToken token2 = response.getToken();
.doNotBlock().build(); LockResponse response = server.lockWithFullLockResponse(client, request); Assert.assertTrue(response.success()); Assert.assertTrue(response.getLockHolders().isEmpty()); .blockForAtMost(SimpleTimeDuration.of(50, TimeUnit.MILLISECONDS)).build(); response = server.lockWithFullLockResponse(LockClient.ANONYMOUS, request); Assert.assertTrue(response.success()); Assert.assertFalse(response.getLockHolders().isEmpty()); Assert.assertEquals(ImmutableMap.of(lock3, client), response.getLockHolders()); .blockForAtMost(SimpleTimeDuration.of(50, TimeUnit.MILLISECONDS)).build(); response = server.lockWithFullLockResponse(LockClient.ANONYMOUS, request); Assert.assertTrue(response.success()); Assert.assertFalse(response.getLockHolders().isEmpty()); Assert.assertEquals(ImmutableMap.of(lock4, client), response.getLockHolders()); .blockForAtMost(SimpleTimeDuration.of(50, TimeUnit.MILLISECONDS)).build(); response = server.lockWithFullLockResponse(LockClient.ANONYMOUS, request); Assert.assertTrue(response.success()); Assert.assertTrue(response.getLockHolders().isEmpty()); token = response.getToken(); .blockForAtMost(SimpleTimeDuration.of(50, TimeUnit.MILLISECONDS)).build(); response = server.lockWithFullLockResponse(LockClient.ANONYMOUS, request); Assert.assertFalse(response.success()); Assert.assertFalse(response.getLockHolders().isEmpty()); Assert.assertEquals(ImmutableSortedMap.of(lock3, client, lock4, client), response.getLockHolders());
long currentTimeMs = System.currentTimeMillis(); LockResponse response = server.lockWithFullLockResponse(client, request); Assert.assertTrue(response.success()); Assert.assertTrue(response.getLockHolders().isEmpty()); HeldLocksToken token1 = response.getToken();
Assert.assertFalse(response.success()); Assert.assertEquals(ImmutableMap.of(lock1, client), response.getLockHolders()); HeldLocksToken nullToken = response.getToken();
.blockForAtMost(SimpleTimeDuration.of(100, TimeUnit.MILLISECONDS)).build(); response = server.lockWithFullLockResponse(client, request3); Assert.assertTrue(response.success()); HeldLocksToken token3 = response.getToken(); Assert.assertNotNull(token3);