jenkinsci / lockable-resources-plugin

Lock resources against concurrent use
https://plugins.jenkins.io/lockable-resources
MIT License
87 stars 185 forks source link

Duplication of resource reservation #549

Open oleg-kondaurov opened 1 year ago

oleg-kondaurov commented 1 year ago

Jenkins and plugins versions report

Environment ```text Jenkins: 2.396 OS: Linux - 5.9.0-0.bpo.5-amd64 Java: 11.0.18 - Eclipse Adoptium (OpenJDK 64-Bit Server VM) --- ace-editor:1.1 allure-jenkins-plugin:2.30.3 ansicolor:1.0.2 ant:481.v7b_09e538fcca antisamy-markup-formatter:159.v25b_c67cd35fb_ apache-httpcomponents-client-4-api:4.5.14-150.v7a_b_9d17134a_5 authentication-tokens:1.4 blueocean:1.27.3 blueocean-autofavorite:1.2.5 blueocean-bitbucket-pipeline:1.27.3 blueocean-commons:1.27.3 blueocean-config:1.27.3 blueocean-core-js:1.27.3 blueocean-dashboard:1.27.3 blueocean-display-url:2.4.1 blueocean-events:1.27.3 blueocean-git-pipeline:1.27.3 blueocean-github-pipeline:1.27.3 blueocean-i18n:1.27.3 blueocean-jwt:1.27.3 blueocean-personalization:1.27.3 blueocean-pipeline-api-impl:1.27.3 blueocean-pipeline-editor:1.27.3 blueocean-pipeline-scm-api:1.27.3 blueocean-rest:1.27.3 blueocean-rest-impl:1.27.3 blueocean-web:1.27.3 bootstrap4-api:4.6.0-5 bootstrap5-api:5.2.2-2 bouncycastle-api:2.27 branch-api:2.1071.v1a_188a_562481 build-timeout:1.28 build-token-root:151.va_e52fe3215fc caffeine-api:2.9.3-65.v6a_47d0f4d1fe checks-api:2.0.0 cloudbees-bitbucket-branch-source:800.va_b_b_9a_a_5035c1 cloudbees-folder:6.815.v0dd5a_cb_40e0e command-launcher:90.v669d7ccb_7c31 commons-lang3-api:3.12.0-36.vd97de6465d5b_ commons-text-api:1.10.0-36.vc008c8fcda_7b_ conditional-buildstep:1.4.2 copyartifact:686.v6fd37018d7c2 credentials:1224.vc23ca_a_9a_2cb_0 credentials-binding:523.vd859a_4b_122e6 dark-theme:315.va_22e7d692ea_a data-tables-api:1.13.3-3 display-url-api:2.3.7 docker-commons:419.v8e3cd84ef49c docker-workflow:563.vd5d2e5c4007f durable-task:504.vb10d1ae5ba2f echarts-api:5.4.0-3 email-ext:2.95 envfile:43.v2644436e7d71 envinject-api:1.199.v3ce31253ed13 extensible-choice-parameter:1.8.0 external-monitor-job:203.v683c09d993b_9 favorite:2.4.1 file-operations:1.11 font-awesome-api:6.3.0-2 git:5.0.0 git-client:4.2.0 git-server:99.va_0826a_b_cdfa_d github:1.37.0 github-api:1.303-417.ve35d9dd78549 github-branch-source:1703.vd5a_2b_29c6cdc github-oauth:0.39 google-login:1.7 gradle:2.3.2 greenballs:1.15.1 handlebars:3.0.8 handy-uri-templates-2-api:2.1.8-22.v77d5b_75e6953 htmlpublisher:1.31 instance-identity:142.v04572ca_5b_265 ionicons-api:45.vf54fca_5d2154 jackson2-api:2.14.2-319.v37853346a_229 jakarta-activation-api:2.0.1-3 jakarta-mail-api:2.0.1-3 javadoc:226.v71211feb_e7e9 javax-activation-api:1.2.0-6 javax-mail-api:1.6.2-9 jaxb:2.3.8-1 jdk-tool:63.v62d2fd4b_4793 jenkins-design-language:1.27.3 jjwt-api:0.11.5-77.v646c772fddb_0 jnr-posix-api:3.1.16-2 jobConfigHistory:1207.vd28a_54732f92 jquery-detached:1.2.1 jquery3-api:3.6.4-1 jsch:0.1.55.61.va_e9ee26616e7 junit:1189.v1b_e593637fa_e ldap:671.v2a_9192a_7419d lockable-resources:1150.v59db_2b_994618 mailer:448.v5b_97805e3767 mapdb-api:1.0.9-28.vf251ce40855d matrix-auth:3.1.6 matrix-project:789.v57a_725b_63c79 maven-plugin:3.21 mina-sshd-api-common:2.9.2-62.v199162f0a_2f8 mina-sshd-api-core:2.9.2-62.v199162f0a_2f8 momentjs:1.1.1 monitoring:1.92.0 okhttp-api:4.10.0-132.v7a_7b_91cef39c pam-auth:1.10 parameterized-trigger:2.45 pipeline-build-step:487.va_823138eee8b_ pipeline-config-history:1.6 pipeline-github-lib:42.v0739460cda_c4 pipeline-graph-analysis:202.va_d268e64deb_3 pipeline-groovy-lib:629.vb_5627b_ee2104 pipeline-input-step:466.v6d0a_5df34f81 pipeline-milestone-step:111.v449306f708b_7 pipeline-model-api:2.2125.vddb_a_44a_d605e pipeline-model-definition:2.2125.vddb_a_44a_d605e pipeline-model-extensions:2.2125.vddb_a_44a_d605e pipeline-rest-api:2.32 pipeline-stage-step:305.ve96d0205c1c6 pipeline-stage-tags-metadata:2.2125.vddb_a_44a_d605e pipeline-stage-view:2.32 pipeline-utility-steps:2.15.1 plain-credentials:143.v1b_df8b_d3b_e48 plugin-util-api:3.2.0 popper-api:1.16.1-3 popper2-api:2.11.6-2 pubsub-light:1.17 pyenv-pipeline:2.1.2 rebuild:1.34 resource-disposer:0.21 run-condition:1.5 saferestart:0.7 scm-api:631.v9143df5b_e4a_a script-security:1244.ve463715a_f89c simple-theme-plugin:146.v0e67db_a_9052e slack:631.v40deea_40323b snakeyaml-api:1.33-95.va_b_a_e3e47b_fa_4 sse-gateway:1.26 ssh-agent:327.v230ecd01f86f ssh-credentials:305.v8f4381501156 ssh-slaves:2.877.v365f5eb_a_b_eec sshd:3.275.v9e17c10f2571 structs:324.va_f5d6774f3a_d subversion:2.17.1 theme-manager:1.6 throttle-concurrents:2.12 timestamper:1.23 token-macro:321.vd7cc1f2a_52c8 trilead-api:2.84.v72119de229b_7 uno-choice:2.6.4 variant:59.vf075fe829ccb windows-slaves:1.8.1 workflow-aggregator:596.v8c21c963d92d workflow-api:1208.v0cc7c6e0da_9e workflow-basic-steps:1010.vf7a_b_98e847c1 workflow-cps:3651.ve2e99a_4f4a_e5 workflow-durable-task-step:1241.v1a_63e465f943 workflow-job:1289.vd1c337fd5354 workflow-multibranch:733.v109046189126 workflow-scm-step:408.v7d5b_135a_b_d49 workflow-step-api:639.v6eca_cd8c04a_a_ workflow-support:839.v35e2736cfd5c ws-cleanup:0.44 ```

