Fix queue handling to remove the dependency from repobuild, and have a cancel method
This commit is contained in:
parent
24ab0ae53a
commit
5f605b7cc8
7 changed files with 95 additions and 24 deletions
|
@ -82,10 +82,19 @@ class WorkQueue(object):
|
|||
self._reporter(self._currently_processing, running_count,
|
||||
running_count + available_not_running_count)
|
||||
|
||||
def has_retries_remaining(self, item_id):
|
||||
""" Returns whether the queue item with the given id has any retries remaining. If the
|
||||
queue item does not exist, returns False. """
|
||||
with self._transaction_factory(db):
|
||||
try:
|
||||
return QueueItem.get(id=item_id).retries_remaining > 0
|
||||
except QueueItem.DoesNotExist:
|
||||
return False
|
||||
|
||||
def put(self, canonical_name_list, message, available_after=0, retries_remaining=5):
|
||||
"""
|
||||
Put an item, if it shouldn't be processed for some number of seconds,
|
||||
specify that amount as available_after.
|
||||
specify that amount as available_after. Returns the ID of the queue item added.
|
||||
"""
|
||||
|
||||
params = {
|
||||
|
@ -98,7 +107,7 @@ class WorkQueue(object):
|
|||
params['available_after'] = available_date
|
||||
|
||||
with self._transaction_factory(db):
|
||||
return QueueItem.create(**params)
|
||||
return str(QueueItem.create(**params).id)
|
||||
|
||||
def get(self, processing_time=300):
|
||||
"""
|
||||
|
@ -141,10 +150,32 @@ class WorkQueue(object):
|
|||
# Return a view of the queue item rather than an active db object
|
||||
return item
|
||||
|
||||
def cancel(self, item_id):
|
||||
""" Attempts to cancel the queue item with the given ID from the queue. Returns true on success
|
||||
and false if the queue item could not be canceled. A queue item can only be canceled if
|
||||
if is available and has retries remaining.
|
||||
"""
|
||||
|
||||
with self._transaction_factory(db):
|
||||
# Load the build queue item for update.
|
||||
try:
|
||||
queue_item = db_for_update(QueueItem.select()
|
||||
.where(QueueItem.id == item_id)).get()
|
||||
except QueueItem.DoesNotExist:
|
||||
return False
|
||||
|
||||
# Check the queue item.
|
||||
if not queue_item.available or queue_item.retries_remaining == 0:
|
||||
return False
|
||||
|
||||
# Delete the queue item.
|
||||
queue_item.delete_instance(recursive=True)
|
||||
return True
|
||||
|
||||
def complete(self, completed_item):
|
||||
with self._transaction_factory(db):
|
||||
completed_item_obj = self._item_by_id_for_update(completed_item.id)
|
||||
completed_item_obj.delete_instance()
|
||||
completed_item_obj.delete_instance(recursive=True)
|
||||
self._currently_processing = False
|
||||
|
||||
def incomplete(self, incomplete_item, retry_after=300, restore_retry=False):
|
||||
|
|
Reference in a new issue