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 e005b9e1..bc357b0a 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 @@ -324,5 +324,11 @@ public class JObjectManager { } public void rollback(TransactionPrivate tx) { + Log.trace("Rolling back transaction " + tx.getId()); + tx.reads().forEach((key, value) -> { + if (value instanceof TransactionObjectLocked locked) { + locked.lock.close(); + } + }); } } \ No newline at end of file diff --git a/dhfs-parent/server/src/main/java/com/usatiuk/dhfs/files/service/DhfsFileServiceImpl.java b/dhfs-parent/server/src/main/java/com/usatiuk/dhfs/files/service/DhfsFileServiceImpl.java index 42336a25..a169453e 100644 --- a/dhfs-parent/server/src/main/java/com/usatiuk/dhfs/files/service/DhfsFileServiceImpl.java +++ b/dhfs-parent/server/src/main/java/com/usatiuk/dhfs/files/service/DhfsFileServiceImpl.java @@ -10,6 +10,7 @@ import com.usatiuk.dhfs.objects.jkleppmanntree.structs.JKleppmannTreeNode; import com.usatiuk.dhfs.objects.jkleppmanntree.structs.JKleppmannTreeNodeMeta; import com.usatiuk.dhfs.objects.jkleppmanntree.structs.JKleppmannTreeNodeMetaDirectory; import com.usatiuk.dhfs.objects.jkleppmanntree.structs.JKleppmannTreeNodeMetaFile; +import com.usatiuk.dhfs.objects.transaction.LockingStrategy; import com.usatiuk.dhfs.objects.transaction.Transaction; import com.usatiuk.dhfs.utils.StatusRuntimeExceptionNoStacktrace; import com.usatiuk.objects.common.runtime.JData; @@ -354,7 +355,7 @@ public class DhfsFileServiceImpl implements DhfsFileService { throw new StatusRuntimeException(Status.INVALID_ARGUMENT.withDescription("Offset should be more than zero: " + offset)); // FIXME: - var file = curTx.get(File.class, fileUuid).orElse(null); + var file = curTx.get(File.class, fileUuid, LockingStrategy.WRITE).orElse(null); if (file == null) { Log.error("File not found when trying to write: " + fileUuid); return -1L; diff --git a/dhfs-parent/server/src/main/java/com/usatiuk/dhfs/objects/jkleppmanntree/JKleppmannTreeManager.java b/dhfs-parent/server/src/main/java/com/usatiuk/dhfs/objects/jkleppmanntree/JKleppmannTreeManager.java index c3cf95ee..35a74978 100644 --- a/dhfs-parent/server/src/main/java/com/usatiuk/dhfs/objects/jkleppmanntree/JKleppmannTreeManager.java +++ b/dhfs-parent/server/src/main/java/com/usatiuk/dhfs/objects/jkleppmanntree/JKleppmannTreeManager.java @@ -5,6 +5,7 @@ import com.usatiuk.dhfs.objects.jkleppmanntree.structs.JKleppmannTreeNode; import com.usatiuk.dhfs.objects.jkleppmanntree.structs.JKleppmannTreeNodeMeta; import com.usatiuk.dhfs.objects.jkleppmanntree.structs.JKleppmannTreeNodeMetaDirectory; import com.usatiuk.dhfs.objects.jkleppmanntree.structs.JKleppmannTreePersistentData; +import com.usatiuk.dhfs.objects.transaction.LockingStrategy; import com.usatiuk.dhfs.objects.transaction.Transaction; import com.usatiuk.kleppmanntree.*; import com.usatiuk.objects.common.runtime.JObjectKey; @@ -32,7 +33,7 @@ public class JKleppmannTreeManager { public JKleppmannTree getTree(JObjectKey name) { return txManager.executeTx(() -> { - var data = curTx.get(JKleppmannTreePersistentData.class, name).orElse(null); + var data = curTx.get(JKleppmannTreePersistentData.class, name, LockingStrategy.WRITE).orElse(null); if (data == null) { data = new JKleppmannTreePersistentData( name, diff --git a/dhfs-parent/utils/src/main/java/com/usatiuk/dhfs/utils/DataLocker.java b/dhfs-parent/utils/src/main/java/com/usatiuk/dhfs/utils/DataLocker.java index 35e882da..8a8fb89f 100644 --- a/dhfs-parent/utils/src/main/java/com/usatiuk/dhfs/utils/DataLocker.java +++ b/dhfs-parent/utils/src/main/java/com/usatiuk/dhfs/utils/DataLocker.java @@ -32,7 +32,9 @@ public class DataLocker { public void close() { synchronized (_tag) { _tag.released = true; - _tag.notify(); + // Notify all because when the object is locked again, + // it's a different lock tag + _tag.notifyAll(); _locks.remove(_key, _tag); } }