From f5481621f85a494f9597a076f38a132c525a670f Mon Sep 17 00:00:00 2001 From: Brian Coca Date: Tue, 11 Sep 2012 17:53:43 -0400 Subject: [PATCH] made copy atomic by creating tmp file in dest location (ensures same partition) uses pid and epoch to prevent collisions, good enough for most cases Signed-off-by: Brian Coca --- library/copy | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/library/copy b/library/copy index b4da56c9797..beda6652ba3 100755 --- a/library/copy +++ b/library/copy @@ -20,6 +20,7 @@ import os import shutil +import time def main(): @@ -64,7 +65,11 @@ def main(): if backup: if os.path.exists(dest): backup_file = module.backup_local(dest) - shutil.copyfile(src, dest) + #TODO:pid + epoch should avoid most collisions, hostname/mac for those using nfs? + # might be an issue with exceeding path length + dest_tmp = "%s.%s.%s.tmp" % (dest,os.getpid(),time.gmtime) + shutil.copyfile(src, dest_tmp) + shutil.copyfile(dest_tmp, dest) except shutil.Error: module.fail_json(msg="failed to copy: %s and %s are the same" % (src, dest)) except IOError: