Blob Blame History Raw
From 1ae13c3df0cf4406b5d66f5e3bd7c9442d5e75bb Mon Sep 17 00:00:00 2001
From: Poornima G <pgurusid@redhat.com>
Date: Tue, 17 Jan 2017 17:45:59 +0530
Subject: [PATCH 359/361] glusterd, rda: If parallel readdir is enabled, split
 the cache limit

With patch http://review.gluster.org/#/c/16072/ readdir-ahead can be
loaded as a child of dht. i.e. there can be more than one instance
of readdir-ahead in client process. In this case the rda-cache-size
should be split among all the readdir-ahead instances. Also the
value of rda-request-size is considered as the minimum cache size
of any readdir-ahead instance.

mainline:
> BUG: 1401812
> Reviewed-on: https://review.gluster.org/16424
> Smoke: Gluster Build System <jenkins@build.gluster.org>
> NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
> CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
> Reviewed-by: Kaushal M <kaushal@redhat.com>
> Reviewed-by: Raghavendra G <rgowdapp@redhat.com>
(cherry picked from commit f245dc568e3c22882e22ddd3e26a4207f5704e3b)

BUG: 1427096
Change-Id: Iea2fe6d4c46adc09dd2e9a252332a0fe3005f2b9
Signed-off-by: Poornima G <pgurusid@redhat.com>
Reviewed-on: https://code.engineering.redhat.com/gerrit/101419
Tested-by: Milind Changire <mchangir@redhat.com>
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
---
 xlators/mgmt/glusterd/src/glusterd-volgen.c     | 76 ++++++++++++++++++++++++-
 xlators/mgmt/glusterd/src/glusterd-volgen.h     |  2 +
 xlators/mgmt/glusterd/src/glusterd-volume-set.c |  2 +
 3 files changed, 78 insertions(+), 2 deletions(-)

diff --git a/xlators/mgmt/glusterd/src/glusterd-volgen.c b/xlators/mgmt/glusterd/src/glusterd-volgen.c
index abebd10..d5ea166 100644
--- a/xlators/mgmt/glusterd/src/glusterd-volgen.c
+++ b/xlators/mgmt/glusterd/src/glusterd-volgen.c
@@ -3593,18 +3593,90 @@ out:
         return ret;
 }
 
