diff options
-rw-r--r-- | geo-replication/syncdaemon/resource.py | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/geo-replication/syncdaemon/resource.py b/geo-replication/syncdaemon/resource.py index 575a6605393..7eeced96caf 100644 --- a/geo-replication/syncdaemon/resource.py +++ b/geo-replication/syncdaemon/resource.py @@ -621,8 +621,14 @@ class Server(object): collect_failure(e, EEXIST) elif op == 'RENAME': en = e['entry1'] - st = lstat(entry) - if isinstance(st, int): + # The matching disk gfid check validates two things + # 1. Validates name is present, return false otherwise + # 2. Validates gfid is same, returns false otherwise + # So both validations are necessary to decide src doesn't + # exist. We can't rely on only gfid stat as hardlink could + # be present and we can't rely only on name as name could + # exist with differnt gfid. + if not matching_disk_gfid(gfid, entry): if e['stat'] and not stat.S_ISDIR(e['stat']['mode']): if stat.S_ISLNK(e['stat']['mode']) and \ e['link'] is not None: @@ -646,6 +652,7 @@ class Server(object): [ENOENT, EEXIST], [ESTALE]) collect_failure(e, cmd_ret) else: + st = lstat(entry) st1 = lstat(en) if isinstance(st1, int): rename_with_disk_gfid_confirmation(gfid, entry, en) |