@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;
}
}