46
46
from DIRAC .MonitoringSystem .Client .MonitoringReporter import MonitoringReporter
47
47
48
48
49
- def filterReplicas (opFile , logger = None , dataManager = None , opSources = None ):
49
+ def filterReplicas (opFile , logger = None , dataManager = None , opSources = None , activeReplicas = None ):
50
50
"""filter out banned/invalid source SEs
51
51
52
- :param opSources list: list of SE names to which limit the possible sources
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
53
54
54
55
:returns: Valid list of SEs valid as source
55
56
@@ -63,19 +64,21 @@ def filterReplicas(opFile, logger=None, dataManager=None, opSources=None):
63
64
log = logger .getSubLogger ("filterReplicas" )
64
65
result = defaultdict (list )
65
66
66
- replicas = dataManager .getActiveReplicas (opFile .LFN , getUrl = False , preferDisk = True )
67
- if not replicas ["OK" ]:
68
- log .error ("Failed to get active replicas" , replicas ["Message" ])
69
- 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
+
70
74
reNotExists = re .compile (r".*such file.*" )
71
- replicas = replicas ["Value" ]
72
- failed = replicas ["Failed" ].get (opFile .LFN , "" )
75
+ failed = activeReplicas ["Failed" ].get (opFile .LFN , "" )
73
76
if reNotExists .match (failed .lower ()):
74
77
opFile .Status = "Failed"
75
78
opFile .Error = failed
76
79
return S_ERROR (failed )
77
80
78
- replicas = replicas ["Successful" ].get (opFile .LFN , {})
81
+ replicas = activeReplicas ["Successful" ].get (opFile .LFN , {})
79
82
80
83
# If user set sourceSEs, only consider those replicas
81
84
if opSources :
@@ -259,9 +262,15 @@ def _addMetadataToFiles(self, toSchedule):
259
262
260
263
return S_OK (filesToSchedule )
261
264
262
- def _filterReplicas (self , opFile ):
265
+ def _filterReplicas (self , opFile , activeReplicas ):
263
266
"""filter out banned/invalid source SEs"""
264
- 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
+ )
265
274
266
275
def _checkExistingFTS3Operations (self ):
267
276
"""
@@ -348,13 +357,22 @@ def fts3Transfer(self):
348
357
if self .rmsMonitoring :
349
358
self .rmsMonitoringReporter .addRecord (self .createRMSRecord ("Attempted" , len (self .getWaitingFilesList ())))
350
359
351
- 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 :
352
370
rmsFilesIds [opFile .FileID ] = opFile
353
371
354
372
opFile .Error = ""
355
373
356
374
# # check replicas
357
- replicas = self ._filterReplicas (opFile )
375
+ replicas = self ._filterReplicas (opFile , allActiveReplicas )
358
376
if not replicas ["OK" ]:
359
377
continue
360
378
replicas = replicas ["Value" ]
@@ -510,6 +528,13 @@ def dmTransfer(self, fromFTS=False):
510
528
if self .rmsMonitoring :
511
529
self .rmsMonitoringReporter .addRecord (self .createRMSRecord ("Attempted" , len (waitingFiles )))
512
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
+
513
538
for opFile in waitingFiles :
514
539
if opFile .Error in (
515
540
"Couldn't get metadata" ,
@@ -524,7 +549,7 @@ def dmTransfer(self, fromFTS=False):
524
549
lfn = opFile .LFN
525
550
526
551
# Check if replica is at the specified source
527
- replicas = self ._filterReplicas (opFile )
552
+ replicas = self ._filterReplicas (opFile , allActiveReplicas )
528
553
if not replicas ["OK" ]:
529
554
self .log .error ("Failed to check replicas" , replicas ["Message" ])
530
555
continue
0 commit comments