From 16eb1d28d9d4ffd9442c79a9e3736c37e2b0ed35 Mon Sep 17 00:00:00 2001 From: Stepan Usatiuk Date: Fri, 21 Mar 2025 23:43:29 +0100 Subject: [PATCH] Objects: add a "never lock option" to avoid deadlocks --- .../objects/transaction/TransactionFactoryImpl.java | 11 +++++++++-- .../objects/src/main/resources/application.properties | 1 + 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/transaction/TransactionFactoryImpl.java b/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/transaction/TransactionFactoryImpl.java index 3aecbccf..7c498e6a 100644 --- a/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/transaction/TransactionFactoryImpl.java +++ b/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/transaction/TransactionFactoryImpl.java @@ -1,14 +1,16 @@ package com.usatiuk.dhfs.objects.transaction; -import com.usatiuk.dhfs.objects.*; +import com.usatiuk.dhfs.objects.JData; +import com.usatiuk.dhfs.objects.JDataVersionedWrapper; +import com.usatiuk.dhfs.objects.JObjectKey; import com.usatiuk.dhfs.objects.iterators.*; -import com.usatiuk.dhfs.objects.iterators.IteratorStart; import com.usatiuk.dhfs.objects.snapshot.Snapshot; import com.usatiuk.dhfs.objects.snapshot.SnapshotManager; import io.quarkus.logging.Log; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; import org.apache.commons.lang3.tuple.Pair; +import org.eclipse.microprofile.config.inject.ConfigProperty; import java.util.*; @@ -18,6 +20,8 @@ public class TransactionFactoryImpl implements TransactionFactory { SnapshotManager snapshotManager; @Inject LockManager lockManager; + @ConfigProperty(name = "dhfs.objects.transaction.never-lock") + boolean neverLock; @Override public TransactionPrivate createTransaction() { @@ -195,6 +199,9 @@ public class TransactionFactoryImpl implements TransactionFactory { } } + if (neverLock) + return getFromSource(type, key); + return switch (strategy) { case OPTIMISTIC -> getFromSource(type, key); case WRITE -> getWriteLockedFromSource(type, key); diff --git a/dhfs-parent/objects/src/main/resources/application.properties b/dhfs-parent/objects/src/main/resources/application.properties index 88d1761d..ce078310 100644 --- a/dhfs-parent/objects/src/main/resources/application.properties +++ b/dhfs-parent/objects/src/main/resources/application.properties @@ -6,5 +6,6 @@ dhfs.objects.lock_timeout_secs=15 dhfs.objects.persistence.files.root=${HOME}/dhfs_default/data/objs quarkus.package.jar.decompiler.enabled=true dhfs.objects.persistence.snapshot-extra-checks=false +dhfs.objects.transaction.never-lock=true quarkus.log.category."com.usatiuk.dhfs.objects.iterators".level=INFO quarkus.log.category."com.usatiuk.dhfs.objects.iterators".min-level=INFO