This is an automated email from the ASF dual-hosted git repository.

clebertsuconic pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/activemq-artemis.git


The following commit(s) were added to refs/heads/main by this push:
     new ba02fcc  ARTEMIS-3664 Critical Analyzer should not HALT or STOP the 
broker during the startup
ba02fcc is described below

commit ba02fccb77539f8642aa5d09511cda2fc998542e
Author: Clebert Suconic <[email protected]>
AuthorDate: Mon Jan 31 11:59:11 2022 -0500

    ARTEMIS-3664 Critical Analyzer should not HALT or STOP the broker during 
the startup
---
 .../utils/critical/CriticalAnalyzerImpl.java       |  2 +-
 .../utils/critical/CriticalAnalyzerAccessor.java   | 26 +++++++
 .../artemis/core/server/ActiveMQServerLogger.java  |  4 ++
 .../core/server/impl/ActiveMQServerImpl.java       | 80 +++++++++++++---------
 .../server/impl/ActiveMQServerImplAccessor.java    | 27 ++++++++
 .../server/impl/ActiveMQServerStartupTest.java     | 70 +++++++++++++++++++
 6 files changed, 177 insertions(+), 32 deletions(-)

diff --git 
a/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/critical/CriticalAnalyzerImpl.java
 
b/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/critical/CriticalAnalyzerImpl.java
index ecb5439..528d15f 100644
--- 
a/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/critical/CriticalAnalyzerImpl.java
+++ 
b/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/critical/CriticalAnalyzerImpl.java
@@ -149,7 +149,7 @@ public class CriticalAnalyzerImpl implements 
CriticalAnalyzer {
       }
    }
 
