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

Locked resources using the variable parameter do not get reset to the variable once released to another requester and only appear as null on subsequent locks

    • Icon: Bug Bug
    • Resolution: Fixed
    • Icon: Major Major
    • None
    •  lockable-resources 2.2

      I'm appearing to hit an issue where a released resource does not get an update on the environment variable once the lock is released.  See the following code (with only two resources available in the automation-accounts label)

       

      node {
        parallel (
          "p1": {
            lock(label: 'automation-accounts', variable: 'ACCOUNTS_VAR', quantity: 1) {
              echo "A $env.ACCOUNTS_VAR"
              sleep 4
                   }
          },
          "p2": {
            lock(label: 'automation-accounts', variable: 'ACCOUNTS_VAR', quantity: 1) {
              echo "B $env.ACCOUNTS_VAR"
              sleep 2
                   }
          },
          "p3": {
            lock(label: 'automation-accounts', variable: 'ACCOUNTS_VAR', quantity: 1) {
              echo "C $env.ACCOUNTS_VAR"
                   }
               }
        )
      }

       

      In the log I get the following (note "C null"):
      [Pipeline] {
      [Pipeline] parallel
      [Pipeline] [p1] { (Branch: p1)
      [Pipeline] [p2] { (Branch: p2)
      [Pipeline] [p3] { (Branch: p3)
      [Pipeline] [p1] lock
      [p1] Trying to acquire lock on [Label: automation-accounts, Quantity: 1]
      [p1] Lock acquired on [Label: automation-accounts, Quantity: 1]
      [Pipeline] [p1] {
      [Pipeline] [p2] lock
      [p2] Trying to acquire lock on [Label: automation-accounts, Quantity: 1]
      [p2] Lock acquired on [Label: automation-accounts, Quantity: 1]
      [Pipeline] [p2] {
      [Pipeline] [p3] lock
      [p3] Trying to acquire lock on [Label: automation-accounts, Quantity: 1]
      [p3] Found 0 available resource(s). Waiting for correct amount: 1.
      [p3] [Label: automation-accounts, Quantity: 1] is locked, waiting...
      [Pipeline] [p1] echo
      [p1] A <Account1>
      [Pipeline] [p1] sleep
      [p1] Sleeping for 4 sec
      [Pipeline] [p2] echo
      [p2] B <Account2>
      [Pipeline] [p2] sleep
      [p2] Sleeping for 2 sec
      [p3] Lock acquired on [Label: automation-accounts, Quantity: 1]
      [Pipeline] [p2] }
      [p2] Lock released on resource [Label: automation-accounts, Quantity: 1]
      [Pipeline] [p3] {
      [Pipeline] [p2] // lock
      [Pipeline] [p2] }
      [Pipeline] [p3] echo
      [p3] C null
      [Pipeline] [p3] }
      [p3] Lock released on resource [Label: automation-accounts, Quantity: 1]
      [Pipeline] [p3] // lock
      [Pipeline] [p3] }
      [Pipeline] [p1] }
      [p1] Lock released on resource [Label: automation-accounts, Quantity: 1]
      [Pipeline] [p1] // lock
      [Pipeline] [p1] }
      [Pipeline] // parallel
      [Pipeline] }
      [Pipeline] // node
      [Pipeline] End of Pipeline

      Expected Result:
      I should get "C <Account2>

      Perhaps I'm calling it wrong though?  It appears that the lock is being acquired BEFORE the resource is released though this might be just a logging complication of calling it in parallel

          [JENKINS-50176] Locked resources using the variable parameter do not get reset to the variable once released to another requester and only appear as null on subsequent locks

          Tom Skrainar added a comment -

          Observing the same issue as well.

          Tom Skrainar added a comment - Observing the same issue as well.

          Jan Kacik added a comment -

          We are experiencing the same issue. When you try to lock a resource and it has to wait in the queue for some time, then it will get null in the variable.

          Jan Kacik added a comment - We are experiencing the same issue. When you try to lock a resource and it has to wait in the queue for some time, then it will get null in the variable.

          Jeroen Bogers added a comment - - edited

          It seems that if the lock can be immediately granted, the variable is set. If waiting on the resource is needed it is not set.
          I suspect the error is on line 51 of src/main/java/org/jenkins/plugins/lockableresources/LockStepExecution.java

          The code there states:

           		LockableResourcesStruct resourceHolder = new LockableResourcesStruct(resources, step.label, step.quantity);
          

          I think this should have been (in accordance with the added LockableResourcesStruct on line 56 of src/main/java/org/jenkins/plugins/lockableresources/queue/LockableResourcesStruct.java):

           		LockableResourcesStruct resourceHolder = new LockableResourcesStruct(resources, step.label, step.quantity, step.variable);
          

          This is because if the lock is queued instead of granting the lock directly (with the variable as part of the 'lock' call, the resourceHolder is put on the queue.
          When the lock is then granted the variable name is looked up in the LockableResourcesStruct but it is not set and thus the environment variable will not be set.

          EDIT: A PR was already created by 'boblloyd' to fix this issue: https://github.com/jenkinsci/lockable-resources-plugin/pull/95

          Jeroen Bogers added a comment - - edited It seems that if the lock can be immediately granted, the variable is set. If waiting on the resource is needed it is not set. I suspect the error is on line 51 of src/main/java/org/jenkins/plugins/lockableresources/LockStepExecution.java The code there states: LockableResourcesStruct resourceHolder = new LockableResourcesStruct(resources, step.label, step.quantity); I think this should have been (in accordance with the added LockableResourcesStruct on line 56 of src/main/java/org/jenkins/plugins/lockableresources/queue/LockableResourcesStruct.java): LockableResourcesStruct resourceHolder = new LockableResourcesStruct(resources, step.label, step.quantity, step.variable); This is because if the lock is queued instead of granting the lock directly (with the variable as part of the 'lock' call, the resourceHolder is put on the queue. When the lock is then granted the variable name is looked up in the LockableResourcesStruct but it is not set and thus the environment variable will not be set. EDIT: A PR was already created by 'boblloyd' to fix this issue: https://github.com/jenkinsci/lockable-resources-plugin/pull/95

          Any update on this jbogers?  It looks like the fix is ready but some unit tests are blocking the ability to merge?  Any followup on why it would work in windows but not linux?

          Brandon Saunders added a comment - Any update on this jbogers ?  It looks like the fix is ready but some unit tests are blocking the ability to merge?  Any followup on why it would work in windows but not linux?

          Jeroen Bogers added a comment - - edited

          avidviewer, sadly I have no follow up to offer on this. I'm not the owner of the pull request and have no special access.

          To me it seems the build failure is just a random failure on the build server (it encountered a timeout were I would expect none). I have built the plugin locally (on Linux) and ran the same tests without any problems.
          Since then I have taken that own build and installed it in my Jenkins instead as my team was being blocked by the issue. It has been running without issue for a few days now.

          It is up to amuniz now to take the patch boblloyd provided and move forward with it.

          Jeroen Bogers added a comment - - edited avidviewer , sadly I have no follow up to offer on this. I'm not the owner of the pull request and have no special access. To me it seems the build failure is just a random failure on the build server (it encountered a timeout were I would expect none). I have built the plugin locally (on Linux) and ran the same tests without any problems. Since then I have taken that own build and installed it in my Jenkins instead as my team was being blocked by the issue. It has been running without issue for a few days now. It is up to amuniz now to take the patch boblloyd provided and move forward with it.

          Curt Coleman added a comment -

          amuniz, is there anything you can do on your end to get this fix (PR-95) pushed through (assuming you agree with the changes)?

          Curt Coleman added a comment - amuniz , is there anything you can do on your end to get this fix ( PR-95 ) pushed through (assuming you agree with the changes)?

          Jeroen Bogers added a comment -

          Issue is also solved in PR #87 which has already been merged to master. Waiting for next release now.

          Jeroen Bogers added a comment - Issue is also solved in PR #87 which has already been merged to master. Waiting for next release now.

          Any idea, When is this planned for release  ?

          Anthuwan Makimaidass added a comment - Any idea, When is this planned for release  ?

          vikash srivastava added a comment - - edited

          can somebody please clarify if the changes are merged to master?

          i still see below struct not updated with variable name.

           

          resourceHolderList.add(new LockableResourcesStruct(resources, resource.label, resource.quantity));

           

          my local changes.

           

          resourceHolderList.add(new LockableResourcesStruct(resources, resource.label, resource.quantity,step.variable,step.node));

          vikash srivastava added a comment - - edited can somebody please clarify if the changes are merged to master? i still see below struct not updated with variable name.   resourceHolderList.add(new LockableResourcesStruct(resources, resource.label, resource.quantity));   my local changes.   resourceHolderList.add(new LockableResourcesStruct(resources, resource.label, resource.quantity,step.variable,step.node));

          Jagadeesh Inugunti added a comment - - edited

          jbogers  We are still seeing this issue with lockable resource plugin 

           

          Please let us know if someone is working/looking into this issue , it will be really helpful if this gets resolved .

          Jagadeesh Inugunti added a comment - - edited jbogers   We are still seeing this issue with lockable resource plugin    Please let us know if someone is working/looking into this issue , it will be really helpful if this gets resolved .

          Stefan Rystedt added a comment - - edited

          I have created PR#117 which should solve this issue. My way of solving it is a little bit cleaner according to my  opinion. But then I have not done any Jenkins plugin development until I did this fix. It can be merged as is thought.

          Stefan Rystedt added a comment - - edited I have created PR#117 which should solve this issue. My way of solving it is a little bit cleaner according to my  opinion. But then I have not done any Jenkins plugin development until I did this fix. It can be merged as is thought.

          Steven Foster added a comment -

          ryz's PR also fixes JENKINS-54541

          Steven Foster added a comment - ryz 's PR also fixes  JENKINS-54541

          Niels Wegner added a comment -

          stevenfoster Thanks for that info. This will get us around stuck pipelines when freeing reservations

          Niels Wegner added a comment - stevenfoster Thanks for that info. This will get us around stuck pipelines when freeing reservations

          Adrian Constantin added a comment - - edited

          Dose anybody know if the Lockable Resource plugin is still active?

          Adrian Constantin added a comment - - edited Dose anybody know if the Lockable Resource plugin is still active?

          yes its active ,see some bug fixes going in , we use it for our CI pipeline in validation stage. 

          vikash srivastava added a comment - yes its active ,see some bug fixes going in , we use it for our CI pipeline in validation stage. 

          vikashks the reason for my question is that since June 2018 I could only see a security fix released in March and one bug fixed in Jan. And all pull requests, except one, have failed the CI build after the last release: https://github.com/jenkinsci/lockable-resources-plugin/pulls

          I have also browsed 5-6 PRs in the list above, and they all seem to be waiting for comments or actions from maintainers for a few months, including the PR that fixes this issue.

          Adrian Constantin added a comment - vikashks the reason for my question is that since June 2018 I could only see a security fix released in March and one bug fixed in Jan. And all pull requests, except one, have failed the CI build after the last release:  https://github.com/jenkinsci/lockable-resources-plugin/pulls I have also browsed 5-6 PRs in the list above, and they all seem to be waiting for comments or actions from maintainers for a few months, including the PR that fixes this issue.

          Carlos Garcia added a comment -

          The same issue is reproduced in my environment. Does anybody know if there is a feasible solution? Is there any release planned to address this issue?

          Carlos Garcia added a comment - The same issue is reproduced in my environment. Does anybody know if there is a feasible solution? Is there any release planned to address this issue?

          There is a workaround (of sorts) which we deployed in our environment (we are using a declarative pipeline): put a loop around the lock statement which breaks out only once the variable is set successfully. It means you lose the FIFO property, and occasionally it can deadlock if there are a lot of waiters, but in a low-contention case the waiter will loop and on the second iteration the lock will be free so it will get it and set the variable.

          Christopher Head added a comment - There is a workaround (of sorts) which we deployed in our environment (we are using a declarative pipeline): put a loop around the lock statement which breaks out only once the variable is set successfully. It means you lose the FIFO property, and occasionally it can deadlock if there are a lot of waiters, but in a low-contention case the waiter will loop and on the second iteration the lock will be free so it will get it and set the variable.

          vikash srivastava added a comment - - edited

          vikash srivastava added a comment - - edited Below changeset is fixing this issue. https://github.com/jenkinsci/lockable-resources-plugin/pull/117/files/2802f118e7957429d0664d24584343b94ba5d51f  

            tgr Tobias Gruetzmacher
            avidviewer Brandon Saunders
            Votes:
            26 Vote for this issue
            Watchers:
            28 Start watching this issue

              Created:
              Updated:
              Resolved: