mirror of
https://github.com/usatiuk/dhfs.git
synced 2025-10-29 04:57:48 +01:00
more sensible hook order
This commit is contained in:
@@ -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());
|
||||||
|
|||||||
Reference in New Issue
Block a user