/** * This should only be called by the Lock Service. Calling this method won't actually refresh the grant. */ public HeldLocksGrant refresh(long newExpirationDateMs) { return new HeldLocksGrant(grantId, creationDateMs, newExpirationDateMs, lockMap, lockTimeout, versionId); }
@JsonIgnore @Override public SortedLockCollection<LockDescriptor> getLockDescriptors() { return getLocks(); }
@Override public String toString() { return toString(System.currentTimeMillis()); }
@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; }
@Override @Nullable public HeldLocksGrant refreshGrant(HeldLocksGrant grant) { Preconditions.checkNotNull(grant); @Nullable HeldLocks<HeldLocksGrant> heldLocks = heldLocksGrantMap.get(grant); if (heldLocks == null) { if (log.isTraceEnabled()) { log.trace(".refreshGrant({}) returns null", grant.getGrantId().toString(Character.MAX_RADIX)); } return null; } long now = currentTimeMillis(); long expirationDateMs = now + heldLocks.realToken.getLockTimeout().toMillis(); heldLocksGrantMap.replace(grant, heldLocks, new HeldLocks<HeldLocksGrant>( heldLocks.realToken.refresh(expirationDateMs), heldLocks.locks)); heldLocks = heldLocksGrantMap.get(grant); if (heldLocks == null) { if (log.isTraceEnabled()) { log.trace(".refreshGrant({}) returns null", grant.getGrantId().toString(Character.MAX_RADIX)); } return null; } HeldLocksGrant refreshedGrant = heldLocks.realToken; logIfAbnormallyOld(refreshedGrant, now); if (log.isTraceEnabled()) { log.trace(".refreshGrant({}) returns {}", grant.getGrantId().toString(Character.MAX_RADIX), refreshedGrant.getGrantId().toString(Character.MAX_RADIX)); } return refreshedGrant; }
@Override public HeldLocksToken useGrant(LockClient client, HeldLocksGrant grant) { Preconditions.checkNotNull(client); Preconditions.checkArgument(client != INTERNAL_LOCK_GRANT_CLIENT); Preconditions.checkNotNull(grant); @Nullable HeldLocks<HeldLocksGrant> heldLocks = heldLocksGrantMap.remove(grant); if (heldLocks == null) { log.warn("Tried to use invalid grant: {} (grant ID {})", UnsafeArg.of("grant", grant), SafeArg.of("grantId", grant.getGrantId())); throw new IllegalArgumentException("grant is invalid: " + grant); } 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({}, {}) (grant ID {}) returns {} (token ID {})", SafeArg.of("client", client), UnsafeArg.of("grant", grant), SafeArg.of("grantId", grant.getGrantId()), UnsafeArg.of("token", token), SafeArg.of("tokenId", token.getTokenId())); } return token; }
Assert.assertNull(grant.getClient()); Assert.assertEquals(request.getLockDescriptors(), grant.getLocks()); Thread.sleep(51); Assert.assertTrue(grant.getExpirationDateMs() - System.currentTimeMillis() < 450); grant = server.refreshGrant(grant); Assert.assertTrue(grant.getExpirationDateMs() - System.currentTimeMillis() < 500); nullToken = server.lockWithFullLockResponse(LockClient.ANONYMOUS, request).getToken(); Assert.assertNull(nullToken);
Assert.assertNull(grantToken.getClient()); }); grantToken = server.convertToGrant(token1); Assert.assertNull(grantToken.getClient()); validToken = server.useGrant(client2, grantToken.getGrantId()); Assert.assertNotNull(validToken); Assert.assertEquals(client2, validToken.getClient());
SafeArg.of("tokenId", token.getTokenId()), UnsafeArg.of("grant", grant), SafeArg.of("grantId", grant.getGrantId()));
Object readResolve() { return lockMap.isEmpty() ? new HeldLocksGrant(grantId) : new HeldLocksGrant(grantId, creationDateMs, expirationDateMs, lockMap, lockTimeout, versionId); } }
private void logIfAbnormallyOld(final HeldLocksGrant grant, final long now) { logIfAbnormallyOld(grant, now, () -> grant.toString(now)); }
@JsonIgnore @Override public SortedLockCollection<LockDescriptor> getLockDescriptors() { return getLocks(); }
@Override @Nullable public HeldLocksGrant refreshGrant(BigInteger grantId) { return refreshGrant(new HeldLocksGrant(Preconditions.checkNotNull(grantId))); }
@Override public String toString() { return toString(System.currentTimeMillis()); }
private HeldLocksGrant createHeldLocksGrant(SortedLockCollection<LockDescriptor> lockDescriptorMap, LockCollection<? extends ClientAwareReadWriteLock> heldLocksMap, TimeDuration lockTimeout, @Nullable Long versionId) { while (true) { BigInteger grantId = new BigInteger(RANDOM_BIT_COUNT, randomPool.getSecureRandom()); long expirationDateMs = currentTimeMillis() + lockTimeout.toMillis(); HeldLocksGrant grant = new HeldLocksGrant(grantId, System.currentTimeMillis(), expirationDateMs, lockDescriptorMap, lockTimeout, versionId); HeldLocks<HeldLocksGrant> newHeldLocks = HeldLocks.of(grant, heldLocksMap); if (heldLocksGrantMap.putIfAbsent(grant, newHeldLocks) == null) { lockGrantReaperQueue.add(grant); return grant; } log.error("Lock ID collision! " + "Count of held grants = {}" + "; random bit count = {}", SafeArg.of("heldTokenCount", heldLocksTokenMap.size()), SafeArg.of("randomBitCount", RANDOM_BIT_COUNT)); } }
@Test public void testSerialisationAndDeserialisationOfHeldLocksGrant() throws Exception { ImmutableSortedMap<LockDescriptor, LockMode> lockDescriptorLockMode = LockServiceTestUtils .getLockDescriptorLockMode(ImmutableList.of("lock1", "lock2")); HeldLocksGrant heldLocksGrant = new HeldLocksGrant( BigInteger.ONE, System.currentTimeMillis(), System.currentTimeMillis() + 10L, LockCollections.of(lockDescriptorLockMode), SimpleTimeDuration.of(100, TimeUnit.SECONDS), 10L); ObjectMapper mapper = new ObjectMapper(); String serializedForm = mapper.writeValueAsString(heldLocksGrant); HeldLocksGrant deserialzedlockServerOptions = mapper.readValue(serializedForm, HeldLocksGrant.class); assertEquals(heldLocksGrant, deserialzedlockServerOptions); }
/** * This should only be called by the Lock Service. Calling this method won't actually refresh the grant. */ public HeldLocksGrant refresh(long newExpirationDateMs) { return new HeldLocksGrant(grantId, creationDateMs, newExpirationDateMs, lockMap, lockTimeout, versionId); }
Object readResolve() { return lockMap.isEmpty() ? new HeldLocksGrant(grantId) : new HeldLocksGrant(grantId, creationDateMs, expirationDateMs, lockMap, lockTimeout, versionId); } }