From dd29e6b8a8c7f79074b7bb66b93aa14ccb89ec3e Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 8 Oct 2018 16:27:40 +0200 Subject: [PATCH] [IMP] runbot_merge: attempt to fix race condition Because mergebot cron can run on any runbot, it's apparently possible that a staging gets merged and the "closed" feedback from github overwrites the merged status which the mergebot is supposed to set despite the supposed protection. --- runbot_merge/controllers/__init__.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/runbot_merge/controllers/__init__.py b/runbot_merge/controllers/__init__.py index ff12b0e8..f2b52972 100644 --- a/runbot_merge/controllers/__init__.py +++ b/runbot_merge/controllers/__init__.py @@ -166,12 +166,18 @@ def handle_pr(env, event): # don't marked merged PRs as closed (!!!) if event['action'] == 'closed' and pr_obj.state != 'merged': - pr_obj.state = 'closed' - pr_obj.staging_id.cancel( - "PR %s:%s closed by %s", - pr_obj.repository.name, pr_obj.number, - event['sender']['login'] - ) + env.cr.execute(''' + UPDATE runbot_merge_pull_requests + SET state = 'closed' + WHERE id = %s AND state != 'merged' + ''', [pr_obj.id]) + env.cr.commit() + if env.cr.rowcount: + pr_obj.staging_id.cancel( + "PR %s:%s closed by %s", + pr_obj.repository.name, pr_obj.number, + event['sender']['login'] + ) return 'Closed {}'.format(pr_obj.id) if event['action'] == 'reopened' and pr_obj.state == 'closed':