omniCoder77 commented on PR #4775:
URL: https://github.com/apache/cassandra/pull/4775#issuecomment-4369462557

   I attempted to write a test for this scenario.
   ```
   public class DecommissionWithNoHintsTest extends TestBaseImpl
   {
       @Test
       public void testDecommissionSucceedsWithNoHintsAndNoLiveEndpoints() 
throws Exception
       {
           try (Cluster cluster = builder().withNodes(3)
                                           .withConfig(config -> 
config.with(NETWORK, GOSSIP))
                                           .withInstanceInitializer(BB::install)
                                           .start())
           {
               cluster.get(3).nodetoolResult("decommission", 
"--force").asserts().success();
           }
       }
   
       public static class BB
       {
           static void install(ClassLoader cl, int nodeNumber)
           {
               if (nodeNumber != 3)
                   return;
               new ByteBuddy()
                       .rebase(FailureDetector.class)
                       .method(named("isAlive"))
                       .intercept(MethodDelegation.to(BB.class))
                       .make()
                       .load(cl, ClassLoadingStrategy.Default.INJECTION);
           }
   
           public static boolean isAlive(@Argument(0) InetAddressAndPort 
endpoint)
           {
               return false;
           }
       }
   }
   ```
    The decommission succeeds but 
UnavailablePreferredHintsStreamingTargetException still reaches the uncaught 
exception handler via TransferHintsTask.run(). This seems consistent with your 
comment about Supplier<Optional<UUID>> — the current exception-based approach 
needs catches in two places.
    Log:
   ```
   ERROR [main] 2026-05-04T08:39:53,872 AbstractCluster.java:1220 - Unexpected 
errors
   org.apache.cassandra.distributed.shared.ShutdownException: Uncaught 
exceptions were thrown during test
        at 
org.apache.cassandra.distributed.impl.AbstractCluster.checkAndResetUncaughtExceptions(AbstractCluster.java:1218)
        at 
org.apache.cassandra.distributed.impl.AbstractCluster.close(AbstractCluster.java:1203)
        at 
org.apache.cassandra.distributed.test.ring.DecommissionWithNoHintsTest.testDecommissionSucceedsWithNoHintsAndNoLiveEndpoints(DecommissionWithNoHintsTest.java:48)
        at 
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at 
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
        at 
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:569)
        at 
org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
        at 
org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
        at 
org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
        at 
org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
        at 
org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
        at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
        at 
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
        at 
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
        at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
        at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
        at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
        at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
        at 
org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
        at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
        at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
        at 
com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:73)
        at 
com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)
        at 
com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)
        at 
com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)
        at 
com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:225)
        at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:61)
        Suppressed: 
org.apache.cassandra.exceptions.UnavailablePreferredHintsStreamingTargetException:
 Unable to stream hints since no live endpoints seen
                at 
org.apache.cassandra.service.StorageService.getPreferredHintsStreamTarget(StorageService.java:3583)
                at 
org.apache.cassandra.hints.HintsDispatchExecutor$TransferHintsTask.run(HintsDispatchExecutor.java:170)
                at 
org.apache.cassandra.concurrent.FutureTask$2.call(FutureTask.java:124)
                at 
org.apache.cassandra.concurrent.FutureTask.call(FutureTask.java:61)
                at 
org.apache.cassandra.concurrent.FutureTask.run(FutureTask.java:71)
                at 
java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
                at 
java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
                at 
io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
                at java.base/java.lang.Thread.run(Thread.java:840)
   
   org.apache.cassandra.distributed.shared.ShutdownException: Uncaught 
exceptions were thrown during test
   
        at 
org.apache.cassandra.distributed.impl.AbstractCluster.checkAndResetUncaughtExceptions(AbstractCluster.java:1218)
        at 
org.apache.cassandra.distributed.impl.AbstractCluster.close(AbstractCluster.java:1203)
        at 
org.apache.cassandra.distributed.test.ring.DecommissionWithNoHintsTest.testDecommissionSucceedsWithNoHintsAndNoLiveEndpoints(DecommissionWithNoHintsTest.java:48)
        at 
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at 
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
        at 
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:569)
        at 
org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
        at 
org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
        at 
org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
        at 
org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
        at 
org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
        at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
        at 
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
        at 
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
        at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
        at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
        at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
        at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
        at 
org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
        at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
        at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
        at 
com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:73)
        at 
com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)
        at 
com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)
        at 
com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)
        at 
com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:225)
        at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:61)
        Suppressed: 
org.apache.cassandra.exceptions.UnavailablePreferredHintsStreamingTargetException:
 Unable to stream hints since no live endpoints seen
                at 
org.apache.cassandra.service.StorageService.getPreferredHintsStreamTarget(StorageService.java:3583)
                at 
org.apache.cassandra.hints.HintsDispatchExecutor$TransferHintsTask.run(HintsDispatchExecutor.java:170)
                at 
org.apache.cassandra.concurrent.FutureTask$2.call(FutureTask.java:124)
                at 
org.apache.cassandra.concurrent.FutureTask.call(FutureTask.java:61)
                at 
org.apache.cassandra.concurrent.FutureTask.run(FutureTask.java:71)
                at 
java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
                at 
java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
                at 
io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
                at java.base/java.lang.Thread.run(Thread.java:840)
   ```


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


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

Reply via email to