/** Returns whether this result has failed. Use {@link #getError} to retrieve the associated exception. */ public boolean isFailed() { return future.isCompletedExceptionally() && !isTimedOut(); }
private boolean shouldRemove(AsyncResult<HeldLocks> lockResult) { return lockResult.isFailed() || lockResult.isTimedOut() || lockResult.test(HeldLocks::unlockIfExpired); }
private void requestComplete( RequestInfo requestInfo, AsyncResult<?> result, long blockingTimeMillis) { events.requestComplete(blockingTimeMillis); if (blockingTimeMillis == 0 || blockingTimeMillis < thresholdMillis.get()) { return; } if (result.isCompletedSuccessfully()) { events.successfulSlowAcquisition(requestInfo, blockingTimeMillis); } else if (result.isTimedOut()) { events.timedOutSlowAcquisition(requestInfo, blockingTimeMillis); } }
@Test public void propagatesTimeoutExceptionIfRequestTimesOut() { AsyncResult<HeldLocks> timedOutResult = new AsyncResult<>(); timedOutResult.timeout(); when(acquirer.acquireLocks(any(), any(), any())).thenReturn(timedOutResult); AsyncResult<?> result = lockService.lock(REQUEST_ID, descriptors(LOCK_A), DEADLINE); assertThat(result.isTimedOut()).isTrue(); }
@Test @ShouldRetry public void waitForLocksRequestTimesOutWhenTimeoutPasses() { lockSynchronously(REQUEST_1, LOCK_A); AsyncResult<Void> result = service.waitForLocks(REQUEST_2, descriptors(LOCK_A), SHORT_TIMEOUT); assertThat(result.isTimedOut()).isFalse(); waitForTimeout(SHORT_TIMEOUT); assertThat(result.isTimedOut()).isTrue(); }
@Test @ShouldRetry public void lockRequestTimesOutWhenTimeoutPasses() { lockSynchronously(REQUEST_1, LOCK_A); AsyncResult<LockToken> result = service.lock(REQUEST_2, descriptors(LOCK_A), SHORT_TIMEOUT); assertThat(result.isTimedOut()).isFalse(); waitForTimeout(SHORT_TIMEOUT); assertThat(result.isTimedOut()).isTrue(); }
@Test public void resultIsTimedOutWhenTimeOutIsCalled() { lockSynchronously(REQUEST_1); AsyncResult<Void> request2 = lockAsync(REQUEST_2); lock.timeout(REQUEST_2); assertThat(request2.isTimedOut()).isTrue(); }
@Test public void waitRequestIsTimedOutAfterDeadline() { lockSynchronously(REQUEST_1); AsyncResult<Void> request2 = waitUntilAvailableAsync(REQUEST_1); lock.timeout(REQUEST_1); assertThat(request2.isTimedOut()).isTrue(); }
@Test public void doesNotTimeOutBeforeSpecifiedTime() { acquire(lockB); AsyncResult<?> result = acquire(lockA, lockB, lockC); executor.tick(TIMEOUT.getTimeMillis() - 1L, TimeUnit.MILLISECONDS); verify(lockB, never()).timeout(REQUEST_ID); assertThat(result.isTimedOut()).isFalse(); }
@Test public void timesOutRequestAfterSpecifiedTime() { acquire(lockB); AsyncResult<?> result = acquire(lockA, lockB, lockC); executor.tick(TIMEOUT.getTimeMillis() + 1L, TimeUnit.MILLISECONDS); verify(lockB).timeout(REQUEST_ID); assertThat(result.isTimedOut()).isTrue(); }
@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())); } }); }
@Test @ShouldRetry public void requestsAreIdempotentWithRespectToTimeout() { lockSynchronously(REQUEST_1, LOCK_A); service.lock(REQUEST_2, descriptors(LOCK_A), SHORT_TIMEOUT); AsyncResult<LockToken> duplicate = service.lock(REQUEST_2, descriptors(LOCK_A), LONG_TIMEOUT); waitForTimeout(SHORT_TIMEOUT); assertThat(duplicate.isTimedOut()).isTrue(); }
/** Returns whether this result has failed. Use {@link #getError} to retrieve the associated exception. */ public boolean isFailed() { return future.isCompletedExceptionally() && !isTimedOut(); }
private boolean shouldRemove(AsyncResult<HeldLocks> lockResult) { return lockResult.isFailed() || lockResult.isTimedOut() || lockResult.test(HeldLocks::unlockIfExpired); }
private void requestComplete( RequestInfo requestInfo, AsyncResult<?> result, long blockingTimeMillis) { events.requestComplete(blockingTimeMillis); if (blockingTimeMillis == 0 || blockingTimeMillis < thresholdMillis.get()) { return; } if (result.isCompletedSuccessfully()) { events.successfulSlowAcquisition(requestInfo, blockingTimeMillis); } else if (result.isTimedOut()) { events.timedOutSlowAcquisition(requestInfo, blockingTimeMillis); } }
@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())); } }); }