@Test public void conditionSupplier_noLocks() { Supplier<AdvisoryLocksCondition> conditionSupplier = AdvisoryLockConditionSuppliers.get(lockService, ImmutableSet.of(), () -> null); assertThat(conditionSupplier.get()).isSameAs(AdvisoryLockConditionSuppliers.NO_LOCKS_CONDITION); }
public static Supplier<AdvisoryLocksCondition> get(LockService lockService, Iterable<HeldLocksToken> lockTokens, Supplier<LockRequest> lockSupplier) { return () -> { Set<HeldLocksToken> externalLocks = ImmutableSet.copyOf(lockTokens); ExternalLocksCondition externalCondition = externalLocks.isEmpty() ? null : new ExternalLocksCondition(lockService, externalLocks); LockRequest lockRequest = lockSupplier.get(); if (lockRequest != null) { Validate.isTrue(lockRequest.getVersionId() == null, "Using a version id is not allowed"); HeldLocksToken newToken = acquireLock(lockService, lockRequest); TransactionLocksCondition transactionCondition = new TransactionLocksCondition(lockService, newToken); return externalCondition == null ? transactionCondition : new CombinedLocksCondition(externalCondition, transactionCondition); } return externalCondition == null ? NO_LOCKS_CONDITION : externalCondition; }; }
@Test public void conditionSupplier_transactionLockFailure() throws InterruptedException { Supplier<AdvisoryLocksCondition> conditionSupplier = AdvisoryLockConditionSuppliers.get(lockService, ImmutableSet.of(), LOCK_REQUEST_SUPPLIER); when(lockService.lockAndGetHeldLocks(LockClient.ANONYMOUS.getClientId(), LOCK_REQUEST)) .thenReturn(null); assertThatThrownBy(() -> conditionSupplier.get()) .isInstanceOf(LockAcquisitionException.class) .hasMessageContaining("Failed to lock using the provided lock request"); }
public static Supplier<AdvisoryLocksCondition> get(LockService lockService, Iterable<HeldLocksToken> lockTokens, Supplier<LockRequest> lockSupplier) { return () -> { Set<HeldLocksToken> externalLocks = ImmutableSet.copyOf(lockTokens); ExternalLocksCondition externalCondition = externalLocks.isEmpty() ? null : new ExternalLocksCondition(lockService, externalLocks); LockRequest lockRequest = lockSupplier.get(); if (lockRequest != null) { Validate.isTrue(lockRequest.getVersionId() == null, "Using a version id is not allowed"); HeldLocksToken newToken = acquireLock(lockService, lockRequest); TransactionLocksCondition transactionCondition = new TransactionLocksCondition(lockService, newToken); return externalCondition == null ? transactionCondition : new CombinedLocksCondition(externalCondition, transactionCondition); } return externalCondition == null ? NO_LOCKS_CONDITION : externalCondition; }; }
@Test public void conditionSupplier_externalLocks() { Supplier<AdvisoryLocksCondition> conditionSupplier = AdvisoryLockConditionSuppliers.get(lockService, ImmutableSet.of(EXTERNAL_LOCK_TOKEN), () -> null); assertThat(conditionSupplier.get().getLocks()).containsOnly(EXTERNAL_LOCK_TOKEN); }
@Test public void conditionSupplier_transactionLockFailureBeforeSuccess() throws InterruptedException { Supplier<AdvisoryLocksCondition> conditionSupplier = AdvisoryLockConditionSuppliers.get(lockService, ImmutableSet.of(), LOCK_REQUEST_SUPPLIER); when(lockService.lockAndGetHeldLocks(LockClient.ANONYMOUS.getClientId(), LOCK_REQUEST)) .thenReturn(null) .thenReturn(null) .thenReturn(TRANSACTION_LOCK_TOKEN); assertThat(conditionSupplier.get().getLocks()).containsOnly(TRANSACTION_LOCK_TOKEN); }
@Override public <T, E extends Exception> T runTaskWithLocksWithRetry( Iterable<HeldLocksToken> lockTokens, Supplier<LockRequest> lockSupplier, LockAwareTransactionTask<T, E> task) throws E, InterruptedException { checkOpen(); Supplier<AdvisoryLocksCondition> conditionSupplier = AdvisoryLockConditionSuppliers.get(getLockService(), lockTokens, lockSupplier); return runTaskWithConditionWithRetry(conditionSupplier, (transaction, condition) -> task.execute(transaction, condition.getLocks())); }
@Test public void conditionSupplier_bothLocks() throws InterruptedException { Supplier<AdvisoryLocksCondition> conditionSupplier = AdvisoryLockConditionSuppliers.get( lockService, ImmutableSet.of(EXTERNAL_LOCK_TOKEN), LOCK_REQUEST_SUPPLIER); when(lockService.lockAndGetHeldLocks(LockClient.ANONYMOUS.getClientId(), LOCK_REQUEST)) .thenReturn(TRANSACTION_LOCK_TOKEN); assertThat(conditionSupplier.get().getLocks()).containsOnly(EXTERNAL_LOCK_TOKEN, TRANSACTION_LOCK_TOKEN); }
@Test public void conditionSupplier_transactionLockSuccess() throws InterruptedException { Supplier<AdvisoryLocksCondition> conditionSupplier = AdvisoryLockConditionSuppliers.get(lockService, ImmutableSet.of(), LOCK_REQUEST_SUPPLIER); when(lockService.lockAndGetHeldLocks(LockClient.ANONYMOUS.getClientId(), LOCK_REQUEST)) .thenReturn(TRANSACTION_LOCK_TOKEN); assertThat(conditionSupplier.get().getLocks()).containsOnly(TRANSACTION_LOCK_TOKEN); }
@Override public <T, E extends Exception> T runTaskWithLocksWithRetry( Iterable<HeldLocksToken> lockTokens, Supplier<LockRequest> lockSupplier, LockAwareTransactionTask<T, E> task) throws E, InterruptedException { checkOpen(); Supplier<AdvisoryLocksCondition> conditionSupplier = AdvisoryLockConditionSuppliers.get(getLockService(), lockTokens, lockSupplier); return runTaskWithConditionWithRetry(conditionSupplier, (transaction, condition) -> task.execute(transaction, condition.getLocks())); }