From 7284fe91e5412ab7fead8cc433039d43239ef54a Mon Sep 17 00:00:00 2001 From: Stepan Usatiuk Date: Mon, 3 Feb 2025 21:21:14 +0100 Subject: [PATCH] fix tx hooks not quite working --- .../usatiuk/dhfs/objects/JObjectManager.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/JObjectManager.java b/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/JObjectManager.java index c3c2df63..57b6fd39 100644 --- a/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/JObjectManager.java +++ b/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/JObjectManager.java @@ -30,6 +30,7 @@ public class JObjectManager { WritebackObjectPersistentStore writebackObjectPersistentStore; @Inject TransactionFactory transactionFactory; + JObjectManager(Instance preCommitTxHooks) { _preCommitTxHooks = preCommitTxHooks.stream().sorted(Comparator.comparingInt(PreCommitTxHook::getPriority)).toList(); } @@ -131,20 +132,21 @@ public class JObjectManager { boolean somethingChanged; do { somethingChanged = false; + Map> currentIteration = new HashMap(); for (var hook : _preCommitTxHooks) { - drained = tx.drainNewWrites(); - Log.trace("Commit iteration with " + drained.size() + " records for hook " + hook.getClass()); + for (var n : tx.drainNewWrites()) + currentIteration.put(n.key(), n); + Log.trace("Commit iteration with " + currentIteration.size() + " records for hook " + hook.getClass()); - drained.stream() - .map(TxRecord.TxObjectRecord::key) + currentIteration.keySet().stream() .sorted(Comparator.comparing(JObjectKey::toString)) .forEach(addDependency); - for (var entry : drained) { + for (var entry : currentIteration.entrySet()) { somethingChanged = true; Log.trace("Running pre-commit hook " + hook.getClass() + " for" + entry.toString()); - var oldObj = getCurrent.apply(entry.key()); - switch (entry) { + var oldObj = getCurrent.apply(entry.getKey()); + switch (entry.getValue()) { case TxRecord.TxObjectRecordWrite write -> { if (oldObj == null) { hook.onCreate(write.key(), write.data()); @@ -157,9 +159,9 @@ public class JObjectManager { } default -> throw new TxCommitException("Unexpected value: " + entry); } - current.put(entry.key(), entry); } } + current.putAll(currentIteration); } while (somethingChanged); } reads = tx.reads();