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

NPE in Slave.createLauncher() for Matrix and Pipeline jobs

    • Icon: Bug Bug
    • Resolution: Duplicate
    • Icon: Major Major
    • core
    • Jenkins ver. 1.566m Java 7u25, Windows Server 2008 master, Debian & Ubuntu slaves
    • Jenkins 2.60.3

      Jenkins failed some test on 2 configurations out of a 5-configuration matrix build, with the other 3 builds completing normally. Both failed slaves leave no additional information for diagnosing the root cause:

      13:49:24 Started by upstream project "fast-tests" build number 920
      13:49:24 originally caused by:
      13:49:24  Started by user User
      13:49:24 FATAL: null
      13:49:24 java.lang.NullPointerException
      13:49:24 	at hudson.model.Slave.createLauncher(Slave.java:359)
      13:49:24 	at hudson.model.AbstractBuild$AbstractBuildExecution.createLauncher(AbstractBuild.java:559)
      13:49:24 	at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:476)
      13:49:24 	at hudson.model.Run.execute(Run.java:1710)
      13:49:24 	at hudson.matrix.MatrixRun.run(MatrixRun.java:146)
      13:49:24 	at hudson.model.ResourceController.execute(ResourceController.java:88)
      13:49:24 	at hudson.model.Executor.run(Executor.java:231)
      

      JENKINS-21999 seemed to be a similar issue but the line numbers have changed and that issue was fixed, whereas this issue still occurs.

          [JENKINS-23305] NPE in Slave.createLauncher() for Matrix and Pipeline jobs

          Oleg Nenashev added a comment -

          Are you sure that you use 1.566?
          I don't see any NPE chance in https://github.com/jenkinsci/jenkins/blob/jenkins-1.566/core/src/main/java/hudson/model/Slave.java

           
          353:   public Launcher createLauncher(TaskListener listener) {
          354:        SlaveComputer c = getComputer();
          355:        if (c == null) {
          356:            listener.error("Issue with creating launcher for slave " + name + ".");
          357:            return new Launcher.DummyLauncher(listener);
          358:        } else {
          359:            return new RemoteLauncher(listener, c.getChannel(), c.isUnix()).decorateFor(this);
          360:        }
          361:    }
          

          Oleg Nenashev added a comment - Are you sure that you use 1.566? I don't see any NPE chance in https://github.com/jenkinsci/jenkins/blob/jenkins-1.566/core/src/main/java/hudson/model/Slave.java 353: public Launcher createLauncher(TaskListener listener) { 354: SlaveComputer c = getComputer(); 355: if (c == null) { 356: listener.error("Issue with creating launcher for slave " + name + "."); 357: return new Launcher.DummyLauncher(listener); 358: } else { 359: return new RemoteLauncher(listener, c.getChannel(), c.isUnix()).decorateFor(this); 360: } 361: }

          trejkaz added a comment - - edited

          Definitely using 1.566 (assuming the version shown at the bottom of the page is accurate!), but I agree, if that's the code running in 1.566, I don't see where there can be an NPE, unless there is some unboxing going on which is not evident by seeing just that fragment.

          trejkaz added a comment - - edited Definitely using 1.566 (assuming the version shown at the bottom of the page is accurate!), but I agree, if that's the code running in 1.566, I don't see where there can be an NPE, unless there is some unboxing going on which is not evident by seeing just that fragment.

          trejkaz added a comment -

          Well hey, how about that.

              /**
               * True if this computer is a Unix machine (as opposed to Windows machine).
               *
               * @return
               *      null if the computer is disconnected and therefore we don't know whether it is Unix or not.
               */
              public Boolean isUnix() {
                  return isUnix;
              }
          

          trejkaz added a comment - Well hey, how about that. /** * True if this computer is a Unix machine (as opposed to Windows machine). * * @ return * null if the computer is disconnected and therefore we don't know whether it is Unix or not. */ public Boolean isUnix() { return isUnix; }

          Daniel Beck added a comment -

          … and the constructor takes only a boolean.

          Daniel Beck added a comment - … and the constructor takes only a boolean .

          Oleg Nenashev added a comment -

          Sorry, I've missed the previous message...
          trejkaz is right. The implicit unboxing of null Boolean values throws NPE according to Java specs.

          Oleg Nenashev added a comment - Sorry, I've missed the previous message... trejkaz is right. The implicit unboxing of null Boolean values throws NPE according to Java specs.

          Daniel Beck added a comment -

          It's weird how a job can be scheduled for a node before it could be determined whether it's Unix.

          Daniel Beck added a comment - It's weird how a job can be scheduled for a node before it could be determined whether it's Unix.

          trejkaz added a comment - - edited

          My guess would be that despite isUnix being set in a synchronized{} block, isUnix() is not synchronised, so a second thread getting the value might be getting an out of date value.

          trejkaz added a comment - - edited My guess would be that despite isUnix being set in a synchronized{} block, isUnix() is not synchronised, so a second thread getting the value might be getting an out of date value.

          Oleg Nenashev added a comment -

          Another stacktrace for Jenkins Pipeline:

          java.lang.NullPointerException 
          at hudson.model.Slave.createLauncher(Slave.java:417) 
          at org.jenkinsci.plugins.workflow.support.DefaultStepContext.makeLauncher(DefaultStepContext.java:112) 
          at org.jenkinsci.plugins.workflow.support.DefaultStepContext.get(DefaultStepContext.java:68) 
          at org.jenkinsci.plugins.workflow.steps.StepDescriptor.checkContextAvailability(StepDescriptor.java:251) 
          at org.jenkinsci.plugins.workflow.cps.DSL.invokeStep(DSL.java:179) 
          at org.jenkinsci.plugins.workflow.cps.DSL.invokeMethod(DSL.java:126) 
          at org.jenkinsci.plugins.workflow.cps.CpsScript.invokeMethod(CpsScript.java:108) 
          at groovy.lang.GroovyObject$invokeMethod.call(Unknown Source)
          

          Oleg Nenashev added a comment - Another stacktrace for Jenkins Pipeline: java.lang.NullPointerException at hudson.model.Slave.createLauncher(Slave.java:417) at org.jenkinsci.plugins.workflow.support.DefaultStepContext.makeLauncher(DefaultStepContext.java:112) at org.jenkinsci.plugins.workflow.support.DefaultStepContext.get(DefaultStepContext.java:68) at org.jenkinsci.plugins.workflow.steps.StepDescriptor.checkContextAvailability(StepDescriptor.java:251) at org.jenkinsci.plugins.workflow.cps.DSL.invokeStep(DSL.java:179) at org.jenkinsci.plugins.workflow.cps.DSL.invokeMethod(DSL.java:126) at org.jenkinsci.plugins.workflow.cps.CpsScript.invokeMethod(CpsScript.java:108) at groovy.lang.GroovyObject$invokeMethod.call(Unknown Source)

          Jesse Glick added a comment -

          Duplicated by JENKINS-38527 perhaps?

          Jesse Glick added a comment - Duplicated by  JENKINS-38527 perhaps?

          Oleg Nenashev added a comment -

          Likely

          Oleg Nenashev added a comment - Likely

            oleg_nenashev Oleg Nenashev
            trejkaz trejkaz
            Votes:
            2 Vote for this issue
            Watchers:
            6 Start watching this issue

              Created:
              Updated:
              Resolved: