@@ -291,7 +291,7 @@ async def add_batch_of_requests(
291
291
# (added by another producer or before migration).
292
292
293
293
294
- new_requests : list [ProcessedRequest ] = []
294
+ new_requests : list [Request ] = []
295
295
already_present_requests : list [ProcessedRequest ] = []
296
296
297
297
for request in requests :
@@ -316,15 +316,7 @@ async def add_batch_of_requests(
316
316
)
317
317
)
318
318
else :
319
- new_requests .append (
320
- ProcessedRequest .model_validate (
321
- {
322
- 'uniqueKey' : request .unique_key ,
323
- 'wasAlreadyPresent' : False ,
324
- 'wasAlreadyHandled' : request .was_already_handled ,
325
- }
326
- )
327
- )
319
+ new_requests .append (request )
328
320
329
321
330
322
# Update local caches
@@ -400,19 +392,18 @@ async def fetch_next_request(self) -> Request | None:
400
392
Returns:
401
393
The request or `None` if there are no more pending requests.
402
394
"""
403
- async with self ._fetch_lock :
404
- await self ._ensure_head_is_non_empty ()
405
-
406
- while self ._head_requests :
407
- request_unique_key = self ._head_requests .pop ()
408
- if (
409
- request_unique_key not in self ._requests_in_progress and
410
- request_unique_key not in self ._requests_already_handled
411
- ):
412
- self ._requests_in_progress .add (request_unique_key )
413
- return await self .get_request (request_unique_key )
414
- # No request locally and the ones returned from the platform are already in progress.
415
- return None
395
+ await self ._ensure_head_is_non_empty ()
396
+
397
+ while self ._head_requests :
398
+ request_unique_key = self ._head_requests .pop ()
399
+ if (
400
+ request_unique_key not in self ._requests_in_progress and
401
+ request_unique_key not in self ._requests_already_handled
402
+ ):
403
+ self ._requests_in_progress .add (request_unique_key )
404
+ return await self .get_request (request_unique_key )
405
+ # No request locally and the ones returned from the platform are already in progress.
406
+ return None
416
407
417
408
async def _ensure_head_is_non_empty (self ) -> None :
418
409
"""Ensure that the queue head has requests if they are available in the queue."""
@@ -427,7 +418,6 @@ async def _list_head(self) -> None:
427
418
response = await self ._api_client .list_head (limit = requested_head_items )
428
419
429
420
# Update metadata
430
- self ._queue_has_locked_requests = response .get ('queueHasLockedRequests' , False )
431
421
# Check if there is another client working with the RequestQueue
432
422
self ._metadata .had_multiple_clients = response .get ('hadMultipleClients' , False )
433
423
# Should warn once? This might be outside expected context if the other consumers consumes at the same time
@@ -472,23 +462,22 @@ async def mark_request_as_handled(self, request: Request) -> ProcessedRequest |
472
462
if cached_request := self ._requests_cache [request .unique_key ]:
473
463
cached_request .handled_at = request .handled_at
474
464
475
- async with self ._fetch_lock :
476
- try :
477
- # Update the request in the API
478
- # Works as upsert - adds the request if it does not exist yet. (Local request that was handled before
479
- # adding to the queue.)
480
- processed_request = await self ._update_request (request )
481
- # Remove request from cache. It will most likely not be needed.
482
- self ._requests_cache .pop (request .unique_key )
483
- self ._requests_in_progress .discard (request .unique_key )
484
- # Remember that we handled this request, to optimize local deduplication.
485
- self ._requests_already_handled .add (request .unique_key )
486
-
487
- except Exception as exc :
488
- logger .debug (f'Error marking request { request .unique_key } as handled: { exc !s} ' )
489
- return None
490
- else :
491
- return processed_request
465
+ try :
466
+ # Update the request in the API
467
+ # Works as upsert - adds the request if it does not exist yet. (Local request that was handled before
468
+ # adding to the queue.)
469
+ processed_request = await self ._update_request (request )
470
+ # Remember that we handled this request, to optimize local deduplication.
471
+ self ._requests_already_handled .add (request .unique_key )
472
+ # Remove request from cache. It will most likely not be needed.
473
+ self ._requests_cache .pop (request .unique_key )
474
+ self ._requests_in_progress .discard (request .unique_key )
475
+
476
+ except Exception as exc :
477
+ logger .debug (f'Error marking request { request .unique_key } as handled: { exc !s} ' )
478
+ return None
479
+ else :
480
+ return processed_request
492
481
493
482
@override
494
483
async def reclaim_request (
@@ -513,33 +502,31 @@ async def reclaim_request(
513
502
if request .was_already_handled :
514
503
request .handled_at = None
515
504
516
- # Reclaim with lock to prevent race conditions that could lead to double processing of the same request.
517
- async with self ._fetch_lock :
518
- try :
519
- # Make sure request is in the local cache. We might need it.
520
- self ._requests_cache [request .unique_key ] = request
505
+ try :
506
+ # Make sure request is in the local cache. We might need it.
507
+ self ._requests_cache [request .unique_key ] = request
521
508
522
- # No longer in progress
523
- self ._requests_in_progress .discard (request .unique_key )
524
- # No longer handled
525
- self ._requests_already_handled .discard (request .unique_key )
509
+ # No longer in progress
510
+ self ._requests_in_progress .discard (request .unique_key )
511
+ # No longer handled
512
+ self ._requests_already_handled .discard (request .unique_key )
526
513
527
- if forefront :
528
- # Append to top of the local head estimation
529
- self ._head_requests .append (request .unique_key )
514
+ if forefront :
515
+ # Append to top of the local head estimation
516
+ self ._head_requests .append (request .unique_key )
530
517
531
- processed_request = await self ._update_request (request , forefront = forefront )
532
- processed_request .unique_key = request .unique_key
533
- # If the request was previously handled, decrement our handled count since
534
- # we're putting it back for processing.
535
- if request .was_already_handled and not processed_request .was_already_handled :
536
- self ._metadata .handled_request_count -= 1
518
+ processed_request = await self ._update_request (request , forefront = forefront )
519
+ processed_request .unique_key = request .unique_key
520
+ # If the request was previously handled, decrement our handled count since
521
+ # we're putting it back for processing.
522
+ if request .was_already_handled and not processed_request .was_already_handled :
523
+ self ._metadata .handled_request_count -= 1
537
524
538
- except Exception as exc :
539
- logger .debug (f'Error reclaiming request { request .unique_key } : { exc !s} ' )
540
- return None
541
- else :
542
- return processed_request
525
+ except Exception as exc :
526
+ logger .debug (f'Error reclaiming request { request .unique_key } : { exc !s} ' )
527
+ return None
528
+ else :
529
+ return processed_request
543
530
544
531
@override
545
532
async def is_empty (self ) -> bool :
@@ -549,9 +536,8 @@ async def is_empty(self) -> bool:
549
536
True if the queue is empty, False otherwise.
550
537
"""
551
538
# Without the lock the `is_empty` is prone to falsely report True with some low probability race condition.
552
- async with self ._fetch_lock :
553
- await self ._ensure_head_is_non_empty ()
554
- return not self ._head_requests and not self ._queue_has_locked_requests and not self ._requests_in_progress
539
+ await self ._ensure_head_is_non_empty ()
540
+ return not self ._head_requests and not self ._requests_in_progress
555
541
556
542
async def _update_request (
557
543
self ,
0 commit comments