diff --git a/dhfs-parent/server/src/main/java/com/usatiuk/dhfs/objects/RefcounterTxHook.java b/dhfs-parent/server/src/main/java/com/usatiuk/dhfs/objects/RefcounterTxHook.java index b6f515cd..5d67cc1b 100644 --- a/dhfs-parent/server/src/main/java/com/usatiuk/dhfs/objects/RefcounterTxHook.java +++ b/dhfs-parent/server/src/main/java/com/usatiuk/dhfs/objects/RefcounterTxHook.java @@ -1,6 +1,5 @@ package com.usatiuk.dhfs.objects; -import com.usatiuk.dhfs.objects.jmap.JMapEntry; import com.usatiuk.dhfs.objects.transaction.Transaction; import io.quarkus.logging.Log; import jakarta.enterprise.context.ApplicationScoped; @@ -23,18 +22,6 @@ public class RefcounterTxHook implements PreCommitTxHook { @Override public void onChange(JObjectKey key, JData old, JData cur) { - if (cur instanceof JMapEntry me) { - var oldMe = (JMapEntry) old; - var oldRef = oldMe.ref(); - var curRef = me.ref(); - var referencedOld = getRef(oldRef); - curTx.put(referencedOld.withRefsFrom(referencedOld.refsFrom().minus(key))); - var referencedCur = getRef(curRef); - curTx.put(referencedCur.withRefsFrom(referencedCur.refsFrom().plus(key))); - Log.tracev("Removed ref from {0} to {1}, added ref to {2}", key, oldRef, curRef); - return; - } - if (!(cur instanceof JDataRefcounted refCur)) { return; } @@ -62,14 +49,6 @@ public class RefcounterTxHook implements PreCommitTxHook { @Override public void onCreate(JObjectKey key, JData cur) { - if (cur instanceof JMapEntry me) { - var curRef = me.ref(); - var referencedCur = getRef(curRef); - curTx.put(referencedCur.withRefsFrom(referencedCur.refsFrom().plus(key))); - Log.tracev("Added ref from {0} to {1}", key, curRef); - return; - } - if (!(cur instanceof JDataRefcounted refCur)) { return; } @@ -83,14 +62,6 @@ public class RefcounterTxHook implements PreCommitTxHook { @Override public void onDelete(JObjectKey key, JData cur) { - if (cur instanceof JMapEntry me) { - var oldRef = me.ref(); - var referencedOld = getRef(oldRef); - curTx.put(referencedOld.withRefsFrom(referencedOld.refsFrom().minus(key))); - Log.tracev("Removed ref from {0} to {1}", key, oldRef); - return; - } - if (!(cur instanceof JDataRefcounted refCur)) { return; } diff --git a/dhfs-parent/server/src/main/java/com/usatiuk/dhfs/objects/jmap/JMapRefcounterTxHook.java b/dhfs-parent/server/src/main/java/com/usatiuk/dhfs/objects/jmap/JMapRefcounterTxHook.java new file mode 100644 index 00000000..5dab5507 --- /dev/null +++ b/dhfs-parent/server/src/main/java/com/usatiuk/dhfs/objects/jmap/JMapRefcounterTxHook.java @@ -0,0 +1,63 @@ +package com.usatiuk.dhfs.objects.jmap; + +import com.usatiuk.dhfs.objects.*; +import com.usatiuk.dhfs.objects.transaction.Transaction; +import io.quarkus.logging.Log; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; + +@ApplicationScoped +public class JMapRefcounterTxHook implements PreCommitTxHook { + @Inject + Transaction curTx; + + private JDataRefcounted getRef(JObjectKey key) { + var found = curTx.get(JDataRefcounted.class, key).orElse(null); + + if (found != null) { + return found; + } + + return new RemoteObjectMeta(key); + } + + @Override + public void onChange(JObjectKey key, JData old, JData cur) { + if (!(cur instanceof JMapEntry me)) { + return; + } + + var oldMe = (JMapEntry) old; + var oldRef = oldMe.ref(); + var curRef = me.ref(); + var referencedOld = getRef(oldRef); + curTx.put(referencedOld.withRefsFrom(referencedOld.refsFrom().minus(key))); + var referencedCur = getRef(curRef); + curTx.put(referencedCur.withRefsFrom(referencedCur.refsFrom().plus(key))); + Log.tracev("Removed ref from {0} to {1}, added ref to {2}", key, oldRef, curRef); + } + + @Override + public void onCreate(JObjectKey key, JData cur) { + if (!(cur instanceof JMapEntry me)) { + return; + } + + var curRef = me.ref(); + var referencedCur = getRef(curRef); + curTx.put(referencedCur.withRefsFrom(referencedCur.refsFrom().plus(key))); + Log.tracev("Added ref from {0} to {1}", key, curRef); + } + + @Override + public void onDelete(JObjectKey key, JData cur) { + if (!(cur instanceof JMapEntry me)) { + return; + } + + var oldRef = me.ref(); + var referencedOld = getRef(oldRef); + curTx.put(referencedOld.withRefsFrom(referencedOld.refsFrom().minus(key))); + Log.tracev("Removed ref from {0} to {1}", key, oldRef); + } +}