From 56a15f4672d3726442273f390ccbca8293388ec9 Mon Sep 17 00:00:00 2001 From: Stepan Usatiuk Date: Fri, 25 Apr 2025 09:50:54 +0200 Subject: [PATCH] Sync-base: cleanup JKleppmannTree meta --- .../dhfsfs/objects/FileSyncHandler.java | 17 ++++------ .../JKleppmannTreeNodeMetaDirectory.java | 13 +++++++- .../objects}/JKleppmannTreeNodeMetaFile.java | 10 +++++- .../dhfsfs/service/DhfsFileServiceImpl.java | 22 ++++++------- .../usatiuk/dhfs/invalidation/OpHandler.java | 4 +-- .../JKleppmannTreeInitialSyncProcessor.java | 6 ++-- .../jkleppmanntree/JKleppmannTreeManager.java | 33 +++++++++++++------ .../JKleppmannTreeOpExtractor.java | 10 +++--- .../JKleppmannTreeOpWrapper.java | 13 +++----- .../structs/JKleppmannTreeNode.java | 21 +++++------- .../structs/JKleppmannTreeNodeMeta.java | 4 +++ .../dhfs/peersync/PeerInfoService.java | 8 ++--- .../structs/JKleppmannTreeNodeMetaPeer.java | 7 ++++ 13 files changed, 99 insertions(+), 69 deletions(-) rename dhfs-parent/{sync-base/src/main/java/com/usatiuk/dhfs/jkleppmanntree/structs => dhfs-fs/src/main/java/com/usatiuk/dhfsfs/objects}/JKleppmannTreeNodeMetaDirectory.java (50%) rename dhfs-parent/{sync-base/src/main/java/com/usatiuk/dhfs/jkleppmanntree/structs => dhfs-fs/src/main/java/com/usatiuk/dhfsfs/objects}/JKleppmannTreeNodeMetaFile.java (81%) diff --git a/dhfs-parent/dhfs-fs/src/main/java/com/usatiuk/dhfsfs/objects/FileSyncHandler.java b/dhfs-parent/dhfs-fs/src/main/java/com/usatiuk/dhfsfs/objects/FileSyncHandler.java index e1524951..2b46ec98 100644 --- a/dhfs-parent/dhfs-fs/src/main/java/com/usatiuk/dhfsfs/objects/FileSyncHandler.java +++ b/dhfs-parent/dhfs-fs/src/main/java/com/usatiuk/dhfsfs/objects/FileSyncHandler.java @@ -1,20 +1,15 @@ package com.usatiuk.dhfsfs.objects; -import com.usatiuk.dhfs.peersync.PeerId; -import com.usatiuk.dhfs.remoteobj.RemoteObjectDataWrapper; -import com.usatiuk.dhfs.remoteobj.RemoteObjectMeta; -import com.usatiuk.dhfs.remoteobj.RemoteTransaction; -import com.usatiuk.dhfsfs.service.DhfsFileService; import com.usatiuk.dhfs.jkleppmanntree.JKleppmannTreeManager; -import com.usatiuk.dhfs.jkleppmanntree.structs.JKleppmannTreeNodeMetaFile; import com.usatiuk.dhfs.jmap.JMapHelper; -import com.usatiuk.dhfs.remoteobj.ObjSyncHandler; +import com.usatiuk.dhfs.peersync.PeerId; import com.usatiuk.dhfs.peersync.PersistentPeerDataService; -import com.usatiuk.dhfs.remoteobj.SyncHelper; +import com.usatiuk.dhfs.remoteobj.*; +import com.usatiuk.dhfsfs.service.DhfsFileService; +import com.usatiuk.kleppmanntree.AlreadyExistsException; import com.usatiuk.objects.JObjectKey; import com.usatiuk.objects.transaction.LockingStrategy; import com.usatiuk.objects.transaction.Transaction; -import com.usatiuk.kleppmanntree.AlreadyExistsException; import io.grpc.Status; import io.grpc.StatusRuntimeException; import io.quarkus.logging.Log; @@ -48,11 +43,11 @@ public class FileSyncHandler implements ObjSyncHandler { DhfsFileService fileService; private JKleppmannTreeManager.JKleppmannTree getTreeW() { - return jKleppmannTreeManager.getTree(JObjectKey.of("fs")); + return jKleppmannTreeManager.getTree(JObjectKey.of("fs")).orElseThrow(); } private JKleppmannTreeManager.JKleppmannTree getTreeR() { - return jKleppmannTreeManager.getTree(JObjectKey.of("fs"), LockingStrategy.OPTIMISTIC); + return jKleppmannTreeManager.getTree(JObjectKey.of("fs"), LockingStrategy.OPTIMISTIC).orElseThrow(); } private void resolveConflict(PeerId from, JObjectKey key, PMap receivedChangelog, diff --git a/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/jkleppmanntree/structs/JKleppmannTreeNodeMetaDirectory.java b/dhfs-parent/dhfs-fs/src/main/java/com/usatiuk/dhfsfs/objects/JKleppmannTreeNodeMetaDirectory.java similarity index 50% rename from dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/jkleppmanntree/structs/JKleppmannTreeNodeMetaDirectory.java rename to dhfs-parent/dhfs-fs/src/main/java/com/usatiuk/dhfsfs/objects/JKleppmannTreeNodeMetaDirectory.java index e3ae7e24..99562fdc 100644 --- a/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/jkleppmanntree/structs/JKleppmannTreeNodeMetaDirectory.java +++ b/dhfs-parent/dhfs-fs/src/main/java/com/usatiuk/dhfsfs/objects/JKleppmannTreeNodeMetaDirectory.java @@ -1,4 +1,10 @@ -package com.usatiuk.dhfs.jkleppmanntree.structs; +package com.usatiuk.dhfsfs.objects; + +import com.usatiuk.dhfs.jkleppmanntree.structs.JKleppmannTreeNodeMeta; +import com.usatiuk.objects.JObjectKey; + +import java.util.Collection; +import java.util.List; public class JKleppmannTreeNodeMetaDirectory extends JKleppmannTreeNodeMeta { public JKleppmannTreeNodeMetaDirectory(String name) { @@ -9,4 +15,9 @@ public class JKleppmannTreeNodeMetaDirectory extends JKleppmannTreeNodeMeta { public JKleppmannTreeNodeMeta withName(String name) { return new JKleppmannTreeNodeMetaDirectory(name); } + + @Override + public Collection collectRefsTo() { + return List.of(); + } } diff --git a/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/jkleppmanntree/structs/JKleppmannTreeNodeMetaFile.java b/dhfs-parent/dhfs-fs/src/main/java/com/usatiuk/dhfsfs/objects/JKleppmannTreeNodeMetaFile.java similarity index 81% rename from dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/jkleppmanntree/structs/JKleppmannTreeNodeMetaFile.java rename to dhfs-parent/dhfs-fs/src/main/java/com/usatiuk/dhfsfs/objects/JKleppmannTreeNodeMetaFile.java index 13b449bf..fbfd3487 100644 --- a/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/jkleppmanntree/structs/JKleppmannTreeNodeMetaFile.java +++ b/dhfs-parent/dhfs-fs/src/main/java/com/usatiuk/dhfsfs/objects/JKleppmannTreeNodeMetaFile.java @@ -1,7 +1,10 @@ -package com.usatiuk.dhfs.jkleppmanntree.structs; +package com.usatiuk.dhfsfs.objects; +import com.usatiuk.dhfs.jkleppmanntree.structs.JKleppmannTreeNodeMeta; import com.usatiuk.objects.JObjectKey; +import java.util.Collection; +import java.util.List; import java.util.Objects; public class JKleppmannTreeNodeMetaFile extends JKleppmannTreeNodeMeta { @@ -42,4 +45,9 @@ public class JKleppmannTreeNodeMetaFile extends JKleppmannTreeNodeMeta { "_fileIno=" + _fileIno + '}'; } + + @Override + public Collection collectRefsTo() { + return List.of(_fileIno); + } } diff --git a/dhfs-parent/dhfs-fs/src/main/java/com/usatiuk/dhfsfs/service/DhfsFileServiceImpl.java b/dhfs-parent/dhfs-fs/src/main/java/com/usatiuk/dhfsfs/service/DhfsFileServiceImpl.java index 8004ab0c..0822c8be 100644 --- a/dhfs-parent/dhfs-fs/src/main/java/com/usatiuk/dhfsfs/service/DhfsFileServiceImpl.java +++ b/dhfs-parent/dhfs-fs/src/main/java/com/usatiuk/dhfsfs/service/DhfsFileServiceImpl.java @@ -2,26 +2,26 @@ package com.usatiuk.dhfsfs.service; import com.google.protobuf.ByteString; import com.google.protobuf.UnsafeByteOperations; +import com.usatiuk.dhfs.jkleppmanntree.JKleppmannTreeManager; +import com.usatiuk.dhfs.jkleppmanntree.structs.JKleppmannTreeNode; +import com.usatiuk.dhfs.jkleppmanntree.structs.JKleppmannTreeNodeMeta; +import com.usatiuk.dhfs.jmap.JMapEntry; +import com.usatiuk.dhfs.jmap.JMapHelper; +import com.usatiuk.dhfs.jmap.JMapLongKey; import com.usatiuk.dhfs.remoteobj.JDataRemote; import com.usatiuk.dhfs.remoteobj.RemoteObjectMeta; import com.usatiuk.dhfs.remoteobj.RemoteTransaction; import com.usatiuk.dhfsfs.objects.ChunkData; import com.usatiuk.dhfsfs.objects.File; -import com.usatiuk.dhfs.jkleppmanntree.JKleppmannTreeManager; -import com.usatiuk.dhfs.jkleppmanntree.structs.JKleppmannTreeNode; -import com.usatiuk.dhfs.jkleppmanntree.structs.JKleppmannTreeNodeMeta; -import com.usatiuk.dhfs.jkleppmanntree.structs.JKleppmannTreeNodeMetaDirectory; -import com.usatiuk.dhfs.jkleppmanntree.structs.JKleppmannTreeNodeMetaFile; -import com.usatiuk.dhfs.jmap.JMapEntry; -import com.usatiuk.dhfs.jmap.JMapHelper; -import com.usatiuk.dhfs.jmap.JMapLongKey; -import com.usatiuk.utils.StatusRuntimeExceptionNoStacktrace; +import com.usatiuk.dhfsfs.objects.JKleppmannTreeNodeMetaDirectory; +import com.usatiuk.dhfsfs.objects.JKleppmannTreeNodeMetaFile; import com.usatiuk.objects.JData; import com.usatiuk.objects.JObjectKey; import com.usatiuk.objects.iterators.IteratorStart; import com.usatiuk.objects.transaction.LockingStrategy; import com.usatiuk.objects.transaction.Transaction; import com.usatiuk.objects.transaction.TransactionManager; +import com.usatiuk.utils.StatusRuntimeExceptionNoStacktrace; import io.grpc.Status; import io.grpc.StatusRuntimeException; import io.quarkus.logging.Log; @@ -73,11 +73,11 @@ public class DhfsFileServiceImpl implements DhfsFileService { JMapHelper jMapHelper; private JKleppmannTreeManager.JKleppmannTree getTreeW() { - return jKleppmannTreeManager.getTree(JObjectKey.of("fs")); + return jKleppmannTreeManager.getTree(JObjectKey.of("fs"), () -> new JKleppmannTreeNodeMetaDirectory("")); } private JKleppmannTreeManager.JKleppmannTree getTreeR() { - return jKleppmannTreeManager.getTree(JObjectKey.of("fs"), LockingStrategy.OPTIMISTIC); + return jKleppmannTreeManager.getTree(JObjectKey.of("fs"), LockingStrategy.OPTIMISTIC, () -> new JKleppmannTreeNodeMetaDirectory("")); } private ChunkData createChunk(ByteString bytes) { diff --git a/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/invalidation/OpHandler.java b/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/invalidation/OpHandler.java index 12ed5950..15371976 100644 --- a/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/invalidation/OpHandler.java +++ b/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/invalidation/OpHandler.java @@ -23,11 +23,11 @@ public class OpHandler { if (op instanceof IndexUpdateOp iu) { pushOpHandler.handlePush(from, iu); } else if (op instanceof JKleppmannTreeOpWrapper jk) { - var tree = jKleppmannTreeManager.getTree(jk.treeName()); + var tree = jKleppmannTreeManager.getTree(jk.treeName()).orElseThrow(); tree.acceptExternalOp(from, jk); curTx.onCommit(() -> invalidationQueueService.pushInvalidationToOne(from, jk.treeName())); } else if (op instanceof JKleppmannTreePeriodicPushOp pop) { - var tree = jKleppmannTreeManager.getTree(pop.treeName()); + var tree = jKleppmannTreeManager.getTree(pop.treeName()).orElseThrow(); tree.acceptExternalOp(from, pop); } } diff --git a/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/jkleppmanntree/JKleppmannTreeInitialSyncProcessor.java b/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/jkleppmanntree/JKleppmannTreeInitialSyncProcessor.java index cc8a32a1..7665f1ef 100644 --- a/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/jkleppmanntree/JKleppmannTreeInitialSyncProcessor.java +++ b/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/jkleppmanntree/JKleppmannTreeInitialSyncProcessor.java @@ -1,9 +1,9 @@ package com.usatiuk.dhfs.jkleppmanntree; -import com.usatiuk.dhfs.peersync.PeerId; +import com.usatiuk.dhfs.invalidation.InvalidationQueueService; import com.usatiuk.dhfs.jkleppmanntree.structs.JKleppmannTreePersistentData; import com.usatiuk.dhfs.peersync.InitialSyncProcessor; -import com.usatiuk.dhfs.invalidation.InvalidationQueueService; +import com.usatiuk.dhfs.peersync.PeerId; import com.usatiuk.objects.JObjectKey; import io.quarkus.logging.Log; import jakarta.enterprise.context.ApplicationScoped; @@ -18,7 +18,7 @@ public class JKleppmannTreeInitialSyncProcessor implements InitialSyncProcessor< @Override public void prepareForInitialSync(PeerId from, JObjectKey key) { - var tree = jKleppmannTreeManager.getTree(key); + var tree = jKleppmannTreeManager.getTree(key).orElseThrow(); tree.recordBootstrap(from); } diff --git a/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/jkleppmanntree/JKleppmannTreeManager.java b/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/jkleppmanntree/JKleppmannTreeManager.java index fc2f3693..1a3f1af8 100644 --- a/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/jkleppmanntree/JKleppmannTreeManager.java +++ b/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/jkleppmanntree/JKleppmannTreeManager.java @@ -1,15 +1,17 @@ package com.usatiuk.dhfs.jkleppmanntree; -import com.usatiuk.objects.JObjectKey; -import com.usatiuk.dhfs.peersync.PeerId; -import com.usatiuk.dhfs.jkleppmanntree.structs.*; -import com.usatiuk.dhfs.peersync.PersistentPeerDataService; import com.usatiuk.dhfs.invalidation.Op; +import com.usatiuk.dhfs.jkleppmanntree.structs.JKleppmannTreeNode; +import com.usatiuk.dhfs.jkleppmanntree.structs.JKleppmannTreeNodeMeta; +import com.usatiuk.dhfs.jkleppmanntree.structs.JKleppmannTreePersistentData; +import com.usatiuk.dhfs.peersync.PeerId; import com.usatiuk.dhfs.peersync.PeerInfoService; +import com.usatiuk.dhfs.peersync.PersistentPeerDataService; +import com.usatiuk.kleppmanntree.*; +import com.usatiuk.objects.JObjectKey; import com.usatiuk.objects.transaction.LockingStrategy; import com.usatiuk.objects.transaction.Transaction; import com.usatiuk.objects.transaction.TransactionManager; -import com.usatiuk.kleppmanntree.*; import io.quarkus.logging.Log; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; @@ -20,6 +22,7 @@ import org.pcollections.TreePSet; import java.util.*; import java.util.function.Function; +import java.util.function.Supplier; @ApplicationScoped public class JKleppmannTreeManager { @@ -35,7 +38,7 @@ public class JKleppmannTreeManager { @Inject PersistentPeerDataService persistentPeerDataService; - public JKleppmannTree getTree(JObjectKey name, LockingStrategy lockingStrategy) { + public JKleppmannTree getTree(JObjectKey name, LockingStrategy lockingStrategy, Supplier rootNodeSupplier) { return txManager.executeTx(() -> { var data = curTx.get(JKleppmannTreePersistentData.class, name, lockingStrategy).orElse(null); if (data == null) { @@ -49,11 +52,11 @@ public class JKleppmannTreeManager { TreePMap.empty() ); curTx.put(data); - var rootNode = new JKleppmannTreeNode(JObjectKey.of(name.value() + "_jt_root"), null, new JKleppmannTreeNodeMetaDirectory("")); + var rootNode = new JKleppmannTreeNode(JObjectKey.of(name.value() + "_jt_root"), null, rootNodeSupplier.get()); curTx.put(rootNode); - var trashNode = new JKleppmannTreeNode(JObjectKey.of(name.value() + "_jt_trash"), null, new JKleppmannTreeNodeMetaDirectory("")); + var trashNode = new JKleppmannTreeNode(JObjectKey.of(name.value() + "_jt_trash"), null, rootNodeSupplier.get()); curTx.put(trashNode); - var lf_node = new JKleppmannTreeNode(JObjectKey.of(name.value() + "_jt_lf"), null, new JKleppmannTreeNodeMetaDirectory("")); + var lf_node = new JKleppmannTreeNode(JObjectKey.of(name.value() + "_jt_lf"), null, rootNodeSupplier.get()); curTx.put(lf_node); } return new JKleppmannTree(data); @@ -61,10 +64,20 @@ public class JKleppmannTreeManager { }); } - public JKleppmannTree getTree(JObjectKey name) { + public Optional getTree(JObjectKey name) { return getTree(name, LockingStrategy.WRITE); } + public Optional getTree(JObjectKey name, LockingStrategy lockingStrategy) { + return txManager.executeTx(() -> { + return curTx.get(JKleppmannTreePersistentData.class, name, lockingStrategy).map(JKleppmannTree::new); + }); + } + + public JKleppmannTree getTree(JObjectKey name, Supplier rootNodeSupplier) { + return getTree(name, LockingStrategy.WRITE, rootNodeSupplier); + } + public class JKleppmannTree { private final KleppmannTree _tree; private final JKleppmannTreeStorageInterface _storageInterface; diff --git a/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/jkleppmanntree/JKleppmannTreeOpExtractor.java b/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/jkleppmanntree/JKleppmannTreeOpExtractor.java index dbff3ca5..8ab75d24 100644 --- a/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/jkleppmanntree/JKleppmannTreeOpExtractor.java +++ b/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/jkleppmanntree/JKleppmannTreeOpExtractor.java @@ -1,11 +1,11 @@ package com.usatiuk.dhfs.jkleppmanntree; -import com.usatiuk.dhfs.peersync.PeerId; -import com.usatiuk.dhfs.remoteobj.RemoteTransaction; -import com.usatiuk.dhfs.jkleppmanntree.structs.JKleppmannTreePersistentData; import com.usatiuk.dhfs.invalidation.InvalidationQueueService; import com.usatiuk.dhfs.invalidation.Op; import com.usatiuk.dhfs.invalidation.OpExtractor; +import com.usatiuk.dhfs.jkleppmanntree.structs.JKleppmannTreePersistentData; +import com.usatiuk.dhfs.peersync.PeerId; +import com.usatiuk.dhfs.remoteobj.RemoteTransaction; import com.usatiuk.dhfs.syncmap.DtoMapperService; import com.usatiuk.objects.transaction.Transaction; import com.usatiuk.objects.transaction.TransactionManager; @@ -34,7 +34,7 @@ public class JKleppmannTreeOpExtractor implements OpExtractor, Runnable> extractOps(JKleppmannTreePersistentData data, PeerId peerId) { return txm.run(() -> { - var tree = jKleppmannTreeManager.getTree(data.key()); + var tree = jKleppmannTreeManager.getTree(data.key()).orElseThrow(); if (!tree.hasPendingOpsForHost(peerId)) return Pair.of(List.of(tree.getPeriodicPushOp()), (Runnable) () -> { @@ -48,7 +48,7 @@ public class JKleppmannTreeOpExtractor implements OpExtractor, Runnable>of(ops, (Runnable) () -> { txm.run(() -> { - var commitTree = jKleppmannTreeManager.getTree(key); + var commitTree = jKleppmannTreeManager.getTree(key).orElseThrow(); for (var op : ops) { commitTree.commitOpForHost(peerId, op); } diff --git a/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/jkleppmanntree/JKleppmannTreeOpWrapper.java b/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/jkleppmanntree/JKleppmannTreeOpWrapper.java index 71ab4b7c..75ef2a66 100644 --- a/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/jkleppmanntree/JKleppmannTreeOpWrapper.java +++ b/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/jkleppmanntree/JKleppmannTreeOpWrapper.java @@ -1,24 +1,19 @@ package com.usatiuk.dhfs.jkleppmanntree; -import com.usatiuk.objects.JObjectKey; -import com.usatiuk.dhfs.peersync.PeerId; -import com.usatiuk.dhfs.jkleppmanntree.structs.JKleppmannTreeNodeMeta; -import com.usatiuk.dhfs.jkleppmanntree.structs.JKleppmannTreeNodeMetaFile; import com.usatiuk.dhfs.invalidation.Op; +import com.usatiuk.dhfs.jkleppmanntree.structs.JKleppmannTreeNodeMeta; +import com.usatiuk.dhfs.peersync.PeerId; import com.usatiuk.kleppmanntree.OpMove; +import com.usatiuk.objects.JObjectKey; import java.io.Serializable; import java.util.Collection; -import java.util.List; // Wrapper to avoid having to specify generic types public record JKleppmannTreeOpWrapper(JObjectKey treeName, OpMove op) implements Op, Serializable { @Override public Collection getEscapedRefs() { - if (op.newMeta() instanceof JKleppmannTreeNodeMetaFile mf) { - return List.of(mf.getFileIno()); - } - return List.of(); + return op.newMeta().collectRefsTo(); } } diff --git a/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/jkleppmanntree/structs/JKleppmannTreeNode.java b/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/jkleppmanntree/structs/JKleppmannTreeNode.java index 8e4182ee..3ab192d3 100644 --- a/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/jkleppmanntree/structs/JKleppmannTreeNode.java +++ b/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/jkleppmanntree/structs/JKleppmannTreeNode.java @@ -1,12 +1,12 @@ package com.usatiuk.dhfs.jkleppmanntree.structs; +import com.usatiuk.dhfs.peersync.PeerId; import com.usatiuk.dhfs.refcount.JDataRef; import com.usatiuk.dhfs.refcount.JDataRefcounted; -import com.usatiuk.objects.JObjectKey; -import com.usatiuk.dhfs.peersync.PeerId; -import com.usatiuk.dhfs.peersync.structs.JKleppmannTreeNodeMetaPeer; import com.usatiuk.kleppmanntree.OpMove; import com.usatiuk.kleppmanntree.TreeNode; +import com.usatiuk.objects.JObjectKey; +import jakarta.annotation.Nullable; import org.pcollections.HashTreePMap; import org.pcollections.PCollection; import org.pcollections.PMap; @@ -14,13 +14,14 @@ import org.pcollections.TreePSet; import java.io.Serializable; import java.util.Collection; +import java.util.Optional; import java.util.stream.Collectors; import java.util.stream.Stream; // FIXME: Ideally this is two classes? public record JKleppmannTreeNode(JObjectKey key, PCollection refsFrom, boolean frozen, JObjectKey parent, OpMove lastEffectiveOp, - JKleppmannTreeNodeMeta meta, + @Nullable JKleppmannTreeNodeMeta meta, PMap children) implements TreeNode, JDataRefcounted, Serializable { public JKleppmannTreeNode(JObjectKey id, JObjectKey parent, JKleppmannTreeNodeMeta meta) { @@ -60,13 +61,9 @@ public record JKleppmannTreeNode(JObjectKey key, PCollection refsFrom, @Override public Collection collectRefsTo() { return Stream.concat(children().values().stream(), - switch (meta()) { - case JKleppmannTreeNodeMetaDirectory dir -> Stream.empty(); - case JKleppmannTreeNodeMetaFile file -> Stream.of(file.getFileIno()); - case JKleppmannTreeNodeMetaPeer peer -> Stream.of(peer.getPeerId()); - case null -> Stream.empty(); - default -> throw new IllegalStateException("Unexpected value: " + meta()); - } - ).collect(Collectors.toUnmodifiableSet()); + Optional.ofNullable(meta) + .>map(o -> o.collectRefsTo().stream()) + .orElse(Stream.empty())) + .collect(Collectors.toUnmodifiableSet()); } } diff --git a/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/jkleppmanntree/structs/JKleppmannTreeNodeMeta.java b/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/jkleppmanntree/structs/JKleppmannTreeNodeMeta.java index 6c8672cf..f22d933c 100644 --- a/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/jkleppmanntree/structs/JKleppmannTreeNodeMeta.java +++ b/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/jkleppmanntree/structs/JKleppmannTreeNodeMeta.java @@ -1,7 +1,9 @@ package com.usatiuk.dhfs.jkleppmanntree.structs; import com.usatiuk.kleppmanntree.NodeMeta; +import com.usatiuk.objects.JObjectKey; +import java.util.Collection; import java.util.Objects; //@ProtoMirror(JKleppmannTreeNodeMetaP.class) @@ -38,4 +40,6 @@ public abstract class JKleppmannTreeNodeMeta implements NodeMeta { "_name='" + _name + '\'' + '}'; } + + abstract public Collection collectRefsTo(); } diff --git a/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/peersync/PeerInfoService.java b/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/peersync/PeerInfoService.java index 0cc855e8..d30ea5df 100644 --- a/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/peersync/PeerInfoService.java +++ b/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/peersync/PeerInfoService.java @@ -1,10 +1,10 @@ package com.usatiuk.dhfs.peersync; -import com.usatiuk.objects.JObjectKey; -import com.usatiuk.dhfs.remoteobj.RemoteTransaction; import com.usatiuk.dhfs.jkleppmanntree.JKleppmannTreeManager; import com.usatiuk.dhfs.jkleppmanntree.structs.JKleppmannTreeNode; import com.usatiuk.dhfs.peersync.structs.JKleppmannTreeNodeMetaPeer; +import com.usatiuk.dhfs.remoteobj.RemoteTransaction; +import com.usatiuk.objects.JObjectKey; import com.usatiuk.objects.transaction.LockingStrategy; import com.usatiuk.objects.transaction.Transaction; import com.usatiuk.objects.transaction.TransactionManager; @@ -30,11 +30,11 @@ public class PeerInfoService { RemoteTransaction remoteTx; private JKleppmannTreeManager.JKleppmannTree getTreeW() { - return jKleppmannTreeManager.getTree(TREE_KEY); + return jKleppmannTreeManager.getTree(TREE_KEY, () -> null); } private JKleppmannTreeManager.JKleppmannTree getTreeR() { - return jKleppmannTreeManager.getTree(TREE_KEY, LockingStrategy.OPTIMISTIC); + return jKleppmannTreeManager.getTree(TREE_KEY, LockingStrategy.OPTIMISTIC, () -> null); } public Optional getPeerInfoImpl(JObjectKey key) { diff --git a/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/peersync/structs/JKleppmannTreeNodeMetaPeer.java b/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/peersync/structs/JKleppmannTreeNodeMetaPeer.java index 5a91af89..7bc4e1fa 100644 --- a/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/peersync/structs/JKleppmannTreeNodeMetaPeer.java +++ b/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/peersync/structs/JKleppmannTreeNodeMetaPeer.java @@ -4,6 +4,8 @@ import com.usatiuk.objects.JObjectKey; import com.usatiuk.dhfs.peersync.PeerId; import com.usatiuk.dhfs.jkleppmanntree.structs.JKleppmannTreeNodeMeta; +import java.util.Collection; +import java.util.List; import java.util.Objects; //@ProtoMirror(JKleppmannTreeNodeMetaFileP.class) @@ -50,4 +52,9 @@ public class JKleppmannTreeNodeMetaPeer extends JKleppmannTreeNodeMeta { public int hashCode() { return Objects.hash(super.hashCode(), _peerId); } + + @Override + public Collection collectRefsTo() { + return List.of(_peerId); + } }