From 64d0c5b675e44942cc137173952c1569a6682aa6 Mon Sep 17 00:00:00 2001 From: Jimmy Zelinskie Date: Thu, 14 Jul 2016 14:53:16 -0400 Subject: [PATCH] data.queue: fix race condition It's possible that multiple consumers will acquire a queue item if they race on an expired item. To mitigate this, we check that the processing_expires time hasn't been changed since we last read. --- data/queue.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/data/queue.py b/data/queue.py index 601092982..f05ee9c8f 100644 --- a/data/queue.py +++ b/data/queue.py @@ -184,7 +184,8 @@ class WorkQueue(object): processing_expires=now + timedelta(seconds=processing_time), retries_remaining=QueueItem.retries_remaining-1) .where(QueueItem.id == db_item.id)) - changed_query = self._available_jobs_where(set_unavailable_query, now) + changed_query = (self._available_jobs_where(set_unavailable_query, now) + .where(QueueItem.processing_expires == db_item.processing_expires)) changed = changed_query.execute() if changed == 1: item = AttrDict({