@@ -34,31 +34,7 @@ def getJobFeatures():
34
34
return features
35
35
36
36
37
- def getProcessorFromMJF ():
38
- jobFeatures = getJobFeatures ()
39
- if jobFeatures :
40
- try :
41
- return int (jobFeatures ["allocated_cpu" ])
42
- except KeyError :
43
- gLogger .error (
44
- "MJF is available but allocated_cpu is not an integer" , repr (jobFeatures .get ("allocated_cpu" ))
45
- )
46
- return None
47
-
48
-
49
- def getMemoryFromMJF ():
50
- jobFeatures = getJobFeatures ()
51
- if jobFeatures :
52
- try :
53
- return int (jobFeatures ["max_rss_bytes" ])
54
- except KeyError :
55
- gLogger .error (
56
- "MJF is available but max_rss_bytes is not an integer" , repr (jobFeatures .get ("max_rss_bytes" ))
57
- )
58
- return None
59
-
60
-
61
- def getMemoryFromProc ():
37
+ def _getMemoryFromProc ():
62
38
meminfo = {i .split ()[0 ].rstrip (":" ): int (i .split ()[1 ]) for i in open ("/proc/meminfo" ).readlines ()}
63
39
maxRAM = meminfo ["MemTotal" ]
64
40
if maxRAM :
@@ -72,7 +48,6 @@ def getNumberOfProcessors(siteName=None, gridCE=None, queue=None):
72
48
73
49
Tries to find it in this order:
74
50
1) from the /Resources/Computing/CEDefaults/NumberOfProcessors (which is what the pilot fills up)
75
- 2) if not present from JobFeatures
76
51
3) if not present looks in CS for "NumberOfProcessors" Queue or CE option
77
52
4) if not present but there's WholeNode tag, look what the WN provides using multiprocessing.cpu_count()
78
53
5) return 1
@@ -84,14 +59,7 @@ def getNumberOfProcessors(siteName=None, gridCE=None, queue=None):
84
59
if numberOfProcessors :
85
60
return numberOfProcessors
86
61
87
- # 2) from MJF
88
- gLogger .info ("Getting numberOfProcessors from MJF" )
89
- numberOfProcessors = getProcessorFromMJF ()
90
- if numberOfProcessors :
91
- return numberOfProcessors
92
- gLogger .info ("NumberOfProcessors could not be found in MJF" )
93
-
94
- # 3) looks in CS for "NumberOfProcessors" Queue or CE or site option
62
+ # 2) looks in CS for "NumberOfProcessors" Queue or CE or site option
95
63
if not siteName :
96
64
siteName = gConfig .getValue ("/LocalSite/Site" , "" )
97
65
if not gridCE :
@@ -237,3 +205,65 @@ def getNumberOfGPUs(siteName=None, gridCE=None, queue=None):
237
205
# 3) return 0
238
206
gLogger .info ("NumberOfGPUs could not be found in CS" )
239
207
return 0
208
+
209
+
210
+ def getAvailableRAM (siteName = None , gridCE = None , queue = None ):
211
+ """Gets the available RAM on a certain CE/queue/node (what the pilot administers)
212
+
213
+ The siteName/gridCE/queue parameters are normally not necessary.
214
+
215
+ Tries to find it in this order:
216
+ 1) from the /Resources/Computing/CEDefaults/AvailableRAM (which is what the pilot might fill up)
217
+ 2) if not present looks in CS for "AvailableRAM" Queue or CE option
218
+ 3) if not present but there's WholeNode tag, look what the WN provides using _getMemoryFromProc()
219
+ 4) return 0
220
+ """
221
+
222
+ # 1) from /Resources/Computing/CEDefaults/MaxRAM
223
+ gLogger .info ("Getting MaxRAM from /Resources/Computing/CEDefaults/MaxRAM" )
224
+ availableRAM = gConfig .getValue ("/Resources/Computing/CEDefaults/MaxRAM" , None )
225
+ if availableRAM :
226
+ return availableRAM
227
+
228
+ # 2) looks in CS for "MaxRAM" Queue or CE or site option
229
+ if not siteName :
230
+ siteName = gConfig .getValue ("/LocalSite/Site" , "" )
231
+ if not gridCE :
232
+ gridCE = gConfig .getValue ("/LocalSite/GridCE" , "" )
233
+ if not queue :
234
+ queue = gConfig .getValue ("/LocalSite/CEQueue" , "" )
235
+ if not (siteName and gridCE and queue ):
236
+ gLogger .error ("Could not find AvailableRAM: missing siteName or gridCE or queue. Returning 0" )
237
+ return 0
238
+
239
+ grid = siteName .split ("." )[0 ]
240
+ csPaths = [
241
+ f"/Resources/Sites/{ grid } /{ siteName } /CEs/{ gridCE } /Queues/{ queue } /MaxRAM" ,
242
+ f"/Resources/Sites/{ grid } /{ siteName } /CEs/{ gridCE } /MaxRAM" ,
243
+ f"/Resources/Sites/{ grid } /{ siteName } /MaxRAM" ,
244
+ ]
245
+ for csPath in csPaths :
246
+ gLogger .info ("Looking in" , csPath )
247
+ availableRAM = gConfig .getValue (csPath , None )
248
+ if availableRAM :
249
+ return availableRAM
250
+
251
+ # 3) checks if 'WholeNode' is one of the used tags
252
+ # Tags of the CE
253
+ tags = fromChar (
254
+ gConfig .getValue (f"/Resources/Sites/{ siteName .split ('.' )[0 ]} /{ siteName } /CEs/{ gridCE } /Tag" , "" )
255
+ ) + fromChar (gConfig .getValue (f"/Resources/Sites/{ siteName .split ('.' )[0 ]} /{ siteName } /Cloud/{ gridCE } /Tag" , "" ))
256
+ # Tags of the Queue
257
+ tags += fromChar (
258
+ gConfig .getValue (f"/Resources/Sites/{ siteName .split ('.' )[0 ]} /{ siteName } /CEs/{ gridCE } /Queues/{ queue } /Tag" , "" )
259
+ ) + fromChar (
260
+ gConfig .getValue (f"/Resources/Sites/{ siteName .split ('.' )[0 ]} /{ siteName } /Cloud/{ gridCE } /VMTypes/{ queue } /Tag" , "" )
261
+ )
262
+
263
+ if "WholeNode" in tags :
264
+ gLogger .info ("Found WholeNode tag, using _getMemoryFromProc()" )
265
+ return _getMemoryFromProc ()
266
+
267
+ # 4) return 0
268
+ gLogger .info ("AvailableRAM could not be found in CS, and WholeNode tag not found" )
269
+ return 0
0 commit comments