mirror of
https://github.com/usatiuk/dhfs.git
synced 2025-10-29 04:57:48 +01:00
Objects: simplify tx commit a little
This commit is contained in:
@@ -83,6 +83,7 @@ public class JObjectManager {
|
|||||||
writes.put(n.key(), n);
|
writes.put(n.key(), n);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Run hooks for all objects
|
// Run hooks for all objects
|
||||||
// Every hook should see every change made to every object, yet the object's evolution
|
// Every hook should see every change made to every object, yet the object's evolution
|
||||||
// should be consistent from the view point of each individual hook
|
// should be consistent from the view point of each individual hook
|
||||||
@@ -135,14 +136,14 @@ public class JObjectManager {
|
|||||||
lastCurHookSeen.put(n.key(), n);
|
lastCurHookSeen.put(n.key(), n);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
var before = hookPut.pendingWrites().put(n.key(), n);
|
var before = hookPut.pendingWrites().put(n.key(), n);
|
||||||
if (before == null)
|
if (before == null)
|
||||||
pendingCount++;
|
pendingCount++;
|
||||||
}
|
}
|
||||||
writes.put(n.key(), n);
|
writes.put(n.key(), n);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
for (var read : tx.reads().entrySet()) {
|
for (var read : tx.reads().entrySet()) {
|
||||||
if (read.getValue() instanceof TransactionObjectLocked<?> locked) {
|
if (read.getValue() instanceof TransactionObjectLocked<?> locked) {
|
||||||
@@ -164,11 +165,11 @@ public class JObjectManager {
|
|||||||
toLock.add(read.getKey());
|
toLock.add(read.getKey());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (var write : writes.entrySet()) {
|
for (var write : writes.keySet()) {
|
||||||
if (!readSet.containsKey(write.getKey()))
|
if (!readSet.containsKey(write))
|
||||||
toLock.add(write.getKey());
|
toLock.add(write);
|
||||||
}
|
}
|
||||||
Collections.sort(toLock);
|
toLock.sort(null);
|
||||||
for (var key : toLock) {
|
for (var key : toLock) {
|
||||||
var lock = lockManager.lockObject(key);
|
var lock = lockManager.lockObject(key);
|
||||||
toUnlock.add(lock);
|
toUnlock.add(lock);
|
||||||
@@ -192,14 +193,16 @@ public class JObjectManager {
|
|||||||
writebackObjectPersistentStore.asyncFence(finalVersion, r);
|
writebackObjectPersistentStore.asyncFence(finalVersion, r);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var onCommit = tx.getOnCommit();
|
||||||
|
var onFlush = tx.getOnFlush();
|
||||||
|
|
||||||
return Pair.of(
|
return Pair.of(
|
||||||
Stream.concat(
|
List.of(() -> {
|
||||||
tx.getOnCommit().stream(),
|
for (var f : onCommit)
|
||||||
Stream.<Runnable>of(() -> {
|
f.run();
|
||||||
for (var f : tx.getOnFlush())
|
for (var f : onFlush)
|
||||||
fenceFn.accept(f);
|
fenceFn.accept(f);
|
||||||
})
|
}),
|
||||||
).toList(),
|
|
||||||
new TransactionHandle() {
|
new TransactionHandle() {
|
||||||
@Override
|
@Override
|
||||||
public void onFlush(Runnable runnable) {
|
public void onFlush(Runnable runnable) {
|
||||||
@@ -221,7 +224,7 @@ public class JObjectManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (current.isEmpty()) {
|
if (current.isEmpty()) {
|
||||||
// TODO: Every write gets a dependency due to hooks
|
// Every write gets a dependency due to hooks
|
||||||
continue;
|
continue;
|
||||||
// assert false;
|
// assert false;
|
||||||
// throw new TxCommitException("Serialization hazard: " + dep.isEmpty() + " vs " + read.getValue().value().isEmpty());
|
// throw new TxCommitException("Serialization hazard: " + dep.isEmpty() + " vs " + read.getValue().value().isEmpty());
|
||||||
@@ -246,7 +249,7 @@ public class JObjectManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return Pair.of(
|
return Pair.of(
|
||||||
List.copyOf(tx.getOnCommit()),
|
tx.getOnCommit(),
|
||||||
new TransactionHandle() {
|
new TransactionHandle() {
|
||||||
@Override
|
@Override
|
||||||
public void onFlush(Runnable runnable) {
|
public void onFlush(Runnable runnable) {
|
||||||
|
|||||||
Reference in New Issue
Block a user