From 415da94093b0d112e7885751394c267f5b186f01 Mon Sep 17 00:00:00 2001 From: Klaas van Schelven Date: Thu, 6 Feb 2025 14:18:46 +0100 Subject: [PATCH] transaction semaphore: release in a finally block transaction.commit can fail (in fact: e.g. FK checks _only_ happen on-commit) such failures _must_ release the semaphore, otherwise the next request will be stuck forever. --- bugsink/transaction.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/bugsink/transaction.py b/bugsink/transaction.py index b11173b..379487a 100644 --- a/bugsink/transaction.py +++ b/bugsink/transaction.py @@ -151,17 +151,19 @@ class ImmediateAtomic(SuperDurableAtomic): self.t0 = time.time() def __exit__(self, exc_type, exc_value, traceback): - super(ImmediateAtomic, self).__exit__(exc_type, exc_value, traceback) + try: + super(ImmediateAtomic, self).__exit__(exc_type, exc_value, traceback) - took = (time.time() - self.t0) * 1000 - performance_logger.info(f"{took:6.2f}ms IMMEDIATE transaction") + took = (time.time() - self.t0) * 1000 + performance_logger.info(f"{took:6.2f}ms IMMEDIATE transaction") - connection = django_db_transaction.get_connection(self.using) - if hasattr(connection, "_start_transaction_under_autocommit"): - connection._start_transaction_under_autocommit = connection._start_transaction_under_autocommit_original - del connection._start_transaction_under_autocommit_original + connection = django_db_transaction.get_connection(self.using) + if hasattr(connection, "_start_transaction_under_autocommit"): + connection._start_transaction_under_autocommit = connection._start_transaction_under_autocommit_original + del connection._start_transaction_under_autocommit_original - immediate_semaphore.release() + finally: + immediate_semaphore.release() def immediate_atomic(using=None, savepoint=True, durable=True):