summaryrefslogtreecommitdiffstats
path: root/vespajlib
diff options
context:
space:
mode:
authorHarald Musum <musum@oath.com>2018-01-24 12:34:39 +0100
committerHarald Musum <musum@oath.com>2018-01-24 12:34:39 +0100
commit4fabd087beef62eb9e08eee3a65f23a14efc96b4 (patch)
treed5661f1ad247d21721fd4fb4245cea60da42a881 /vespajlib
parent3f77fca1c8d5aa495452e7f86457965058bf923e (diff)
Throw if commit() is called more than once
Diffstat (limited to 'vespajlib')
-rw-r--r--vespajlib/src/main/java/com/yahoo/transaction/NestedTransaction.java6
-rw-r--r--vespajlib/src/test/java/com/yahoo/transaction/NestedTransactionTestCase.java13
2 files changed, 19 insertions, 0 deletions
diff --git a/vespajlib/src/main/java/com/yahoo/transaction/NestedTransaction.java b/vespajlib/src/main/java/com/yahoo/transaction/NestedTransaction.java
index c860e9ead4f..af22cb77690 100644
--- a/vespajlib/src/main/java/com/yahoo/transaction/NestedTransaction.java
+++ b/vespajlib/src/main/java/com/yahoo/transaction/NestedTransaction.java
@@ -24,6 +24,9 @@ public final class NestedTransaction implements AutoCloseable {
/** A list of (non-transactional) operations to execute after this transaction has committed successfully */
private final List<Runnable> onCommitted = new ArrayList<>(2);
+ /** Updated when commit() is done, to be able to track if someone tries to commit a second time */
+ private boolean committed = false;
+
/**
* Adds a transaction to this.
*
@@ -45,6 +48,8 @@ public final class NestedTransaction implements AutoCloseable {
/** Perform a 2 phase commit */
public void commit() {
+ if (committed) throw new IllegalStateException("Transaction already committed");
+
List<Transaction> organizedTransactions = organizeTransactions(transactions);
// First phase
@@ -75,6 +80,7 @@ public final class NestedTransaction implements AutoCloseable {
log.log(Level.WARNING, "A committed task in " + this + " caused an exception", e);
}
}
+ committed = true;
}
public void onCommitted(Runnable runnable) {
diff --git a/vespajlib/src/test/java/com/yahoo/transaction/NestedTransactionTestCase.java b/vespajlib/src/test/java/com/yahoo/transaction/NestedTransactionTestCase.java
index 4feb0869aa0..60facf7e4af 100644
--- a/vespajlib/src/test/java/com/yahoo/transaction/NestedTransactionTestCase.java
+++ b/vespajlib/src/test/java/com/yahoo/transaction/NestedTransactionTestCase.java
@@ -91,6 +91,19 @@ public class NestedTransactionTestCase {
}
}
+ @Test
+ public void testMoreThanOneCommitThrows() {
+ NestedTransaction t = new NestedTransaction();
+ t.add(new TransactionTypeA("A1"), TransactionTypeB.class);
+ t.commit();
+ try {
+ t.commit();
+ fail("Expected exception");
+ }
+ catch (IllegalStateException expected) {
+ }
+ }
+
private static class TransactionTypeA extends MockTransaction {
public TransactionTypeA(String name) { super(name); }
}