Blame SPECS/0299-geo-rep-performance-improvement-while-syncing-rename.patch

Packit Service 89bf3d
From f293f7ac2f75c58d81da1229b484eb530b7083b5 Mon Sep 17 00:00:00 2001
Packit Service 89bf3d
From: Sunny Kumar <sunkumar@redhat.com>
Packit Service 89bf3d
Date: Fri, 20 Sep 2019 09:39:12 +0530
Packit Service 89bf3d
Subject: [PATCH 299/302] geo-rep: performance improvement while syncing
Packit Service 89bf3d
 renames with existing gfid
Packit Service 89bf3d
Packit Service 89bf3d
Problem:
Packit Service 89bf3d
The bug[1] addresses issue of data inconsistency when handling RENAME with
Packit Service 89bf3d
existing destination. This fix requires some performance tuning considering
Packit Service 89bf3d
this issue occurs in heavy rename workload.
Packit Service 89bf3d
Packit Service 89bf3d
Solution:
Packit Service 89bf3d
If distribution count for master volume is one do not verify op's on
Packit Service 89bf3d
master and go ahead with rename.
Packit Service 89bf3d
Packit Service 89bf3d
The performance improvement with this patch can only be observed if
Packit Service 89bf3d
master volume has distribution count one.
Packit Service 89bf3d
Packit Service 89bf3d
[1]. https://bugzilla.redhat.com/show_bug.cgi?id=1694820
Packit Service 89bf3d
Backport of:
Packit Service 89bf3d
Packit Service 89bf3d
    >fixes: bz#1753857
Packit Service 89bf3d
    >Change-Id: I8e9bcd575e7e35f40f9f78b7961c92dee642f47b
Packit Service 89bf3d
    >Signed-off-by: Sunny Kumar <sunkumar@redhat.com>
Packit Service 89bf3d
Packit Service 89bf3d
Upstream Patch:
Packit Service 89bf3d
    https://review.gluster.org/#/c/glusterfs/+/23459/
Packit Service 89bf3d
Packit Service 89bf3d
BUG: 1726000
Packit Service 89bf3d
Change-Id: I8e9bcd575e7e35f40f9f78b7961c92dee642f47b
Packit Service 89bf3d
Signed-off-by: Sunny Kumar <sunkumar@redhat.com>
Packit Service 89bf3d
Reviewed-on: https://code.engineering.redhat.com/gerrit/181893
Packit Service 89bf3d
Tested-by: RHGS Build Bot <nigelb@redhat.com>
Packit Service 89bf3d
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
Packit Service 89bf3d
---
Packit Service 89bf3d
 geo-replication/gsyncd.conf.in           |  5 +++++
Packit Service 89bf3d
 geo-replication/syncdaemon/gsyncd.py     |  2 ++
Packit Service 89bf3d
 geo-replication/syncdaemon/monitor.py    |  2 ++
Packit Service 89bf3d
 geo-replication/syncdaemon/resource.py   | 13 +++++++++++--
Packit Service 89bf3d
 geo-replication/syncdaemon/syncdutils.py | 11 +++++++++++
Packit Service 89bf3d
 5 files changed, 31 insertions(+), 2 deletions(-)
Packit Service 89bf3d
Packit Service 89bf3d
diff --git a/geo-replication/gsyncd.conf.in b/geo-replication/gsyncd.conf.in
Packit Service 89bf3d
index 5ebd57a..9155cd8 100644
Packit Service 89bf3d
--- a/geo-replication/gsyncd.conf.in
Packit Service 89bf3d
+++ b/geo-replication/gsyncd.conf.in
Packit Service 89bf3d
@@ -23,6 +23,11 @@ configurable=false
Packit Service 89bf3d
 type=int
Packit Service 89bf3d
 value=1
Packit Service 89bf3d
 
Packit Service 89bf3d
+[master-distribution-count]
Packit Service 89bf3d
+configurable=false
Packit Service 89bf3d
+type=int
Packit Service 89bf3d
+value=1
Packit Service 89bf3d
+
Packit Service 89bf3d
 [glusterd-workdir]
Packit Service 89bf3d
 value = @GLUSTERD_WORKDIR@
Packit Service 89bf3d
 
Packit Service 89bf3d
diff --git a/geo-replication/syncdaemon/gsyncd.py b/geo-replication/syncdaemon/gsyncd.py
Packit Service 89bf3d
index a4c6f32..6ae5269 100644
Packit Service 89bf3d
--- a/geo-replication/syncdaemon/gsyncd.py
Packit Service 89bf3d
+++ b/geo-replication/syncdaemon/gsyncd.py
Packit Service 89bf3d
@@ -134,6 +134,8 @@ def main():
Packit Service 89bf3d
                    help="Directory where Gluster binaries exist on slave")
Packit Service 89bf3d
     p.add_argument("--slave-access-mount", action="store_true",
Packit Service 89bf3d
                    help="Do not lazy umount the slave volume")
Packit Service 89bf3d
+    p.add_argument("--master-dist-count", type=int,
Packit Service 89bf3d
+                   help="Master Distribution count")
Packit Service 89bf3d
 
Packit Service 89bf3d
     # Status
Packit Service 89bf3d
     p = sp.add_parser("status")
Packit Service 89bf3d
diff --git a/geo-replication/syncdaemon/monitor.py b/geo-replication/syncdaemon/monitor.py
Packit Service 89bf3d
index 234f3f1..236afe7 100644
Packit Service 89bf3d
--- a/geo-replication/syncdaemon/monitor.py
Packit Service 89bf3d
+++ b/geo-replication/syncdaemon/monitor.py
Packit Service 89bf3d
@@ -37,6 +37,8 @@ def get_subvol_num(brick_idx, vol, hot):
Packit Service 89bf3d
     tier = vol.is_tier()
