@@ -335,6 +335,7 @@ def manage_dismissed_request(self, request, session):
335
335
request_uid = request .request_uid ,
336
336
message = dismission_metadata .get ("message" , "" ),
337
337
session = session ,
338
+ commit = False ,
338
339
)
339
340
previous_status = dismission_metadata .get ("previous_status" , "accepted" )
340
341
if dismission_metadata .get ("reason" , "DismissedRequest" ) == "PermissionError" :
@@ -371,8 +372,10 @@ def sync_database(self, session: sa.orm.Session) -> None:
371
372
"""
372
373
# the retrieve API sets the status to "dismissed",
373
374
# here the broker fixes the QoS and queue status accordingly
374
- dismissed_requests = db .get_dismissed_requests (session )
375
- for request in dismissed_requests :
375
+ dismissed_requests = db .get_dismissed_requests (
376
+ session , limit = CONFIG .broker_max_accepted_requests
377
+ )
378
+ for i , request in enumerate (dismissed_requests ):
376
379
if future := self .futures .pop (request .request_uid , None ):
377
380
future .cancel ()
378
381
session = self .manage_dismissed_request (request , session )
@@ -561,6 +564,34 @@ def on_future_done(self, future: distributed.Future) -> str:
561
564
future .release ()
562
565
return future .key
563
566
567
+ @perf_logger
568
+ def cache_requests_qos_properties (self , requests , session : sa .orm .Session ) -> None :
569
+ """Cache the qos properties of the requests."""
570
+ # copy list of requests to avoid RuntimeError: dictionary changed size during iteration
571
+ for request in list (requests ):
572
+ try :
573
+ self .qos ._properties (request , check_permissions = True , session = session )
574
+ except PermissionError as exception :
575
+ db .add_event (
576
+ event_type = "user_visible_error" ,
577
+ request_uid = request .request_uid ,
578
+ message = exception .args [0 ],
579
+ session = session ,
580
+ )
581
+ request = db .get_request (request .request_uid , session = session )
582
+ request .status = "failed"
583
+ request .finished_at = datetime .datetime .now ()
584
+ request .response_error = {
585
+ "reason" : "PermissionError" ,
586
+ "message" : exception .args [0 ],
587
+ }
588
+ self .queue .pop (request .request_uid , None )
589
+ self .qos .notify_dismission_of_request (
590
+ request , session , scheduler = self .internal_scheduler
591
+ )
592
+ logger .info ("job has finished" , ** db .logger_kwargs (request = request ))
593
+ session .commit ()
594
+
564
595
def processing_time_priority_algorithm (
565
596
self ,
566
597
session_write : sa .orm .Session ,
@@ -592,7 +623,9 @@ def processing_time_priority_algorithm(
592
623
)
593
624
for request in requests :
594
625
# need to check the limits on each request to update the qos_rules table
595
- can_run = self .qos .can_run (request , session = session_write , scheduler = self .internal_scheduler )
626
+ can_run = self .qos .can_run (
627
+ request , session = session_write , scheduler = self .internal_scheduler
628
+ )
596
629
if can_run and may_run and requests_counter < number_of_requests :
597
630
self .submit_request (request , session = session_write )
598
631
may_run = False
@@ -673,6 +706,7 @@ def run(self) -> None:
673
706
db .get_accepted_requests (
674
707
session = session_write ,
675
708
last_created_at = self .queue .last_created_at ,
709
+ limit = CONFIG .broker_max_accepted_requests ,
676
710
)
677
711
)
678
712
self .sync_qos_rules (session_write )
@@ -688,10 +722,13 @@ def run(self) -> None:
688
722
# if the internal queue is not in sync with the database, re-sync it
689
723
logger .info (
690
724
"re-syncing internal queue" ,
691
- internal_queue = { queue_length } ,
692
- db_queue = { db_queue } ,
725
+ internal_queue = queue_length ,
726
+ db_queue = db_queue ,
693
727
)
694
728
self .queue .reset ()
729
+ self .cache_requests_qos_properties (
730
+ self .queue .values (), session_write
731
+ )
695
732
696
733
running_requests = len (db .get_running_requests (session = session_read ))
697
734
queue_length = self .queue .len ()
0 commit comments