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

smiklosovic pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/cassandra.git


The following commit(s) were added to refs/heads/trunk by this push:
     new fd2986b8bc Added additional parameter to JVM shutdown to allow for 
logs to be properly shutdown
fd2986b8bc is described below

commit fd2986b8bc9247c47238596a38ee295c12fb44ac
Author: Alan Wang <[email protected]>
AuthorDate: Mon Nov 3 10:46:45 2025 -0800

    Added additional parameter to JVM shutdown to allow for logs to be properly 
shutdown
    
    patch by Alan Wang; reviewed by Abe Ratnofsky, Caleb Rackliffe for 
CASSANDRA-20978
---
 CHANGES.txt                                        |  1 +
 .../service/DefaultDiskErrorsHandler.java          |  6 ++--
 .../cassandra/utils/JVMStabilityInspector.java     | 17 +++++++--
 .../org/apache/cassandra/cql3/OutOfSpaceTest.java  |  1 +
 .../db/commitlog/CommitLogFailurePolicyTest.java   |  2 ++
 .../apache/cassandra/net/ResourceLimitsTest.java   |  1 +
 .../cassandra/utils/JVMStabilityInspectorTest.java | 42 ++++++++++++++++++++++
 .../org/apache/cassandra/utils/KillerForTests.java | 15 ++++++++
 8 files changed, 80 insertions(+), 5 deletions(-)

diff --git a/CHANGES.txt b/CHANGES.txt
index fa2b7a16c6..1e9bbaa2fe 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 5.1
+ * Added additional parameter to JVM shutdown to allow for logs to be properly 
shutdown (CASSANDRA-20978)
  * Improve isGossipOnlyMember and location lookup performance (CASSANDRA-21039)
  * Refactor the way we check if a transformation is allowed to be committed 
during upgrades (CASSANDRA-21043)
  * Improve debug around paused and disabled compaction 
(CASSANDRA-20131,CASSANDRA-19728)
diff --git 
a/src/java/org/apache/cassandra/service/DefaultDiskErrorsHandler.java 
b/src/java/org/apache/cassandra/service/DefaultDiskErrorsHandler.java
index cc350861f4..72a18a9f72 100644
--- a/src/java/org/apache/cassandra/service/DefaultDiskErrorsHandler.java
+++ b/src/java/org/apache/cassandra/service/DefaultDiskErrorsHandler.java
@@ -129,7 +129,7 @@ public class DefaultDiskErrorsHandler implements 
DiskErrorsHandler
                 logger.error("Exiting forcefully due to file system exception 
on startup, disk failure policy \"{}\"",
                              DatabaseDescriptor.getDiskFailurePolicy(),
                              t);
-                JVMStabilityInspector.killCurrentJVM(t, true);
+                JVMStabilityInspector.killCurrentJVM(t, true, true);
                 break;
             default:
                 break;
@@ -174,10 +174,10 @@ public class DefaultDiskErrorsHandler implements 
DiskErrorsHandler
         if (!StorageService.instance.isDaemonSetupCompleted())
         {
             logger.error("Exiting due to error while processing commit log 
during initialization.", t);
-            JVMStabilityInspector.killCurrentJVM(t, true);
+            JVMStabilityInspector.killCurrentJVM(t, true, true);
         }
         else if (DatabaseDescriptor.getCommitFailurePolicy() == 
Config.CommitFailurePolicy.die)
-            JVMStabilityInspector.killCurrentJVM(t, false);
+            JVMStabilityInspector.killCurrentJVM(t, false, true);
     }
 
     private boolean shouldMaybeRemoveData(Throwable error)
diff --git a/src/java/org/apache/cassandra/utils/JVMStabilityInspector.java 
b/src/java/org/apache/cassandra/utils/JVMStabilityInspector.java
index 284fc0598a..f445bf9e3e 100644
--- a/src/java/org/apache/cassandra/utils/JVMStabilityInspector.java
+++ b/src/java/org/apache/cassandra/utils/JVMStabilityInspector.java
@@ -47,6 +47,7 @@ import org.apache.cassandra.metrics.StorageMetrics;
 import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.tracing.Tracing;
 import org.apache.cassandra.utils.concurrent.UncheckedInterruptedException;
+import org.apache.cassandra.utils.logging.LoggingSupportFactory;
 
 import static 
org.apache.cassandra.config.CassandraRelevantProperties.PRINT_HEAP_HISTOGRAM_ON_OUT_OF_MEMORY_ERROR;
 
@@ -226,16 +227,21 @@ public final class JVMStabilityInspector
         killer.killCurrentJVM(t, quiet);
     }
 
