Improve job status assert affected by race condition
authorHrvoje Ribicic <riba@google.com>
Thu, 20 Feb 2014 14:11:32 +0000 (15:11 +0100)
committerHrvoje Ribicic <riba@google.com>
Thu, 20 Feb 2014 15:23:32 +0000 (16:23 +0100)
In the sliver of time between choosing a waiting job to be executed and
trying to acquire locks for its execution, the status of the job can be
changed to canceling. An assert checking the job status neglected to
take this into account, and raised an error that managed to perpetually
lock the job in the canceling state. This patch resolves the issue by
making the assert accept the canceling state as well, and exiting if
the job was cancelled.

Signed-off-by: Hrvoje Ribicic <riba@google.com>
Reviewed-by: Klaus Aehlig <aehlig@google.com>

lib/jqueue.py

index 30ca0e7..e427d9a 100644 (file)
@@ -1104,7 +1104,12 @@ class _JobProcessor(object):
     """
     op = opctx.op
 
-    assert op.status == constants.OP_STATUS_WAITING
+    assert op.status in (constants.OP_STATUS_WAITING,
+                         constants.OP_STATUS_CANCELING)
+
+    # The very last check if the job was cancelled before trying to execute
+    if op.status == constants.OP_STATUS_CANCELING:
+      return (constants.OP_STATUS_CANCELING, None)
 
     timeout = opctx.GetNextLockTimeout()