You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by ta...@apache.org on 2017/09/07 16:17:49 UTC

[13/14] activemq git commit: https://issues.apache.org/jira/browse/AMQ-6799 - IOExceptionHandler during the startup

https://issues.apache.org/jira/browse/AMQ-6799 - IOExceptionHandler during the startup

(cherry picked from commit c7291f1ecfefec7aad6fcf168e298e2ef0af8ed7)


Project: http://git-wip-us.apache.org/repos/asf/activemq/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq/commit/ccf8dbe2
Tree: http://git-wip-us.apache.org/repos/asf/activemq/tree/ccf8dbe2
Diff: http://git-wip-us.apache.org/repos/asf/activemq/diff/ccf8dbe2

Branch: refs/heads/activemq-5.15.x
Commit: ccf8dbe28be0961b571b6125c78758dd5fb2cad9
Parents: 0924f98
Author: Dejan Bosanac <de...@nighttale.net>
Authored: Thu Aug 24 14:04:28 2017 +0200
Committer: Timothy Bish <ta...@gmail.com>
Committed: Thu Sep 7 12:14:35 2017 -0400

----------------------------------------------------------------------
 .../util/DefaultIOExceptionHandler.java         |  6 ++-
 .../util/DefaultIOExceptionHandlerTest.java     |  5 +++
 .../store/jdbc/LeaseDatabaseLocker.java         |  2 +-
 .../jdbc/JDBCIOExceptionHandlerMockeryTest.java |  2 +
 .../store/jdbc/JDBCIOExceptionHandlerTest.java  | 43 ++++++++++++++++++++
 5 files changed, 55 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/activemq/blob/ccf8dbe2/activemq-broker/src/main/java/org/apache/activemq/util/DefaultIOExceptionHandler.java
