From da48691cb4f28fc5b1f4ce4eb1d557c1f752ad44 Mon Sep 17 00:00:00 2001 From: Robert Godfrey Date: Wed, 17 Oct 2007 19:42:14 +0000 Subject: QPID-645 : TxnBuffer should rethrow exceptions encountered on commit git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/branches/M2.1@585642 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/qpid/server/txn/TxnBuffer.java | 28 +++++++++++++++------- .../org/apache/qpid/server/txn/TxnBufferTest.java | 12 +++++++++- 2 files changed, 31 insertions(+), 9 deletions(-) (limited to 'java') diff --git a/java/broker/src/main/java/org/apache/qpid/server/txn/TxnBuffer.java b/java/broker/src/main/java/org/apache/qpid/server/txn/TxnBuffer.java index 405c233552..46a68b6a23 100644 --- a/java/broker/src/main/java/org/apache/qpid/server/txn/TxnBuffer.java +++ b/java/broker/src/main/java/org/apache/qpid/server/txn/TxnBuffer.java @@ -54,7 +54,7 @@ public class TxnBuffer _ops.clear(); } - private boolean prepare(StoreContext context) + private boolean prepare(StoreContext context) throws AMQException { for (int i = 0; i < _ops.size(); i++) { @@ -63,19 +63,31 @@ public class TxnBuffer { op.prepare(context); } - catch (Exception e) + catch (AMQException e) { - //compensate previously prepared ops - for (int j = 0; j < i; j++) - { - _ops.get(j).undoPrepare(); - } - return false; + undoPrepare(i); + throw e; + } + catch (RuntimeException e) + { + undoPrepare(i); + throw e; } } return true; } + private void undoPrepare(int lastPrepared) + { + //compensate previously prepared ops + for (int j = 0; j < lastPrepared; j++) + { + _ops.get(j).undoPrepare(); + } + } + + + public void rollback(StoreContext context) throws AMQException { for (TxnOp op : _ops) diff --git a/java/systests/src/main/java/org/apache/qpid/server/txn/TxnBufferTest.java b/java/systests/src/main/java/org/apache/qpid/server/txn/TxnBufferTest.java index 1d9e30c24e..025f8d89f6 100644 --- a/java/systests/src/main/java/org/apache/qpid/server/txn/TxnBufferTest.java +++ b/java/systests/src/main/java/org/apache/qpid/server/txn/TxnBufferTest.java @@ -27,6 +27,7 @@ import org.apache.qpid.server.store.TestableMemoryMessageStore; import org.apache.qpid.server.store.StoreContext; import java.util.LinkedList; +import java.util.NoSuchElementException; public class TxnBufferTest extends TestCase { @@ -78,7 +79,16 @@ public class TxnBufferTest extends TestCase buffer.enlist(new FailedPrepare()); buffer.enlist(new MockOp()); - buffer.commit(null); + try + { + buffer.commit(null); + + } + catch (NoSuchElementException e) + { + + } + validateOps(); store.validate(); } -- cgit v1.2.1