From 9fb0c6db67bb2f1029497650c71460c5d37e9ea7 Mon Sep 17 00:00:00 2001 From: Piero Toffanin Date: Mon, 6 Nov 2023 11:21:10 -0500 Subject: [PATCH] Cleanup partial tasks --- app/admin.py | 4 ++-- webodm/settings.py | 4 ++++ worker/celery.py | 8 ++++++++ worker/tasks.py | 12 ++++++++++++ 4 files changed, 26 insertions(+), 2 deletions(-) diff --git a/app/admin.py b/app/admin.py index 7ad77d95..7bb98a5d 100644 --- a/app/admin.py +++ b/app/admin.py @@ -40,9 +40,9 @@ class TaskAdmin(admin.ModelAdmin): def has_add_permission(self, request): return False - list_display = ('id', 'project', 'processing_node', 'created_at', 'status', 'last_error') + list_display = ('id', 'name', 'project', 'processing_node', 'created_at', 'status', 'last_error') list_filter = ('status', 'project',) - search_fields = ('id', 'project__name') + search_fields = ('id', 'name', 'project__name') admin.site.register(Task, TaskAdmin) diff --git a/webodm/settings.py b/webodm/settings.py index 49806762..5287252f 100644 --- a/webodm/settings.py +++ b/webodm/settings.py @@ -411,6 +411,10 @@ QUOTA_EXCEEDED_GRACE_PERIOD = 8 # Maximum number of processing nodes to show in "Processing Nodes" menus/dropdowns UI_MAX_PROCESSING_NODES = None +# Number of hours before partial tasks +# are removed (or None to disable) +CLEANUP_PARTIAL_TASKS = None + if TESTING or FLUSHING: CELERY_TASK_ALWAYS_EAGER = True EXTERNAL_AUTH_ENDPOINT = 'http://0.0.0.0:5555/auth' diff --git a/worker/celery.py b/worker/celery.py index cb9209e1..7903f2b5 100644 --- a/worker/celery.py +++ b/worker/celery.py @@ -28,6 +28,14 @@ app.conf.beat_schedule = { 'retry': False } }, + 'cleanup-tasks': { + 'task': 'worker.tasks.cleanup_tasks', + 'schedule': 3600, + 'options': { + 'expires': 1799, + 'retry': False + } + }, 'cleanup-tmp-directory': { 'task': 'worker.tasks.cleanup_tmp_directory', 'schedule': 3600, diff --git a/worker/tasks.py b/worker/tasks.py index 5ca8f24c..5ca53841 100644 --- a/worker/tasks.py +++ b/worker/tasks.py @@ -23,6 +23,8 @@ import worker from .celery import app from app.raster_utils import export_raster as export_raster_sync, extension_for_export_format from app.pointcloud_utils import export_pointcloud as export_pointcloud_sync +from django.utils import timezone +from datetime import timedelta import redis logger = get_task_logger("app.logger") @@ -67,6 +69,16 @@ def cleanup_projects(): if total > 0 and 'app.Project' in count_dict: logger.info("Deleted {} projects".format(count_dict['app.Project'])) +@app.task(ignore_result=True) +def cleanup_tasks(): + # Delete tasks that are older than + if settings.CLEANUP_PARTIAL_TASKS is None: + return + + tasks_to_delete = Task.objects.filter(partial=True, created_at__lte=timezone.now() - timedelta(hours=settings.CLEANUP_PARTIAL_TASKS)) + for t in tasks_to_delete: + logger.info("Cleaning up partial task {}".format(t)) + t.delete() @app.task(ignore_result=True) def cleanup_tmp_directory():