You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by or...@apache.org on 2013/04/29 16:44:11 UTC

svn commit: r1477110 - in /qpid/trunk/qpid/java: bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/ bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/ broker/src/main/java/org/apache/qpid/server/model/adapter/ broker/src/main/...

Author: orudyy
Date: Mon Apr 29 14:44:11 2013
New Revision: 1477110

URL: http://svn.apache.org/r1477110
Log:
QPID-4639: Improve functionality to delete store on virtual host deletion

Added:
    qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/store/MessageStoreTestCase.java
    qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/store/derby/DerbyMessageStoreTest.java
    qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/store/jdbc/
    qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/store/jdbc/JDBCMessageStoreTest.java
Modified:
    qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AbstractBDBMessageStore.java
    qpid/trunk/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStoreTest.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/VirtualHostAdapter.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/store/AbstractJDBCMessageStore.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/store/MessageStore.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/store/NullMessageStore.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/store/derby/DerbyMessageStore.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/store/jdbc/JDBCMessageStore.java
    qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/server/store/SlowMessageStore.java

Modified: qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AbstractBDBMessageStore.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AbstractBDBMessageStore.java?rev=1477110&r1=1477109&r2=1477110&view=diff
==============================================================================
--- qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AbstractBDBMessageStore.java (original)
+++ qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AbstractBDBMessageStore.java Mon Apr 29 14:44:11 2013
@@ -73,6 +73,7 @@ import org.apache.qpid.server.store.berk
 import org.apache.qpid.server.store.berkeleydb.tuple.UUIDTupleBinding;
 import org.apache.qpid.server.store.berkeleydb.tuple.XidBinding;
 import org.apache.qpid.server.store.berkeleydb.upgrade.Upgrader;
+import org.apache.qpid.util.FileUtils;
 
 public abstract class AbstractBDBMessageStore implements MessageStore
 {
@@ -1801,4 +1802,25 @@ public abstract class AbstractBDBMessage
                          + event.getThreadName() + "'", event.getException());
         }
     }
+
+    @Override
+    public void onDelete()
+    {
+        if (LOGGER.isDebugEnabled())
+        {
+            LOGGER.debug("Deleting store " + _storeLocation);
+        }
+
+        if (_storeLocation != null)
+        {
+            File location = new File(_storeLocation);
+            if (location.exists())
+            {
+                if (!FileUtils.delete(location, true))
+                {
+                    LOGGER.error("Cannot delete " + _storeLocation);
+                }
+            }
+        }
+    }
 }

Modified: qpid/trunk/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStoreTest.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStoreTest.java?rev=1477110&r1=1477109&r2=1477110&view=diff
==============================================================================
--- qpid/trunk/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStoreTest.java (original)
+++ qpid/trunk/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStoreTest.java Mon Apr 29 14:44:11 2013
@@ -20,6 +20,7 @@
  */
 package org.apache.qpid.server.store.berkeleydb;
 
+import java.io.File;
 import java.nio.ByteBuffer;
 import java.util.Arrays;
 import java.util.List;
@@ -474,6 +475,22 @@ public class BDBMessageStoreTest extends
         assertEquals("Second Message is incorrect", 23L, val.longValue());
     }
 
+    public void testOnDelete() throws Exception
+    {
+        MessageStore log = getVirtualHost().getMessageStore();
+        AbstractBDBMessageStore bdbStore = assertBDBStore(log);
+        String storeLocation = bdbStore.getStoreLocation();
+
+        File location = new File(storeLocation);
+        assertTrue("Store does not exist at " + storeLocation, location.exists());
+
+        bdbStore.close();
+        assertTrue("Store does not exist at " + storeLocation, location.exists());
+
+        bdbStore.onDelete();
+        assertFalse("Store exists at " + storeLocation, location.exists());
+    }
+
     /**
      * Tests transaction rollback after a commit has occurred by utilising the
      * enqueue and dequeue methods available in the TransactionLog interface

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/VirtualHostAdapter.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/VirtualHostAdapter.java?rev=1477110&r1=1477109&r2=1477110&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/VirtualHostAdapter.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/VirtualHostAdapter.java Mon Apr 29 14:44:11 2013
@@ -80,13 +80,11 @@ import org.apache.qpid.server.txn.Server
 import org.apache.qpid.server.util.MapValueConverter;
 import org.apache.qpid.server.virtualhost.VirtualHostImpl;
 import org.apache.qpid.server.virtualhost.VirtualHostRegistry;
-import org.apache.qpid.util.FileUtils;
 
 public final class VirtualHostAdapter extends AbstractAdapter implements VirtualHost, ExchangeRegistry.RegistryChangeListener,
                                                                   QueueRegistry.RegistryChangeListener,
                                                                   IConnectionRegistry.RegistryChangeListener
 {
-
     private static final Logger LOGGER = Logger.getLogger(VirtualHostAdapter.class);
 
     @SuppressWarnings("serial")
@@ -1004,24 +1002,21 @@ public final class VirtualHostAdapter ex
             {
                 throw new IntegrityViolationException("Cannot delete default virtual host '" + hostName + "'");
             }
-            String storePath = (String)getAttribute(STORE_PATH);
             if (_virtualHost != null && _virtualHost.getState() == org.apache.qpid.server.virtualhost.State.ACTIVE)
             {
                 setDesiredState(currentState, State.STOPPED);
             }
+            MessageStore ms = _virtualHost.getMessageStore();
             _virtualHost = null;
-            setAttribute(VirtualHost.STATE, getActualState(), State.DELETED);
-            if (storePath != null)
+            try
             {
-                if (LOGGER.isDebugEnabled())
-                {
-                    LOGGER.debug("Deleting store at " + storePath);
-                }
-                if (!FileUtils.delete(new File(storePath), true))
-                {
-                    LOGGER.warn("Cannot delete  " + storePath);
-                }
+                ms.onDelete();
             }
+            catch(Exception e)
+            {
+                LOGGER.warn("Exception occured on store deletion", e);
+            }
+            setAttribute(VirtualHost.STATE, getActualState(), State.DELETED);
             return true;
         }
         return false;

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/store/AbstractJDBCMessageStore.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/store/AbstractJDBCMessageStore.java?rev=1477110&r1=1477109&r2=1477110&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/store/AbstractJDBCMessageStore.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/store/AbstractJDBCMessageStore.java Mon Apr 29 14:44:11 2013
@@ -72,6 +72,9 @@ abstract public class AbstractJDBCMessag
 
     private static final String CONFIGURED_OBJECTS_TABLE_NAME = "QPID_CONFIGURED_OBJECTS";
 
+    public static String[] ALL_TABLES = new String[] { DB_VERSION_TABLE_NAME, LINKS_TABLE_NAME, BRIDGES_TABLE_NAME, XID_ACTIONS_TABLE_NAME,
+        XID_TABLE_NAME, QUEUE_ENTRY_TABLE_NAME, MESSAGE_CONTENT_TABLE_NAME, META_DATA_TABLE_NAME, CONFIGURED_OBJECTS_TABLE_NAME };
+
     private static final int DB_VERSION = 6;
 
     private final AtomicLong _messageId = new AtomicLong(0);
@@ -167,6 +170,7 @@ abstract public class AbstractJDBCMessag
 
     private ConfiguredObjectHelper _configuredObjectHelper = new ConfiguredObjectHelper();
 
+
     @Override
     public void configureConfigStore(String name,
                           ConfigurationRecoveryHandler configRecoveryHandler,
@@ -2037,4 +2041,37 @@ abstract public class AbstractJDBCMessag
 
     protected abstract void storedSizeChange(int storeSizeIncrease);
 
+
+    @Override
+    public void onDelete()
+    {
+        try
+        {
+            Connection conn = newAutoCommitConnection();
+            try
+            {
+                for (String tableName : ALL_TABLES)
+                {
+                    Statement stmt = conn.createStatement();
+                    try
+                    {
+                        stmt.execute("DROP TABLE " +  tableName);
+                    }
+                    finally
+                    {
+                        stmt.close();
+                    }
+                }
+            }
+            finally
+            {
+                conn.close();
+            }
+        }
+        catch(SQLException e)
+        {
+            getLogger().error("Exception while deleting store tables", e);
+        }
+    }
+
 }

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/store/MessageStore.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/store/MessageStore.java?rev=1477110&r1=1477109&r2=1477110&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/store/MessageStore.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/store/MessageStore.java Mon Apr 29 14:44:11 2013
@@ -69,4 +69,6 @@ public interface MessageStore extends Du
     String getStoreLocation();
 
     String getStoreType();
+
+    void onDelete();
 }

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/store/NullMessageStore.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/store/NullMessageStore.java?rev=1477110&r1=1477109&r2=1477110&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/store/NullMessageStore.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/store/NullMessageStore.java Mon Apr 29 14:44:11 2013
@@ -121,4 +121,8 @@ public abstract class NullMessageStore i
         return null;
     }
 
+    @Override
+    public void onDelete()
+    {
+    }
 }
\ No newline at end of file

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/store/derby/DerbyMessageStore.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/store/derby/DerbyMessageStore.java?rev=1477110&r1=1477109&r2=1477110&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/store/derby/DerbyMessageStore.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/store/derby/DerbyMessageStore.java Mon Apr 29 14:44:11 2013
@@ -39,6 +39,7 @@ import org.apache.qpid.server.store.Even
 import org.apache.qpid.server.store.EventListener;
 import org.apache.qpid.server.store.MessageStore;
 import org.apache.qpid.server.store.MessageStoreConstants;
+import org.apache.qpid.util.FileUtils;
 
 /**
  * An implementation of a {@link MessageStore} that uses Apache Derby as the persistence
@@ -56,7 +57,7 @@ public class DerbyMessageStore extends A
 
     private static final String TABLE_EXISTANCE_QUERY = "SELECT 1 FROM SYS.SYSTABLES WHERE TABLENAME = ?";
 
-    private static final String DERBY_SINGLE_DB_SHUTDOWN_CODE = "08006";
+    public static final String DERBY_SINGLE_DB_SHUTDOWN_CODE = "08006";
 
     public static final String TYPE = "DERBY";
 
@@ -418,4 +419,29 @@ public class DerbyMessageStore extends A
         return TYPE;
     }
 
+    @Override
+    public void onDelete()
+    {
+        if (_logger.isDebugEnabled())
+        {
+            _logger.debug("Deleting store " + _storeLocation);
+        }
+
+        if (MEMORY_STORE_LOCATION.equals(_storeLocation))
+        {
+            return;
+        }
+
+        if (_storeLocation != null)
+        {
+            File location = new File(_storeLocation);
+            if (location.exists())
+            {
+                if (!FileUtils.delete(location, true))
+                {
+                    _logger.error("Cannot delete " + _storeLocation);
+                }
+            }
+        }
+    }
 }

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/store/jdbc/JDBCMessageStore.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/store/jdbc/JDBCMessageStore.java?rev=1477110&r1=1477109&r2=1477110&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/store/jdbc/JDBCMessageStore.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/store/jdbc/JDBCMessageStore.java Mon Apr 29 14:44:11 2013
@@ -24,7 +24,6 @@ package org.apache.qpid.server.store.jdb
 import java.sql.Blob;
 import java.sql.ResultSet;
 import java.sql.SQLException;
-import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;

Added: qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/store/MessageStoreTestCase.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/store/MessageStoreTestCase.java?rev=1477110&view=auto
==============================================================================
--- qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/store/MessageStoreTestCase.java (added)
+++ qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/store/MessageStoreTestCase.java Mon Apr 29 14:44:11 2013
@@ -0,0 +1,93 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store;
+
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.isA;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import org.apache.commons.configuration.Configuration;
+import org.apache.commons.configuration.PropertiesConfiguration;
+import org.apache.qpid.server.store.ConfigurationRecoveryHandler.BindingRecoveryHandler;
+import org.apache.qpid.server.store.ConfigurationRecoveryHandler.ExchangeRecoveryHandler;
+import org.apache.qpid.server.store.ConfigurationRecoveryHandler.QueueRecoveryHandler;
+import org.apache.qpid.server.store.MessageStoreRecoveryHandler.StoredMessageRecoveryHandler;
+import org.apache.qpid.test.utils.QpidTestCase;
+
+public abstract class MessageStoreTestCase extends QpidTestCase
+{
+    private ConfigurationRecoveryHandler _recoveryHandler;
+    private QueueRecoveryHandler _queueRecoveryHandler;
+    private ExchangeRecoveryHandler _exchangeRecoveryHandler;
+    private BindingRecoveryHandler _bindingRecoveryHandler;
+    private MessageStoreRecoveryHandler _messageStoreRecoveryHandler;
+    private StoredMessageRecoveryHandler _storedMessageRecoveryHandler;
+    private TransactionLogRecoveryHandler _logRecoveryHandler;
+    private TransactionLogRecoveryHandler.QueueEntryRecoveryHandler _queueEntryRecoveryHandler;
+    private TransactionLogRecoveryHandler.DtxRecordRecoveryHandler _dtxRecordRecoveryHandler;
+
+    private MessageStore _store;
+    private Configuration _storeConfiguration;
+
+    public void setUp() throws Exception
+    {
+        super.setUp();
+
+        _recoveryHandler = mock(ConfigurationRecoveryHandler.class);
+        _queueRecoveryHandler = mock(QueueRecoveryHandler.class);
+        _exchangeRecoveryHandler = mock(ExchangeRecoveryHandler.class);
+        _bindingRecoveryHandler = mock(BindingRecoveryHandler.class);
+        _storedMessageRecoveryHandler = mock(StoredMessageRecoveryHandler.class);
+        _logRecoveryHandler = mock(TransactionLogRecoveryHandler.class);
+        _messageStoreRecoveryHandler = mock(MessageStoreRecoveryHandler.class);
+        _queueEntryRecoveryHandler = mock(TransactionLogRecoveryHandler.QueueEntryRecoveryHandler.class);
+        _dtxRecordRecoveryHandler = mock(TransactionLogRecoveryHandler.DtxRecordRecoveryHandler.class);
+
+        when(_messageStoreRecoveryHandler.begin()).thenReturn(_storedMessageRecoveryHandler);
+        when(_recoveryHandler.begin(isA(MessageStore.class))).thenReturn(_exchangeRecoveryHandler);
+        when(_exchangeRecoveryHandler.completeExchangeRecovery()).thenReturn(_queueRecoveryHandler);
+        when(_queueRecoveryHandler.completeQueueRecovery()).thenReturn(_bindingRecoveryHandler);
+        when(_logRecoveryHandler.begin(any(MessageStore.class))).thenReturn(_queueEntryRecoveryHandler);
+        when(_queueEntryRecoveryHandler.completeQueueEntryRecovery()).thenReturn(_dtxRecordRecoveryHandler);
+
+        _storeConfiguration = new PropertiesConfiguration();
+        setUpStoreConfiguration(_storeConfiguration);
+
+        _store = createMessageStore();
+        _store.configureConfigStore(getTestName(), _recoveryHandler, _storeConfiguration);
+        _store.configureMessageStore(getTestName(), _messageStoreRecoveryHandler, _logRecoveryHandler, _storeConfiguration);
+    }
+
+    protected abstract void setUpStoreConfiguration(Configuration storeConfiguration) throws Exception;
+
+    protected abstract MessageStore createMessageStore();
+
+    public MessageStore getStore()
+    {
+        return _store;
+    }
+
+    public Configuration getStoreConfiguration()
+    {
+        return _storeConfiguration;
+    }
+}

Added: qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/store/derby/DerbyMessageStoreTest.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/store/derby/DerbyMessageStoreTest.java?rev=1477110&view=auto
==============================================================================
--- qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/store/derby/DerbyMessageStoreTest.java (added)
+++ qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/store/derby/DerbyMessageStoreTest.java Mon Apr 29 14:44:11 2013
@@ -0,0 +1,82 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store.derby;
+
+import java.io.File;
+
+import org.apache.commons.configuration.Configuration;
+import org.apache.qpid.server.store.MessageStore;
+import org.apache.qpid.server.store.MessageStoreTestCase;
+import org.apache.qpid.util.FileUtils;
+
+public class DerbyMessageStoreTest extends MessageStoreTestCase
+{
+    private String _storeLocation;
+
+    @Override
+    public void tearDown() throws Exception
+    {
+        try
+        {
+            deleteStoreIfExists();
+        }
+        finally
+        {
+            super.tearDown();
+        }
+    }
+
+    public void testOnDelete() throws Exception
+    {
+        File location = new File(_storeLocation);
+        assertTrue("Store does not exist at " + _storeLocation, location.exists());
+
+        getStore().close();
+        assertTrue("Store does not exist at " + _storeLocation, location.exists());
+
+        getStore().onDelete();
+        assertFalse("Store exists at " + _storeLocation, location.exists());
+    }
+
+    @Override
+    protected void setUpStoreConfiguration(Configuration storeConfiguration) throws Exception
+    {
+        _storeLocation = TMP_FOLDER + File.separator + getTestName();
+        storeConfiguration.setProperty("environment-path", _storeLocation);
+        deleteStoreIfExists();
+    }
+
+    private void deleteStoreIfExists()
+    {
+        File location = new File(_storeLocation);
+        if (location.exists())
+        {
+            FileUtils.delete(location, true);
+        }
+    }
+
+    @Override
+    protected MessageStore createMessageStore()
+    {
+        return new DerbyMessageStore();
+    }
+
+}

Added: qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/store/jdbc/JDBCMessageStoreTest.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/store/jdbc/JDBCMessageStoreTest.java?rev=1477110&view=auto
==============================================================================
--- qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/store/jdbc/JDBCMessageStoreTest.java (added)
+++ qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/store/jdbc/JDBCMessageStoreTest.java Mon Apr 29 14:44:11 2013
@@ -0,0 +1,149 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store.jdbc;
+
+import java.sql.Connection;
+import java.sql.DatabaseMetaData;
+import java.sql.DriverManager;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.commons.configuration.Configuration;
+import org.apache.qpid.server.store.MessageStore;
+import org.apache.qpid.server.store.MessageStoreTestCase;
+import org.apache.qpid.server.store.derby.DerbyMessageStore;
+
+public class JDBCMessageStoreTest extends MessageStoreTestCase
+{
+    private String _connectionURL;
+
+    @Override
+    public void tearDown() throws Exception
+    {
+        try
+        {
+            shutdownDerby();
+        }
+        finally
+        {
+            super.tearDown();
+        }
+    }
+
+    public void testOnDelete() throws Exception
+    {
+        String[] expectedTables = JDBCMessageStore.ALL_TABLES;
+        assertTablesExist(expectedTables, true);
+        getStore().close();
+        assertTablesExist(expectedTables, true);
+        getStore().onDelete();
+        assertTablesExist(expectedTables, false);
+    }
+
+    @Override
+    protected void setUpStoreConfiguration(Configuration storeConfiguration) throws Exception
+    {
+        _connectionURL = "jdbc:derby:memory:/" + getTestName() + ";create=true";
+        storeConfiguration.addProperty("connectionUrl", _connectionURL);
+    }
+
+    @Override
+    protected MessageStore createMessageStore()
+    {
+        return new JDBCMessageStore();
+    }
+
+    private void assertTablesExist(String[] expectedTables, boolean exists) throws SQLException
+    {
+        Set<String> existingTables = getTableNames();
+        for (String tableName : expectedTables)
+        {
+            assertEquals("Table " + tableName + (exists ? " is not found" : " actually exist"), exists,
+                    existingTables.contains(tableName));
+        }
+    }
+
+    private Set<String> getTableNames() throws SQLException
+    {
+        Set<String> tableNames = new HashSet<String>();
+        Connection conn = null;
+        try
+        {
+            conn = openConnection();
+            DatabaseMetaData metaData = conn.getMetaData();
+            ResultSet tables = metaData.getTables(null, null, null, new String[] { "TABLE" });
+            try
+            {
+                while (tables.next())
+                {
+                    tableNames.add(tables.getString("TABLE_NAME"));
+                }
+            }
+            finally
+            {
+                tables.close();
+            }
+        }
+        finally
+        {
+            if (conn != null)
+            {
+                conn.close();
+            }
+        }
+        return tableNames;
+    }
+
+    private Connection openConnection() throws SQLException
+    {
+        return DriverManager.getConnection(_connectionURL);
+    }
+
+
+    private void shutdownDerby() throws SQLException
+    {
+        Connection connection = null;
+        try
+        {
+            connection = DriverManager.getConnection("jdbc:derby:memory:/" + getTestName() + ";shutdown=true");
+        }
+        catch(SQLException e)
+        {
+            if (e.getSQLState().equalsIgnoreCase(DerbyMessageStore.DERBY_SINGLE_DB_SHUTDOWN_CODE))
+            {
+                //expected and represents a clean shutdown of this database only, do nothing.
+            }
+            else
+            {
+                throw e;
+            }
+        }
+        finally
+        {
+            if (connection != null)
+            {
+                connection.close();
+            }
+        }
+    }
+}

Modified: qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/server/store/SlowMessageStore.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/server/store/SlowMessageStore.java?rev=1477110&r1=1477109&r2=1477110&view=diff
==============================================================================
--- qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/server/store/SlowMessageStore.java (original)
+++ qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/server/store/SlowMessageStore.java Mon Apr 29 14:44:11 2013
@@ -344,4 +344,10 @@ public class SlowMessageStore implements
         return "SLOW";
     }
 
+    @Override
+    public void onDelete()
+    {
+        _realStore.onDelete();
+    }
+
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org