----------------------------------------------------------------------
diff --git a/activemq-broker/src/main/java/org/apache/activemq/util/DefaultIOExceptionHandler.java b/activemq-broker/src/main/java/org/apache/activemq/util/DefaultIOExceptionHandler.java
index 7668364..022707d 100644
--- a/activemq-broker/src/main/java/org/apache/activemq/util/DefaultIOExceptionHandler.java
+++ b/activemq-broker/src/main/java/org/apache/activemq/util/DefaultIOExceptionHandler.java
@@ -51,7 +51,7 @@ import org.slf4j.LoggerFactory;
 
     @Override
     public void handle(IOException exception) {
-        if (ignoreAllErrors) {
+        if (!broker.isStarted() || ignoreAllErrors) {
             allowIOResumption();
             LOG.info("Ignoring IO exception, " + exception, exception);
             return;
@@ -167,7 +167,9 @@ import org.slf4j.LoggerFactory;
 
     protected void allowIOResumption() {
         try {
-            broker.getPersistenceAdapter().allowIOResumption();
+            if (broker.getPersistenceAdapter() != null) {
+                broker.getPersistenceAdapter().allowIOResumption();
+            }
         } catch (IOException e) {
             LOG.warn("Failed to allow IO resumption", e);
         }

http://git-wip-us.apache.org/repos/asf/activemq/blob/ccf8dbe2/activemq-broker/src/test/java/org/apache/activemq/util/DefaultIOExceptionHandlerTest.java
----------------------------------------------------------------------
diff --git a/activemq-broker/src/test/java/org/apache/activemq/util/DefaultIOExceptionHandlerTest.java b/activemq-broker/src/test/java/org/apache/activemq/util/DefaultIOExceptionHandlerTest.java
index ea46809..f8d1ee9 100644
--- a/activemq-broker/src/test/java/org/apache/activemq/util/DefaultIOExceptionHandlerTest.java
+++ b/activemq-broker/src/test/java/org/apache/activemq/util/DefaultIOExceptionHandlerTest.java
@@ -49,6 +49,11 @@ public class DefaultIOExceptionHandlerTest {
         underTest.setSystemExitOnShutdown(exitPlease);
         underTest.setBrokerService(new BrokerService() {
             @Override
+            public boolean isStarted() {
+                return true;
+            }
+
+            @Override
             public void stop() throws Exception {
                 shutdownOnExitSet.set(isSystemExitOnShutdown());
                 stopCalled.countDown();

http://git-wip-us.apache.org/repos/asf/activemq/blob/ccf8dbe2/activemq-jdbc-store/src/main/java/org/apache/activemq/store/jdbc/LeaseDatabaseLocker.java
----------------------------------------------------------------------
diff --git a/activemq-jdbc-store/src/main/java/org/apache/activemq/store/jdbc/LeaseDatabaseLocker.java b/activemq-jdbc-store/src/main/java/org/apache/activemq/store/jdbc/LeaseDatabaseLocker.java
index cbbc73d..f6e7f2a 100644
--- a/activemq-jdbc-store/src/main/java/org/apache/activemq/store/jdbc/LeaseDatabaseLocker.java
+++ b/activemq-jdbc-store/src/main/java/org/apache/activemq/store/jdbc/LeaseDatabaseLocker.java
@@ -91,7 +91,7 @@ public class LeaseDatabaseLocker extends AbstractJDBCLocker {
                                     + e, e);
                 }
                 if (handleStartException) {
-                    lockable.getBrokerService().handleIOException(IOExceptionSupport.create(e));
+                    throw e;
                 }
             } finally {
                 close(statement);

http://git-wip-us.apache.org/repos/asf/activemq/blob/ccf8dbe2/activemq-unit-tests/src/test/java/org/apache/activemq/store/jdbc/JDBCIOExceptionHandlerMockeryTest.java
----------------------------------------------------------------------
diff --git a/activemq-unit-tests/src/test/java/org/apache/activemq/store/jdbc/JDBCIOExceptionHandlerMockeryTest.java b/activemq-unit-tests/src/test/java/org/apache/activemq/store/jdbc/JDBCIOExceptionHandlerMockeryTest.java
index 8a7dc63..e7224b6 100644
--- a/activemq-unit-tests/src/test/java/org/apache/activemq/store/jdbc/JDBCIOExceptionHandlerMockeryTest.java
+++ b/activemq-unit-tests/src/test/java/org/apache/activemq/store/jdbc/JDBCIOExceptionHandlerMockeryTest.java
@@ -65,6 +65,8 @@ public class JDBCIOExceptionHandlerMockeryTest {
 
         // simulate jdbc up between hasLock and checkpoint, so hasLock fails to verify
         context.checking(new Expectations() {{
+            allowing(brokerService).isStarted();
+            will(returnValue(true));
             allowing(brokerService).isRestartAllowed();
             will(returnValue(false));
             allowing(brokerService).setSystemExitOnShutdown(with(false));

http://git-wip-us.apache.org/repos/asf/activemq/blob/ccf8dbe2/activemq-unit-tests/src/test/java/org/apache/activemq/store/jdbc/JDBCIOExceptionHandlerTest.java
----------------------------------------------------------------------
diff --git a/activemq-unit-tests/src/test/java/org/apache/activemq/store/jdbc/JDBCIOExceptionHandlerTest.java b/activemq-unit-tests/src/test/java/org/apache/activemq/store/jdbc/JDBCIOExceptionHandlerTest.java
index 5144182..a4bd832 100644
--- a/activemq-unit-tests/src/test/java/org/apache/activemq/store/jdbc/JDBCIOExceptionHandlerTest.java
+++ b/activemq-unit-tests/src/test/java/org/apache/activemq/store/jdbc/JDBCIOExceptionHandlerTest.java
@@ -28,6 +28,7 @@ import javax.jms.Connection;
 import org.apache.activemq.ActiveMQConnectionFactory;
 import org.apache.activemq.broker.BrokerService;
 import org.apache.activemq.broker.ft.SyncCreateDataSource;
+import org.apache.activemq.bugs.embedded.ThreadExplorer;
 import org.apache.activemq.util.IOHelper;
 import org.apache.activemq.util.LeaseLockerIOExceptionHandler;
 import org.apache.activemq.util.Wait;
@@ -101,6 +102,47 @@ public class JDBCIOExceptionHandlerTest {
         return broker;
     }
 
+    @Test
+    public void testStartWithDatabaseDown() throws Exception {
+        BrokerService broker = new BrokerService();
+
+        JDBCPersistenceAdapter jdbc = new JDBCPersistenceAdapter();
+        EmbeddedDataSource embeddedDataSource = (EmbeddedDataSource) jdbc.getDataSource();
+        // create a wrapper to EmbeddedDataSource to allow the connection be
+        // reestablished to derby db
+        dataSource = new ReconnectingEmbeddedDataSource(new SyncCreateDataSource(embeddedDataSource));
+        dataSource.stopDB();
+        jdbc.setDataSource(dataSource);
+
+        jdbc.setLockKeepAlivePeriod(1000l);
+        LeaseDatabaseLocker leaseDatabaseLocker = new LeaseDatabaseLocker();
+        leaseDatabaseLocker.setHandleStartException(true);
+        leaseDatabaseLocker.setLockAcquireSleepInterval(2000l);
+        jdbc.setLocker(leaseDatabaseLocker);
+
+        broker.setPersistenceAdapter(jdbc);
+        LeaseLockerIOExceptionHandler ioExceptionHandler = new LeaseLockerIOExceptionHandler();
+        ioExceptionHandler.setResumeCheckSleepPeriod(1000l);
+        ioExceptionHandler.setStopStartConnectors(true);
+        broker.setIoExceptionHandler(ioExceptionHandler);
+        try {
+            broker.start();
+            fail("Broker should have been stopped!");
+        } catch (Exception e) {
+            Thread.sleep(5000);
+            assertTrue("Broker should have been stopped!", broker.isStopped());
+            Thread[] threads = ThreadExplorer.listThreads();
+            for (int i = 0; i < threads.length; i++) {
+                if (threads[i].getName().startsWith("IOExceptionHandler")) {
+                    fail("IOExceptionHanlder still active");
+                }
+            }
+        } finally {
+            dataSource = null;
+            broker = null;
+        }
+    }
+
     /*
      * run test without JMX enabled
      */
@@ -223,6 +265,7 @@ public class JDBCIOExceptionHandlerTest {
         } finally {
             LOG.debug("*** broker is stopping...");
             broker.stop();
+            broker.waitUntilStopped();
         }
     }