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());
+        }
+
+    }
 }