diff --git a/ariadne/manager/provisioning.py b/ariadne/manager/provisioning.py index ec6835f..c202032 100644 --- a/ariadne/manager/provisioning.py +++ b/ariadne/manager/provisioning.py @@ -106,7 +106,13 @@ class ProvisioningManager: continue candidates = self._storage.list_provision_candidates() for request in candidates: - self.provision_access_request(request.request_code) + try: + self.provision_access_request(request.request_code) + except Exception: + logger.exception( + "provisioning loop error", + extra={"event": "provision_loop_error", "request_code": request.request_code}, + ) time.sleep(settings.provision_poll_interval_sec) def _sync_status_metrics(self) -> None: @@ -168,6 +174,7 @@ class ProvisioningManager: self._log_provision_start(request_code) with self._db.connection() as conn: + conn.autocommit = True lock_id = _advisory_lock_id(request_code) locked_row = conn.execute("SELECT pg_try_advisory_lock(%s) AS locked", (lock_id,)).fetchone() if not locked_row or not locked_row.get("locked"): @@ -175,7 +182,13 @@ class ProvisioningManager: try: return self._provision_locked(conn, request_code, required_tasks) finally: - conn.execute("SELECT pg_advisory_unlock(%s)", (lock_id,)) + try: + conn.execute("SELECT pg_advisory_unlock(%s)", (lock_id,)) + except Exception: + logger.warning( + "failed to release advisory lock", + extra={"event": "provision_unlock_error", "request_code": request_code}, + ) def _provision_locked( self,