46
46
from DIRAC .MonitoringSystem .Client .MonitoringReporter import MonitoringReporter
47
47
48
48
49
- def filterReplicas (opFile , logger = None , dataManager = None , opSources = None ):
50
- """filter out banned/invalid source SEs"""
49
+ def filterReplicas (opFile , logger = None , dataManager = None , opSources = None , activeReplicas = None ):
50
+ """filter out banned/invalid source SEs
51
+
52
+ :param list opSources: list of SE names to which limit the possible sources
53
+ :param dict activeReplicas: the result of dm.getActiveReplicas(*)["Value"]. Used as a cache
54
+
55
+ :returns: Valid list of SEs valid as source
56
+
57
+ """
51
58
52
59
if logger is None :
53
60
logger = gLogger
@@ -57,19 +64,21 @@ def filterReplicas(opFile, logger=None, dataManager=None, opSources=None):
57
64
log = logger .getSubLogger ("filterReplicas" )
58
65
result = defaultdict (list )
59
66
60
- replicas = dataManager .getActiveReplicas (opFile .LFN , getUrl = False , preferDisk = True )
61
- if not replicas ["OK" ]:
62
- log .error ("Failed to get active replicas" , replicas ["Message" ])
63
- return replicas
67
+ if not activeReplicas :
68
+ res = dataManager .getActiveReplicas (opFile .LFN , getUrl = False , preferDisk = True )
69
+ if not res ["OK" ]:
70
+ log .error ("Failed to get active replicas" , res ["Message" ])
71
+ return res
72
+ activeReplicas = res ["Value" ]
73
+
64
74
reNotExists = re .compile (r".*such file.*" )
65
- replicas = replicas ["Value" ]
66
- failed = replicas ["Failed" ].get (opFile .LFN , "" )
75
+ failed = activeReplicas ["Failed" ].get (opFile .LFN , "" )
67
76
if reNotExists .match (failed .lower ()):
68
77
opFile .Status = "Failed"
69
78
opFile .Error = failed
70
79
return S_ERROR (failed )
71
80
72
- replicas = replicas ["Successful" ].get (opFile .LFN , {})
81
+ replicas = activeReplicas ["Successful" ].get (opFile .LFN , {})
73
82
74
83
# If user set sourceSEs, only consider those replicas
75
84
if opSources :
@@ -253,9 +262,15 @@ def _addMetadataToFiles(self, toSchedule):
253
262
254
263
return S_OK (filesToSchedule )
255
264
256
- def _filterReplicas (self , opFile ):
265
+ def _filterReplicas (self , opFile , activeReplicas ):
257
266
"""filter out banned/invalid source SEs"""
258
- return filterReplicas (opFile , logger = self .log , dataManager = self .dm , opSources = self .operation .sourceSEList )
267
+ return filterReplicas (
268
+ opFile ,
269
+ logger = self .log ,
270
+ dataManager = self .dm ,
271
+ opSources = self .operation .sourceSEList ,
272
+ activeReplicas = activeReplicas ,
273
+ )
259
274
260
275
def _checkExistingFTS3Operations (self ):
261
276
"""
@@ -342,13 +357,22 @@ def fts3Transfer(self):
342
357
if self .rmsMonitoring :
343
358
self .rmsMonitoringReporter .addRecord (self .createRMSRecord ("Attempted" , len (self .getWaitingFilesList ())))
344
359
345
- for opFile in self .getWaitingFilesList ():
360
+ waitingFiles = self .getWaitingFilesList ()
361
+
362
+ allLFNs = [opFile .LFN for opFile in waitingFiles ]
363
+ res = self .dm .getActiveReplicas (allLFNs , getUrl = False , preferDisk = True )
364
+ if not res ["OK" ]:
365
+ self .log .error ("Failed to get active replicas" , res ["Message" ])
366
+ return res
367
+ allActiveReplicas = res ["Value" ]
368
+
369
+ for opFile in waitingFiles :
346
370
rmsFilesIds [opFile .FileID ] = opFile
347
371
348
372
opFile .Error = ""
349
373
350
374
# # check replicas
351
- replicas = self ._filterReplicas (opFile )
375
+ replicas = self ._filterReplicas (opFile , allActiveReplicas )
352
376
if not replicas ["OK" ]:
353
377
continue
354
378
replicas = replicas ["Value" ]
@@ -504,6 +528,13 @@ def dmTransfer(self, fromFTS=False):
504
528
if self .rmsMonitoring :
505
529
self .rmsMonitoringReporter .addRecord (self .createRMSRecord ("Attempted" , len (waitingFiles )))
506
530
531
+ allLFNs = [opFile .LFN for opFile in waitingFiles ]
532
+ res = self .dm .getActiveReplicas (allLFNs , getUrl = False , preferDisk = True )
533
+ if not res ["OK" ]:
534
+ self .log .error ("Failed to get active replicas" , res ["Message" ])
535
+ return res
536
+ allActiveReplicas = res ["Value" ]
537
+
507
538
for opFile in waitingFiles :
508
539
if opFile .Error in (
509
540
"Couldn't get metadata" ,
@@ -518,7 +549,7 @@ def dmTransfer(self, fromFTS=False):
518
549
lfn = opFile .LFN
519
550
520
551
# Check if replica is at the specified source
521
- replicas = self ._filterReplicas (opFile )
552
+ replicas = self ._filterReplicas (opFile , allActiveReplicas )
522
553
if not replicas ["OK" ]:
523
554
self .log .error ("Failed to check replicas" , replicas ["Message" ])
524
555
continue
0 commit comments