+static int
+client_graph_set_rda_options (volgen_graph_t *graph,
+                              glusterd_volinfo_t *volinfo,
+                              dict_t *set_dict)
+{
+        char           *rda_cache_s              = NULL;
+        int32_t         ret                      = 0;
+        uint64_t        rda_cache_size           = 0;
+        char           *rda_req_s                = NULL;
+        uint64_t        rda_req_size             = 0;
+        uint64_t        new_cache_size           = 0;
+        char            new_cache_size_str[50]   = {0,};
+        char            new_req_size_str[50]     = {0,};
+        int             dist_count               = 0;
+
+        dist_count = volinfo->brick_count / volinfo->dist_leaf_count;
+        if (dist_count <= 1)
+                goto out;
+
+        if (graph->type == GF_REBALANCED ||
+            graph->type == GF_QUOTAD ||
+            graph->type == GF_SNAPD ||
+            !glusterd_volinfo_get_boolean (volinfo, VKEY_PARALLEL_READDIR) ||
+            !glusterd_volinfo_get_boolean (volinfo, VKEY_READDIR_AHEAD))
+                goto out;
+
+        ret = glusterd_volinfo_get (volinfo, VKEY_RDA_CACHE_LIMIT, &rda_cache_s);
+        if (ret < 0)
+                goto out;
+
+        gf_string2bytesize_uint64 (rda_cache_s, &rda_cache_size);
+
+        ret = glusterd_volinfo_get (volinfo, VKEY_RDA_REQUEST_SIZE, &rda_req_s);
+        if (ret < 0)
+                goto out;
+
+        gf_string2bytesize_uint64 (rda_req_s, &rda_req_size);
+
+        new_cache_size = rda_cache_size / dist_count;
+        if (new_cache_size < rda_req_size) {
+                if (new_cache_size < 4 * 1024)
+                        new_cache_size = rda_req_size = 4 * 1024;
+                else
+                        rda_req_size = new_cache_size;
+
+                snprintf (new_req_size_str, sizeof (new_req_size_str),
+                          "%ld%s", rda_req_size, "B");
+                ret = dict_set_dynstr_with_alloc (set_dict,
+                                                  VKEY_RDA_REQUEST_SIZE,
+                                                  new_req_size_str);
+                if (ret < 0)
+                        goto out;
+        }
+
+        snprintf (new_cache_size_str, sizeof (new_cache_size_str),
+                  "%ld%s", new_cache_size, "B");
+        ret = dict_set_dynstr_with_alloc (set_dict,
+                                          VKEY_RDA_CACHE_LIMIT,
+                                          new_cache_size_str);
+        if (ret < 0)
+                goto out;
+
+out:
+        return ret;
+}
+
+
 static int client_graph_set_perf_options(volgen_graph_t *graph,
                                          glusterd_volinfo_t *volinfo,
                                          dict_t *set_dict)
 {
-        data_t *tmp_data = NULL;
-        char *volname = NULL;
+        data_t         *tmp_data                 = NULL;
+        char           *volname                  = NULL;
+        int             ret                      = 0;
 
         /*
          * Logic to make sure NFS doesn't have performance translators by
          * default for a volume
          */
         volname = volinfo->volname;
+        ret = client_graph_set_rda_options (graph, volinfo, set_dict);
+        if (ret < 0)
+                return ret;
+
         tmp_data = dict_get (set_dict, "nfs-volume-file");
         if (!tmp_data)
                 return volgen_graph_set_options_generic(graph, set_dict,
diff --git a/xlators/mgmt/glusterd/src/glusterd-volgen.h b/xlators/mgmt/glusterd/src/glusterd-volgen.h
index bbf40b5..664b2ff 100644
--- a/xlators/mgmt/glusterd/src/glusterd-volgen.h
+++ b/xlators/mgmt/glusterd/src/glusterd-volgen.h
@@ -34,6 +34,8 @@
 #define VKEY_FEATURES_SCRUB       "features.scrub"
 #define VKEY_PARALLEL_READDIR     "performance.parallel-readdir"
 #define VKEY_READDIR_AHEAD        "performance.readdir-ahead"
+#define VKEY_RDA_CACHE_LIMIT      "performance.rda-cache-limit"
+#define VKEY_RDA_REQUEST_SIZE     "performance.rda-request-size"
 
 #define AUTH_ALLOW_MAP_KEY "auth.allow"
 #define AUTH_REJECT_MAP_KEY "auth.reject"
diff --git a/xlators/mgmt/glusterd/src/glusterd-volume-set.c b/xlators/mgmt/glusterd/src/glusterd-volume-set.c
index a2ef7c9..78b2ead 100644
--- a/xlators/mgmt/glusterd/src/glusterd-volume-set.c
+++ b/xlators/mgmt/glusterd/src/glusterd-volume-set.c
@@ -3032,6 +3032,7 @@ struct volopt_map_entry glusterd_volopt_map[] = {
 	{ .key         = "performance.rda-request-size",
 	  .voltype     = "performance/readdir-ahead",
           .option      = "rda-request-size",
+          .value       = "128KB",
           .flags       = OPT_FLAG_CLIENT_OPT,
           .type        = DOC,
           .op_version  = GD_OP_VERSION_3_9_1,
@@ -3051,6 +3052,7 @@ struct volopt_map_entry glusterd_volopt_map[] = {
 	},
         { .key         = "performance.rda-cache-limit",
           .voltype     = "performance/readdir-ahead",
+          .value       = "10MB",
           .type        = DOC,
           .flags       = OPT_FLAG_CLIENT_OPT,
           .op_version  = GD_OP_VERSION_3_9_1,
-- 
1.8.3.1