@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; }
@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")); }
@Test public void testWriteBackOfValueHolder() throws StoreAccessException { offHeapStore = createAndInitStore(timeSource, ExpiryPolicyBuilder.timeToIdleExpiration(Duration.ofMillis(15L))); offHeapStore.put("key1", "value1"); timeSource.advanceTime(10); OffHeapValueHolder<String> valueHolder = (OffHeapValueHolder<String>)offHeapStore.get("key1"); assertThat(valueHolder.lastAccessTime(), is(10L)); timeSource.advanceTime(10); assertThat(offHeapStore.get("key1"), notNullValue()); timeSource.advanceTime(16); assertThat(offHeapStore.get("key1"), nullValue()); }
@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; }