public UUID getRequestId() { return token.getRequestId(); }
public Set<LockToken> unlock(Set<LockToken> tokens) { Set<LockToken> unlocked = filter(tokens, HeldLocks::unlock); for (LockToken token : unlocked) { heldLocksById.remove(token.getRequestId()); } return unlocked; }
private Set<LockToken> filter(Set<LockToken> tokens, Predicate<HeldLocks> predicate) { Set<LockToken> filtered = Sets.newHashSetWithExpectedSize(tokens.size()); for (LockToken token : tokens) { AsyncResult<HeldLocks> lockResult = heldLocksById.get(token.getRequestId()); if (lockResult != null && lockResult.test(predicate)) { filtered.add(token); } } return filtered; }
public synchronized boolean unlock() { if (isUnlocked) { return false; } isUnlocked = true; for (AsyncLock lock : acquiredLocks) { lock.unlock(token.getRequestId()); } return true; }
static LockRefreshToken toLegacyToken(LockToken tokenV2) { return new LockRefreshToken(toBigInteger(tokenV2.getRequestId()), Long.MIN_VALUE); }
@Test public void removesExpiredAndFailedRequests() { UUID nonExpiredRequest = mockNonExpiredRequest().getRequestId(); mockExpiredRequest(); mockFailedRequest(); assertThat(heldLocksCollection.heldLocksById.size()).isEqualTo(3); heldLocksCollection.removeExpired(); assertThat(heldLocksCollection.heldLocksById.size()).isEqualTo(1); assertThat(heldLocksCollection.heldLocksById.keySet().iterator().next()).isEqualTo(nonExpiredRequest); }
/** * Unlocks if expired, and returns whether the locks are now unlocked (regardless of whether or not they were * unlocked as a result of calling this method). */ public synchronized boolean unlockIfExpired() { if (expirationTimer.isExpired()) { if (unlock()) { lockLog.lockExpired(token.getRequestId(), getLockDescriptors()); } } return isUnlocked; }
private LockToken mockHeldLocksForNewRequest(Consumer<HeldLocks> mockApplier) { LockToken request = LockToken.of(UUID.randomUUID()); HeldLocks heldLocks = mock(HeldLocks.class); mockApplier.accept(heldLocks); AsyncResult<HeldLocks> completedResult = new AsyncResult<>(); completedResult.complete(heldLocks); heldLocksCollection.getExistingOrAcquire(request.getRequestId(), () -> completedResult); return request; }
private LockToken mockFailedRequest() { LockToken request = LockToken.of(UUID.randomUUID()); AsyncResult failedLocks = new AsyncResult(); failedLocks.fail(new RuntimeException()); heldLocksCollection.getExistingOrAcquire(request.getRequestId(), () -> failedLocks); return request; }
private LockToken mockTimedOutRequest() { LockToken request = LockToken.of(UUID.randomUUID()); AsyncResult timedOutResult = new AsyncResult(); timedOutResult.timeout(); heldLocksCollection.getExistingOrAcquire(request.getRequestId(), () -> timedOutResult); return request; }
public UUID getRequestId() { return token.getRequestId(); }
public synchronized boolean unlock() { if (isUnlocked) { return false; } isUnlocked = true; for (AsyncLock lock : acquiredLocks) { lock.unlock(token.getRequestId()); } return true; }
public Set<LockToken> unlock(Set<LockToken> tokens) { Set<LockToken> unlocked = filter(tokens, HeldLocks::unlock); for (LockToken token : unlocked) { heldLocksById.remove(token.getRequestId()); } return unlocked; }
private Set<LockToken> filter(Set<LockToken> tokens, Predicate<HeldLocks> predicate) { Set<LockToken> filtered = Sets.newHashSetWithExpectedSize(tokens.size()); for (LockToken token : tokens) { AsyncResult<HeldLocks> lockResult = heldLocksById.get(token.getRequestId()); if (lockResult != null && lockResult.test(predicate)) { filtered.add(token); } } return filtered; }
/** * Unlocks if expired, and returns whether the locks are now unlocked (regardless of whether or not they were * unlocked as a result of calling this method). */ public synchronized boolean unlockIfExpired() { if (expirationTimer.isExpired()) { if (unlock()) { lockLog.lockExpired(token.getRequestId(), getLockDescriptors()); } } return isUnlocked; }