+    public static void killCurrentJVM(Throwable t, boolean quiet, boolean 
callShutDownOnLogger)
+    {
+        killer.killCurrentJVM(t, quiet, callShutDownOnLogger);
+    }
+
     public static void userFunctionTimeout(Throwable t)
     {
         switch (DatabaseDescriptor.getUserFunctionTimeoutPolicy())
         {
             case die:
                 // policy to give 250ms grace time to
-                ScheduledExecutors.nonPeriodicTasks.schedule(() -> 
killer.killCurrentJVM(t), 250, TimeUnit.MILLISECONDS);
+                ScheduledExecutors.nonPeriodicTasks.schedule(() -> 
killer.killCurrentJVM(t, false, true), 250, TimeUnit.MILLISECONDS);
                 break;
             case die_immediate:
-                killer.killCurrentJVM(t);
+                killer.killCurrentJVM(t, false, true);
                 break;
             case ignore:
                 logger.error(t.getMessage());
@@ -268,6 +274,11 @@ public final class JVMStabilityInspector
         }
 
         public void killCurrentJVM(Throwable t, boolean quiet)
+        {
+            killCurrentJVM(t, quiet, false);
+        }
+
+        public void killCurrentJVM(Throwable t, boolean quiet, boolean 
callShutDownOnLogger)
         {
             if (!quiet)
             {
@@ -279,6 +290,8 @@ public final class JVMStabilityInspector
 
             if (doExit && killing.compareAndSet(false, true))
             {
+                if (callShutDownOnLogger)
+                    LoggingSupportFactory.getLoggingSupport().onShutdown();
                 StorageService.instance.removeShutdownHook();
                 System.exit(100);
             }
diff --git a/test/unit/org/apache/cassandra/cql3/OutOfSpaceTest.java 
b/test/unit/org/apache/cassandra/cql3/OutOfSpaceTest.java
index 072ee08720..1df61ffc27 100644
--- a/test/unit/org/apache/cassandra/cql3/OutOfSpaceTest.java
+++ b/test/unit/org/apache/cassandra/cql3/OutOfSpaceTest.java
@@ -79,6 +79,7 @@ public class OutOfSpaceTest extends CQLTester
             flushAndExpectError();
             Assert.assertTrue(killerForTests.wasKilled());
             Assert.assertFalse(killerForTests.wasKilledQuietly()); //only 
killed quietly on startup failure
+            Assert.assertFalse(killerForTests.calledShutDownOnLogger());
         }
         finally
         {
diff --git 
a/test/unit/org/apache/cassandra/db/commitlog/CommitLogFailurePolicyTest.java 
b/test/unit/org/apache/cassandra/db/commitlog/CommitLogFailurePolicyTest.java
index 3dc4e5f69e..dd245f11e8 100644
--- 
a/test/unit/org/apache/cassandra/db/commitlog/CommitLogFailurePolicyTest.java
+++ 
b/test/unit/org/apache/cassandra/db/commitlog/CommitLogFailurePolicyTest.java
@@ -83,6 +83,7 @@ public class CommitLogFailurePolicyTest
             CommitLog.handleCommitError("Testing die policy", new Throwable());
             Assert.assertTrue(killerForTests.wasKilled());
             Assert.assertFalse(killerForTests.wasKilledQuietly()); //only 
killed quietly on startup failure
+            Assert.assertTrue(killerForTests.calledShutDownOnLogger());
         }
         finally
         {
@@ -108,6 +109,7 @@ public class CommitLogFailurePolicyTest
             //even though policy is ignore, JVM must die because Daemon has 
not finished initializing
             Assert.assertTrue(killerForTests.wasKilled());
             Assert.assertTrue(killerForTests.wasKilledQuietly()); //killed 
quietly due to startup failure
+            Assert.assertTrue(killerForTests.calledShutDownOnLogger());
         }
         finally
         {
diff --git a/test/unit/org/apache/cassandra/net/ResourceLimitsTest.java 
b/test/unit/org/apache/cassandra/net/ResourceLimitsTest.java
index 5c2ecbed6a..89b94385f3 100644
--- a/test/unit/org/apache/cassandra/net/ResourceLimitsTest.java
+++ b/test/unit/org/apache/cassandra/net/ResourceLimitsTest.java
@@ -173,6 +173,7 @@ public class ResourceLimitsTest
             }
             Assert.assertTrue(killerForTests.wasKilled());
             Assert.assertFalse(killerForTests.wasKilledQuietly()); //only 
killed quietly on startup failure
+            Assert.assertFalse(killerForTests.calledShutDownOnLogger());
         }
         finally
         {
diff --git 
a/test/unit/org/apache/cassandra/utils/JVMStabilityInspectorTest.java 
b/test/unit/org/apache/cassandra/utils/JVMStabilityInspectorTest.java
index 172e5eb584..14ffcdc631 100644
--- a/test/unit/org/apache/cassandra/utils/JVMStabilityInspectorTest.java
+++ b/test/unit/org/apache/cassandra/utils/JVMStabilityInspectorTest.java
@@ -118,6 +118,48 @@ public class JVMStabilityInspectorTest
         }
     }
 
