diff options
| author | Kotresh HR <khiremat@redhat.com> | 2017-07-26 08:09:31 -0400 | 
|---|---|---|
| committer | Shyamsundar Ranganathan <srangana@redhat.com> | 2017-07-31 16:29:32 +0000 | 
| commit | 1f51ffce563f614053af689a1ee0d84e37232fa7 (patch) | |
| tree | c291f1d5c447443fe8e66d676af3402246176136 | |
| parent | c81bcf072ceefead5708ac57672d1dab5e42f4b8 (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
Signed-off-by: Kotresh HR <khiremat@redhat.com>
BUG: 1476208
Reviewed-on: https://review.gluster.org/17905
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.py | 8 | 
1 files changed, 8 insertions, 0 deletions
diff --git a/geo-replication/syncdaemon/resource.py b/geo-replication/syncdaemon/resource.py index 275e9fd29ab..a608944f9be 100644 --- a/geo-replication/syncdaemon/resource.py +++ b/geo-replication/syncdaemon/resource.py @@ -797,6 +797,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)  | 
