From 174320d389c6d86fe5abaf772ff36a201aec80df Mon Sep 17 00:00:00 2001 From: Stepan Usatiuk Date: Sat, 8 Mar 2025 15:05:57 +0100 Subject: [PATCH] Objects: lazy deserialization --- .../dhfs/objects/JDataVersionedWrapper.java | 7 ++-- .../objects/JDataVersionedWrapperImpl.java | 8 ++++ .../objects/JDataVersionedWrapperLazy.java | 37 +++++++++++++++++++ .../dhfs/objects/JavaDataSerializer.java | 11 ++++-- .../WritebackObjectPersistentStore.java | 2 +- 5 files changed, 57 insertions(+), 8 deletions(-) create mode 100644 dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/JDataVersionedWrapperImpl.java create mode 100644 dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/JDataVersionedWrapperLazy.java diff --git a/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/JDataVersionedWrapper.java b/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/JDataVersionedWrapper.java index d1aaddc2..9fb7b4ec 100644 --- a/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/JDataVersionedWrapper.java +++ b/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/JDataVersionedWrapper.java @@ -1,8 +1,7 @@ package com.usatiuk.dhfs.objects; -import jakarta.annotation.Nonnull; +public interface JDataVersionedWrapper { + JData data(); -import java.io.Serializable; - -public record JDataVersionedWrapper(@Nonnull JData data, long version) implements Serializable { + long version(); } diff --git a/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/JDataVersionedWrapperImpl.java b/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/JDataVersionedWrapperImpl.java new file mode 100644 index 00000000..99305dd8 --- /dev/null +++ b/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/JDataVersionedWrapperImpl.java @@ -0,0 +1,8 @@ +package com.usatiuk.dhfs.objects; + +import jakarta.annotation.Nonnull; + +import java.io.Serializable; + +public record JDataVersionedWrapperImpl(@Nonnull JData data, long version) implements Serializable, JDataVersionedWrapper { +} diff --git a/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/JDataVersionedWrapperLazy.java b/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/JDataVersionedWrapperLazy.java new file mode 100644 index 00000000..5794fb18 --- /dev/null +++ b/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/JDataVersionedWrapperLazy.java @@ -0,0 +1,37 @@ +package com.usatiuk.dhfs.objects; + +import com.google.protobuf.ByteString; +import com.usatiuk.dhfs.utils.SerializationHelper; + +public class JDataVersionedWrapperLazy implements JDataVersionedWrapper { + private final long _version; + private ByteString _rawData; + private JData _data; + + public JDataVersionedWrapperLazy(long version, ByteString rawData) { + _version = version; + _rawData = rawData; + } + + public JData data() { + if (_data != null) + return _data; + + synchronized (this) { + if (_data != null) + return _data; + + try (var is = _rawData.newInput()) { + _data = SerializationHelper.deserialize(is); + } catch (Exception e) { + throw new RuntimeException(e); + } + _rawData = null; + return _data; + } + } + + public long version() { + return _version; + } +} diff --git a/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/JavaDataSerializer.java b/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/JavaDataSerializer.java index a42ebc07..f870b3c8 100644 --- a/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/JavaDataSerializer.java +++ b/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/JavaDataSerializer.java @@ -5,17 +5,22 @@ import com.google.protobuf.ByteString; import com.usatiuk.dhfs.utils.SerializationHelper; import jakarta.enterprise.context.ApplicationScoped; -import java.io.Serializable; +import java.nio.ByteBuffer; @ApplicationScoped public class JavaDataSerializer implements ObjectSerializer { @Override public ByteString serialize(JDataVersionedWrapper obj) { - return SerializationHelper.serialize((Serializable) obj); + ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES); + buffer.putLong(obj.version()); + buffer.flip(); + return ByteString.copyFrom(buffer).concat(SerializationHelper.serialize(obj.data())); } @Override public JDataVersionedWrapper deserialize(ByteString data) { - return SerializationHelper.deserialize(data.toByteArray()); + var version = data.substring(0, Long.BYTES).asReadOnlyByteBuffer().getLong(); + var rawData = data.substring(Long.BYTES); + return new JDataVersionedWrapperLazy(version, rawData); } } diff --git a/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/WritebackObjectPersistentStore.java b/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/WritebackObjectPersistentStore.java index 2fb14558..8a843407 100644 --- a/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/WritebackObjectPersistentStore.java +++ b/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/WritebackObjectPersistentStore.java @@ -432,7 +432,7 @@ public class WritebackObjectPersistentStore { switch (action) { case TxRecord.TxObjectRecordWrite write -> { Log.trace("Flushing object " + write.key()); - bundle.commit(new JDataVersionedWrapper(write.data(), bundleId)); + bundle.commit(new JDataVersionedWrapperImpl(write.data(), bundleId)); } case TxRecord.TxObjectRecordDeleted deleted -> { Log.trace("Deleting object " + deleted.key());