@@ -65,17 +65,17 @@ def read_rules(self):
65
65
self .rules .dump ()
66
66
67
67
@locked
68
- def reload_rules (self , session , scheduler ):
68
+ def reload_rules (self , session ):
69
69
"""Allow a 'hot' reloading of the rules.
70
70
71
71
For example, a thread could be monitoring the time stamp of the rules
72
72
file and call this method.
73
73
"""
74
74
self .read_rules ()
75
- self .reconfigure (session = session , scheduler = scheduler )
75
+ self .reconfigure (session = session )
76
76
77
77
@locked
78
- def reconfigure (self , session , scheduler ):
78
+ def reconfigure (self , session ):
79
79
"""Reset the status of the QoS.
80
80
81
81
This method must be called if the rule_set is changed.
@@ -89,27 +89,40 @@ def reconfigure(self, session, scheduler):
89
89
# Re-register the active tasks
90
90
for request in database .get_running_requests (session = session ):
91
91
# Recompute the limits
92
- for limit in self .limits_for (request , session , scheduler ):
92
+ for limit in self .limits_for (request , session ):
93
93
limit .increment ()
94
94
95
95
@locked
96
96
def can_run (self , request , session , scheduler ):
97
97
"""Check if a request can run."""
98
98
properties = self ._properties (
99
- request = request , session = session , scheduler = scheduler
99
+ request = request , session = session
100
100
)
101
101
limits = []
102
+ new_limits = []
102
103
for limit in properties .limits :
103
104
if limit .full (request ):
104
105
limits .append (limit )
106
+ if str (limit .__hash__ ()) not in [r .uid for r in request .qos_rules ]:
107
+ new_limits .append (limit )
108
+ if len (new_limits ):
109
+ scheduler .append (
110
+ {
111
+ "function" : database .add_request_qos_status ,
112
+ "kwargs" : {
113
+ "request_uid" : request .request_uid ,
114
+ "rules" : limits ,
115
+ },
116
+ }
117
+ )
105
118
permissions = []
106
119
for permission in properties .permissions :
107
120
if not permission .evaluate (request ):
108
121
permissions .append (permission )
109
122
return not len (limits ) and not len (permissions )
110
123
111
124
@locked
112
- def _properties (self , request , session , scheduler ):
125
+ def _properties (self , request , session ):
113
126
"""Return the Properties object associated with a request.
114
127
115
128
If it does not exists it is created.
@@ -148,17 +161,6 @@ def _properties(self, request, session, scheduler):
148
161
if limit is not None :
149
162
properties .limits .append (limit )
150
163
151
- if len (properties .limits ) > 0 :
152
- scheduler .append (
153
- {
154
- "function" : database .add_request_qos_status ,
155
- "kwargs" : {
156
- "request_uid" : request .request_uid ,
157
- "rules" : properties .limits ,
158
- },
159
- }
160
- )
161
-
162
164
# Add priorities and compute starting priority
163
165
priority = 0
164
166
for rule in self .rules .priorities :
@@ -175,38 +177,38 @@ def _properties(self, request, session, scheduler):
175
177
return properties
176
178
177
179
@locked
178
- def priority (self , request , session , scheduler ):
180
+ def priority (self , request , session ):
179
181
"""Compute the priority of a request."""
180
182
# The priority of a request increases with time
181
183
return (
182
- self ._properties (request , session , scheduler ).starting_priority
184
+ self ._properties (request , session ).starting_priority
183
185
+ request .age
184
186
)
185
187
186
188
def dump (self , out = print ):
187
189
self .rules .dump (out )
188
190
189
191
@locked
190
- def status (self , requests , session , scheduler , out = print ):
192
+ def status (self , requests , session , out = print ):
191
193
out ()
192
194
out ("===================================================================" )
193
195
out ("REQUESTS" )
194
196
out ("===================================================================" )
195
197
196
198
for request in requests :
197
- self ._status (request , session , scheduler , out )
199
+ self ._status (request , session , out )
198
200
199
201
out ()
200
202
out ("===================================================================" )
201
203
202
- def _status (self , request , session , scheduler , out ):
204
+ def _status (self , request , session , out ):
203
205
out ()
204
206
out ("===================================================================" )
205
207
out ("QoS info for:" )
206
208
out (request , request .status )
207
209
out ("Priority: {}" .format (self .priority (request , session )))
208
210
out ("Limits rules:" )
209
- for limit in self .limits_for (request , session , scheduler ):
211
+ for limit in self .limits_for (request , session ):
210
212
out (
211
213
" {} ({}/{}) {}" .format (
212
214
limit ,
@@ -217,36 +219,36 @@ def _status(self, request, session, scheduler, out):
217
219
)
218
220
219
221
out ("Priorities rules:" )
220
- for priority in self .priorities_for (request , session , scheduler ):
222
+ for priority in self .priorities_for (request , session ):
221
223
out (" {}" .format (priority ))
222
224
223
225
out ("Permissions rules:" )
224
- for permission in self .permissions_for (request , session , scheduler ):
226
+ for permission in self .permissions_for (request , session ):
225
227
out (" {}" .format (permission ))
226
228
227
229
@locked
228
- def limits_for (self , request , session , scheduler ):
230
+ def limits_for (self , request , session ):
229
231
"""Return the limit rules that applies to a request.
230
232
231
233
Ensure that the properties cache is created if needed.
232
234
"""
233
- return self ._properties (request , session , scheduler ).limits
235
+ return self ._properties (request , session ).limits
234
236
235
237
@locked
236
- def permissions_for (self , request , session , scheduler ):
238
+ def permissions_for (self , request , session ):
237
239
"""Return the permission rules that applies to a request.
238
240
239
241
Ensure that the properties cache is created if needed.
240
242
"""
241
- return self ._properties (request , session , scheduler ).permissions
243
+ return self ._properties (request , session ).permissions
242
244
243
245
@locked
244
- def priorities_for (self , request , session , scheduler ):
246
+ def priorities_for (self , request , session ):
245
247
"""Return the priority rules that applies to a request.
246
248
247
249
Ensure that the properties cache is created if needed.
248
250
"""
249
- return self ._properties (request , session , scheduler ).priorities
251
+ return self ._properties (request , session ).priorities
250
252
251
253
@locked
252
254
def user_limit (self , request ):
@@ -304,7 +306,7 @@ def notify_start_of_request(self, request, session, scheduler):
304
306
its capacity.
305
307
"""
306
308
limits_list = []
307
- for limit in self .limits_for (request , session , scheduler ):
309
+ for limit in self .limits_for (request , session ):
308
310
limit .increment ()
309
311
limits_list .append (limit )
310
312
scheduler .append (
@@ -326,7 +328,7 @@ def notify_end_of_request(self, request, session, scheduler):
326
328
sharing the same limits can run.
327
329
"""
328
330
limits_list = []
329
- for limit in self .limits_for (request , session , scheduler ):
331
+ for limit in self .limits_for (request , session ):
330
332
limit .decrement ()
331
333
limits_list .append (limit )
332
334
0 commit comments