From e2e756e7c52a7bdafece619eae3bb550d66fae81 Mon Sep 17 00:00:00 2001 From: Stepan Usatiuk Date: Wed, 23 Apr 2025 14:50:28 +0200 Subject: [PATCH] Objects: getFromSource just ever so slightly faster one map access --- .../stores/CachingObjectPersistentStore.java | 4 ++- .../transaction/TransactionFactoryImpl.java | 15 ++++---- .../com/usatiuk/dhfs/RemoteObjectMeta.java | 36 ++++++++----------- 3 files changed, 24 insertions(+), 31 deletions(-) diff --git a/dhfs-parent/objects/src/main/java/com/usatiuk/objects/stores/CachingObjectPersistentStore.java b/dhfs-parent/objects/src/main/java/com/usatiuk/objects/stores/CachingObjectPersistentStore.java index 773e4f74..80dbdf53 100644 --- a/dhfs-parent/objects/src/main/java/com/usatiuk/objects/stores/CachingObjectPersistentStore.java +++ b/dhfs-parent/objects/src/main/java/com/usatiuk/objects/stores/CachingObjectPersistentStore.java @@ -42,13 +42,15 @@ public class CachingObjectPersistentStore { if (old != null) newSize -= old.size(); - TreePMap newCache = map().plus(key, entry); + TreePMap newCache = map(); while (newSize > sizeLimit) { var del = newCache.firstEntry(); newCache = newCache.minusFirstEntry(); newSize -= del.getValue().size(); } + + newCache = newCache.plus(key, entry); return new Cache( newCache, newSize, diff --git a/dhfs-parent/objects/src/main/java/com/usatiuk/objects/transaction/TransactionFactoryImpl.java b/dhfs-parent/objects/src/main/java/com/usatiuk/objects/transaction/TransactionFactoryImpl.java index 217b8fb9..ae11f3d6 100644 --- a/dhfs-parent/objects/src/main/java/com/usatiuk/objects/transaction/TransactionFactoryImpl.java +++ b/dhfs-parent/objects/src/main/java/com/usatiuk/objects/transaction/TransactionFactoryImpl.java @@ -94,15 +94,12 @@ public class TransactionFactoryImpl implements TransactionFactory { @Override public Optional getFromSource(Class type, JObjectKey key) { - var got = _readSet.get(key); - - if (got == null) { - var read = _snapshot.readObject(key); - _readSet.put(key, new TransactionObjectNoLock<>(read)); - return read.map(JDataVersionedWrapper::data).map(type::cast); - } - - return got.data().map(JDataVersionedWrapper::data).map(type::cast); + return _readSet.computeIfAbsent(key, k -> { + var read = _snapshot.readObject(k); + return new TransactionObjectNoLock<>(read); + }) + .data() + .map(w -> type.cast(w.data())); } public Optional getWriteLockedFromSource(Class type, JObjectKey key) { diff --git a/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/RemoteObjectMeta.java b/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/RemoteObjectMeta.java index 263e37f7..bdef1dbe 100644 --- a/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/RemoteObjectMeta.java +++ b/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/RemoteObjectMeta.java @@ -6,8 +6,7 @@ import org.pcollections.*; import java.util.Collection; import java.util.List; -public record RemoteObjectMeta(PCollection refsFrom, boolean frozen, - JObjectKey key, +public record RemoteObjectMeta(JObjectKey key, PCollection refsFrom, boolean frozen, PMap knownRemoteVersions, Class knownType, PSet confirmedDeletes, @@ -16,22 +15,22 @@ public record RemoteObjectMeta(PCollection refsFrom, boolean frozen, boolean hasLocalData) implements JDataRefcounted { // Self put public RemoteObjectMeta(JDataRemote data, PeerId initialPeer) { - this(HashTreePSet.empty(), false, - data.key(), HashTreePMap.empty(), data.getClass(), HashTreePSet.empty(), false, + this(data.key(), HashTreePSet.empty(), false, + HashTreePMap.empty(), data.getClass(), HashTreePSet.empty(), false, HashTreePMap.empty().plus(initialPeer, 1L), true); } public RemoteObjectMeta(JObjectKey key, PMap remoteChangelog) { - this(HashTreePSet.empty(), false, - key, HashTreePMap.empty(), JDataRemote.class, HashTreePSet.empty(), true, + this(key, HashTreePSet.empty(), false, + HashTreePMap.empty(), JDataRemote.class, HashTreePSet.empty(), true, remoteChangelog, false); } public RemoteObjectMeta(JObjectKey key) { - this(HashTreePSet.empty(), false, - key, HashTreePMap.empty(), JDataRemote.class, HashTreePSet.empty(), true, + this(key, HashTreePSet.empty(), false, + HashTreePMap.empty(), JDataRemote.class, HashTreePSet.empty(), true, TreePMap.empty(), false); } @@ -44,47 +43,42 @@ public record RemoteObjectMeta(PCollection refsFrom, boolean frozen, return JObjectKey.of(key.value() + "_data"); } - @Override - public JObjectKey key() { - return ofMetaKey(key); - } - public JObjectKey dataKey() { return ofDataKey(key); } @Override public RemoteObjectMeta withRefsFrom(PCollection refs) { - return new RemoteObjectMeta(refs, frozen, key, knownRemoteVersions, knownType, confirmedDeletes, seen, changelog, hasLocalData); + return new RemoteObjectMeta(key, refs, frozen, knownRemoteVersions, knownType, confirmedDeletes, seen, changelog, hasLocalData); } @Override public RemoteObjectMeta withFrozen(boolean frozen) { - return new RemoteObjectMeta(refsFrom, frozen, key, knownRemoteVersions, knownType, confirmedDeletes, seen, changelog, hasLocalData); + return new RemoteObjectMeta(key, refsFrom, frozen, knownRemoteVersions, knownType, confirmedDeletes, seen, changelog, hasLocalData); } public RemoteObjectMeta withKnownRemoteVersions(PMap knownRemoteVersions) { - return new RemoteObjectMeta(refsFrom, frozen, key, knownRemoteVersions, knownType, confirmedDeletes, seen, changelog, hasLocalData); + return new RemoteObjectMeta(key, refsFrom, frozen, knownRemoteVersions, knownType, confirmedDeletes, seen, changelog, hasLocalData); } public RemoteObjectMeta withKnownType(Class knownType) { - return new RemoteObjectMeta(refsFrom, frozen, key, knownRemoteVersions, knownType, confirmedDeletes, seen, changelog, hasLocalData); + return new RemoteObjectMeta(key, refsFrom, frozen, knownRemoteVersions, knownType, confirmedDeletes, seen, changelog, hasLocalData); } public RemoteObjectMeta withConfirmedDeletes(PSet confirmedDeletes) { - return new RemoteObjectMeta(refsFrom, frozen, key, knownRemoteVersions, knownType, confirmedDeletes, seen, changelog, hasLocalData); + return new RemoteObjectMeta(key, refsFrom, frozen, knownRemoteVersions, knownType, confirmedDeletes, seen, changelog, hasLocalData); } public RemoteObjectMeta withSeen(boolean seen) { - return new RemoteObjectMeta(refsFrom, frozen, key, knownRemoteVersions, knownType, confirmedDeletes, seen, changelog, hasLocalData); + return new RemoteObjectMeta(key, refsFrom, frozen, knownRemoteVersions, knownType, confirmedDeletes, seen, changelog, hasLocalData); } public RemoteObjectMeta withChangelog(PMap changelog) { - return new RemoteObjectMeta(refsFrom, frozen, key, knownRemoteVersions, knownType, confirmedDeletes, seen, changelog, hasLocalData); + return new RemoteObjectMeta(key, refsFrom, frozen, knownRemoteVersions, knownType, confirmedDeletes, seen, changelog, hasLocalData); } public RemoteObjectMeta withHaveLocal(boolean haveLocal) { - return new RemoteObjectMeta(refsFrom, frozen, key, knownRemoteVersions, knownType, confirmedDeletes, seen, changelog, haveLocal); + return new RemoteObjectMeta(key, refsFrom, frozen, knownRemoteVersions, knownType, confirmedDeletes, seen, changelog, haveLocal); } public long versionSum() {