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

Accessing unset global variable cause master to hang

      If I have a global lib file vars/config.groovy like this:

      def getFoo()  { return this.foo }
      
      def setFoo(String value) {
          if (this.foo == null) {
              this.foo = value
          } else {
              logImmutableWarning('foo', this.foo, value)
          }
      }
      

      and I call

      echo config.foo
      

      my Jenkins master hangs with 100% CPU.

      If I call

      config.foo = 'bar'
      echo config.foo
      

      it works fine.

      Note that it's impossible to kill the job properly and that CPU is still 100% and a thread is still available even after klicking links in build log.

      Aborted by N N
      Click here to forcibly terminate running steps
      Click here to forcibly kill entire build
      

      Only way I know to fix this is to restart master.

      I do not think the extra setter logic is responsible for this.

      I updated this issue because the problem was bigger than I understood at first.

      Original issue

      Reading global variable in own file cause stack overflow

      In have a file in the pipeline global functions (vars/) that has properties. I want to have a default value. But this implementation:

      def getSomething() { return this.something ?: 'somethingDefaultValue' }
      

      leads to Jenkins master taking 100% CPU and hanging in what I believe is a stack overflow error. But it's very hard to get any info from logs or thread dumps.

      Trying to fix this followng the standard groovy way and adding:

      String something
      

      does not help.

          [JENKINS-38021] Accessing unset global variable cause master to hang

          Marcus Philip created issue -
          Marcus Philip made changes -
          Summary Original: Reading global variable in own file cause stack overflow New: Accessing unset global variable cause stack overflow
          Marcus Philip made changes -
          Description Original: In have a file in the pipeline global functions (vars/) that has properties. I want to have a default value. But this implementation:
          {code:java}
          def getSomething() { return this.something ?: 'somethingDefaultValue' }
          {code}
          leads to Jenkins master taking 100% CPU and hanging in what I believe is a stack overflow error. But it's very hard to get any info from logs or thread dumps.

          Trying to fix this followng the standard groovy way and adding:
          {code:java}
          String something
          {code}
          does not help.
          New:
          Original Reading global variable in own file cause stack overflow
          In have a file in the pipeline global functions (vars/) that has properties. I want to have a default value. But this implementation:
          {code:java}
          def getSomething() { return this.something ?: 'somethingDefaultValue' }
          {code}
          leads to Jenkins master taking 100% CPU and hanging in what I believe is a stack overflow error. But it's very hard to get any info from logs or thread dumps.

          Trying to fix this followng the standard groovy way and adding:
          {code:java}
          String something
          {code}
          does not help.
          Marcus Philip made changes -
          Description Original:
          Original Reading global variable in own file cause stack overflow
          In have a file in the pipeline global functions (vars/) that has properties. I want to have a default value. But this implementation:
          {code:java}
          def getSomething() { return this.something ?: 'somethingDefaultValue' }
          {code}
          leads to Jenkins master taking 100% CPU and hanging in what I believe is a stack overflow error. But it's very hard to get any info from logs or thread dumps.

          Trying to fix this followng the standard groovy way and adding:
          {code:java}
          String something
          {code}
          does not help.
          New: If I have a global lib file /vars/config.groovy like this:
          {code:java}
          def getFoo() { return this.foo }
          {code}
          and I call
          {code:java}
          echo config.foo
          {code}
          my Jenkins master hangs with 100% CPU.

          If I call
          {code:java}
          config.foo = 'bar'
          echo config.foo
          {code}
          it works fine.

          Note that it's impossible to kill the job properly and that CPU is still 100% and a thread is still available even after klicking links in build log.
          {code}
          Aborted by N N
          Click here to forcibly terminate running steps
          Click here to forcibly kill entire build
          {code}
          Only way I know to fix this is to restart master.

          _I updated this issue because the problem was bigger than I understood at first._

          h4. Original issue
          h5. Reading global variable in own file cause stack overflow
          In have a file in the pipeline global functions (vars/) that has properties. I want to have a default value. But this implementation:
          {code:java}
          def getSomething() { return this.something ?: 'somethingDefaultValue' }
          {code}
          leads to Jenkins master taking 100% CPU and hanging in what I believe is a stack overflow error. But it's very hard to get any info from logs or thread dumps.

          Trying to fix this followng the standard groovy way and adding:
          {code:java}
          String something
          {code}
          does not help.
          Marcus Philip made changes -
          Description Original: If I have a global lib file /vars/config.groovy like this:
          {code:java}
          def getFoo() { return this.foo }
          {code}
          and I call
          {code:java}
          echo config.foo
          {code}
          my Jenkins master hangs with 100% CPU.

          If I call
          {code:java}
          config.foo = 'bar'
          echo config.foo
          {code}
          it works fine.

          Note that it's impossible to kill the job properly and that CPU is still 100% and a thread is still available even after klicking links in build log.
          {code}
          Aborted by N N
          Click here to forcibly terminate running steps
          Click here to forcibly kill entire build
          {code}
          Only way I know to fix this is to restart master.

          _I updated this issue because the problem was bigger than I understood at first._

          h4. Original issue
          h5. Reading global variable in own file cause stack overflow
          In have a file in the pipeline global functions (vars/) that has properties. I want to have a default value. But this implementation:
          {code:java}
          def getSomething() { return this.something ?: 'somethingDefaultValue' }
          {code}
          leads to Jenkins master taking 100% CPU and hanging in what I believe is a stack overflow error. But it's very hard to get any info from logs or thread dumps.

          Trying to fix this followng the standard groovy way and adding:
          {code:java}
          String something
          {code}
          does not help.
          New: If I have a global lib file /vars/config.groovy like this:
          {code:java}
          def getFoo() { return this.foo }

          def setFoo(String value) {
              if (this.foo == null) {
                  this.foo = value
              } else {
                  logImmutableWarning('foo', this.foo, value)
              }
          }
          {code}
          and I call
          {code:java}
          echo config.foo
          {code}
          my Jenkins master hangs with 100% CPU.

          If I call
          {code:java}
          config.foo = 'bar'
          echo config.foo
          {code}
          it works fine.

          Note that it's impossible to kill the job properly and that CPU is still 100% and a thread is still available even after klicking links in build log.
          {code}
          Aborted by N N
          Click here to forcibly terminate running steps
          Click here to forcibly kill entire build
          {code}
          Only way I know to fix this is to restart master.

          I do not think the extra setter logic is repsonsible for this.

          _I updated this issue because the problem was bigger than I understood at first._

          h4. Original issue
          h5. Reading global variable in own file cause stack overflow
          In have a file in the pipeline global functions (vars/) that has properties. I want to have a default value. But this implementation:
          {code:java}
          def getSomething() { return this.something ?: 'somethingDefaultValue' }
          {code}
          leads to Jenkins master taking 100% CPU and hanging in what I believe is a stack overflow error. But it's very hard to get any info from logs or thread dumps.

          Trying to fix this followng the standard groovy way and adding:
          {code:java}
          String something
          {code}
          does not help.
          Marcus Philip made changes -
          Description Original: If I have a global lib file /vars/config.groovy like this:
          {code:java}
          def getFoo() { return this.foo }

          def setFoo(String value) {
              if (this.foo == null) {
                  this.foo = value
              } else {
                  logImmutableWarning('foo', this.foo, value)
              }
          }
          {code}
          and I call
          {code:java}
          echo config.foo
          {code}
          my Jenkins master hangs with 100% CPU.

          If I call
          {code:java}
          config.foo = 'bar'
          echo config.foo
          {code}
          it works fine.

          Note that it's impossible to kill the job properly and that CPU is still 100% and a thread is still available even after klicking links in build log.
          {code}
          Aborted by N N
          Click here to forcibly terminate running steps
          Click here to forcibly kill entire build
          {code}
          Only way I know to fix this is to restart master.

          I do not think the extra setter logic is repsonsible for this.

          _I updated this issue because the problem was bigger than I understood at first._

          h4. Original issue
          h5. Reading global variable in own file cause stack overflow
          In have a file in the pipeline global functions (vars/) that has properties. I want to have a default value. But this implementation:
          {code:java}
          def getSomething() { return this.something ?: 'somethingDefaultValue' }
          {code}
          leads to Jenkins master taking 100% CPU and hanging in what I believe is a stack overflow error. But it's very hard to get any info from logs or thread dumps.

          Trying to fix this followng the standard groovy way and adding:
          {code:java}
          String something
          {code}
          does not help.
          New: If I have a global lib file /vars/config.groovy like this:
          {code:java}
          def getFoo() { return this.foo }

          def setFoo(String value) {
              if (this.foo == null) {
                  this.foo = value
              } else {
                  logImmutableWarning('foo', this.foo, value)
              }
          }
          {code}
          and I call
          {code:java}
          echo config.foo
          {code}
          my Jenkins master hangs with 100% CPU.

          If I call
          {code:java}
          config.foo = 'bar'
          echo config.foo
          {code}
          it works fine.

          Note that it's impossible to kill the job properly and that CPU is still 100% and a thread is still available even after klicking links in build log.
          {code}
          Aborted by N N
          Click here to forcibly terminate running steps
          Click here to forcibly kill entire build
          {code}
          Only way I know to fix this is to restart master.

          I do not think the extra setter logic is responsible for this.

          _I updated this issue because the problem was bigger than I understood at first._

          h4. Original issue
          h5. Reading global variable in own file cause stack overflow
          In have a file in the pipeline global functions (vars/) that has properties. I want to have a default value. But this implementation:
          {code:java}
          def getSomething() { return this.something ?: 'somethingDefaultValue' }
          {code}
          leads to Jenkins master taking 100% CPU and hanging in what I believe is a stack overflow error. But it's very hard to get any info from logs or thread dumps.

          Trying to fix this followng the standard groovy way and adding:
          {code:java}
          String something
          {code}
          does not help.
          Marcus Philip made changes -
          Priority Original: Minor [ 4 ] New: Critical [ 2 ]
          Marcus Philip made changes -
          Environment New: Pipeline Shared Groovy Libraries Plugin - 2.2 (=latest)
          Marcus Philip made changes -
          Link New: This issue relates to JENKINS-34416 [ JENKINS-34416 ]
          Marcus Philip made changes -
          Description Original: If I have a global lib file /vars/config.groovy like this:
          {code:java}
          def getFoo() { return this.foo }

          def setFoo(String value) {
              if (this.foo == null) {
                  this.foo = value
              } else {
                  logImmutableWarning('foo', this.foo, value)
              }
          }
          {code}
          and I call
          {code:java}
          echo config.foo
          {code}
          my Jenkins master hangs with 100% CPU.

          If I call
          {code:java}
          config.foo = 'bar'
          echo config.foo
          {code}
          it works fine.

          Note that it's impossible to kill the job properly and that CPU is still 100% and a thread is still available even after klicking links in build log.
          {code}
          Aborted by N N
          Click here to forcibly terminate running steps
          Click here to forcibly kill entire build
          {code}
          Only way I know to fix this is to restart master.

          I do not think the extra setter logic is responsible for this.

          _I updated this issue because the problem was bigger than I understood at first._

          h4. Original issue
          h5. Reading global variable in own file cause stack overflow
          In have a file in the pipeline global functions (vars/) that has properties. I want to have a default value. But this implementation:
          {code:java}
          def getSomething() { return this.something ?: 'somethingDefaultValue' }
          {code}
          leads to Jenkins master taking 100% CPU and hanging in what I believe is a stack overflow error. But it's very hard to get any info from logs or thread dumps.

          Trying to fix this followng the standard groovy way and adding:
          {code:java}
          String something
          {code}
          does not help.
          New: If I have a global lib file vars/config.groovy like this:
          {code:java}
          def getFoo() { return this.foo }

          def setFoo(String value) {
              if (this.foo == null) {
                  this.foo = value
              } else {
                  logImmutableWarning('foo', this.foo, value)
              }
          }
          {code}
          and I call
          {code:java}
          echo config.foo
          {code}
          my Jenkins master hangs with 100% CPU.

          If I call
          {code:java}
          config.foo = 'bar'
          echo config.foo
          {code}
          it works fine.

          Note that it's impossible to kill the job properly and that CPU is still 100% and a thread is still available even after klicking links in build log.
          {code}
          Aborted by N N
          Click here to forcibly terminate running steps
          Click here to forcibly kill entire build
          {code}
          Only way I know to fix this is to restart master.

          I do not think the extra setter logic is responsible for this.

          _I updated this issue because the problem was bigger than I understood at first._

          h4. Original issue
          h5. Reading global variable in own file cause stack overflow
          In have a file in the pipeline global functions (vars/) that has properties. I want to have a default value. But this implementation:
          {code:java}
          def getSomething() { return this.something ?: 'somethingDefaultValue' }
          {code}
          leads to Jenkins master taking 100% CPU and hanging in what I believe is a stack overflow error. But it's very hard to get any info from logs or thread dumps.

          Trying to fix this followng the standard groovy way and adding:
          {code:java}
          String something
          {code}
          does not help.
          Marcus Philip made changes -
          Summary Original: Accessing unset global variable cause stack overflow New: Accessing unset global variable cause master to hang

            jglick Jesse Glick
            marcus_phi Marcus Philip
            Votes:
            0 Vote for this issue
            Watchers:
            5 Start watching this issue

              Created:
              Updated:
              Resolved: