@Override public SoftLock lockItem(Object key, Object version) throws CacheException { RLock writeLock = mapCache.getReadWriteLock(key).writeLock(); writeLock.lock(); try { Lockable item = (Lockable) region.get( key ); long timeout = region.nextTimestamp() + region.getTimeout(); Lock lock; if (item == null) { lock = new Lock(timeout, uuid, nextLockId.getAndIncrement(), version); } else { lock = item.lock(timeout, uuid, nextLockId.getAndIncrement()); } region.put( key, lock ); return lock; } finally { writeLock.unlock(); } }
/** * Handle the timeout of a previous lock mapped to this key */ protected void handleLockExpiry(SessionImplementor session, Object key, Lockable lock) { long ts = region.nextTimestamp() + region.getTimeout(); // create new lock that times out immediately Lock newLock = new Lock(ts, uuid, nextLockId.getAndIncrement(), null); newLock.unlock(ts); region.put(session, key, newLock); }
@Override public boolean afterUpdate(Object key, Object value, Object currentVersion, Object previousVersion, SoftLock lock) throws CacheException { RLock writeLock = mapCache.getReadWriteLock(key).writeLock(); writeLock.lock(); try { Lockable item = (Lockable) region.get(key); if (item != null && item.isUnlockable(lock)) { Lock lockItem = (Lock) item; if (lockItem.wasLockedConcurrently()) { decrementLock( key, lockItem ); return false; } else { region.put( key, new Item(value, currentVersion, region.nextTimestamp())); return true; } } else { handleLockExpiry( key, item ); return false; } } finally { writeLock.unlock(); } }
@Override public boolean afterUpdate(SessionImplementor session, Object key, Object value, Object currentVersion, Object previousVersion, SoftLock lock) throws CacheException { RLock writeLock = mapCache.getReadWriteLock(key).writeLock(); writeLock.lock(); try { Lockable item = (Lockable) region.get(session, key); if (item != null && item.isUnlockable(lock)) { Lock lockItem = (Lock) item; if (lockItem.wasLockedConcurrently()) { decrementLock(session, key, lockItem ); return false; } else { region.put(session, key, new Item(value, currentVersion, region.nextTimestamp())); return true; } } else { handleLockExpiry(session, key, item ); return false; } } finally { writeLock.unlock(); } }
@Override public boolean afterUpdate(Object key, Object value, SoftLock lock) throws CacheException { RLock writeLock = mapCache.getReadWriteLock(key).writeLock(); writeLock.lock(); try { Lockable item = (Lockable) region.get(key); if (item != null && item.isUnlockable(lock)) { Lock lockItem = (Lock) item; if (lockItem.wasLockedConcurrently()) { decrementLock(key, lockItem); return false; } else { region.put(key, new Item(value, null, region.nextTimestamp())); return true; } } else { handleLockExpiry(key, item); return false; } } finally { writeLock.unlock(); } }
@Override public boolean afterUpdate(SharedSessionContractImplementor session, Object key, Object value, SoftLock lock) throws CacheException { RLock writeLock = mapCache.getReadWriteLock(key).writeLock(); writeLock.lock(); try { Lockable item = (Lockable) region.get(session, key); if (item != null && item.isUnlockable(lock)) { Lock lockItem = (Lock) item; if (lockItem.wasLockedConcurrently()) { decrementLock(session, key, lockItem); return false; } else { region.put(session, key, new Item(value, null, region.nextTimestamp())); return true; } } else { handleLockExpiry(session, key, item); return false; } } finally { writeLock.unlock(); } }
@Override public boolean afterUpdate(SessionImplementor session, Object key, Object value, SoftLock lock) throws CacheException { RLock writeLock = mapCache.getReadWriteLock(key).writeLock(); writeLock.lock(); try { Lockable item = (Lockable) region.get(session, key); if (item != null && item.isUnlockable(lock)) { Lock lockItem = (Lock) item; if (lockItem.wasLockedConcurrently()) { decrementLock(session, key, lockItem); return false; } else { region.put(session, key, new Item(value, null, region.nextTimestamp())); return true; } } else { handleLockExpiry(session, key, item); return false; } } finally { writeLock.unlock(); } }
@Override public boolean afterUpdate(SharedSessionContractImplementor session, Object key, Object value, Object currentVersion, Object previousVersion, SoftLock lock) throws CacheException { RLock writeLock = mapCache.getReadWriteLock(key).writeLock(); writeLock.lock(); try { Lockable item = (Lockable) region.get(session, key); if (item != null && item.isUnlockable(lock)) { Lock lockItem = (Lock) item; if (lockItem.wasLockedConcurrently()) { decrementLock(session, key, lockItem ); return false; } else { region.put(session, key, new Item(value, currentVersion, region.nextTimestamp())); return true; } } else { handleLockExpiry(session, key, item ); return false; } } finally { writeLock.unlock(); } }
@Override public SoftLock lockItem(SessionImplementor session, Object key, Object version) throws CacheException { RLock writeLock = mapCache.getReadWriteLock(key).writeLock(); writeLock.lock(); try { Lockable item = (Lockable) region.get(session, key); long timeout = region.nextTimestamp() + region.getTimeout(); Lock lock; if (item == null) { lock = new Lock(timeout, uuid, nextLockId.getAndIncrement(), version); } else { lock = item.lock(timeout, uuid, nextLockId.getAndIncrement()); } region.put(session, key, lock); return lock; } finally { writeLock.unlock(); } }
@Override public SoftLock lockItem(SharedSessionContractImplementor session, Object key, Object version) throws CacheException { RLock writeLock = mapCache.getReadWriteLock(key).writeLock(); writeLock.lock(); try { Lockable item = (Lockable) region.get(session, key); long timeout = region.nextTimestamp() + region.getTimeout(); Lock lock; if (item == null) { lock = new Lock(timeout, uuid, nextLockId.getAndIncrement(), version); } else { lock = item.lock(timeout, uuid, nextLockId.getAndIncrement()); } region.put(session, key, lock); return lock; } finally { writeLock.unlock(); } }
@Override public boolean isUnlockable(SoftLock lock) { return equals( lock ); }
@Override public boolean isUnlockable(SoftLock lock) { return equals( lock ); }
/** * Unlock and re-put the given key, lock combination. */ protected void decrementLock(Object key, Lock lock) { lock.unlock(region.nextTimestamp()); region.put(key, lock); }
/** * Unlock and re-put the given key, lock combination. */ protected void decrementLock(SessionImplementor session, Object key, Lock lock) { lock.unlock(region.nextTimestamp()); region.put(session, key, lock); }
/** * Handle the timeout of a previous lock mapped to this key */ protected void handleLockExpiry(SharedSessionContractImplementor session, Object key, Lockable lock) { long ts = region.nextTimestamp() + region.getTimeout(); // create new lock that times out immediately Lock newLock = new Lock(ts, uuid, nextLockId.getAndIncrement(), null); newLock.unlock(ts); region.put(session, key, newLock); }
@Override public Lock lock(long timeout, UUID uuid, long lockId) { return new Lock(timeout, uuid, lockId, version); } }
@Override public Lock lock(long timeout, UUID uuid, long lockId) { return new Lock(timeout, uuid, lockId, version); } }
@Override public Lock lock(long timeout, UUID uuid, long lockId) { return new Lock(timeout, uuid, lockId, version); } }
/** * Unlock and re-put the given key, lock combination. */ protected void decrementLock(SharedSessionContractImplementor session, Object key, Lock lock) { lock.unlock(region.nextTimestamp()); region.put(session, key, lock); }
@Override public boolean isUnlockable(SoftLock lock) { return equals( lock ); }