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>
This commit is contained in:
parent
ab2558a3e7
commit
d685e4238f
@ -797,6 +797,14 @@ class Server(object):
|
|||||||
if isinstance(st, int):
|
if isinstance(st, int):
|
||||||
blob = entry_pack_reg(
|
blob = entry_pack_reg(
|
||||||
gfid, bname, e['mode'], e['uid'], e['gid'])
|
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':
|
elif op == 'MKDIR':
|
||||||
slink = os.path.join(pfx, gfid)
|
slink = os.path.join(pfx, gfid)
|
||||||
st = lstat(slink)
|
st = lstat(slink)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user