more sensible hook order

This commit is contained in:
2025-01-01 19:19:15 +01:00
parent e0fbe80636
commit 18a133abdc

View File

@@ -220,34 +220,41 @@ public class JObjectManager {
// TODO: check deletions, inserts // TODO: check deletions, inserts
try { try {
Collection<TxRecord.TxObjectRecord<?>> drained; Collection<TxRecord.TxObjectRecord<?>> drained;
while (!(drained = tx.drainNewWrites()).isEmpty()) { {
Log.trace("Commit iteration with " + drained.size() + " records"); boolean somethingChanged;
do {
somethingChanged = false;
for (var hook : _preCommitTxHooks) {
drained = tx.drainNewWrites();
Log.trace("Commit iteration with " + drained.size() + " records for hook " + hook.getClass());
drained.stream() drained.stream()
.map(TxRecord.TxObjectRecord::key) .map(TxRecord.TxObjectRecord::key)
.sorted(Comparator.comparing(JObjectKey::toString)) .sorted(Comparator.comparing(JObjectKey::toString))
.forEach(addDependency); .forEach(addDependency);
for (var hook : _preCommitTxHooks) { for (var entry : drained) {
for (var entry : drained) { somethingChanged = true;
Log.trace("Running pre-commit hook " + hook.getClass() + " for" + entry.toString()); Log.trace("Running pre-commit hook " + hook.getClass() + " for" + entry.toString());
var oldObj = getCurrent.apply(entry.key()); var oldObj = getCurrent.apply(entry.key());
var curObj = tx.get(JData.class, entry.key()).orElse(null); switch (entry) {
case TxRecord.TxObjectRecordWrite<?> write -> {
assert (curObj == null) == (entry instanceof TxRecord.TxObjectRecordDeleted); if (oldObj == null) {
hook.onCreate(write.key(), write.data());
if (curObj == null) { } else {
hook.onDelete(entry.key(), oldObj); hook.onChange(write.key(), oldObj, write.data());
} else if (oldObj == null) { }
hook.onCreate(entry.key(), curObj); }
} else { case TxRecord.TxObjectRecordDeleted deleted -> {
hook.onChange(entry.key(), oldObj, curObj); hook.onDelete(deleted.key(), oldObj);
}
default -> throw new IllegalStateException("Unexpected value: " + entry);
}
current.put(entry.key(), entry);
} }
current.put(entry.key(), entry);
} }
} } while (somethingChanged);
} }
reads = tx.reads(); reads = tx.reads();
for (var read : reads.entrySet()) { for (var read : reads.entrySet()) {
addDependency.accept(read.getKey()); addDependency.accept(read.getKey());