@Override public ByteBuffer encode(OffHeapValueHolder<V> valueHolder) { ByteBuffer serialized; if (valueHolder instanceof BinaryValueHolder && ((BinaryValueHolder)valueHolder).isBinaryValueAvailable()) { serialized = ((BinaryValueHolder)valueHolder).getBinaryValue(); } else { serialized = serializer.serialize(valueHolder.get()); } ByteBuffer byteBuffer = ByteBuffer.allocate(serialized.remaining() + FIELDS_OVERHEAD); byteBuffer.putLong(valueHolder.getId()); byteBuffer.putLong(valueHolder.creationTime()); byteBuffer.putLong(valueHolder.lastAccessTime()); byteBuffer.putLong(valueHolder.expirationTime()); byteBuffer.putLong(0L); // represent the hits on previous versions. It is kept for compatibility reasons with previously saved data byteBuffer.put(serialized); byteBuffer.flip(); return byteBuffer; }
existingValue = mappedValue.get(); existingValueHolder.set(mappedValue);
@Override public int hashCode() { int result = 1; result = 31 * result + get().hashCode(); result = 31 * result + super.hashCode(); return result; }
@Test public void testDecodingAPreviousVersionWithTheHits() { StringSerializer serializer = new StringSerializer(); ByteBuffer serialized = serializer.serialize("test"); long time = System.currentTimeMillis(); ByteBuffer byteBuffer = ByteBuffer.allocate(serialized.remaining() + 40); byteBuffer.putLong(123L); // id byteBuffer.putLong(time); // creation time byteBuffer.putLong(time + 1); // last access time byteBuffer.putLong(time + 2); // expiration time byteBuffer.putLong(100L); // hits byteBuffer.put(serialized); // the held value byteBuffer.flip(); OffHeapValueHolder<String> decoded = valueHolderPortability.decode(byteBuffer); assertThat(decoded.getId(), equalTo(123L)); assertThat(decoded.creationTime(), equalTo(time)); assertThat(decoded.lastAccessTime(), equalTo(time + 1)); assertThat(decoded.expirationTime(), equalTo(time + 2)); assertThat(decoded.get(), equalTo("test")); }
@Override public boolean adviseAgainstEviction(K key, OffHeapValueHolder<V> value) { try { return delegate.adviseAgainstEviction(key, value.get()); } catch (Exception e) { LOG.error("Exception raised while running eviction advisor " + "- Eviction will assume entry is NOT advised against eviction", e); return false; } }
existingValue = mappedValue.get();
@Test public void testDelayedDeserialization() { JavaSerializer<String> serializer = new JavaSerializer<>(getClass().getClassLoader()); String testValue = "Let's get binary!"; ByteBuffer serialized = serializer.serialize(testValue); OffHeapValueHolder<String> valueHolder = new LazyOffHeapValueHolder<>(1L, serialized, serializer, 10L, 20L, 15L, mock(WriteContext.class)); valueHolder.detach(); serialized.clear(); assertThat(valueHolder.get(), is(testValue)); }
@Override public ByteBuffer encode(OffHeapValueHolder<V> valueHolder) { ByteBuffer serialized; if (valueHolder instanceof BinaryValueHolder && ((BinaryValueHolder)valueHolder).isBinaryValueAvailable()) { serialized = ((BinaryValueHolder)valueHolder).getBinaryValue(); } else { serialized = serializer.serialize(valueHolder.get()); } ByteBuffer byteBuffer = ByteBuffer.allocate(serialized.remaining() + FIELDS_OVERHEAD); byteBuffer.putLong(valueHolder.getId()); byteBuffer.putLong(valueHolder.creationTime(OffHeapValueHolder.TIME_UNIT)); byteBuffer.putLong(valueHolder.lastAccessTime(OffHeapValueHolder.TIME_UNIT)); byteBuffer.putLong(valueHolder.expirationTime(OffHeapValueHolder.TIME_UNIT)); byteBuffer.putLong(0L); // represent the hits on previous versions. It is kept for compatibility reasons with previously saved data byteBuffer.put(serialized); byteBuffer.flip(); return byteBuffer; }
onExpiration(mappedKey, mappedValue, eventSink); return null; } else if (mappedValue.get().equals(value)) { removed.set(true); eventSink.removed(mappedKey, mappedValue);
existingValue = mappedValue.get();
} else if (oldValue.equals(mappedValue.get())) { replaced.set(true); return newUpdatedValueHolder(mappedKey, newValue, mappedValue, now, eventSink);
@Override public boolean adviseAgainstEviction(K key, OffHeapValueHolder<V> value) { try { return delegate.adviseAgainstEviction(key, value.get()); } catch (Exception e) { LOG.error("Exception raised while running eviction advisor " + "- Eviction will assume entry is NOT advised against eviction", e); return false; } }
@Override public int hashCode() { int result = 1; result = 31 * result + get().hashCode(); result = 31 * result + super.hashCode(); return result; }
} else if (oldValue.equals(mappedValue.get())) { replaced.set(true); return newUpdatedValueHolder(mappedKey, newValue, mappedValue, now, eventSink);
onExpiration(mappedKey, mappedValue, eventSink); return null; } else if (mappedValue.get().equals(value)) { removed.set(true); eventSink.removed(mappedKey, mappedValue);