def on_failure(self, exc, task_id, args, kwargs, einfo): from tasks.models import ExportTask, ExportTaskException, ExportRun logger.debug('Task name: {0} failed, {1}'.format(self.name, einfo)) task = ExportTask.objects.get(celery_uid=task_id) task.status = 'FAILED' task.finished_at = timezone.now() task.save() exception = cPickle.dumps(einfo) ete = ExportTaskException(task=task, exception=exception) ete.save() if self.abort_on_error: run = ExportRun.objects.get(tasks__celery_uid=task_id) run.status = 'FAILED' run.finished_at = timezone.now() run.save() error_handler = ExportTaskErrorHandler() # run error handler stage_dir = kwargs['stage_dir'] error_handler.si(run_uid=str(run.uid), task_id=task_id, stage_dir=stage_dir).delay()
def update_task_state(self, run_uid=None, name=None): """ Update the task state and celery task uid. Can use the celery uid for diagnostics. """ started = timezone.now() from tasks.models import ExportRun, ExportTask celery_uid = self.request.id try: task = ExportTask.objects.get(run__uid=run_uid, name=name) celery_uid = self.request.id task.celery_uid = celery_uid task.status = 'RUNNING' task.started_at = started task.save() logger.debug('Updated task: {0} with uid: {1}'.format(task.name, task.uid)) except DatabaseError as e: logger.error('Updating task {0} state throws: {1}'.format(task.name, e)) raise e
def on_success(self, retval, task_id, args, kwargs): from tasks.models import ExportTask, ExportTaskResult # update the task finished = timezone.now() task = ExportTask.objects.get(celery_uid=task_id) task.finished_at = finished # get the output output_url = retval['result'] stat = os.stat(output_url) size = stat.st_size / 1024 / 1024.00 # construct the download_path download_root = settings.EXPORT_DOWNLOAD_ROOT parts = output_url.split('/') filename = parts[-1] run_uid = parts[-2] run_dir = '{0}{1}'.format(download_root, run_uid) download_path = '{0}{1}/{2}'.format(download_root, run_uid, filename) try: if not os.path.exists(run_dir): os.makedirs(run_dir) # don't copy raw overpass data if (task.name != 'OverpassQuery'): shutil.copy(output_url, download_path) except IOError as e: logger.error('Error copying output file to: {0}'.format(download_path)) # construct the download url download_media_root = settings.EXPORT_MEDIA_ROOT download_url = '{0}{1}/{2}'.format(download_media_root, run_uid, filename) # save the task and task result result = ExportTaskResult( task=task, filename=filename, size=size, download_url=download_url ) result.save() task.status = 'SUCCESS' task.save()