use of com.palantir.lock.HeldLocksToken in project atlasdb by palantir.
the class RangeVisitor method visitRange.
private void visitRange(Visitor visitor, MutableRange range) {
do {
final RangeRequest request = range.getRangeRequest();
try {
long startTime = System.currentTimeMillis();
long numVisited = txManager.runTaskWithLocksWithRetry(lockTokens, Suppliers.ofInstance(null), new LockAwareTransactionTask<Long, RuntimeException>() {
@Override
public Long execute(Transaction tx, Iterable<HeldLocksToken> heldLocks) {
return visitInternal(tx, visitor, request, range);
}
@Override
public String toString() {
return "visitRange(" + request + ")";
}
});
counter.addAndGet(numVisited);
log.info("Visited {} rows from {} in {} ms.", numVisited, tableRef.getQualifiedName(), System.currentTimeMillis() - startTime);
} catch (InterruptedException e) {
throw Throwables.rewrapAndThrowUncheckedException(e);
}
} while (!range.isComplete());
}
use of com.palantir.lock.HeldLocksToken in project atlasdb by palantir.
the class SnapshotTransactionTest method noRetryOnExpiredLockTokens.
@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) {
Set<LockRefreshToken> expectedTokens = ImmutableSet.of(expiredLockToken.getLockRefreshToken());
assertThat(e.getMessage(), containsString(expectedTokens.toString()));
assertThat(e.getMessage(), containsString("Retry is not possible."));
}
}
use of com.palantir.lock.HeldLocksToken in project atlasdb by palantir.
the class LockServiceImpl method lockWithFullLockResponse.
@Override
public // We're concerned about sanitizing logs at the info level and above. This method just logs at debug and info.
LockResponse lockWithFullLockResponse(LockClient client, LockRequest request) throws InterruptedException {
Preconditions.checkNotNull(client);
Preconditions.checkArgument(!client.equals(INTERNAL_LOCK_GRANT_CLIENT));
Preconditions.checkArgument(request.getLockTimeout().compareTo(maxAllowedLockTimeout) <= 0, "Requested lock timeout (%s) is greater than maximum allowed lock timeout (%s)", request.getLockTimeout(), maxAllowedLockTimeout);
long startTime = System.currentTimeMillis();
if (requestLogger.isDebugEnabled()) {
requestLogger.debug("LockServiceImpl processing lock request {} for requesting thread {}", UnsafeArg.of("lockRequest", request), SafeArg.of("requestingThread", request.getCreatingThreadName()));
}
Map<ClientAwareReadWriteLock, LockMode> locks = Maps.newLinkedHashMap();
if (isShutDown.get()) {
throw new ServiceNotAvailableException("This lock server is shut down.");
}
try {
boolean indefinitelyBlocking = isIndefinitelyBlocking(request.getBlockingMode());
if (indefinitelyBlocking) {
indefinitelyBlockingThreads.add(Thread.currentThread());
}
outstandingLockRequestMultimap.put(client, request);
Map<LockDescriptor, LockClient> failedLocks = Maps.newHashMap();
@Nullable Long deadline = (request.getBlockingDuration() == null) ? null : System.nanoTime() + request.getBlockingDuration().toNanos();
if (request.getBlockingMode() == BLOCK_UNTIL_TIMEOUT) {
if (request.getLockGroupBehavior() == LOCK_AS_MANY_AS_POSSIBLE) {
tryLocks(client, request, DO_NOT_BLOCK, null, LOCK_AS_MANY_AS_POSSIBLE, locks, failedLocks);
}
}
tryLocks(client, request, request.getBlockingMode(), deadline, request.getLockGroupBehavior(), locks, failedLocks);
if (request.getBlockingMode() == BlockingMode.BLOCK_INDEFINITELY_THEN_RELEASE) {
if (log.isTraceEnabled()) {
logNullResponse(client, request, null);
}
if (requestLogger.isDebugEnabled()) {
requestLogger.debug("Timed out requesting {} for requesting thread {} after {} ms", UnsafeArg.of("request", request), SafeArg.of("threadName", request.getCreatingThreadName()), SafeArg.of("timeoutMillis", System.currentTimeMillis() - startTime));
}
return new LockResponse(failedLocks);
}
if (locks.isEmpty() || ((request.getLockGroupBehavior() == LOCK_ALL_OR_NONE) && (locks.size() < request.getLockDescriptors().size()))) {
if (log.isTraceEnabled()) {
logNullResponse(client, request, null);
}
if (requestLogger.isDebugEnabled()) {
requestLogger.debug("Failed to acquire all locks for {} for requesting thread {} after {} ms", UnsafeArg.of("request", request), SafeArg.of("threadName", request.getCreatingThreadName()), SafeArg.of("waitMillis", System.currentTimeMillis() - startTime));
}
if (requestLogger.isTraceEnabled()) {
logLockAcquisitionFailure(failedLocks);
}
return new LockResponse(null, failedLocks);
}
Builder<LockDescriptor, LockMode> lockDescriptorMap = ImmutableSortedMap.naturalOrder();
for (Entry<ClientAwareReadWriteLock, LockMode> entry : locks.entrySet()) {
lockDescriptorMap.put(entry.getKey().getDescriptor(), entry.getValue());
}
if (request.getVersionId() != null) {
versionIdMap.put(client, request.getVersionId());
}
HeldLocksToken token = createHeldLocksToken(client, LockCollections.of(lockDescriptorMap.build()), LockCollections.of(locks), request.getLockTimeout(), request.getVersionId(), request.getCreatingThreadName());
locks.clear();
if (log.isTraceEnabled()) {
logNullResponse(client, request, token);
}
if (Thread.interrupted()) {
throw new InterruptedException("Interrupted while locking.");
}
if (requestLogger.isDebugEnabled()) {
requestLogger.debug("Successfully acquired locks {} for requesting thread {} after {} ms", UnsafeArg.of("request", request), SafeArg.of("threadName", request.getCreatingThreadName()), SafeArg.of("waitMillis", System.currentTimeMillis() - startTime));
}
return new LockResponse(token, failedLocks);
} finally {
outstandingLockRequestMultimap.remove(client, request);
indefinitelyBlockingThreads.remove(Thread.currentThread());
try {
for (Entry<ClientAwareReadWriteLock, LockMode> entry : locks.entrySet()) {
entry.getKey().get(client, entry.getValue()).unlock();
}
} catch (Throwable e) {
// (authorized)
log.error("Internal lock server error: state has been corrupted!!", UnsafeArg.of("exception", e), SafeArg.of("stacktrace", e.getStackTrace()));
throw Throwables.throwUncheckedException(e);
}
}
}
use of com.palantir.lock.HeldLocksToken in project atlasdb by palantir.
the class LockServiceImpl method unlockSimple.
@Override
public boolean unlockSimple(SimpleHeldLocksToken token) {
Preconditions.checkNotNull(token);
LockDescriptor fakeLockDesc = StringLockDescriptor.of("unlockSimple");
SortedLockCollection<LockDescriptor> fakeLockSet = LockCollections.of(ImmutableSortedMap.of(fakeLockDesc, LockMode.READ));
return unlock(new HeldLocksToken(token.getTokenId(), LockClient.ANONYMOUS, token.getCreationDateMs(), 0L, fakeLockSet, maxAllowedLockTimeout, 0L, "UnknownThread-unlockSimple"));
}
use of com.palantir.lock.HeldLocksToken in project atlasdb by palantir.
the class LockServiceImpl method useGrant.
@Override
public HeldLocksToken useGrant(LockClient client, BigInteger grantId) {
Preconditions.checkNotNull(client);
Preconditions.checkArgument(client != INTERNAL_LOCK_GRANT_CLIENT);
Preconditions.checkNotNull(grantId);
HeldLocksGrant grant = new HeldLocksGrant(grantId);
@Nullable HeldLocks<HeldLocksGrant> heldLocks = heldLocksGrantMap.remove(grant);
if (heldLocks == null) {
log.warn(GRANT_MESSAGE, client, grantId.toString(Character.MAX_RADIX));
String formattedMessage = MessageFormatter.format(GRANT_MESSAGE, client, grantId.toString(Character.MAX_RADIX)).getMessage();
throw new IllegalArgumentException(formattedMessage);
}
HeldLocksGrant realGrant = heldLocks.realToken;
changeOwner(heldLocks.locks, INTERNAL_LOCK_GRANT_CLIENT, client);
HeldLocksToken token = createHeldLocksToken(client, realGrant.getLockDescriptors(), heldLocks.locks, realGrant.getLockTimeout(), realGrant.getVersionId(), "Converted from Grant, Missing Thread Name");
if (log.isTraceEnabled()) {
log.trace(".useGrant({}, {}) returns {}", client, grantId.toString(Character.MAX_RADIX), token);
}
return token;
}
Aggregations