diff options
author | Ravishankar N <ravishankar@redhat.com> | 2016-01-10 09:19:34 +0530 |
---|---|---|
committer | Pranith Kumar Karampuri <pkarampu@redhat.com> | 2016-03-01 03:23:20 -0800 |
commit | 8210ca1a5c0e78e91c6fab7df7e002e39660b706 (patch) | |
tree | 432a6836cc685760ee441f4b8e46221947247211 /xlators/cluster/afr/src/afr.c | |
parent | ea00992d3d52a51b7c8311ad9565bbbb6e395f9d (diff) |
afr: Add throttled background client-side heals
If a heal is needed after inode refresh (lookup, read_txn), launch it in
the background instead of blocking the fop (that triggered refresh) until the
heal happens.
afr_replies_interpret() is modified such that the heal is
launched only if atleast one sink brick is up.
Max. no of heals that can happen in parallel is configurable via the
'background-self-heal-count' volume option. Any number greater than that
is put in a wait queue whose length is configurable via
'heal-wait-queue-leng' volume option. If the wait queue is also full,
further heals will be ignored.
Default values: background-self-heal-count=8, heal-wait-queue-leng=128
Change-Id: I1d4a52814cdfd43d90591b6d2ad7b6219937ce70
BUG: 1297172
Signed-off-by: Ravishankar N <ravishankar@redhat.com>
Reviewed-on: http://review.gluster.org/13207
Smoke: Gluster Build System <jenkins@build.gluster.com>
CentOS-regression: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Pranith Kumar Karampuri <pkarampu@redhat.com>
Tested-by: Pranith Kumar Karampuri <pkarampu@redhat.com>
NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
Diffstat (limited to 'xlators/cluster/afr/src/afr.c')
-rw-r--r-- | xlators/cluster/afr/src/afr.c | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/xlators/cluster/afr/src/afr.c b/xlators/cluster/afr/src/afr.c index 98e4d3e2699..535f3e5b946 100644 --- a/xlators/cluster/afr/src/afr.c +++ b/xlators/cluster/afr/src/afr.c @@ -124,6 +124,10 @@ reconfigure (xlator_t *this, dict_t *options) priv->background_self_heal_count, options, uint32, out); + GF_OPTION_RECONF ("heal-wait-queue-length", + priv->heal_wait_qlen, options, uint32, out); + + GF_OPTION_RECONF ("metadata-self-heal", priv->metadata_self_heal, options, bool, out); @@ -275,6 +279,8 @@ init (xlator_t *this) priv->read_child = -1; GF_OPTION_INIT ("arbiter-count", priv->arbiter_count, uint32, out); + INIT_LIST_HEAD (&priv->healing); + INIT_LIST_HEAD (&priv->heal_waiting); priv->spb_choice_timeout = AFR_DEFAULT_SPB_CHOICE_TIMEOUT; @@ -327,6 +333,9 @@ init (xlator_t *this) GF_OPTION_INIT ("background-self-heal-count", priv->background_self_heal_count, uint32, out); + GF_OPTION_INIT ("heal-wait-queue-length", + priv->heal_wait_qlen, uint32, out); + GF_OPTION_INIT ("data-self-heal", priv->data_self_heal, str, out); GF_OPTION_INIT ("data-self-heal-algorithm", @@ -599,10 +608,21 @@ struct volume_options options[] = { { .key = {"background-self-heal-count"}, .type = GF_OPTION_TYPE_INT, .min = 0, - .default_value = "16", + .max = 256, + .default_value = "8", + .validate = GF_OPT_VALIDATE_MIN, + .description = "This specifies the number of per client self-heal " + "jobs that can perform parallel heals in the " + "background." + }, + { .key = {"heal-wait-queue-length"}, + .type = GF_OPTION_TYPE_INT, + .min = 0, + .max = 10000, /*Around 100MB with sizeof(afr_local_t)= 10496 bytes*/ + .default_value = "128", .validate = GF_OPT_VALIDATE_MIN, - .description = "This specifies the number of self-heals that can be " - " performed in background without blocking the fop" + .description = "This specifies the number of heals that can be queued" + " for the parallel background self heal jobs." }, { .key = {"data-self-heal"}, .type = GF_OPTION_TYPE_STR, |