diff options
author | Pranith Kumar K <pranithk@gluster.com> | 2012-09-26 12:31:15 +0530 |
---|---|---|
committer | Anand Avati <avati@redhat.com> | 2012-10-01 12:39:36 -0700 |
commit | dd8eb06e26138e149252365043706067782416af (patch) | |
tree | 64336015b9ae4588249dc0e4b6a6eeed67884d2a | |
parent | 947523a74c97b057b8bcfdf2c65943495ab118d2 (diff) |
cluster/afr: Provide option to set readdir-size in entry-self-heal
Problem:
Entry self-heal does lookups on all the entries that are read
in readdir. More the size of readdir more number of lookups happen
in parallel. It is observed that it leads to HUGE cpu spikes
rendering everything else on the system unusable.
Fix:
Provided the option self-heal-readdir-size to configure the size.
Default value is at 1KB.
Tests:
Checked that the readdirs are happening with the configured value
in entry-self-heal.
Change-Id: Icaa937ad88857e6f9a12375b1e7f6a49192bc8b1
BUG: 860895
Signed-off-by: Pranith Kumar K <pranithk@gluster.com>
Reviewed-on: http://review.gluster.org/4002
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Jeff Darcy <jdarcy@redhat.com>
Reviewed-by: Anand Avati <avati@redhat.com>
-rw-r--r-- | xlators/cluster/afr/src/afr-self-heal-entry.c | 2 | ||||
-rw-r--r-- | xlators/cluster/afr/src/afr.c | 11 | ||||
-rw-r--r-- | xlators/cluster/afr/src/afr.h | 2 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-volgen.c | 9 |
4 files changed, 19 insertions, 5 deletions
diff --git a/xlators/cluster/afr/src/afr-self-heal-entry.c b/xlators/cluster/afr/src/afr-self-heal-entry.c index e7f74c7526b..97d8708d4bf 100644 --- a/xlators/cluster/afr/src/afr-self-heal-entry.c +++ b/xlators/cluster/afr/src/afr-self-heal-entry.c @@ -2139,7 +2139,7 @@ afr_sh_entry_open (call_frame_t *frame, xlator_t *this) source = local->self_heal.source; sources = local->self_heal.sources; - sh->block_size = 65536; //131072 + sh->block_size = priv->sh_readdir_size; sh->offset = 0; call_count = sh->active_sinks; diff --git a/xlators/cluster/afr/src/afr.c b/xlators/cluster/afr/src/afr.c index 77f00ef724e..ea686dfde19 100644 --- a/xlators/cluster/afr/src/afr.c +++ b/xlators/cluster/afr/src/afr.c @@ -186,6 +186,8 @@ reconfigure (xlator_t *this, dict_t *options) GF_OPTION_RECONF ("post-op-delay-secs", priv->post_op_delay_secs, options, uint32, out); + GF_OPTION_RECONF (AFR_SH_READDIR_SIZE_KEY, priv->sh_readdir_size, + options, size, out); /* Reset this so we re-discover in case the topology changed. */ priv->did_discovery = _gf_false; @@ -325,6 +327,8 @@ init (xlator_t *this) GF_OPTION_INIT ("eager-lock", priv->eager_lock, bool, out); GF_OPTION_INIT ("quorum-type", qtype, str, out); GF_OPTION_INIT ("quorum-count", priv->quorum_count, uint32, out); + GF_OPTION_INIT (AFR_SH_READDIR_SIZE_KEY, priv->sh_readdir_size, size, + out); fix_quorum_options(this,priv,qtype); GF_OPTION_INIT ("post-op-delay-secs", priv->post_op_delay_secs, uint32, out); @@ -672,5 +676,12 @@ struct volume_options options[] = { "post-operation phase of the transaction to " "enhance overlap of adjacent write operations.", }, + { .key = {AFR_SH_READDIR_SIZE_KEY}, + .type = GF_OPTION_TYPE_SIZET, + .description = "readdirp size for performing entry self-heal", + .min = 1024, + .max = 131072, + .default_value = "1KB", + }, { .key = {NULL} }, }; diff --git a/xlators/cluster/afr/src/afr.h b/xlators/cluster/afr/src/afr.h index 9ae154a3d6d..3f2bbbebc24 100644 --- a/xlators/cluster/afr/src/afr.h +++ b/xlators/cluster/afr/src/afr.h @@ -27,6 +27,7 @@ #define AFR_XATTR_PREFIX "trusted.afr" #define AFR_PATHINFO_HEADER "REPLICATE:" +#define AFR_SH_READDIR_SIZE_KEY "self-heal-readdir-size" struct _pump_private; @@ -159,6 +160,7 @@ typedef struct _afr_private { afr_self_heald_t shd; gf_boolean_t choose_local; gf_boolean_t did_discovery; + uint64_t sh_readdir_size; } afr_private_t; typedef struct { diff --git a/xlators/mgmt/glusterd/src/glusterd-volgen.c b/xlators/mgmt/glusterd/src/glusterd-volgen.c index 882b96cd013..685470d6473 100644 --- a/xlators/mgmt/glusterd/src/glusterd-volgen.c +++ b/xlators/mgmt/glusterd/src/glusterd-volgen.c @@ -132,6 +132,7 @@ static struct volopt_map_entry glusterd_volopt_map[] = { {"cluster.quorum-type", "cluster/replicate", "quorum-type", NULL, NO_DOC, 0}, {"cluster.quorum-count", "cluster/replicate", "quorum-count", NULL, NO_DOC, 0}, {"cluster.choose-local", "cluster/replicate", NULL, NULL, DOC, 0}, + {"cluster.self-heal-readdir-size", "cluster/replicate", NULL, NULL, NO_DOC, 0}, {"cluster.stripe-block-size", "cluster/stripe", "block-size", NULL, DOC, 0}, {"cluster.stripe-coalesce", "cluster/stripe", "coalesce", NULL, DOC, 0}, @@ -2558,13 +2559,13 @@ shd_option_handler (volgen_graph_t *graph, struct volopt_map_entry *vme, struct volopt_map_entry new_vme = {0}; char *shd_option = NULL; - if (vme->option[0] != '!') - goto out; shd_option = gd_get_matching_option (gd_shd_options, vme->option); - if (!shd_option) + if ((vme->option[0] == '!') && !shd_option) goto out; new_vme = *vme; - new_vme.option = shd_option + 1;//option with out '!' + if (shd_option) { + new_vme.option = shd_option + 1;//option with out '!' + } ret = no_filter_option_handler (graph, &new_vme, param); out: |