-   private void fireActions(CriticalComponent component) {
+   protected void fireActions(CriticalComponent component) {
       for (CriticalAction action : actions) {
          try {
             action.run(component);
diff --git 
a/artemis-commons/src/test/java/org/apache/activemq/artemis/utils/critical/CriticalAnalyzerAccessor.java
 
b/artemis-commons/src/test/java/org/apache/activemq/artemis/utils/critical/CriticalAnalyzerAccessor.java
new file mode 100644
index 0000000..0066e99
--- /dev/null
+++ 
b/artemis-commons/src/test/java/org/apache/activemq/artemis/utils/critical/CriticalAnalyzerAccessor.java
@@ -0,0 +1,26 @@
+/**
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.activemq.artemis.utils.critical;
+
+public class CriticalAnalyzerAccessor {
+
+   public static void fireActions(CriticalAnalyzer impl, CriticalComponent 
component) {
+      ((CriticalAnalyzerImpl)impl).fireActions(component);
+   }
+
+}
diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQServerLogger.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQServerLogger.java
index 6dd51b3..b0676cd 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQServerLogger.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQServerLogger.java
@@ -2216,4 +2216,8 @@ public interface ActiveMQServerLogger extends BasicLogger 
{
    @Message(id = 224115, value = "Address control unblock of address ''{0}''. 
Clients will be granted credit as normal.", format = 
Message.Format.MESSAGE_FORMAT)
    void unblockingViaControl(SimpleString addressName);
 
+   @LogMessage(level = Logger.Level.WARN)
+   @Message(id = 224116, value = "The component {0} is not responsive during 
start up. The Server may be taking too long to start", format = 
Message.Format.MESSAGE_FORMAT)
+   void tooLongToStart(Object component);
+
 }
diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java
index 48d827f..e227f4b 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java
@@ -704,7 +704,13 @@ public class ActiveMQServerImpl implements ActiveMQServer {
       }
    }
 
-   private void initializeCriticalAnalyzer() throws Exception {
+
+   private void takingLongToStart(Object criticalComponent) {
+      ActiveMQServerLogger.LOGGER.tooLongToStart(criticalComponent);
+      threadDump();
+   }
+
+   protected void initializeCriticalAnalyzer() throws Exception {
 
       // Some tests will play crazy frequenceistop/start
       CriticalAnalyzer analyzer = this.getCriticalAnalyzer();
@@ -735,49 +741,61 @@ public class ActiveMQServerImpl implements ActiveMQServer 
{
          case HALT:
             criticalAction = criticalComponent -> {
 
-               checkCriticalAnalyzerLogging();
-               
ActiveMQServerLogger.LOGGER.criticalSystemHalt(criticalComponent);
+               if (ActiveMQServerImpl.this.state == SERVER_STATE.STARTING) {
+                  takingLongToStart(criticalComponent);
+               } else {
+                  checkCriticalAnalyzerLogging();
+                  
ActiveMQServerLogger.LOGGER.criticalSystemHalt(criticalComponent);
 
-               threadDump();
-               sendCriticalNotification(criticalComponent);
+                  threadDump();
+                  sendCriticalNotification(criticalComponent);
 
-               Runtime.getRuntime().halt(70); // Linux systems will have 
/usr/include/sysexits.h showing 70 as internal software error
+                  Runtime.getRuntime().halt(70); // Linux systems will have 
/usr/include/sysexits.h showing 70 as internal software error
+               }
 
             };
             break;
          case SHUTDOWN:
             criticalAction = criticalComponent -> {
 
-               checkCriticalAnalyzerLogging();
-               
ActiveMQServerLogger.LOGGER.criticalSystemShutdown(criticalComponent);
-
-               threadDump();
-
-               // on the case of a critical failure, -1 cannot simply means 
forever.
-               // in case graceful is -1, we will set it to 30 seconds
-               sendCriticalNotification(criticalComponent);
-
-               // you can't stop from the check thread,
-               // nor can use an executor
-               Thread stopThread = new Thread() {
-                  @Override
-                  public void run() {
-                     try {
-                        ActiveMQServerImpl.this.stop();
-                     } catch (Throwable e) {
-                        logger.warn(e.getMessage(), e);
+               if (ActiveMQServerImpl.this.state == SERVER_STATE.STARTING) {
+                  takingLongToStart(criticalComponent);
+               } else {
+                  checkCriticalAnalyzerLogging();
+                  
ActiveMQServerLogger.LOGGER.criticalSystemShutdown(criticalComponent);
+
+                  threadDump();
+
+                  // on the case of a critical failure, -1 cannot simply means 
forever.
+                  // in case graceful is -1, we will set it to 30 seconds
+                  sendCriticalNotification(criticalComponent);
+
+                  // you can't stop from the check thread,
+                  // nor can use an executor
+                  Thread stopThread = new Thread() {
+                     @Override
+                     public void run() {
+                        try {
+                           ActiveMQServerImpl.this.stop();
+                        } catch (Throwable e) {
+                           logger.warn(e.getMessage(), e);
+                        }
                      }
-                  }
-               };
-               stopThread.start();
+                  };
+                  stopThread.start();
+               }
             };
             break;
          case LOG:
             criticalAction = criticalComponent -> {
-               checkCriticalAnalyzerLogging();
-               
ActiveMQServerLogger.LOGGER.criticalSystemLog(criticalComponent);
-               threadDump();
-               sendCriticalNotification(criticalComponent);
+               if (ActiveMQServerImpl.this.state == SERVER_STATE.STARTING) {
+                  takingLongToStart(criticalComponent);
+               } else {
+                  checkCriticalAnalyzerLogging();
+                  
ActiveMQServerLogger.LOGGER.criticalSystemLog(criticalComponent);
+                  threadDump();
+                  sendCriticalNotification(criticalComponent);
+               }
             };
             break;
       }
diff --git 
a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImplAccessor.java
 
b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImplAccessor.java
new file mode 100644
index 0000000..7306873
--- /dev/null
+++ 
b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImplAccessor.java
@@ -0,0 +1,27 @@
+/**
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.activemq.artemis.core.server.impl;
+
+public class ActiveMQServerImplAccessor {
+
+
+   public static void initializeCriticalAnalyzer(ActiveMQServerImpl server) 
throws Exception {
+      server.initializeCriticalAnalyzer();
+   }
+
+}
diff --git 
a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerStartupTest.java
 
b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerStartupTest.java
new file mode 100644
index 0000000..48fbb37
--- /dev/null
+++ 
b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerStartupTest.java
@@ -0,0 +1,70 @@
+/**
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.activemq.artemis.core.server.impl;
+
+import org.apache.activemq.artemis.core.config.impl.ConfigurationImpl;
+import org.apache.activemq.artemis.core.server.ActiveMQServer;
+import org.apache.activemq.artemis.logs.AssertionLoggerHandler;
+import org.apache.activemq.artemis.tests.util.ActiveMQTestBase;
+import org.apache.activemq.artemis.utils.critical.CriticalAnalyzerAccessor;
+import org.apache.activemq.artemis.utils.critical.CriticalAnalyzerPolicy;
+import org.apache.activemq.artemis.utils.critical.CriticalComponentImpl;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class ActiveMQServerStartupTest extends ActiveMQTestBase {
+
+   @Test
+   public void testTooLongToStartHalt() throws Exception {
+      testTooLongToStart(CriticalAnalyzerPolicy.HALT);
+   }
+
+   @Test
+   public void testTooLongToStartShutdown() throws Exception {
+      testTooLongToStart(CriticalAnalyzerPolicy.SHUTDOWN);
+   }
+
+   @Test
+   public void testTooLongToStartLOG() throws Exception {
+      testTooLongToStart(CriticalAnalyzerPolicy.LOG);
+   }
+
+   private void testTooLongToStart(CriticalAnalyzerPolicy policy) throws 
Exception {
+
+      AssertionLoggerHandler.startCapture();
+      try {
+
+         ConfigurationImpl configuration = new ConfigurationImpl();
+         configuration.setCriticalAnalyzerPolicy(policy);
+         configuration.setCriticalAnalyzer(true);
+         configuration.setPersistenceEnabled(false);
+         ActiveMQServerImpl server = new ActiveMQServerImpl(configuration);
+         addServer(server);
+         server.start();
+         // this will be faking a condition
+         server.setState(ActiveMQServer.SERVER_STATE.STARTING);
+         CriticalAnalyzerAccessor.fireActions(server.getCriticalAnalyzer(), 
new CriticalComponentImpl(server.getCriticalAnalyzer(), 2));
+         Assert.assertTrue(AssertionLoggerHandler.findText("224116"));
+         Assert.assertEquals(ActiveMQServer.SERVER_STATE.STARTING, 
server.getState()); // should not be changed
+         server.stop();
+      } finally {
+         AssertionLoggerHandler.stopCapture();
+      }
+   }
+
+}

Reply via email to