Packit Service 89bf3d
     disperse_count = vol.disperse_count(tier, hot)
Packit Service 89bf3d
     replica_count = vol.replica_count(tier, hot)
Packit Service 89bf3d
+    distribute_count = vol.distribution_count(tier, hot)
Packit Service 89bf3d
+    gconf.setconfig("master-distribution-count", distribute_count)
Packit Service 89bf3d
 
Packit Service 89bf3d
     if (tier and not hot):
Packit Service 89bf3d
         brick_idx = brick_idx - vol.get_hot_bricks_count(tier)
Packit Service 89bf3d
diff --git a/geo-replication/syncdaemon/resource.py b/geo-replication/syncdaemon/resource.py
Packit Service 89bf3d
index b16db60..189d8a1 100644
Packit Service 89bf3d
--- a/geo-replication/syncdaemon/resource.py
Packit Service 89bf3d
+++ b/geo-replication/syncdaemon/resource.py
Packit Service 89bf3d
@@ -377,6 +377,7 @@ class Server(object):
Packit Service 89bf3d
     def entry_ops(cls, entries):
Packit Service 89bf3d
         pfx = gauxpfx()
Packit Service 89bf3d
         logging.debug('entries: %s' % repr(entries))
Packit Service 89bf3d
+        dist_count = rconf.args.master_dist_count
Packit Service 89bf3d
 
Packit Service 89bf3d
         def entry_purge(op, entry, gfid, e, uid, gid):
Packit Service 89bf3d
             # This is an extremely racy code and needs to be fixed ASAP.
Packit Service 89bf3d
@@ -686,9 +687,15 @@ class Server(object):
Packit Service 89bf3d
                                             raise
Packit Service 89bf3d
                                 else:
Packit Service 89bf3d
                                     raise
Packit Service 89bf3d
-                        elif not matching_disk_gfid(gfid, en):
Packit Service 89bf3d
+                        elif not matching_disk_gfid(gfid, en) and dist_count > 1:
Packit Service 89bf3d
                             collect_failure(e, EEXIST, uid, gid, True)
Packit Service 89bf3d
                         else:
Packit Service 89bf3d
+                            # We are here which means matching_disk_gfid for
Packit Service 89bf3d
+                            # both source and destination has returned false
Packit Service 89bf3d
+                            # and distribution count for master vol is greater
Packit Service 89bf3d
+                            # then one. Which basically says both the source and
Packit Service 89bf3d
+                            # destination exist and not hardlinks.
Packit Service 89bf3d
+                            # So we are safe to go ahead with rename here.
Packit Service 89bf3d
                             rename_with_disk_gfid_confirmation(gfid, entry, en,
Packit Service 89bf3d
                                                                uid, gid)
Packit Service 89bf3d
             if blob:
Packit Service 89bf3d
@@ -1409,7 +1416,9 @@ class SSH(object):
Packit Service 89bf3d
                 '--slave-gluster-log-level',
Packit Service 89bf3d
                 gconf.get("slave-gluster-log-level"),
Packit Service 89bf3d
                 '--slave-gluster-command-dir',
Packit Service 89bf3d
-                gconf.get("slave-gluster-command-dir")]
Packit Service 89bf3d
+                gconf.get("slave-gluster-command-dir"),
Packit Service 89bf3d
+                '--master-dist-count',
Packit Service 89bf3d
+                str(gconf.get("master-distribution-count"))]
Packit Service 89bf3d
 
Packit Service 89bf3d
         if gconf.get("slave-access-mount"):
Packit Service 89bf3d
             args_to_slave.append('--slave-access-mount')
Packit Service 89bf3d
diff --git a/geo-replication/syncdaemon/syncdutils.py b/geo-replication/syncdaemon/syncdutils.py
Packit Service 89bf3d
index 2ee10ac..aadaebd 100644
Packit Service 89bf3d
--- a/geo-replication/syncdaemon/syncdutils.py
Packit Service 89bf3d
+++ b/geo-replication/syncdaemon/syncdutils.py
Packit Service 89bf3d
@@ -926,6 +926,14 @@ class Volinfo(object):
Packit Service 89bf3d
         else:
Packit Service 89bf3d
             return int(self.get('disperseCount')[0].text)
Packit Service 89bf3d
 
Packit Service 89bf3d
+    def distribution_count(self, tier, hot):
Packit Service 89bf3d
+        if (tier and hot):
Packit Service 89bf3d
+            return int(self.get('hotBricks/hotdistCount')[0].text)
Packit Service 89bf3d
+        elif (tier and not hot):
Packit Service 89bf3d
+            return int(self.get('coldBricks/colddistCount')[0].text)
Packit Service 89bf3d
+        else:
Packit Service 89bf3d
+            return int(self.get('distCount')[0].text)
Packit Service 89bf3d
+
Packit Service 89bf3d
     @property
Packit Service 89bf3d
     @memoize
Packit Service 89bf3d
     def hot_bricks(self):
Packit Service 89bf3d
@@ -994,6 +1002,9 @@ class VolinfoFromGconf(object):
Packit Service 89bf3d
     def disperse_count(self, tier, hot):
Packit Service 89bf3d
         return gconf.get("master-disperse-count")
Packit Service 89bf3d
 
Packit Service 89bf3d
+    def distribution_count(self, tier, hot):
Packit Service 89bf3d
+        return gconf.get("master-distribution-count")
Packit Service 89bf3d
+
Packit Service 89bf3d
     @property
Packit Service 89bf3d
     @memoize
Packit Service 89bf3d
     def hot_bricks(self):
Packit Service 89bf3d
-- 
Packit Service 89bf3d
1.8.3.1
Packit Service 89bf3d