From 2eee683065c7b5bcdea2acef69b64fb888af3050 Mon Sep 17 00:00:00 2001 From: Vlada Dusek Date: Mon, 16 Feb 2026 16:55:19 +0100 Subject: [PATCH] fix: Move metadata counter updates after successful API call in RQ single client In `mark_request_as_handled`, the `handled_request_count` and `pending_request_count` metadata counters were updated before the `_update_request` API call. If the API call failed, the counters would be left in an inconsistent state with no rollback. This moves the counter updates to the `else` block so they only execute after a successful API call. Co-Authored-By: Claude Opus 4.6 --- .../_apify/_request_queue_single_client.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/apify/storage_clients/_apify/_request_queue_single_client.py b/src/apify/storage_clients/_apify/_request_queue_single_client.py index 6ab1b392..22b66daf 100644 --- a/src/apify/storage_clients/_apify/_request_queue_single_client.py +++ b/src/apify/storage_clients/_apify/_request_queue_single_client.py @@ -204,10 +204,9 @@ async def mark_request_as_handled(self, request: Request) -> ProcessedRequest | if cached_request := self._requests_cache.get(request_id): cached_request.handled_at = request.handled_at - if request.handled_at is None: + should_update_counters = request.handled_at is None + if should_update_counters: request.handled_at = datetime.now(tz=timezone.utc) - self.metadata.handled_request_count += 1 - self.metadata.pending_request_count -= 1 try: # Remember that we handled this request, to optimize local deduplication. @@ -224,6 +223,10 @@ async def mark_request_as_handled(self, request: Request) -> ProcessedRequest | logger.exception(f'Error marking request {request.unique_key} as handled.') return None else: + # Update counters only after a successful API call to avoid inconsistency on failure. + if should_update_counters: + self.metadata.handled_request_count += 1 + self.metadata.pending_request_count -= 1 return processed_request async def reclaim_request(