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

local variable in parallel threads behaves like global variables

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Not A Defect
    • Icon: Minor Minor
    • pipeline
    • None

      running this pipeline:

      def do_i(p) {
      return {
      echo "$p"
      for (i = 0; i < 10; i++)

      { echo "i: $i" }

      }
      }

      stage('i'){
      parallel(
      "x" : do_i('xx'),
      "y" : do_i('yy')
      )
      }

      produces this output:
      [Pipeline] stage
      [Pipeline] {
      [Pipeline] parallel
      [Pipeline] [x] { (Branch: x)
      [Pipeline] [y]

      { (Branch: y) [Pipeline] [x] echo [x] xx [Pipeline] [y] echo [y] yy [Pipeline] [x] echo [x] i: 0 [Pipeline] [y] echo [y] i: 1 [Pipeline] [x] echo [x] i: 2 [Pipeline] [y] echo [y] i: 3 [Pipeline] [x] echo [x] i: 4 [Pipeline] [y] echo [y] i: 5 [Pipeline] [x] echo [x] i: 6 [Pipeline] [y] echo [y] i: 7 [Pipeline] [x] echo [x] i: 8 [Pipeline] [y] echo [y] i: 9 [Pipeline] [y] }

      [Pipeline] [x] echo
      [x] i: 10
      [Pipeline] [x] }
      [Pipeline] // parallel
      [Pipeline] }
      [Pipeline] // stage
      [Pipeline] End of Pipeline

      Note how i is incremented as if both threads were referring to the same variable i.
      If I modify the for loop to: for (int i = 0; i < 10; i++)
      then it works as I expect, where each thread has its own i variable:

      [Pipeline] stage
      [Pipeline] {
      [Pipeline] parallel
      [Pipeline] [x] { (Branch: x)
      [Pipeline] [y]

      { (Branch: y) [Pipeline] [x] echo [x] xx [Pipeline] [y] echo [y] yy [Pipeline] [x] echo [x] i: 0 [Pipeline] [y] echo [y] i: 0 [Pipeline] [x] echo [x] i: 1 [Pipeline] [y] echo [y] i: 1 [Pipeline] [x] echo [x] i: 2 [Pipeline] [y] echo [y] i: 2 [Pipeline] [x] echo [x] i: 3 [Pipeline] [y] echo [y] i: 3 [Pipeline] [x] echo [x] i: 4 [Pipeline] [y] echo [y] i: 4 [Pipeline] [x] echo [x] i: 5 [Pipeline] [y] echo [y] i: 5 [Pipeline] [x] echo [x] i: 6 [Pipeline] [y] echo [y] i: 6 [Pipeline] [x] echo [x] i: 7 [Pipeline] [y] echo [y] i: 7 [Pipeline] [x] echo [x] i: 8 [Pipeline] [y] echo [y] i: 8 [Pipeline] [x] echo [x] i: 9 [Pipeline] [x] }

      [Pipeline] [y] echo
      [y] i: 9
      [Pipeline] [y] }
      [Pipeline] // parallel
      [Pipeline] }
      [Pipeline] // stage
      [Pipeline] End of Pipeline

            Unassigned Unassigned
            kudangun Shai Kubitsky
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated:
              Resolved: