Blob Blame History Raw
From 0e663d4c32a6a43ba444277b0fd05ca29493995e Mon Sep 17 00:00:00 2001
From: Atin Mukherjee <amukherj@redhat.com>
Date: Wed, 1 Feb 2017 15:04:08 +0530
Subject: [PATCH 283/285] glusterd : do not load io-threads in client graph for
 replicate volumes

client.io-threads has been turned on by default from release-3.9 onwards,
however this has an adverse effects on replicate volumes due to the design
limitations on replications, till that gets addressed through server side
replication as a preventive measure it is wiser not to load io-threads in the
client graph for replicate volumes.

>Reviewed-on: https://review.gluster.org/16502
>NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
>CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
>Smoke: Gluster Build System <jenkins@build.gluster.org>
>Reviewed-by: Prashanth Pai <ppai@redhat.com>
>Reviewed-by: Ravishankar N <ravishankar@redhat.com>
>Reviewed-by: Jeff Darcy <jdarcy@redhat.com>

Change-Id: Ibc576d4517da23fcdf55c6f4d17b90152a8817d7
BUG: 1418011
Signed-off-by: Atin Mukherjee <amukherj@redhat.com>
Reviewed-on: https://code.engineering.redhat.com/gerrit/96886
---
 xlators/mgmt/glusterd/src/glusterd-handler.c |  4 ++--
 xlators/mgmt/glusterd/src/glusterd-utils.c   | 20 +++++++++++++++++++-
 xlators/mgmt/glusterd/src/glusterd-utils.h   |  3 ++-
 xlators/mgmt/glusterd/src/glusterd-volgen.c  |  8 ++++++++
 4 files changed, 31 insertions(+), 4 deletions(-)

diff --git a/xlators/mgmt/glusterd/src/glusterd-handler.c b/xlators/mgmt/glusterd/src/glusterd-handler.c
index f8dc91b..664fe5b 100644
--- a/xlators/mgmt/glusterd/src/glusterd-handler.c
+++ b/xlators/mgmt/glusterd/src/glusterd-handler.c
@@ -4837,7 +4837,7 @@ glusterd_get_volume_opts (rpcsvc_request_t *req, dict_t *dict)
                                                                (dict,
                                                                 _gf_false,
                                                                 key, orig_key,
-                                                                volinfo->dict,
+                                                                volinfo,
                                                                 &rsp.op_errstr);
                                         if (ret && !rsp.op_errstr) {
                                                 snprintf (err_str,
@@ -4863,7 +4863,7 @@ glusterd_get_volume_opts (rpcsvc_request_t *req, dict_t *dict)
         } else {
                 /* Handle the "all" volume option request */
                 ret = glusterd_get_default_val_for_volopt (dict, _gf_true, NULL,
-                                                           NULL, volinfo->dict,
+                                                           NULL, volinfo,
                                                            &rsp.op_errstr);
                 if (ret && !rsp.op_errstr) {
                         snprintf (err_str, sizeof(err_str),
diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c
index 31ba68b..a0d18cc 100644
--- a/xlators/mgmt/glusterd/src/glusterd-utils.c
+++ b/xlators/mgmt/glusterd/src/glusterd-utils.c
@@ -10934,7 +10934,8 @@ out:
 int
 glusterd_get_default_val_for_volopt (dict_t *ctx, gf_boolean_t all_opts,
                                      char *input_key, char *orig_key,
-                                     dict_t *vol_dict, char **op_errstr)
+                                     glusterd_volinfo_t *volinfo,
+                                     char **op_errstr)
 {
         struct volopt_map_entry *vme = NULL;
         int                      ret = -1;
@@ -10945,6 +10946,7 @@ glusterd_get_default_val_for_volopt (dict_t *ctx, gf_boolean_t all_opts,
         char                     dict_key[50] = {0,};
         gf_boolean_t             key_found = _gf_false;
         glusterd_conf_t         *priv = NULL;
+        dict_t                  *vol_dict = NULL;
 
         this = THIS;
         GF_ASSERT (this);
@@ -10952,6 +10954,7 @@ glusterd_get_default_val_for_volopt (dict_t *ctx, gf_boolean_t all_opts,
         priv = this->private;
         GF_VALIDATE_OR_GOTO (this->name, priv, out);
 
+        vol_dict = volinfo->dict;
         GF_VALIDATE_OR_GOTO (this->name, vol_dict, out);
 
         /* Check whether key is passed for a single option */
@@ -10973,6 +10976,20 @@ glusterd_get_default_val_for_volopt (dict_t *ctx, gf_boolean_t all_opts,
                 if (!def_val) {
                         ret = dict_get_str (vol_dict, vme->key, &def_val);
                         if (!def_val) {
+                                /* For replicate volumes
+                                 * performance.client-io-threads will be set to
+                                 * off by default until explicitly turned on
+                                 */
+                                if (!strcmp (vme->key,
+                                            "performance.client-io-threads")) {
+                                        if (volinfo->type ==
+                                            GF_CLUSTER_TYPE_REPLICATE ||
+                                            volinfo->type ==
+                                            GF_CLUSTER_TYPE_STRIPE_REPLICATE) {
+                                                def_val = "off";
+                                                goto set_count;
+                                        }
+                                }
                                 if (vme->value) {
                                         def_val = vme->value;
                                 } else {
@@ -10985,6 +11002,7 @@ glusterd_get_default_val_for_volopt (dict_t *ctx, gf_boolean_t all_opts,
                                 }
                         }
                 }
+set_count:
                 count++;
                 sprintf (dict_key, "key%d", count);
                 ret = dict_set_str(ctx, dict_key, vme->key);
diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.h b/xlators/mgmt/glusterd/src/glusterd-utils.h
index 419ab48..160b2ef 100644
--- a/xlators/mgmt/glusterd/src/glusterd-utils.h
+++ b/xlators/mgmt/glusterd/src/glusterd-utils.h
@@ -626,7 +626,8 @@ glusterd_get_volopt_content (dict_t *dict, gf_boolean_t xml_out);
 int
 glusterd_get_default_val_for_volopt (dict_t *dict, gf_boolean_t all_opts,
                                      char *key, char *orig_key,
-                                     dict_t *vol_dict, char **err_str);
+                                     glusterd_volinfo_t  *volinfo,
+                                     char **err_str);
 
 int
 glusterd_check_client_op_version_support (char *volname, uint32_t op_version,
diff --git a/xlators/mgmt/glusterd/src/glusterd-volgen.c b/xlators/mgmt/glusterd/src/glusterd-volgen.c
index 7d2e4b4..692b495 100644
--- a/xlators/mgmt/glusterd/src/glusterd-volgen.c
+++ b/xlators/mgmt/glusterd/src/glusterd-volgen.c
@@ -2534,6 +2534,14 @@ perfxl_option_handler (volgen_graph_t *graph, struct volopt_map_entry *vme,
             (vme->op_version > volinfo->client_op_version))
                 return 0;
 
+        /* For replicate volumes do not load io-threads as it affects
+         * performance
+         */
+        if (!strcmp (vme->key, "performance.client-io-threads") &&
+            (GF_CLUSTER_TYPE_STRIPE_REPLICATE == volinfo->type ||
+             GF_CLUSTER_TYPE_REPLICATE == volinfo->type))
+                return 0;
+
         if (volgen_graph_add (graph, vme->voltype, volinfo->volname))
                 return 0;
         else
-- 
2.9.3