What Operating System are you using (both controller, and any agents involved in the problem)?

Debian 10

Reproduction steps

When the particular resource is already locked by the job and new lock function is called to lock exactly the same resource the build is waiting infinitely long (until timeout).

pipeline {
    options {
        lock(
            quantity: 1,
            resource: "DUT1"
            variable: 'DUT_LOCKED'           
        )
        timeout(time: 3, unit: 'HOURS')
    }
    stages {
        stage('Initial test') {
            steps {
                lock(
                     inversePrecedence: true, 
                     resource: "DUT1"
                ) {
                    SomeSharedLib()
                }
            }
        }
    }
}

As result I see in console of the BLE jobs » Regression #118 build I see:

...
Trying to acquire lock on [DUT1]
Lock acquired on [DUT1]
...
[Pipeline] lock
Trying to acquire lock on [DUT1]
Found 0 available resource(s). Waiting for correct amount: 1.
[DUT1] is locked by BLE jobs » Regression #118, waiting...    

Expected Results

Skip locking resource if it is already locked by the same build, which is trying to lock it.

Actual Results

Build failed due to timeout

Anything else?

No response

oleg-kondaurov commented 1 year ago

Can I somehow check in declarative pipeline if the resource is already locked by the same job as currently running and prevent double locking?

mPokornyETM commented 1 year ago

your test job:

...
lock('maintenance') {/*keep the scope empty*/}
startSomeFunction();
...

your maintenance job

lock('maintenance') {
  doSomeMaintanance(); // or just reserve the resource 'maintenance' manually
}

This works for us as ;-)

oleg-kondaurov commented 1 year ago

@mPokornyETM Did you accidentally reply on another my issue (https://github.com/jenkinsci/lockable-resources-plugin/issues/497) here?

mPokornyETM commented 1 year ago

@mPokornyETM Did you accidentally reply on another my issue (#497) here?

yes, sorry, but you has the answer now. Thx fo correction. ;-)

mPokornyETM commented 1 year ago

I want to fix this issue, but it is hard. When you use parallel you will lock the resource more times in the same job. I can add some property like acceptLock : buildId || userId and when the ID match, then the scope can be executed. But I don´t now, if we want it. I am scaried about possible side effects.