/** * 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); } }
@Override @Nullable public HeldLocksGrant refreshGrant(BigInteger grantId) { return refreshGrant(new HeldLocksGrant(Preconditions.checkNotNull(grantId))); }
@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; }
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); } }