@@ -63,6 +63,10 @@ def main():
63
63
from DIRAC .DataManagementSystem .Client .DataManager import DataManager
64
64
from DIRAC .Resources .Storage .StorageElement import StorageElement
65
65
66
+ from multiprocessing import Manager
67
+
68
+ listOfFailedFiles = Manager ().list ()
69
+
66
70
def getSetOfLocalDirectoriesAndFiles (path ):
67
71
"""Return a set of all directories and subdirectories and a set of
68
72
files contained therein for a given local path
@@ -145,20 +149,6 @@ def getSetOfRemoteDirectoriesAndFiles(fc, path):
145
149
146
150
return S_OK (tree )
147
151
148
- def isInFileCatalog (fc , path ):
149
- """
150
- Check if the file is in the File Catalog
151
- """
152
-
153
- result = fc .listDirectory (path )
154
- if result ["OK" ]:
155
- if result ["Value" ]["Successful" ]:
156
- return S_OK ()
157
- else :
158
- return S_ERROR ()
159
- else :
160
- return S_ERROR ()
161
-
162
152
def getContentToSync (upload , fc , source_dir , dest_dir ):
163
153
"""
164
154
Return list of files and directories to be create and deleted
@@ -228,26 +218,6 @@ def removeRemoteFiles(dm, lfns):
228
218
else :
229
219
return S_OK ()
230
220
231
- def uploadLocalFile (dm , lfn , localfile , storage ):
232
- """
233
- Upload a local file to a storage element
234
- """
235
- res = dm .putAndRegister (lfn , localfile , storage , None )
236
- if not res ["OK" ]:
237
- return S_ERROR ("Error: failed to upload %s to %s" % (lfn , storage ))
238
- else :
239
- return S_OK ("Successfully uploaded file to %s" % storage )
240
-
241
- def downloadRemoteFile (dm , lfn , destination ):
242
- """
243
- Download a file from the system
244
- """
245
- res = dm .getFile (lfn , destination )
246
- if not res ["OK" ]:
247
- return S_ERROR ("Error: failed to download %s " % lfn )
248
- else :
249
- return S_OK ("Successfully uploaded file %s" % lfn )
250
-
251
221
def removeStorageDirectoryFromSE (directory , storageElement ):
252
222
"""
253
223
Delete directory on selected storage element
@@ -285,19 +255,6 @@ def removeRemoteDirectory(fc, lfn):
285
255
286
256
return S_OK ("Successfully removed directory" )
287
257
288
- def createRemoteDirectory (fc , newdir ):
289
- """
290
- Create directory in file catalog
291
- """
292
- result = fc .createDirectory (newdir )
293
- if result ["OK" ]:
294
- if result ["Value" ]["Successful" ] and newdir in result ["Value" ]["Successful" ]:
295
- return S_OK ("Successfully created directory:" + newdir )
296
- elif result ["Value" ]["Failed" ] and newdir in result ["Value" ]["Failed" ]:
297
- return S_ERROR ("Failed to create directory: " + result ["Value" ]["Failed" ][newdir ])
298
- else :
299
- return S_ERROR ("Failed to create directory:" + result ["Message" ])
300
-
301
258
def createLocalDirectory (directory ):
302
259
"""
303
260
Create local directory
@@ -314,7 +271,7 @@ def removeLocalFile(path):
314
271
try :
315
272
os .remove (path )
316
273
except OSError as e :
317
- return S_ERROR ("Directory creation failed:" + e .strerror )
274
+ return S_ERROR ("File deletion failed:" + e .strerror )
318
275
319
276
if os .path .isfile (path ):
320
277
return S_ERROR ("File deleting failed" )
@@ -356,15 +313,15 @@ def doUpload(fc, dm, result, source_dir, dest_dir, storage, delete, nthreads):
356
313
gLogger .notice ("Deleting " + directoryname + " -> [DONE]" )
357
314
358
315
for directoryname in result ["Value" ]["Create" ]["Directories" ]:
359
- res = createRemoteDirectory (fc , dest_dir + "/" + directoryname )
316
+ res = returnSingleResult (fc . createDirectory ( dest_dir + "/" + directoryname ) )
360
317
if not res ["OK" ]:
361
318
gLogger .fatal ("Creation of directory: " + directoryname + " -X- [FAILED] " + res ["Message" ])
362
319
DIRAC .exit (1 )
363
320
else :
364
321
gLogger .notice ("Creating " + directoryname + " -> [DONE]" )
365
322
366
323
listOfFiles = result ["Value" ]["Create" ]["Files" ]
367
- # Chech that we do not have to many threads
324
+ # Check that we do not have too many threads
368
325
if nthreads > len (listOfFiles ):
369
326
nthreads = len (listOfFiles )
370
327
@@ -387,10 +344,11 @@ def uploadListOfFiles(dm, source_dir, dest_dir, storage, listOfFiles, tID):
387
344
log = gLogger .getLocalSubLogger ("[Thread %s] " % tID )
388
345
threadLine = "[Thread %s]" % tID
389
346
for filename in listOfFiles :
390
- res = uploadLocalFile (dm , dest_dir + "/" + filename , source_dir + "/" + filename , storage )
347
+ destLFN = os .path .join (dest_dir , filename )
348
+ res = returnSingleResult (dm .putAndRegister (destLFN , source_dir + "/" + filename , storage , None ))
391
349
if not res ["OK" ]:
392
350
log .fatal (threadLine + " Uploading " + filename + " -X- [FAILED] " + res ["Message" ])
393
- DIRAC . exit ( 1 )
351
+ listOfFailedFiles . append ( "%s: %s" % ( destLFN , res [ "Message" ]) )
394
352
else :
395
353
log .notice (threadLine + " Uploading " + filename + " -> [DONE]" )
396
354
@@ -464,10 +422,11 @@ def downloadListOfFiles(dm, source_dir, dest_dir, listOfFiles, tID):
464
422
log = gLogger .getLocalSubLogger ("[Thread %s] " % tID )
465
423
threadLine = "[Thread %s]" % tID
466
424
for filename in listOfFiles :
467
- res = downloadRemoteFile (dm , source_dir + "/" + filename , dest_dir + ("/" + filename ).rsplit ("/" , 1 )[0 ])
425
+ sourceLFN = os .path .join (source_dir , filename )
426
+ res = returnSingleResult (dm .getFile (sourceLFN , dest_dir + ("/" + filename ).rsplit ("/" , 1 )[0 ]))
468
427
if not res ["OK" ]:
469
428
log .fatal (threadLine + " Downloading " + filename + " -X- [FAILED] " + res ["Message" ])
470
- DIRAC . exit ( 1 )
429
+ listOfFailedFiles . append ( "%s: %s" % ( sourceLFN , res [ "Message" ]) )
471
430
else :
472
431
log .notice (threadLine + " Downloading " + filename + " -> [DONE]" )
473
432
@@ -486,9 +445,8 @@ def runInParallel(arguments, listOfLists, function):
486
445
for process in processes :
487
446
process .join ()
488
447
489
- for process in processes :
490
- if process .exitcode == 1 :
491
- return S_ERROR ()
448
+ if any (process .exitcode == 1 for process in processes ):
449
+ return S_ERROR ()
492
450
return S_OK ()
493
451
494
452
def syncDestinations (upload , source_dir , dest_dir , storage , delete , nthreads ):
@@ -546,7 +504,11 @@ def run(parameters, delete, nthreads):
546
504
547
505
return S_OK ("Successfully mirrored " + source_dir + " into " + dest_dir )
548
506
507
+ # This is the execution
549
508
returnValue = run (args , sync , parallel )
509
+ if listOfFailedFiles :
510
+ gLogger .error ("Some file operations failed:\n \t " , "\n \t " .join (listOfFailedFiles ))
511
+ DIRAC .exit (1 )
550
512
if not returnValue ["OK" ]:
551
513
gLogger .fatal (returnValue ["Message" ])
552
514
DIRAC .exit (1 )
0 commit comments