+    @Test
+    public void testCallShutDownOnLoggerOnSpecificErrors() throws Exception
+    {
+        KillerForTests killerForTests = new KillerForTests();
+        JVMStabilityInspector.Killer originalKiller = 
JVMStabilityInspector.replaceKiller(killerForTests);
+
+        Config.DiskFailurePolicy oldPolicy = 
DatabaseDescriptor.getDiskFailurePolicy();
+        Config.UserFunctionTimeoutPolicy oldUserFunctionTimeoutPolicy = 
DatabaseDescriptor.getUserFunctionTimeoutPolicy();
+        DiskErrorsHandlerService.configure();
+        try
+        {
+            
DatabaseDescriptor.setDiskFailurePolicy(Config.DiskFailurePolicy.die);
+            killerForTests.reset();
+            JVMStabilityInspector.inspectThrowable(new FSWriteError(new 
IOException(), "blah"));
+            assertTrue(killerForTests.wasKilled());
+            assertTrue(killerForTests.calledShutDownOnLogger());
+
+            killerForTests.reset();
+            JVMStabilityInspector.inspectCommitLogThrowable(new Throwable());
+            assertTrue(killerForTests.wasKilled());
+            assertTrue(killerForTests.calledShutDownOnLogger());
+
+            
DatabaseDescriptor.setUserFunctionTimeoutPolicy(Config.UserFunctionTimeoutPolicy.die_immediate);
+            killerForTests.reset();
+            JVMStabilityInspector.userFunctionTimeout(new Throwable());
+            assertTrue(killerForTests.wasKilled());
+            assertTrue(killerForTests.calledShutDownOnLogger());
+        }
+        catch (Exception | Error e)
+        {
+            throw new AssertionError("Failure when 
daemonSetupCompleted=false", e);
+        }
+        finally
+        {
+            JVMStabilityInspector.replaceKiller(originalKiller);
+            DatabaseDescriptor.setDiskFailurePolicy(oldPolicy);
+            
DatabaseDescriptor.setUserFunctionTimeoutPolicy(oldUserFunctionTimeoutPolicy);
+            StorageService.instance.registerDaemon(null);
+            
DiskErrorsHandlerService.set(DiskErrorsHandler.NoOpDiskErrorHandler.NO_OP);
+        }
+    }
+
     @Test
     public void testOutOfMemoryHandling()
     {
diff --git a/test/unit/org/apache/cassandra/utils/KillerForTests.java 
b/test/unit/org/apache/cassandra/utils/KillerForTests.java
index 6f7f3c7b10..a891e82a1b 100644
--- a/test/unit/org/apache/cassandra/utils/KillerForTests.java
+++ b/test/unit/org/apache/cassandra/utils/KillerForTests.java
@@ -27,6 +27,7 @@ public class KillerForTests extends 
JVMStabilityInspector.Killer
 {
     private boolean killed = false;
     private boolean quiet = false;
+    private boolean callShutDownOnLogger = false;
     private final boolean expected;
 
     public KillerForTests()
@@ -41,6 +42,12 @@ public class KillerForTests extends 
JVMStabilityInspector.Killer
 
     @Override
     public void killCurrentJVM(Throwable t, boolean quiet)
+    {
+        killCurrentJVM(t, quiet, false);
+    }
+
+    @Override
+    public void killCurrentJVM(Throwable t, boolean quiet, boolean 
callShutDownOnLogger)
     {
         if (!expected)
             Assert.fail("Saw JVM Kill but did not expect it.");
@@ -52,6 +59,7 @@ public class KillerForTests extends 
JVMStabilityInspector.Killer
         }
         this.killed = true;
         this.quiet = quiet;
+        this.callShutDownOnLogger = callShutDownOnLogger;
     }
 
     public boolean wasKilled()
@@ -64,8 +72,15 @@ public class KillerForTests extends 
JVMStabilityInspector.Killer
         return quiet;
     }
 
+    public boolean calledShutDownOnLogger()
+    {
+        return callShutDownOnLogger;
+    }
+
     public void reset()
     {
         killed = false;
+        quiet = false;
+        callShutDownOnLogger = false;
     }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to