summaryrefslogtreecommitdiffstats
path: root/geo-replication
diff options
context:
space:
mode:
authorMilind Changire <mchangir@redhat.com>2016-01-29 13:53:07 +0530
committerVijay Bellur <vbellur@redhat.com>2016-03-08 08:34:57 -0800
commit16f42cdef539d5c63784f989af9ae877a94d72e7 (patch)
treeda1d855748f46df9fe112470d6d5864f2baa601c /geo-replication
parentc249931f2ca37d56391e671b37479555fec92686 (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: 1296208 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> (cherry picked from commit 87d93fac9fcc4b258b7eb432ac4151cdd043534f) Reviewed-on: http://review.gluster.org/13571
Diffstat (limited to 'geo-replication')
-rw-r--r--geo-replication/syncdaemon/resource.py16
1 files changed, 12 insertions, 4 deletions
diff --git a/geo-replication/syncdaemon/resource.py b/geo-replication/syncdaemon/resource.py
index c7fdbf37308..c26054ad9df 100644
--- a/geo-replication/syncdaemon/resource.py
+++ b/geo-replication/syncdaemon/resource.py
@@ -698,11 +698,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)