diff options
author | Milind Changire <mchangir@redhat.com> | 2016-01-29 13:53:07 +0530 |
---|---|---|
committer | Jeff Darcy <jdarcy@redhat.com> | 2016-02-29 23:58:05 -0800 |
commit | 87d93fac9fcc4b258b7eb432ac4151cdd043534f (patch) | |
tree | e3d63403ea9f8ef33b54d22c403bbf7c591d1ca9 | |
parent | a35bfdaa6279a981a84e8831d65702496f1e478e (diff) |
georep: avoid creating multiple entries with same gfid
Problem:
CREATE + RENAME changelogs replayed by geo-replication cause
stale old-name entries with same gfid on slave nodes.
A gfid is a unique key in the file-system and should not be
assigned to multiple entries.
Solution:
Create entry on slave only if lstat(gfid) at aux-mount fails.
This applies to files as well as directories.
Change-Id: Ice3340f4ae1251c2dcef024a2388c4d33b5d4919
BUG: 1296206
Signed-off-by: Milind Changire <mchangir@redhat.com>
Reviewed-on: http://review.gluster.org/13316
Smoke: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Kotresh HR <khiremat@redhat.com>
Reviewed-by: Aravinda VK <avishwan@redhat.com>
NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
CentOS-regression: Gluster Build System <jenkins@build.gluster.com>
-rw-r--r-- | geo-replication/syncdaemon/resource.py | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/geo-replication/syncdaemon/resource.py b/geo-replication/syncdaemon/resource.py index ac697eb39ed..14fd76a7d59 100644 --- a/geo-replication/syncdaemon/resource.py +++ b/geo-replication/syncdaemon/resource.py @@ -694,11 +694,19 @@ class Server(object): logging.warn("Failed to remove %s => %s/%s. %s" % (gfid, pg, bname, os.strerror(er))) elif op in ['CREATE', 'MKNOD']: - blob = entry_pack_reg( - gfid, bname, e['mode'], e['uid'], e['gid']) + slink = os.path.join(pfx, gfid) + st = lstat(slink) + # don't create multiple entries with same gfid + if isinstance(st, int): + blob = entry_pack_reg( + gfid, bname, e['mode'], e['uid'], e['gid']) elif op == 'MKDIR': - blob = entry_pack_mkdir( - gfid, bname, e['mode'], e['uid'], e['gid']) + slink = os.path.join(pfx, gfid) + st = lstat(slink) + # don't create multiple entries with same gfid + if isinstance(st, int): + blob = entry_pack_mkdir( + gfid, bname, e['mode'], e['uid'], e['gid']) elif op == 'LINK': slink = os.path.join(pfx, gfid) st = lstat(slink) |