From c4cf038a93df7843f69c10076e289c95b8375701 Mon Sep 17 00:00:00 2001 From: Klaas van Schelven Date: Wed, 5 Nov 2025 12:59:42 +0100 Subject: [PATCH] minidump after-digest cleanup envelope-based happy path only --- ingest/tasks.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/ingest/tasks.py b/ingest/tasks.py index 522ee3d..0077d46 100644 --- a/ingest/tasks.py +++ b/ingest/tasks.py @@ -1,3 +1,4 @@ +import contextlib import os import logging import json @@ -17,10 +18,12 @@ def digest(event_id, event_metadata): with open(get_filename_for_event_id(event_id), "rb") as f: event_data = json.loads(f.read().decode("utf-8")) + opened = [get_filename_for_event_id(event_id)] if event_metadata.get("has_minidump"): with open(get_filename_for_event_id(event_id, filetype="minidump"), "rb") as f: minidump_bytes = f.read() + opened += [get_filename_for_event_id(event_id, filetype="minidump")] else: minidump_bytes = None @@ -29,11 +32,10 @@ def digest(event_id, event_metadata): except ValidationError as e: logger.warning("ValidationError in digest_event", exc_info=e) finally: - # NOTE: if an SDK misbehaves, and sends the same event_id multiple times in quick succession, the line below - # will trigger a FileNotFoundError on the second attempt to delete the file (the files also overwrite each other - # on-ingest). In that case your logs will also a "ValidationError in digest_event". Although that means an error - # bubbles up from the below, at least for now I'm OK with that. (next steps _could_ be: [a] catching the error - # as expected [b] refusing to "just overwrite and doubly enqueue on-ingest" [c] reporting about this particular - # problem to the end-user etc... but at least "getting it really right" might actually be quite hard (race - # conditions) and I'm not so sure it's worth it. - os.unlink(get_filename_for_event_id(event_id)) + # NOTE: if an SDK misbehaves, and sends the same event_id multiple times in quick succession, the os.unlink + # below will trigger a FileNotFoundError on the second attempt to delete the file (the events also overwrite + # each other on-ingest, but that's separately dealt with, showing a "ValidationError in digest_event". We're + # just catching those and ignoring them (bubble-up is not desirable because it hinders follow-up cleanups) + for filename in opened: + with contextlib.suppress(FileNotFoundError): + os.unlink(filename)