@@ -474,14 +474,13 @@ def reset_qos_rules(session: sa.orm.Session, qos):
474
474
for request in get_running_requests (session ):
475
475
# Recompute the limits
476
476
limits = qos .limits_for (request , session )
477
- cached_rules .update (
478
- delete_request_qos_status (
479
- request_uid = request .request_uid ,
480
- rules = limits ,
481
- session = session ,
482
- rules_in_db = cached_rules ,
483
- )
477
+ _ , rules = delete_request_qos_status (
478
+ request_uid = request .request_uid ,
479
+ rules = limits ,
480
+ session = session ,
481
+ rules_in_db = cached_rules ,
484
482
)
483
+ cached_rules .update (rules )
485
484
session .commit ()
486
485
487
486
@@ -523,7 +522,7 @@ def add_qos_rule(
523
522
def decrement_qos_rule_running (
524
523
rules : list , session : sa .orm .Session , rules_in_db : dict [str , QoSRule ] = {}, ** kwargs
525
524
):
526
- """Increment the running counter of a QoS rule."""
525
+ """Decrement the running counter of a QoS rule."""
527
526
for rule in rules :
528
527
if (rule_uid := str (rule .__hash__ ())) in rules_in_db :
529
528
qos_rule = rules_in_db [rule_uid ]
@@ -534,7 +533,8 @@ def decrement_qos_rule_running(
534
533
# this happend when a request is finished after a broker restart.
535
534
# the rule is not in the database anymore because it has been reset.
536
535
continue
537
- qos_rule .running = max (0 , qos_rule .running - 1 )
536
+ qos_rule .running = rule .value
537
+ return None , None
538
538
539
539
540
540
def delete_request_qos_status (
@@ -556,11 +556,11 @@ def delete_request_qos_status(
556
556
except sqlalchemy .orm .exc .NoResultFound :
557
557
qos_rule = add_qos_rule (rule = rule , session = session )
558
558
created_rules [qos_rule .uid ] = qos_rule
559
- if qos_rule in request .qos_rules :
559
+ if qos_rule . uid in [ r . uid for r in request .qos_rules ] :
560
560
request .qos_rules .remove (qos_rule )
561
- qos_rule .queued = max ( 0 , qos_rule .queued - 1 )
562
- qos_rule .running += 1
563
- return created_rules
561
+ qos_rule .queued = len ( rule .queued )
562
+ qos_rule .running = rule . value
563
+ return request , created_rules
564
564
565
565
566
566
def add_request_qos_status (
@@ -569,20 +569,22 @@ def add_request_qos_status(
569
569
session : sa .orm .Session ,
570
570
rules_in_db : dict [str , QoSRule ] = {},
571
571
** kwargs ,
572
- ):
572
+ ) -> tuple [ SystemRequest | None , dict [ str , QoSRule ]] :
573
573
created_rules : dict = {}
574
+ new_request = None
574
575
if request is None :
575
- return {}
576
+ return new_request , {}
576
577
for rule in rules :
577
578
if (rule_uid := str (rule .__hash__ ())) in rules_in_db :
578
579
qos_rule = rules_in_db [rule_uid ]
579
580
else :
580
581
qos_rule = add_qos_rule (rule = rule , session = session )
581
582
created_rules [qos_rule .uid ] = qos_rule
582
- if qos_rule not in request .qos_rules :
583
- qos_rule .queued += 1
584
- request .qos_rules .append (qos_rule )
585
- return created_rules
583
+ if qos_rule .uid not in [r .uid for r in request .qos_rules ]:
584
+ qos_rule .queued = len (rule .queued )
585
+ new_request = get_request (request .request_uid , session )
586
+ new_request .qos_rules .append (qos_rule )
587
+ return new_request , created_rules
586
588
587
589
588
590
def get_qos_status_from_request (
@@ -606,11 +608,9 @@ def get_qos_status_from_request(
606
608
607
609
608
610
def requeue_request (
609
- request_uid : str ,
611
+ request : SystemRequest ,
610
612
session : sa .orm .Session ,
611
- ):
612
- statement = sa .select (SystemRequest ).where (SystemRequest .request_uid == request_uid )
613
- request = session .scalars (statement ).one ()
613
+ ) -> SystemRequest | None :
614
614
if request .status == "running" :
615
615
# ugly implementation because sqlalchemy doesn't allow to directly update JSONB
616
616
# FIXME: use a specific column for resubmit_number
@@ -624,7 +624,29 @@ def requeue_request(
624
624
logger .info ("requeueing request" , ** logger_kwargs (request = request ))
625
625
return request
626
626
else :
627
- return
627
+ return None
628
+
629
+
630
+ def set_request_cache_id (request_uid : str , cache_id : int , session : sa .orm .Session ):
631
+ statement = sa .select (SystemRequest ).where (SystemRequest .request_uid == request_uid )
632
+ request = session .scalars (statement ).one ()
633
+ request .cache_id = cache_id
634
+ session .commit ()
635
+ return request
636
+
637
+
638
+ def set_successful_request (
639
+ request_uid : str ,
640
+ session : sa .orm .Session ,
641
+ ) -> SystemRequest | None :
642
+ statement = sa .select (SystemRequest ).where (SystemRequest .request_uid == request_uid )
643
+ request = session .scalars (statement ).one ()
644
+ if request .status == "successful" :
645
+ return None
646
+ request .status = "successful"
647
+ request .finished_at = sa .func .now ()
648
+ session .commit ()
649
+ return request
628
650
629
651
630
652
def set_request_status (
@@ -634,8 +656,6 @@ def set_request_status(
634
656
cache_id : int | None = None ,
635
657
error_message : str | None = None ,
636
658
error_reason : str | None = None ,
637
- log : list [tuple [int , str ]] = [],
638
- user_visible_log : list [tuple [int , str ]] = [],
639
659
resubmit : bool | None = None ,
640
660
) -> SystemRequest :
641
661
"""Set the status of a request."""
@@ -651,16 +671,15 @@ def set_request_status(
651
671
request .request_metadata = metadata
652
672
if status == "successful" :
653
673
request .finished_at = sa .func .now ()
654
- request .cache_id = cache_id
655
674
elif status == "failed" :
656
675
request .finished_at = sa .func .now ()
657
676
request .response_error = {"message" : error_message , "reason" : error_reason }
658
677
elif status == "running" :
659
678
request .started_at = sa .func .now ()
660
679
request .qos_status = {}
680
+ if cache_id is not None :
681
+ request .cache_id = cache_id
661
682
# FIXME: logs can't be live updated
662
- request .response_log = json .dumps (log )
663
- request .response_user_visible_log = json .dumps (user_visible_log )
664
683
request .status = status
665
684
session .commit ()
666
685
return request
0 commit comments