Skip to content

Commit ae1f809

Browse files
committed
fix (DMS.directory-sync): better failure logging, later abort
Do not abort treating files if a single file fails to be uploaded or downloaded Printout all failed files at the end of the a thread
1 parent f0b2839 commit ae1f809

File tree

1 file changed

+15
-8
lines changed

1 file changed

+15
-8
lines changed

src/DIRAC/DataManagementSystem/scripts/dirac_dms_directory_sync.py

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,10 @@ def main():
6363
from DIRAC.DataManagementSystem.Client.DataManager import DataManager
6464
from DIRAC.Resources.Storage.StorageElement import StorageElement
6565

66+
from multiprocessing import Manager
67+
68+
listOfFailedFiles = Manager().list()
69+
6670
def getSetOfLocalDirectoriesAndFiles(path):
6771
"""Return a set of all directories and subdirectories and a set of
6872
files contained therein for a given local path
@@ -232,9 +236,9 @@ def uploadLocalFile(dm, lfn, localfile, storage):
232236
"""
233237
Upload a local file to a storage element
234238
"""
235-
res = dm.putAndRegister(lfn, localfile, storage, None)
239+
res = returnSingleResult(dm.putAndRegister(lfn, localfile, storage, None))
236240
if not res["OK"]:
237-
return S_ERROR("Error: failed to upload %s to %s" % (lfn, storage))
241+
return S_ERROR("Error: failed to upload %s to %s: %s" % (lfn, storage, res["Message"]))
238242
else:
239243
return S_OK("Successfully uploaded file to %s" % storage)
240244

@@ -364,7 +368,7 @@ def doUpload(fc, dm, result, source_dir, dest_dir, storage, delete, nthreads):
364368
gLogger.notice("Creating " + directoryname + " -> [DONE]")
365369

366370
listOfFiles = result["Value"]["Create"]["Files"]
367-
# Chech that we do not have to many threads
371+
# Check that we do not have too many threads
368372
if nthreads > len(listOfFiles):
369373
nthreads = len(listOfFiles)
370374

@@ -390,7 +394,7 @@ def uploadListOfFiles(dm, source_dir, dest_dir, storage, listOfFiles, tID):
390394
res = uploadLocalFile(dm, dest_dir + "/" + filename, source_dir + "/" + filename, storage)
391395
if not res["OK"]:
392396
log.fatal(threadLine + " Uploading " + filename + " -X- [FAILED] " + res["Message"])
393-
DIRAC.exit(1)
397+
listOfFailedFiles.append("%s: %s" % (filename, res["Message"]))
394398
else:
395399
log.notice(threadLine + " Uploading " + filename + " -> [DONE]")
396400

@@ -467,7 +471,7 @@ def downloadListOfFiles(dm, source_dir, dest_dir, listOfFiles, tID):
467471
res = downloadRemoteFile(dm, source_dir + "/" + filename, dest_dir + ("/" + filename).rsplit("/", 1)[0])
468472
if not res["OK"]:
469473
log.fatal(threadLine + " Downloading " + filename + " -X- [FAILED] " + res["Message"])
470-
DIRAC.exit(1)
474+
listOfFailedFiles.append("%s: %s" % (filename, res["Message"]))
471475
else:
472476
log.notice(threadLine + " Downloading " + filename + " -> [DONE]")
473477

@@ -486,9 +490,8 @@ def runInParallel(arguments, listOfLists, function):
486490
for process in processes:
487491
process.join()
488492

489-
for process in processes:
490-
if process.exitcode == 1:
491-
return S_ERROR()
493+
if any(process.exitcode == 1 for process in processes):
494+
return S_ERROR()
492495
return S_OK()
493496

494497
def syncDestinations(upload, source_dir, dest_dir, storage, delete, nthreads):
@@ -546,7 +549,11 @@ def run(parameters, delete, nthreads):
546549

547550
return S_OK("Successfully mirrored " + source_dir + " into " + dest_dir)
548551

552+
# This is the execution
549553
returnValue = run(args, sync, parallel)
554+
if listOfFailedFiles:
555+
gLogger.error("Some file operations failed:\n\t", "\n\t".join(listOfFailedFiles))
556+
DIRAC.exit(1)
550557
if not returnValue["OK"]:
551558
gLogger.fatal(returnValue["Message"])
552559
DIRAC.exit(1)

0 commit comments

Comments
 (0)