@Test public void outstandingRequestsReceiveNotCurrentLeaderExceptionOnClose() { lockSynchronously(REQUEST_1, LOCK_A); AsyncResult<LockToken> request2 = lock(REQUEST_2, LOCK_A); service.close(); assertThat(request2.isFailed()).isTrue(); assertThat(request2.getError()).isInstanceOf(NotCurrentLeaderException.class); }
@Test public void propagatesExceptionIfSynchronousLockAcquisitionFails() { AsyncResult<Void> lockResult = new AsyncResult<>(); RuntimeException error = new RuntimeException("foo"); lockResult.fail(error); doReturn(lockResult).when(lockA).lock(any()); AsyncResult<HeldLocks> acquisitions = acquire(lockA); assertThat(acquisitions.getError()).isEqualTo(error); }
@POST @Path("await-locks") public void waitForLocks(@Suspended final AsyncResponse response, WaitForLocksRequest request) { AsyncResult<Void> result = timelock.waitForLocks(request); lockLog.registerRequest(request, result); result.onComplete(() -> { if (result.isFailed()) { response.resume(result.getError()); } else if (result.isTimedOut()) { response.resume(WaitForLocksResponse.timedOut()); } else { response.resume(WaitForLocksResponse.successful()); } }); }
@Test public void propagatesExceptionIfAsyncLockAcquisitionFails() { AsyncResult<Void> lockResult = new AsyncResult<>(); RuntimeException error = new RuntimeException("foo"); lockResult.fail(error); doReturn(lockResult).when(lockB).lock(any()); lockA.lock(OTHER_REQUEST_ID); AsyncResult<HeldLocks> acquisitions = acquire(lockA, lockB); lockA.unlock(OTHER_REQUEST_ID); assertThat(acquisitions.getError()).isEqualTo(error); }
@POST @Path("lock") public void lock(@Suspended final AsyncResponse response, LockRequest request) { AsyncResult<LockToken> result = timelock.lock(request); lockLog.registerRequest(request, result); result.onComplete(() -> { if (result.isFailed()) { response.resume(result.getError()); } else if (result.isTimedOut()) { response.resume(LockResponse.timedOut()); } else { response.resume(LockResponse.successful(result.get())); } }); }
@POST @Path("await-locks") public void waitForLocks(@Suspended final AsyncResponse response, WaitForLocksRequest request) { AsyncResult<Void> result = timelock.waitForLocks(request); lockLog.registerRequest(request, result); result.onComplete(() -> { if (result.isFailed()) { response.resume(result.getError()); } else if (result.isTimedOut()) { response.resume(WaitForLocksResponse.timedOut()); } else { response.resume(WaitForLocksResponse.successful()); } }); }
@POST @Path("lock") public void lock(@Suspended final AsyncResponse response, LockRequest request) { AsyncResult<LockToken> result = timelock.lock(request); lockLog.registerRequest(request, result); result.onComplete(() -> { if (result.isFailed()) { response.resume(result.getError()); } else if (result.isTimedOut()) { response.resume(LockResponse.timedOut()); } else { response.resume(LockResponse.successful(result.get())); } }); }