@Override public void throwIfConditionInvalid(long timestamp) { if (lockTokens.isEmpty()) { return; } Set<LockRefreshToken> refreshTokens = lockTokens.stream() .map(HeldLocksToken::getLockRefreshToken) .collect(Collectors.toSet()); Set<LockRefreshToken> refreshedLocks = lockService.refreshLockRefreshTokens(refreshTokens); Set<LockRefreshToken> expiredLocks = Sets.difference(refreshTokens, refreshedLocks); if (!expiredLocks.isEmpty()) { List<HeldLocksToken> expiredHeldLocks = lockTokens.stream() .filter(token -> expiredLocks.contains(token.getLockRefreshToken())) .collect(Collectors.toList()); log.warn("External lock service locks were no longer valid", UnsafeArg.of("invalidLocks", expiredHeldLocks)); throw new TransactionLockTimeoutNonRetriableException("Provided external lock tokens expired. " + "Retry is not possible. Locks: " + expiredHeldLocks); } }
@Test public void noRetryOnExpiredLockTokens() throws InterruptedException { HeldLocksToken expiredLockToken = getExpiredHeldLocksToken(); try { txManager.runTaskWithLocksWithRetry(ImmutableList.of(expiredLockToken), () -> null, (tx, locks) -> { tx.put(TABLE, ImmutableMap.of(TEST_CELL, PtBytes.toBytes("value"))); return null; }); fail(); } catch (TransactionLockTimeoutNonRetriableException e) { LockDescriptor descriptor = Iterables.getFirst(expiredLockToken.getLockDescriptors(), null); assertThat(e.getMessage(), containsString(descriptor.toString())); assertThat(e.getMessage(), containsString("Retry is not possible.")); } }
@Override public void throwIfConditionInvalid(long timestamp) { if (lockTokens.isEmpty()) { return; } Set<LockRefreshToken> refreshTokens = lockTokens.stream() .map(HeldLocksToken::getLockRefreshToken) .collect(Collectors.toSet()); Set<LockRefreshToken> refreshedLocks = lockService.refreshLockRefreshTokens(refreshTokens); Set<LockRefreshToken> expiredLocks = Sets.difference(refreshTokens, refreshedLocks); if (!expiredLocks.isEmpty()) { List<HeldLocksToken> expiredHeldLocks = lockTokens.stream() .filter(token -> expiredLocks.contains(token.getLockRefreshToken())) .collect(Collectors.toList()); log.warn("External lock service locks were no longer valid", UnsafeArg.of("invalidLocks", expiredHeldLocks)); throw new TransactionLockTimeoutNonRetriableException("Provided external lock tokens expired. " + "Retry is not possible. Locks: " + expiredHeldLocks); } }