summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKotresh HR <khiremat@redhat.com>2017-07-26 08:09:31 -0400
committerShyamsundar Ranganathan <srangana@redhat.com>2017-08-11 10:45:50 +0000
commita060485aae8cb508e05e0f9e46e3f0ec823a7f22 (patch)
treee1b6649489a1ff7a12d99f05b33b8c76cf955b48
parent5eed664c6c243c261506743448d99a80979942f2 (diff)
geo-rep: Fix syncing of self healed hardlinks
Problem: In a distribute replicate volume, if the hardlinks are created when a subvolume is down, it gets healed from other subvolume when it comes up. If this subvolume becomes ACTIVE in geo-rep there are chances that those hardlinks won't be synced to slave. Cause: AFR can't detect hardlinks during self heal. It just create those files using mknod and the same is recorded in changelog. Geo-rep processes these mknod and ignores it as it finds gfid already on slave. Solution: Geo-rep should process the mknod as link if the gfid already exists on slave. > Change-Id: I2f721b462b38a74c60e1df261662db4b99b32057 > BUG: 1475308 > Signed-off-by: Kotresh HR <khiremat@redhat.com> > Reviewed-on: https://review.gluster.org/17880 > Smoke: Gluster Build System <jenkins@build.gluster.org> > CentOS-regression: Gluster Build System <jenkins@build.gluster.org> > Reviewed-by: Aravinda VK <avishwan@redhat.com> (cherry picked from commit d685e4238fafba8f58bf01174c79cb5ca35203e5) Change-Id: I2f721b462b38a74c60e1df261662db4b99b32057 BUG: 1476212 Signed-off-by: Kotresh HR <khiremat@redhat.com> Reviewed-on: https://review.gluster.org/17907 Smoke: Gluster Build System <jenkins@build.gluster.org> CentOS-regression: Gluster Build System <jenkins@build.gluster.org> Reviewed-by: Aravinda VK <avishwan@redhat.com>
-rw-r--r--geo-replication/syncdaemon/resource.py8
1 files changed, 8 insertions, 0 deletions
diff --git a/geo-replication/syncdaemon/resource.py b/geo-replication/syncdaemon/resource.py
index ae924b84ce4..d309dfb57e3 100644
--- a/geo-replication/syncdaemon/resource.py
+++ b/geo-replication/syncdaemon/resource.py
@@ -781,6 +781,14 @@ class Server(object):
if isinstance(st, int):
blob = entry_pack_reg(
gfid, bname, e['mode'], e['uid'], e['gid'])
+ # Self healed hardlinks are recorded as MKNOD.
+ # So if the gfid already exists, it should be
+ # processed as hard link not mknod.
+ elif op in ['MKNOD']:
+ cmd_ret = errno_wrap(os.link,
+ [slink, entry],
+ [ENOENT, EEXIST], [ESTALE])
+ collect_failure(e, cmd_ret)
elif op == 'MKDIR':
slink = os.path.join(pfx, gfid)
st = lstat(slink)