QPID-8161:[Broekr-J] Rethrow LockTimeoutException on sequence generation as ConnectionScopedRuntimeException
This closes #102
diff --git a/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AbstractBDBMessageStore.java b/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AbstractBDBMessageStore.java
index 84e1190..a7df6a7 100644
--- a/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AbstractBDBMessageStore.java
+++ b/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AbstractBDBMessageStore.java
@@ -41,6 +41,7 @@
import com.sleepycat.je.DatabaseNotFoundException;
import com.sleepycat.je.LockConflictException;
import com.sleepycat.je.LockMode;
+import com.sleepycat.je.LockTimeoutException;
import com.sleepycat.je.OperationStatus;
import com.sleepycat.je.Sequence;
import com.sleepycat.je.SequenceConfig;
@@ -72,6 +73,7 @@
import org.apache.qpid.server.store.handler.MessageInstanceHandler;
import org.apache.qpid.server.txn.Xid;
import org.apache.qpid.server.util.CachingUUIDFactory;
+import org.apache.qpid.server.util.ConnectionScopedRuntimeException;
public abstract class AbstractBDBMessageStore implements MessageStore
@@ -231,6 +233,10 @@
MESSAGE_METADATA_SEQ_CONFIG);
newMessageId = mmdSeq.get(null, 1);
}
+ catch(LockTimeoutException le)
+ {
+ throw new ConnectionScopedRuntimeException("Unexpected exception on BDB sequence", le);
+ }
catch (RuntimeException de)
{
throw getEnvironmentFacade().handleDatabaseException("Cannot get sequence value for new message", de);
diff --git a/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStoreTest.java b/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStoreTest.java
index 8b03750..30c288e 100644
--- a/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStoreTest.java
+++ b/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStoreTest.java
@@ -22,19 +22,30 @@
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.junit.Assume.assumeThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
import java.io.File;
import java.util.Collections;
+import com.sleepycat.je.LockTimeoutException;
+import com.sleepycat.je.Sequence;
import org.junit.Test;
+import org.mockito.Mockito;
import org.apache.qpid.server.bytebuffer.QpidByteBuffer;
+import org.apache.qpid.server.message.internal.InternalMessageMetaData;
import org.apache.qpid.server.model.VirtualHost;
import org.apache.qpid.server.protocol.v0_8.AMQShortString;
import org.apache.qpid.server.protocol.v0_8.FieldTableFactory;
@@ -47,6 +58,7 @@
import org.apache.qpid.server.store.MessageStoreTestCase;
import org.apache.qpid.server.store.StoreException;
import org.apache.qpid.server.store.StoredMessage;
+import org.apache.qpid.server.util.ConnectionScopedRuntimeException;
import org.apache.qpid.server.util.FileUtils;
import org.apache.qpid.server.virtualhost.berkeleydb.BDBVirtualHost;
import org.apache.qpid.test.utils.VirtualHostNodeStoreType;
@@ -218,4 +230,25 @@
return true;
}
+ @Test
+ public void testGetNextMessgaeIdWithLockException(){
+ EnvironmentFacadeFactory eff = mock(EnvironmentFacadeFactory.class);
+ EnvironmentFacade ef = mock(EnvironmentFacade.class);
+ doThrow(LockTimeoutException.class).when(ef).openSequence(any(),any(),any());
+ when(((EnvironmentFacadeFactory) eff).createEnvironmentFacade(any())).thenReturn(ef);
+
+ BDBMessageStore store = new BDBMessageStore (eff);
+ store.openMessageStore(getVirtualHost());
+
+ try
+ {
+ store.addMessage(new InternalMessageMetaData(false, null, 0));
+ fail("exception is expected");
+ }
+ catch(ConnectionScopedRuntimeException e)
+ {
+ assertEquals("Unexpected exception on BDB sequence",e.getMessage());
+ }
+
+ }
}