Projet

Général

Profil

0002-misc-prevent-locking-all-jobs-36215.patch

Benjamin Dauvergne, 01 octobre 2019 10:41

Télécharger (1,44 ko)

Voir les différences:

Subject: [PATCH 2/3] 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 all cases and ordering a sliced queryset is not possible.
 passerelle/base/models.py | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)
passerelle/base/models.py
501 501
        skipped_jobs = []
502 502
        while True:
503 503
            with transaction.atomic():
504
                # lock a job
504
                # lock a runnable job
505 505
                job = self.jobs_set().exclude(
506 506
                        pk__in=skipped_jobs
507 507
                        ).filter(
508 508
                        status='registered'
509
                        ).select_for_update(**skip_locked).first()
509
                        ).select_for_update(**skip_locked
510
                        ).order_by('pk')[:1].first()
510 511
                if not job:
511 512
                    break
512 513
                job.status = 'running'
513
-