private void setAccessTimeAndExpiry(K key, OffHeapValueHolder<V> valueHolder, long now) {
    valueHolder.setLastAccessTime(now, OffHeapValueHolder.TIME_UNIT);

    Duration duration = expiry.getExpiryForAccess(key, valueHolder.value());
    if (duration != null) {
      if (duration.isForever()) {
        valueHolder.setExpirationTime(ValueHolder.NO_EXPIRE, null);
      } else {
        valueHolder.setExpirationTime(safeExpireTime(now, duration), OffHeapValueHolder.TIME_UNIT);
      }
    }
    valueHolder.writeBack();
  }
  private OffHeapValueHolder<V> newUpdatedValueHolder(
      K key, V value, OffHeapValueHolder<V> existing, long now) {
    Duration duration = expiry.getExpiryForUpdate(key, existing.value(), value);
    if (Duration.ZERO.equals(duration)) {
      return null;
    }

    if (duration == null) {
      return new OffHeapValueHolder<V>(
          value, now, existing.expirationTime(OffHeapValueHolder.TIME_UNIT));
    } else if (duration.isForever()) {
      return new OffHeapValueHolder<V>(value, now, OffHeapValueHolder.NO_EXPIRE);
    } else {
      return new OffHeapValueHolder<V>(value, now, safeExpireTime(now, duration));
    }
  }
 @Test
 public void testWriteBackOfValueHolder() throws CacheAccessException {
   TestTimeSource timeSource = new TestTimeSource();
   AbstractOffHeapStore<String, String> offHeapStore =
       createAndInitStore(
           timeSource, Expirations.timeToIdleExpiration(new Duration(15L, TimeUnit.MILLISECONDS)));
   try {
     offHeapStore.put("key1", "value1");
     timeSource.advanceTime(10);
     OffHeapValueHolder<String> valueHolder =
         (OffHeapValueHolder<String>) offHeapStore.get("key1");
     assertThat(valueHolder.lastAccessTime(TimeUnit.MILLISECONDS), is(10L));
     timeSource.advanceTime(10);
     assertThat(offHeapStore.get("key1"), notNullValue());
     timeSource.advanceTime(16);
     assertThat(offHeapStore.get("key1"), nullValue());
   } finally {
     destroyStore(offHeapStore);
   }
 }