From 5003124716fe63e9068a82dc5805698d6e556e72 Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Sat, 21 Sep 2019 10:51:21 +0200 Subject: [PATCH 1/2] misc: prevent locking all jobs (#36215) .first() does list(qs)[:1] which will select all target jobs, we must add a LIMIT 1 before .first() to lock only the job we are looking for. Ordering is necessary as .first() will do an .order_by('pk') on an unordered queryset to get a deterministic result in call cases and ordering a sliced queryset is not possible. --- passerelle/base/models.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/passerelle/base/models.py b/passerelle/base/models.py index d310c3cb..9f38c038 100644 --- a/passerelle/base/models.py +++ b/passerelle/base/models.py @@ -507,7 +507,8 @@ class BaseResource(models.Model): pk__in=skipped_jobs ).filter( status='registered' - ).select_for_update(**skip_locked).first() + ).select_for_update(**skip_locked + ).order_by('pk')[:1].first() if not job: break job.status = 'running' -- 2.23.0