@Override public <T, E extends Exception> T runTaskWithLocksThrowOnConflict( Iterable<HeldLocksToken> lockTokens, LockAwareTransactionTask<T, E> task) throws E, TransactionFailedRetriableException { checkOpen(); AdvisoryLocksCondition lockCondition = new ExternalLocksCondition(getLockService(), ImmutableSet.copyOf(lockTokens)); return runTaskWithConditionThrowOnConflict(lockCondition, (transaction, condition) -> task.execute(transaction, condition.getLocks())); } }
@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); }
@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); }
@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_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); }
@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); }
@Override public <T, E extends Exception> T runTaskWithLocksThrowOnConflict( Iterable<HeldLocksToken> lockTokens, LockAwareTransactionTask<T, E> task) throws E, TransactionFailedRetriableException { checkOpen(); AdvisoryLocksCondition lockCondition = new ExternalLocksCondition(getLockService(), ImmutableSet.copyOf(lockTokens)); return runTaskWithConditionThrowOnConflict(lockCondition, (transaction, condition) -> task.execute(transaction, condition.getLocks())); } }
@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())); }