private OffHeapValueHolder<V> setAccessTimeAndExpiryThenReturnMapping(K key, OffHeapValueHolder<V> valueHolder, long now, StoreEventSink<K, V> eventSink) { Duration duration = Duration.ZERO; try { duration = expiry.getExpiryForAccess(key, valueHolder); if (duration != null && duration.isNegative()) { duration = Duration.ZERO; } } catch (RuntimeException re) { LOG.error("Expiry computation caused an exception - Expiry duration will be 0 ", re); } if (Duration.ZERO.equals(duration)) { onExpiration(key, valueHolder, eventSink); return null; } valueHolder.accessed(now, duration); valueHolder.writeBack(); return valueHolder; }
@Test public void testWriteBackSupport() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { ByteBuffer encoded = valueHolderPortability.encode(originalValue); WriteContext writeContext = mock(WriteContext.class); OffHeapValueHolder<String> decoded = valueHolderPortability.decode(encoded, writeContext); decoded.setExpirationTime(4L); decoded.setLastAccessTime(6L); decoded.writeBack(); verify(writeContext).setLong(OffHeapValueHolderPortability.ACCESS_TIME_OFFSET, 6L); verify(writeContext).setLong(OffHeapValueHolderPortability.EXPIRE_TIME_OFFSET, 4L); }
@Override public boolean flush(K key, final ValueHolder<V> valueFlushed) { checkKey(key); flushObserver.begin(); final StoreEventSink<K, V> eventSink = eventDispatcher.eventSink(); try { boolean result = backingMap().computeIfPinned(key, (k, valuePresent) -> { if (valuePresent.getId() == valueFlushed.getId()) { if (valueFlushed.isExpired(timeSource.getTimeMillis())) { onExpiration(k, valuePresent, eventSink); return null; } valuePresent.updateMetadata(valueFlushed); valuePresent.writeBack(); } return valuePresent; }, valuePresent -> valuePresent.getId() == valueFlushed.getId()); eventDispatcher.releaseEventSink(eventSink); if (result) { flushObserver.end(AuthoritativeTierOperationOutcomes.FlushOutcome.HIT); return true; } else { flushObserver.end(AuthoritativeTierOperationOutcomes.FlushOutcome.MISS); return false; } } catch (RuntimeException re) { eventDispatcher.releaseEventSinkAfterFailure(eventSink, re); throw re; } }
private OffHeapValueHolder<V> setAccessTimeAndExpiryThenReturnMapping(K key, OffHeapValueHolder<V> valueHolder, long now, StoreEventSink<K, V> eventSink) { Duration duration = Duration.ZERO; try { duration = expiry.getExpiryForAccess(key, valueHolder); if (duration != null && duration.isNegative()) { duration = Duration.ZERO; } } catch (RuntimeException re) { LOG.error("Expiry computation caused an exception - Expiry duration will be 0 ", re); } if (Duration.ZERO.equals(duration)) { onExpiration(key, valueHolder, eventSink); return null; } valueHolder.accessed(now, duration); valueHolder.writeBack(); return valueHolder; }
@Override public boolean flush(K key, final ValueHolder<V> valueFlushed) { checkKey(key); flushObserver.begin(); final StoreEventSink<K, V> eventSink = eventDispatcher.eventSink(); try { boolean result = backingMap().computeIfPinned(key, (k, valuePresent) -> { if (valuePresent.getId() == valueFlushed.getId()) { if (valueFlushed.isExpired(timeSource.getTimeMillis(), TimeUnit.MILLISECONDS)) { onExpiration(k, valuePresent, eventSink); return null; } valuePresent.updateMetadata(valueFlushed); valuePresent.writeBack(); } return valuePresent; }, valuePresent -> valuePresent.getId() == valueFlushed.getId()); eventDispatcher.releaseEventSink(eventSink); if (result) { flushObserver.end(AuthoritativeTierOperationOutcomes.FlushOutcome.HIT); return true; } else { flushObserver.end(AuthoritativeTierOperationOutcomes.FlushOutcome.MISS); return false; } } catch (RuntimeException re) { eventDispatcher.releaseEventSinkAfterFailure(eventSink, re); throw re; } }