From 88447eff5f498e4335a8d601979e4d7ea8107e17 Mon Sep 17 00:00:00 2001 From: "marcel.kocisek" Date: Mon, 19 Jan 2026 16:15:46 +0100 Subject: [PATCH 1/2] Add error handling for ObjectNotFoundErrror - add exception handling for clearing upload --- server/mergin/sync/models.py | 9 ++++++--- server/mergin/sync/public_api_v2_controller.py | 9 ++++++++- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/server/mergin/sync/models.py b/server/mergin/sync/models.py index 62e4c8b1..ec0568a6 100644 --- a/server/mergin/sync/models.py +++ b/server/mergin/sync/models.py @@ -1042,9 +1042,12 @@ def clear(self): """Clean up pending upload. Uploaded files and table records are removed, and another upload can start. """ - move_to_tmp(self.upload_dir, self.id) - db.session.delete(self) - db.session.commit() + try: + move_to_tmp(self.upload_dir, self.id) + db.session.delete(self) + db.session.commit() + except Exception: + logging.exception(f"Failed to clear upload.") def process_chunks( self, use_shared_chunk_dir: bool diff --git a/server/mergin/sync/public_api_v2_controller.py b/server/mergin/sync/public_api_v2_controller.py index 3e28aa40..5d2fb4a9 100644 --- a/server/mergin/sync/public_api_v2_controller.py +++ b/server/mergin/sync/public_api_v2_controller.py @@ -13,6 +13,7 @@ from flask_login import current_user from marshmallow import ValidationError from sqlalchemy.exc import IntegrityError +from sqlalchemy.orm.exc import ObjectDeletedError from mergin.sync.tasks import remove_transaction_chunks @@ -333,7 +334,12 @@ def create_project_version(id): ) project_version_created.send(pv) push_finished.send(pv) - except (psycopg2.Error, FileNotFoundError, IntegrityError) as err: + except ( + psycopg2.Error, + FileNotFoundError, + IntegrityError, + ObjectDeletedError, + ) as err: db.session.rollback() logging.exception( f"Failed to finish push for project: {project.id}, project version: {v_next_version}, " @@ -346,6 +352,7 @@ def create_project_version(id): ).count() ): move_to_tmp(version_dir) + upload.clear() return UploadError().response(422) # catch exception during pg transaction so we can rollback and prevent PendingRollbackError during upload clean up except gevent.timeout.Timeout: From bc5e5a31431de4c0ed2531154e24df857ae4ebcf Mon Sep 17 00:00:00 2001 From: Marcel Kocisek Date: Tue, 20 Jan 2026 08:46:12 +0100 Subject: [PATCH 2/2] Update server/mergin/sync/public_api_v2_controller.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- server/mergin/sync/public_api_v2_controller.py | 1 - 1 file changed, 1 deletion(-) diff --git a/server/mergin/sync/public_api_v2_controller.py b/server/mergin/sync/public_api_v2_controller.py index 5d2fb4a9..76fb5daa 100644 --- a/server/mergin/sync/public_api_v2_controller.py +++ b/server/mergin/sync/public_api_v2_controller.py @@ -352,7 +352,6 @@ def create_project_version(id): ).count() ): move_to_tmp(version_dir) - upload.clear() return UploadError().response(422) # catch exception during pg transaction so we can rollback and prevent PendingRollbackError during upload clean up except gevent.timeout.Timeout: