diff --git a/core/src/main/java/com/scalar/db/common/ActiveTransactionManagedDistributedTransactionManager.java b/core/src/main/java/com/scalar/db/common/ActiveTransactionManagedDistributedTransactionManager.java index df6e2341b1..eb8761c00b 100644 --- a/core/src/main/java/com/scalar/db/common/ActiveTransactionManagedDistributedTransactionManager.java +++ b/core/src/main/java/com/scalar/db/common/ActiveTransactionManagedDistributedTransactionManager.java @@ -19,6 +19,8 @@ import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.util.List; import java.util.Optional; +import java.util.concurrent.atomic.AtomicReference; +import java.util.function.BiConsumer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -32,6 +34,17 @@ public abstract class ActiveTransactionManagedDistributedTransactionManager private final ActiveExpiringMap activeTransactions; + private final AtomicReference> + transactionExpirationHandler = + new AtomicReference<>( + (id, t) -> { + try { + t.rollback(); + } catch (Exception e) { + logger.warn("Rollback failed. transaction ID: {}", id, e); + } + }); + public ActiveTransactionManagedDistributedTransactionManager(DatabaseConfig config) { super(config); activeTransactions = @@ -40,14 +53,14 @@ public ActiveTransactionManagedDistributedTransactionManager(DatabaseConfig conf TRANSACTION_EXPIRATION_INTERVAL_MILLIS, (id, t) -> { logger.warn("The transaction is expired. transaction ID: {}", id); - try { - t.rollback(); - } catch (Exception e) { - logger.warn("Rollback failed. transaction ID: {}", id, e); - } + transactionExpirationHandler.get().accept(id, t); }); } + public void setTransactionExpirationHandler(BiConsumer handler) { + transactionExpirationHandler.set(handler); + } + private void add(ActiveTransaction transaction) throws TransactionException { if (activeTransactions.putIfAbsent(transaction.getId(), transaction).isPresent()) { transaction.rollback(); diff --git a/core/src/main/java/com/scalar/db/common/ActiveTransactionManagedTwoPhaseCommitTransactionManager.java b/core/src/main/java/com/scalar/db/common/ActiveTransactionManagedTwoPhaseCommitTransactionManager.java index e216e9a502..075e590f48 100644 --- a/core/src/main/java/com/scalar/db/common/ActiveTransactionManagedTwoPhaseCommitTransactionManager.java +++ b/core/src/main/java/com/scalar/db/common/ActiveTransactionManagedTwoPhaseCommitTransactionManager.java @@ -21,6 +21,8 @@ import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.util.List; import java.util.Optional; +import java.util.concurrent.atomic.AtomicReference; +import java.util.function.BiConsumer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -34,6 +36,17 @@ public abstract class ActiveTransactionManagedTwoPhaseCommitTransactionManager private final ActiveExpiringMap activeTransactions; + private final AtomicReference> + transactionExpirationHandler = + new AtomicReference<>( + (id, t) -> { + try { + t.rollback(); + } catch (Exception e) { + logger.warn("Rollback failed. transaction ID: {}", id, e); + } + }); + public ActiveTransactionManagedTwoPhaseCommitTransactionManager(DatabaseConfig config) { super(config); activeTransactions = @@ -42,14 +55,15 @@ public ActiveTransactionManagedTwoPhaseCommitTransactionManager(DatabaseConfig c TRANSACTION_EXPIRATION_INTERVAL_MILLIS, (id, t) -> { logger.warn("The transaction is expired. transaction ID: {}", id); - try { - t.rollback(); - } catch (Exception e) { - logger.warn("Rollback failed. transaction ID: {}", id, e); - } + transactionExpirationHandler.get().accept(id, t); }); } + public void setTransactionExpirationHandler( + BiConsumer handler) { + transactionExpirationHandler.set(handler); + } + private void add(ActiveTransaction transaction) throws TransactionException { if (activeTransactions.putIfAbsent(transaction.getId(), transaction).isPresent()) { transaction.rollback();