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