summaryrefslogtreecommitdiffstats
path: root/geo-replication/syncdaemon/resource.py
diff options
context:
space:
mode:
Diffstat (limited to 'geo-replication/syncdaemon/resource.py')
-rw-r--r--geo-replication/syncdaemon/resource.py23
1 files changed, 17 insertions, 6 deletions
diff --git a/geo-replication/syncdaemon/resource.py b/geo-replication/syncdaemon/resource.py
index 3722d21a0fd..cbd96bbb77e 100644
--- a/geo-replication/syncdaemon/resource.py
+++ b/geo-replication/syncdaemon/resource.py
@@ -664,16 +664,19 @@ class Server(object):
# We do this for failing fops on Slave
# Master should be logging this
if cmd_ret is None:
- return
+ return False
if cmd_ret == EEXIST:
disk_gfid = cls.gfid_mnt(e['entry'])
- if isinstance(disk_gfid, basestring):
- if e['gfid'] != disk_gfid:
- failures.append((e, cmd_ret, disk_gfid))
+ if isinstance(disk_gfid, basestring) and e['gfid'] != disk_gfid:
+ failures.append((e, cmd_ret, disk_gfid))
+ else:
+ return False
else:
failures.append((e, cmd_ret))
+ return True
+
failures = []
def matching_disk_gfid(gfid, entry):
@@ -843,7 +846,15 @@ class Server(object):
[pg, 'glusterfs.gfid.newfile', blob],
[EEXIST, ENOENT],
[ESTALE, EINVAL])
- collect_failure(e, cmd_ret)
+ failed = collect_failure(e, cmd_ret)
+
+ # If directory creation is failed, return immediately before
+ # further processing. Allowing it to further process will
+ # cause the entire directory tree to fail syncing to slave.
+ # Hence master will log and raise exception if it's
+ # directory failure.
+ if failed and op == 'MKDIR':
+ return failures
# If UID/GID is different than zero that means we are trying
# create Entry with different UID/GID. Create Entry with
@@ -852,7 +863,7 @@ class Server(object):
path = os.path.join(pfx, gfid)
cmd_ret = errno_wrap(os.chown, [path, uid, gid], [ENOENT],
[ESTALE, EINVAL])
- collect_failure(e, cmd_ret)
+ collect_failure(e, cmd_ret)
return failures