summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAravinda VK <avishwan@redhat.com>2014-06-20 12:59:43 +0530
committerVenky Shankar <vshankar@redhat.com>2014-07-09 01:52:24 -0700
commit56c7b07c746ba7ae86117f19bbf304e1150184fb (patch)
tree3841752e4b874d3735584314bc93072566c40e7b
parent72d96e27b3a8cb990c00422289b42e9b90c44b18 (diff)
geo-rep: Avoid duplicate stat in xsync changelog processing
When A file/dir is identified for metadata sync, it was doing duplicate stat to get the metadata to sync. With this patch it avoids doing one additional stat call. Xsync performance will improve. rsync will copy files metadata, so no need to include for processing. BUG: 1111490 Change-Id: I79dad6375fa4742d9aaca7d9856993c184a744dc Signed-off-by: Aravinda VK <avishwan@redhat.com> Reviewed-on: http://review.gluster.org/8124 Tested-by: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Venky Shankar <vshankar@redhat.com> Tested-by: Venky Shankar <vshankar@redhat.com>
-rw-r--r--geo-replication/syncdaemon/master.py30
1 files changed, 24 insertions, 6 deletions
diff --git a/geo-replication/syncdaemon/master.py b/geo-replication/syncdaemon/master.py
index c35ae8d2239..2decc5de930 100644
--- a/geo-replication/syncdaemon/master.py
+++ b/geo-replication/syncdaemon/master.py
@@ -704,6 +704,13 @@ class GMasterCommon(object):
self.set_slave_xtime(path, mark)
+class XCrawlMetadata(object):
+ def __init__(self, st_uid, st_gid, st_mode):
+ self.st_uid = int(st_uid)
+ self.st_gid = int(st_gid)
+ self.st_mode = int(st_mode)
+
+
class GMasterChangelogMixin(GMasterCommon):
""" changelog based change detection and syncing """
@@ -837,7 +844,15 @@ class GMasterChangelogMixin(GMasterCommon):
datas.add(os.path.join(pfx, ec[0]))
elif et == self.TYPE_META:
if ec[1] == 'SETATTR': # only setattr's for now...
- meta_gfid.add(os.path.join(pfx, ec[0]))
+ if len(ec) == 5:
+ # In xsync crawl, we already have stat data
+ # avoid doing stat again
+ meta_gfid.add((os.path.join(pfx, ec[0]),
+ XCrawlMetadata(st_uid=ec[2],
+ st_gid=ec[3],
+ st_mode=ec[4])))
+ else:
+ meta_gfid.add((os.path.join(pfx, ec[0]), ))
else:
logging.warn('got invalid changelog type: %s' % (et))
logging.debug('entries: %s' % repr(entries))
@@ -850,11 +865,14 @@ class GMasterChangelogMixin(GMasterCommon):
if meta_gfid:
meta_entries = []
for go in meta_gfid:
- st = lstat(go)
+ if len(go) > 1:
+ st = go[1]
+ else:
+ st = lstat(go[0])
if isinstance(st, int):
- logging.debug('file %s got purged in the interim' % go)
+ logging.debug('file %s got purged in the interim' % go[0])
continue
- meta_entries.append(edct('META', go=go, stat=st))
+ meta_entries.append(edct('META', go=go[0], stat=st))
if meta_entries:
self.slave.server.meta_ops(meta_entries)
# sync data
@@ -1381,7 +1399,8 @@ class GMasterXsyncMixin(GMasterChangelogMixin):
self.write_entry_change("E", [gfid, 'MKDIR', str(mo), str(
st.st_uid), str(st.st_gid), escape(os.path.join(pargfid,
bname))])
- self.write_entry_change("M", [gfid, "SETATTR"])
+ self.write_entry_change("M", [gfid, "SETATTR", str(st.st_uid),
+ str(st.st_gid), str(st.st_mode)])
self.Xcrawl(e, xtr_root)
self.stimes.append((e, xte))
elif stat.S_ISLNK(mo):
@@ -1401,7 +1420,6 @@ class GMasterXsyncMixin(GMasterChangelogMixin):
str(st.st_gid),
escape(os.path.join(
pargfid, bname))])
- self.write_entry_change("M", [gfid, "SETATTR"])
else:
self.write_entry_change(
"E", [gfid, 'LINK', escape(os.path.join(pargfid,