Eliminate the 'pending' status and remove dependency checks that

necessitated it during pre-run... tighten the transaction wrapper
to just be used when actually updating model details
This commit is contained in:
Matthew Jones
2014-03-24 11:48:28 -04:00
parent 0f1fc77be3
commit b35cee7b72

View File

@@ -97,6 +97,7 @@ class BaseTask(Task):
model = None model = None
abstract = True abstract = True
@transaction.commit_on_success
def update_model(self, pk, **updates): def update_model(self, pk, **updates):
''' '''
Reload model from database and update the given fields. Reload model from database and update the given fields.
@@ -291,7 +292,7 @@ class BaseTask(Task):
''' '''
Hook for checking job/task before running. Hook for checking job/task before running.
''' '''
if instance.status != 'pending': if instance.status != 'running':
return False return False
# TODO: Check that we can write to the stdout data directory # TODO: Check that we can write to the stdout data directory
return True return True
@@ -299,12 +300,11 @@ class BaseTask(Task):
def post_run_hook(self, instance, **kwargs): def post_run_hook(self, instance, **kwargs):
pass pass
@transaction.commit_on_success
def run(self, pk, **kwargs): def run(self, pk, **kwargs):
''' '''
Run the job/task and capture its output. Run the job/task and capture its output.
''' '''
instance = self.update_model(pk, status='pending', celery_task_id=self.request.id) instance = self.update_model(pk, status='running', celery_task_id=self.request.id)
status, stdout, tb = 'error', '', '' status, stdout, tb = 'error', '', ''
output_replacements = [] output_replacements = []
try: try:
@@ -317,7 +317,6 @@ class BaseTask(Task):
instance = self.update_model(pk) instance = self.update_model(pk)
status = instance.status status = instance.status
raise RuntimeError('not starting %s task' % instance.status) raise RuntimeError('not starting %s task' % instance.status)
instance = self.update_model(pk, status='running')
kwargs['private_data_file'] = self.build_private_data_file(instance, **kwargs) kwargs['private_data_file'] = self.build_private_data_file(instance, **kwargs)
kwargs['passwords'] = self.build_passwords(instance, **kwargs) kwargs['passwords'] = self.build_passwords(instance, **kwargs)
args = self.build_args(instance, **kwargs) args = self.build_args(instance, **kwargs)
@@ -507,8 +506,7 @@ class RunJob(BaseTask):
if job.cancel_flag: if job.cancel_flag:
job = self.update_model(job.pk, status='canceled') job = self.update_model(job.pk, status='canceled')
return False return False
elif job.status in ('pending', 'waiting'): elif job.status == 'running':
job = self.update_model(job.pk, status='pending')
return True return True
else: else:
return False return False
@@ -705,25 +703,11 @@ class RunProjectUpdate(BaseTask):
Hook for checking project update before running. Hook for checking project update before running.
''' '''
while True: while True:
pk = project_update.pk if project_update.cancel_flag:
if project_update.status in ('pending', 'waiting'): project_update = self.update_model(project_update.pk, status='canceled')
# Check if project update is blocked by any jobs or other
# updates that are active. Exclude job that is waiting for
# this project update.
project = project_update.project
jobs_qs = project.jobs.filter(status__in=('pending', 'running'))
pu_qs = project.project_updates.filter(status__in=('pending', 'running'))
pu_qs = pu_qs.exclude(pk=project_update.pk)
if jobs_qs.count() or pu_qs.count():
#print 'project update %d waiting on' % pk, jobs_qs, pu_qs
project_update = self.update_model(pk, status='waiting')
time.sleep(4.0)
else:
project_update = self.update_model(pk, status='pending')
return True
elif project_update.cancel_flag:
project_update = self.update_model(pk, status='canceled')
return False return False
elif project_update.status == 'running':
return True
else: else:
return False return False
@@ -852,23 +836,10 @@ class RunInventoryUpdate(BaseTask):
Hook for checking inventory update before running. Hook for checking inventory update before running.
''' '''
while True: while True:
pk = inventory_update.pk if inventory_update.cancel_flag:
if inventory_update.status in ('pending', 'waiting'): inventory_update = self.update_model(inventory_update.pk, status='canceled')
# Check if inventory update is blocked by any jobs using the
# inventory or other active inventory updates.
inventory = inventory_update.inventory_source.inventory
jobs_qs = inventory.jobs.filter(status__in=('pending', 'running'))
iu_qs = InventoryUpdate.objects.filter(inventory_source__inventory=inventory, status__in=('pending', 'running'))
iu_qs = iu_qs.exclude(pk=inventory_update.pk)
if jobs_qs.count() or iu_qs.count():
print 'inventory update %d waiting on' % pk, jobs_qs, iu_qs
inventory_update = self.update_model(pk, status='waiting')
time.sleep(4.0)
else:
inventory_update = self.update_model(pk, status='pending')
return True
elif inventory_update.cancel_flag:
inventory_update = self.update_model(pk, status='canceled')
return False return False
elif inventory_update.status == 'running':
return True
else: else:
return False return False