Uploaded image for project: 'Jenkins'
  1. Jenkins
  2. JENKINS-39425

REGRESSION: NPE when calculating getStartTime chunk time

    Details

    • Epic Link:
    • Sprint:
      indian
    • Similar Issues:

      Description

      There is a multibranch job taht Ben Walding runs that fails to show the pipeline stage graph.

      This is due to /runs/N/nodes/ returning a 500 error, which is due to a null pointer exception.
      And has been failing since the update to bismuth.

      The stage view (classic) does not have this problem.

      Still working on how exactly to reproduce this but thought the stack trace may be useful on its own.

      Caused by: java.lang.NullPointerException
      	at org.jenkinsci.plugins.workflow.actions.TimingAction.getStartTime(TimingAction.java:45)
      	at org.jenkinsci.plugins.workflow.pipelinegraphanalysis.StatusAndTiming.computeChunkTiming(StatusAndTiming.java:240)
      	at io.jenkins.blueocean.rest.impl.pipeline.PipelineNodeGraphVisitor.handleChunkDone(PipelineNodeGraphVisitor.java:201)
      	at org.jenkinsci.plugins.workflow.graphanalysis.StandardChunkVisitor.chunkStart(StandardChunkVisitor.java:40)
      	at io.jenkins.blueocean.rest.impl.pipeline.PipelineNodeGraphVisitor.chunkStart(PipelineNodeGraphVisitor.java:74)
      	at org.jenkinsci.plugins.workflow.graphanalysis.ForkScanner.visitSimpleChunks(ForkScanner.java:566)
      	at org.jenkinsci.plugins.workflow.graphanalysis.ForkScanner.visitSimpleChunks(ForkScanner.java:551)
      	at io.jenkins.blueocean.rest.impl.pipeline.PipelineNodeGraphVisitor.<init>(PipelineNodeGraphVisitor.java:68)
      	at io.jenkins.blueocean.rest.impl.pipeline.NodeGraphBuilder$NodeGraphBuilderFactory.getInstance(NodeGraphBuilder.java:37)
      	at io.jenkins.blueocean.rest.impl.pipeline.PipelineNodeContainerImpl.<init>(PipelineNodeContainerImpl.java:32)
      	at io.jenkins.blueocean.rest.impl.pipeline.PipelineRunImpl.getNodes(PipelineRunImpl.java:81)
      	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
      	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      	at java.lang.reflect.Method.invoke(Method.java:498)
      	at org.kohsuke.stapler.Function$InstanceFunction.invoke(Function.java:324)
      	at org.kohsuke.stapler.MetaClass$3.doDispatch(MetaClass.java:196)
      	at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:58)
      	at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:746)
      

        Attachments

          Issue Links

            Activity

            michaelneale Michael Neale created issue -
            michaelneale Michael Neale made changes -
            Field Original Value New Value
            Epic Link JENKINS-35759 [ 171771 ]
            michaelneale Michael Neale made changes -
            Assignee Vivek Pandey [ vivek ]
            michaelneale Michael Neale made changes -
            Description There is a multibranch job taht [~bwalding] runs that fails to show the pipeline stage graph.

            This is due to /runs/N/nodes/ returning a 500 error, which is due to a null pointer exception.
            (this seems specific to multibranch) and has been failing since the update to bismuth.


            Still working on how exactly to reproduce this but thought the stack trace may be useful on its own.


            {noformat}
            Caused by: java.lang.NullPointerException
            at org.jenkinsci.plugins.workflow.actions.TimingAction.getStartTime(TimingAction.java:45)
            at org.jenkinsci.plugins.workflow.pipelinegraphanalysis.StatusAndTiming.computeChunkTiming(StatusAndTiming.java:240)
            at io.jenkins.blueocean.rest.impl.pipeline.PipelineNodeGraphVisitor.handleChunkDone(PipelineNodeGraphVisitor.java:201)
            at org.jenkinsci.plugins.workflow.graphanalysis.StandardChunkVisitor.chunkStart(StandardChunkVisitor.java:40)
            at io.jenkins.blueocean.rest.impl.pipeline.PipelineNodeGraphVisitor.chunkStart(PipelineNodeGraphVisitor.java:74)
            at org.jenkinsci.plugins.workflow.graphanalysis.ForkScanner.visitSimpleChunks(ForkScanner.java:566)
            at org.jenkinsci.plugins.workflow.graphanalysis.ForkScanner.visitSimpleChunks(ForkScanner.java:551)
            at io.jenkins.blueocean.rest.impl.pipeline.PipelineNodeGraphVisitor.<init>(PipelineNodeGraphVisitor.java:68)
            at io.jenkins.blueocean.rest.impl.pipeline.NodeGraphBuilder$NodeGraphBuilderFactory.getInstance(NodeGraphBuilder.java:37)
            at io.jenkins.blueocean.rest.impl.pipeline.PipelineNodeContainerImpl.<init>(PipelineNodeContainerImpl.java:32)
            at io.jenkins.blueocean.rest.impl.pipeline.PipelineRunImpl.getNodes(PipelineRunImpl.java:81)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.lang.reflect.Method.invoke(Method.java:498)
            at org.kohsuke.stapler.Function$InstanceFunction.invoke(Function.java:324)
            at org.kohsuke.stapler.MetaClass$3.doDispatch(MetaClass.java:196)
            at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:58)
            at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:746)
            {noformat}
            There is a multibranch job taht [~bwalding] runs that fails to show the pipeline stage graph.

            This is due to /runs/N/nodes/ returning a 500 error, which is due to a null pointer exception.
            (this seems specific to multibranch) and has been failing since the update to bismuth.

            The stage view (classic) does not have this problem.


            Still working on how exactly to reproduce this but thought the stack trace may be useful on its own.


            {noformat}
            Caused by: java.lang.NullPointerException
            at org.jenkinsci.plugins.workflow.actions.TimingAction.getStartTime(TimingAction.java:45)
            at org.jenkinsci.plugins.workflow.pipelinegraphanalysis.StatusAndTiming.computeChunkTiming(StatusAndTiming.java:240)
            at io.jenkins.blueocean.rest.impl.pipeline.PipelineNodeGraphVisitor.handleChunkDone(PipelineNodeGraphVisitor.java:201)
            at org.jenkinsci.plugins.workflow.graphanalysis.StandardChunkVisitor.chunkStart(StandardChunkVisitor.java:40)
            at io.jenkins.blueocean.rest.impl.pipeline.PipelineNodeGraphVisitor.chunkStart(PipelineNodeGraphVisitor.java:74)
            at org.jenkinsci.plugins.workflow.graphanalysis.ForkScanner.visitSimpleChunks(ForkScanner.java:566)
            at org.jenkinsci.plugins.workflow.graphanalysis.ForkScanner.visitSimpleChunks(ForkScanner.java:551)
            at io.jenkins.blueocean.rest.impl.pipeline.PipelineNodeGraphVisitor.<init>(PipelineNodeGraphVisitor.java:68)
            at io.jenkins.blueocean.rest.impl.pipeline.NodeGraphBuilder$NodeGraphBuilderFactory.getInstance(NodeGraphBuilder.java:37)
            at io.jenkins.blueocean.rest.impl.pipeline.PipelineNodeContainerImpl.<init>(PipelineNodeContainerImpl.java:32)
            at io.jenkins.blueocean.rest.impl.pipeline.PipelineRunImpl.getNodes(PipelineRunImpl.java:81)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.lang.reflect.Method.invoke(Method.java:498)
            at org.kohsuke.stapler.Function$InstanceFunction.invoke(Function.java:324)
            at org.kohsuke.stapler.MetaClass$3.doDispatch(MetaClass.java:196)
            at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:58)
            at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:746)
            {noformat}
            michaelneale Michael Neale made changes -
            Description There is a multibranch job taht [~bwalding] runs that fails to show the pipeline stage graph.

            This is due to /runs/N/nodes/ returning a 500 error, which is due to a null pointer exception.
            (this seems specific to multibranch) and has been failing since the update to bismuth.

            The stage view (classic) does not have this problem.


            Still working on how exactly to reproduce this but thought the stack trace may be useful on its own.


            {noformat}
            Caused by: java.lang.NullPointerException
            at org.jenkinsci.plugins.workflow.actions.TimingAction.getStartTime(TimingAction.java:45)
            at org.jenkinsci.plugins.workflow.pipelinegraphanalysis.StatusAndTiming.computeChunkTiming(StatusAndTiming.java:240)
            at io.jenkins.blueocean.rest.impl.pipeline.PipelineNodeGraphVisitor.handleChunkDone(PipelineNodeGraphVisitor.java:201)
            at org.jenkinsci.plugins.workflow.graphanalysis.StandardChunkVisitor.chunkStart(StandardChunkVisitor.java:40)
            at io.jenkins.blueocean.rest.impl.pipeline.PipelineNodeGraphVisitor.chunkStart(PipelineNodeGraphVisitor.java:74)
            at org.jenkinsci.plugins.workflow.graphanalysis.ForkScanner.visitSimpleChunks(ForkScanner.java:566)
            at org.jenkinsci.plugins.workflow.graphanalysis.ForkScanner.visitSimpleChunks(ForkScanner.java:551)
            at io.jenkins.blueocean.rest.impl.pipeline.PipelineNodeGraphVisitor.<init>(PipelineNodeGraphVisitor.java:68)
            at io.jenkins.blueocean.rest.impl.pipeline.NodeGraphBuilder$NodeGraphBuilderFactory.getInstance(NodeGraphBuilder.java:37)
            at io.jenkins.blueocean.rest.impl.pipeline.PipelineNodeContainerImpl.<init>(PipelineNodeContainerImpl.java:32)
            at io.jenkins.blueocean.rest.impl.pipeline.PipelineRunImpl.getNodes(PipelineRunImpl.java:81)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.lang.reflect.Method.invoke(Method.java:498)
            at org.kohsuke.stapler.Function$InstanceFunction.invoke(Function.java:324)
            at org.kohsuke.stapler.MetaClass$3.doDispatch(MetaClass.java:196)
            at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:58)
            at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:746)
            {noformat}
            There is a multibranch job taht [~bwalding] runs that fails to show the pipeline stage graph.

            This is due to /runs/N/nodes/ returning a 500 error, which is due to a null pointer exception.
            And has been failing since the update to bismuth.

            The stage view (classic) does not have this problem.


            Still working on how exactly to reproduce this but thought the stack trace may be useful on its own.


            {noformat}
            Caused by: java.lang.NullPointerException
            at org.jenkinsci.plugins.workflow.actions.TimingAction.getStartTime(TimingAction.java:45)
            at org.jenkinsci.plugins.workflow.pipelinegraphanalysis.StatusAndTiming.computeChunkTiming(StatusAndTiming.java:240)
            at io.jenkins.blueocean.rest.impl.pipeline.PipelineNodeGraphVisitor.handleChunkDone(PipelineNodeGraphVisitor.java:201)
            at org.jenkinsci.plugins.workflow.graphanalysis.StandardChunkVisitor.chunkStart(StandardChunkVisitor.java:40)
            at io.jenkins.blueocean.rest.impl.pipeline.PipelineNodeGraphVisitor.chunkStart(PipelineNodeGraphVisitor.java:74)
            at org.jenkinsci.plugins.workflow.graphanalysis.ForkScanner.visitSimpleChunks(ForkScanner.java:566)
            at org.jenkinsci.plugins.workflow.graphanalysis.ForkScanner.visitSimpleChunks(ForkScanner.java:551)
            at io.jenkins.blueocean.rest.impl.pipeline.PipelineNodeGraphVisitor.<init>(PipelineNodeGraphVisitor.java:68)
            at io.jenkins.blueocean.rest.impl.pipeline.NodeGraphBuilder$NodeGraphBuilderFactory.getInstance(NodeGraphBuilder.java:37)
            at io.jenkins.blueocean.rest.impl.pipeline.PipelineNodeContainerImpl.<init>(PipelineNodeContainerImpl.java:32)
            at io.jenkins.blueocean.rest.impl.pipeline.PipelineRunImpl.getNodes(PipelineRunImpl.java:81)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.lang.reflect.Method.invoke(Method.java:498)
            at org.kohsuke.stapler.Function$InstanceFunction.invoke(Function.java:324)
            at org.kohsuke.stapler.MetaClass$3.doDispatch(MetaClass.java:196)
            at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:58)
            at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:746)
            {noformat}
            Hide
            bwalding Ben Walding added a comment -

            Jenkins 2.28 + BlueOcean b11 - stack trace looks the same - but for the avoidance of doubt

            Caused by: java.lang.NullPointerException
            	at org.jenkinsci.plugins.workflow.actions.TimingAction.getStartTime(TimingAction.java:45)
            	at org.jenkinsci.plugins.workflow.pipelinegraphanalysis.StatusAndTiming.computeChunkTiming(StatusAndTiming.java:240)
            	at io.jenkins.blueocean.rest.impl.pipeline.PipelineNodeGraphVisitor.handleChunkDone(PipelineNodeGraphVisitor.java:201)
            	at org.jenkinsci.plugins.workflow.graphanalysis.StandardChunkVisitor.chunkStart(StandardChunkVisitor.java:40)
            	at io.jenkins.blueocean.rest.impl.pipeline.PipelineNodeGraphVisitor.chunkStart(PipelineNodeGraphVisitor.java:74)
            	at org.jenkinsci.plugins.workflow.graphanalysis.ForkScanner.visitSimpleChunks(ForkScanner.java:566)
            	at org.jenkinsci.plugins.workflow.graphanalysis.ForkScanner.visitSimpleChunks(ForkScanner.java:551)
            	at io.jenkins.blueocean.rest.impl.pipeline.PipelineNodeGraphVisitor.<init>(PipelineNodeGraphVisitor.java:68)
            	at io.jenkins.blueocean.rest.impl.pipeline.NodeGraphBuilder$NodeGraphBuilderFactory.getInstance(NodeGraphBuilder.java:37)
            	at io.jenkins.blueocean.rest.impl.pipeline.PipelineNodeContainerImpl.<init>(PipelineNodeContainerImpl.java:32)
            	at io.jenkins.blueocean.rest.impl.pipeline.PipelineRunImpl.getNodes(PipelineRunImpl.java:81)
            	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
            	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            	at java.lang.reflect.Method.invoke(Method.java:498)
            	at org.kohsuke.stapler.Function$InstanceFunction.invoke(Function.java:335)
            	at org.kohsuke.stapler.MetaClass$3.doDispatch(MetaClass.java:197)
            	at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:58)
            	at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:746)
            	... 101 more
            

            As a test I created a multibranch pipeline test job that launches a secondary pipeline job (same structure as my failing job) - it did not have the same issue. So there is something subtle about it.

            Show
            bwalding Ben Walding added a comment - Jenkins 2.28 + BlueOcean b11 - stack trace looks the same - but for the avoidance of doubt Caused by: java.lang.NullPointerException at org.jenkinsci.plugins.workflow.actions.TimingAction.getStartTime(TimingAction.java:45) at org.jenkinsci.plugins.workflow.pipelinegraphanalysis.StatusAndTiming.computeChunkTiming(StatusAndTiming.java:240) at io.jenkins.blueocean.rest.impl.pipeline.PipelineNodeGraphVisitor.handleChunkDone(PipelineNodeGraphVisitor.java:201) at org.jenkinsci.plugins.workflow.graphanalysis.StandardChunkVisitor.chunkStart(StandardChunkVisitor.java:40) at io.jenkins.blueocean.rest.impl.pipeline.PipelineNodeGraphVisitor.chunkStart(PipelineNodeGraphVisitor.java:74) at org.jenkinsci.plugins.workflow.graphanalysis.ForkScanner.visitSimpleChunks(ForkScanner.java:566) at org.jenkinsci.plugins.workflow.graphanalysis.ForkScanner.visitSimpleChunks(ForkScanner.java:551) at io.jenkins.blueocean.rest.impl.pipeline.PipelineNodeGraphVisitor.<init>(PipelineNodeGraphVisitor.java:68) at io.jenkins.blueocean.rest.impl.pipeline.NodeGraphBuilder$NodeGraphBuilderFactory.getInstance(NodeGraphBuilder.java:37) at io.jenkins.blueocean.rest.impl.pipeline.PipelineNodeContainerImpl.<init>(PipelineNodeContainerImpl.java:32) at io.jenkins.blueocean.rest.impl.pipeline.PipelineRunImpl.getNodes(PipelineRunImpl.java:81) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.kohsuke.stapler.Function$InstanceFunction.invoke(Function.java:335) at org.kohsuke.stapler.MetaClass$3.doDispatch(MetaClass.java:197) at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:58) at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:746) ... 101 more As a test I created a multibranch pipeline test job that launches a secondary pipeline job (same structure as my failing job) - it did not have the same issue. So there is something subtle about it.
            Hide
            michaelneale Michael Neale added a comment -

            OK did some digging.

            The failure happens here:
            https://github.com/jenkinsci/workflow-api-plugin/blob/master/src/main/java/org/jenkinsci/plugins/workflow/actions/TimingAction.java#L45

            due to flowNode being null.

            The ternary expression https://github.com/jenkinsci/pipeline-graph-analysis-plugin/blob/master/src/main/java/org/jenkinsci/plugins/workflow/pipelinegraphanalysis/StatusAndTiming.java#L240

            does not guard against firstNode being null (I am not sure if the true/false is correct either, but can't comment on that). Clearly firstNode is null, and it is trying to find the timing for it.

            Show
            michaelneale Michael Neale added a comment - OK did some digging. The failure happens here: https://github.com/jenkinsci/workflow-api-plugin/blob/master/src/main/java/org/jenkinsci/plugins/workflow/actions/TimingAction.java#L45 due to flowNode being null. The ternary expression https://github.com/jenkinsci/pipeline-graph-analysis-plugin/blob/master/src/main/java/org/jenkinsci/plugins/workflow/pipelinegraphanalysis/StatusAndTiming.java#L240 does not guard against firstNode being null (I am not sure if the true/false is correct either, but can't comment on that). Clearly firstNode is null, and it is trying to find the timing for it.
            Show
            michaelneale Michael Neale added a comment - The root cause seems to be that "firstExecuted" is null: https://github.com/jenkinsci/blueocean-plugin/blob/master/blueocean-pipeline-api-impl/src/main/java/io/jenkins/blueocean/rest/impl/pipeline/PipelineNodeGraphVisitor.java#L201 in PipelineNodeGraphVisitor.
            Hide
            michaelneale Michael Neale added a comment -

            Vivek Pandey right there is a case where firstExecuted could be null, in fact there is a check for it:

                    TimingInfo times = StatusAndTiming.computeChunkTiming(run, chunk.getPauseTimeMillis(), firstExecuted, chunk.getLastNode(), chunk.getNodeAfter());
            
                    if(times == null){
                        times = new TimingInfo();
                    }
            
                    GenericStatus status = (firstExecuted == null) ? GenericStatus.NOT_EXECUTED :StatusAndTiming
                        .computeChunkStatus(run, chunk.getNodeBefore(), firstExecuted, chunk.getLastNode(), chunk.getNodeAfter());
            
            

            However this check happens after it is attempted to be used to get the timing. It shouldn't be called if null.

            Show
            michaelneale Michael Neale added a comment - Vivek Pandey right there is a case where firstExecuted could be null, in fact there is a check for it: TimingInfo times = StatusAndTiming.computeChunkTiming(run, chunk.getPauseTimeMillis(), firstExecuted, chunk.getLastNode(), chunk.getNodeAfter()); if(times == null){ times = new TimingInfo(); } GenericStatus status = (firstExecuted == null) ? GenericStatus.NOT_EXECUTED :StatusAndTiming .computeChunkStatus(run, chunk.getNodeBefore(), firstExecuted, chunk.getLastNode(), chunk.getNodeAfter()); However this check happens after it is attempted to be used to get the timing. It shouldn't be called if null.
            Hide
            bwalding Ben Walding added a comment -

            An empty stage triggers it

              stage("for the lulz") {
              
              }
            
            Show
            bwalding Ben Walding added a comment - An empty stage triggers it stage("for the lulz") { }
            Hide
            michaelneale Michael Neale added a comment -

            Have a potential fix incoming...

            Show
            michaelneale Michael Neale added a comment - Have a potential fix incoming...
            Show
            michaelneale Michael Neale added a comment - Fix pending: https://github.com/jenkinsci/blueocean-plugin/pull/581
            jamesdumay James Dumay made changes -
            Sprint indian [ 126 ]
            Assignee Vivek Pandey [ vivek ] Michael Neale [ michaelneale ]
            jamesdumay James Dumay made changes -
            Status Open [ 1 ] In Progress [ 3 ]
            jamesdumay James Dumay made changes -
            Status In Progress [ 3 ] In Review [ 10005 ]
            michaelneale Michael Neale made changes -
            Status In Review [ 10005 ] Resolved [ 5 ]
            Resolution Fixed [ 1 ]
            vivek Vivek Pandey made changes -
            Link This issue is duplicated by JENKINS-39683 [ JENKINS-39683 ]
            jbriden Jenn Briden made changes -
            Status Resolved [ 5 ] Closed [ 6 ]

              People

              • Assignee:
                michaelneale Michael Neale
                Reporter:
                michaelneale Michael Neale
              • Votes:
                0 Vote for this issue
                Watchers:
                3 Start watching this issue

                Dates

                • Created:
                  Updated:
                  Resolved: