[
https://issues.apache.org/jira/browse/CASSANDRA-20833?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Dmitry Konstantinov updated CASSANDRA-20833:
--------------------------------------------
Attachment: image-2025-08-13-21-45-14-273.png
> Jenkins pipeline: add CauseOfInterruption logging to simplify troubleshooting
> -----------------------------------------------------------------------------
>
> Key: CASSANDRA-20833
> URL: https://issues.apache.org/jira/browse/CASSANDRA-20833
> Project: Apache Cassandra
> Issue Type: Improvement
> Components: Build, CI
> Reporter: Dmitry Konstantinov
> Assignee: Dmitry Konstantinov
> Priority: Normal
> Fix For: 5.0.6, 5.1
>
> Attachments: image-2025-08-13-21-45-14-273.png
>
> Time Spent: 20m
> Remaining Estimate: 0h
>
> Currently when a test split of Jenkins pipeline is aborted due to a timeout
> or if an agent went offline Jenkins aborts other parallel steps too. All the
> steps: originally failed and others are looking very similar in Pipeline
> overview and it is time consuming activity to find the original split failure.
> Jenkins throws an exception in this case but it does not have a message and
> stack trace is not informative and generic as well, example:
> {code:java}
> org.jenkinsci.plugins.workflow.steps.FlowInterruptedException
> at PluginClassLoader for
> workflow-durable-task-step//org.jenkinsci.plugins.workflow.support.steps.ExecutorStepExecution$RemovedNodeListener.lambda$cancelOwnerExecution$7(ExecutorStepExecution.java:432)
> at PluginClassLoader for
> workflow-durable-task-step//org.jenkinsci.plugins.workflow.support.steps.ExecutorStepExecution$PlaceholderTask$1.onSuccess(ExecutorStepExecution.java:524)
> at PluginClassLoader for
> workflow-durable-task-step//org.jenkinsci.plugins.workflow.support.steps.ExecutorStepExecution$PlaceholderTask$1.onSuccess(ExecutorStepExecution.java:520)
> at
> com.google.common.util.concurrent.Futures$CallbackListener.run(Futures.java:1139)
> at
> com.google.common.util.concurrent.DirectExecutor.execute(DirectExecutor.java:31)
> at
> com.google.common.util.concurrent.AbstractFuture.executeListener(AbstractFuture.java:1307)
> at
> com.google.common.util.concurrent.AbstractFuture.complete(AbstractFuture.java:1070)
> at
> com.google.common.util.concurrent.AbstractFuture.set(AbstractFuture.java:794)
> at
> com.google.common.util.concurrent.SettableFuture.set(SettableFuture.java:49)
> at PluginClassLoader for
> workflow-cps//org.jenkinsci.plugins.workflow.cps.CpsFlowExecution$5.onSuccess(CpsFlowExecution.java:1118)
> at PluginClassLoader for
> workflow-cps//org.jenkinsci.plugins.workflow.cps.CpsFlowExecution$5.onSuccess(CpsFlowExecution.java:1096)
> at PluginClassLoader for
> workflow-cps//org.jenkinsci.plugins.workflow.cps.CpsFlowExecution$4$1.run(CpsFlowExecution.java:1012)
> at PluginClassLoader for
> workflow-cps//org.jenkinsci.plugins.workflow.cps.CpsVmExecutorService.lambda$wrap$2(CpsVmExecutorService.java:85)
> at
> java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
> at java.base/java.util.concurrent.FutureTask.run(Unknown Source)
> at
> hudson.remoting.SingleLaneExecutorService$1.run(SingleLaneExecutorService.java:139)
> at
> jenkins.util.ContextResettingExecutorService$1.run(ContextResettingExecutorService.java:28)
> at
> jenkins.security.ImpersonatingExecutorService$1.run(ImpersonatingExecutorService.java:68)
> at
> jenkins.util.ErrorLoggingExecutorService.lambda$wrap$0(ErrorLoggingExecutorService.java:51)
> at
> java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
> at java.base/java.util.concurrent.FutureTask.run(Unknown Source)
> at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown
> Source)
> at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown
> Source)
> at PluginClassLoader for
> workflow-cps//org.jenkinsci.plugins.workflow.cps.CpsVmExecutorService$1.call(CpsVmExecutorService.java:53)
> at PluginClassLoader for
> workflow-cps//org.jenkinsci.plugins.workflow.cps.CpsVmExecutorService$1.call(CpsVmExecutorService.java:50)
> at
> org.codehaus.groovy.runtime.GroovyCategorySupport$ThreadCategoryInfo.use(GroovyCategorySupport.java:136)
> at
> org.codehaus.groovy.runtime.GroovyCategorySupport.use(GroovyCategorySupport.java:275)
> at PluginClassLoader for
> workflow-cps//org.jenkinsci.plugins.workflow.cps.CpsVmExecutorService.lambda$categoryThreadFactory$0(CpsVmExecutorService.java:50)
> at java.base/java.lang.Thread.run(Unknown Source)
> Suppressed: org.jenkinsci.plugins.workflow.actions.ErrorAction$ErrorId:
> 363f0c37-5777-48ab-92e6-9aa56ec5431d
> {code}
> FlowInterruptedException has additional info which may help here:
> List<CauseOfInterruption> getCauses()
> [https://github.com/jenkinsci/workflow-step-api-plugin/blob/518c5dcb24c0d692abe25aea4c03f8273ac06ca4/src/main/java/org/jenkinsci/plugins/workflow/steps/FlowInterruptedException.java#L93]
>
> We can extract and print this info which contains the name of the original
> failed step.
> * Example of the original split failure:
> {code:java}
> CauseOfInterruption:
> org.jenkinsci.plugins.workflow.support.steps.ExecutorStepExecution$RemovedNodeCause
> - Agent was removed
> {code}
> * Example of aborted split due to another split error:
> {code:java}
> CauseOfInterruption:
> org.jenkinsci.plugins.workflow.cps.steps.ParallelStep$FailFastCause - Failed
> in branch jvm-dtest jdk11 10/16
> {code}
>
> Note: to use it the method should be added to the approved Jenkins API:
> {code:java}
> method org.jenkinsci.plugins.workflow.steps.FlowInterruptedException
> getCauses
> {code}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]