diff options
author | Vikas Gorur <vikas@gluster.com> | 2009-09-17 05:56:32 +0000 |
---|---|---|
committer | Anand V. Avati <avati@dev.gluster.com> | 2009-09-22 06:13:34 -0700 |
commit | 35f96c039e8961e48af46af43b6ecf7a335feb15 (patch) | |
tree | d73021e62255efd6d7d8f83820c472467409fda4 /xlators/cluster/afr | |
parent | d2b7e65ec0c35c4ee16f28f449553d90fb88fa6a (diff) |
cluster/afr: Add new option "data-self-heal-algorithm"
option: data-self-heal-algorithm type: string default: "full"
This option allows the user to specify the algorithm to
be used for data self-heal. Currently supported values
are "full" and "diff".
Signed-off-by: Anand V. Avati <avati@dev.gluster.com>
Diffstat (limited to 'xlators/cluster/afr')
-rw-r--r-- | xlators/cluster/afr/src/afr-self-heal-algorithm.c | 1 | ||||
-rw-r--r-- | xlators/cluster/afr/src/afr-self-heal-algorithm.h | 2 | ||||
-rw-r--r-- | xlators/cluster/afr/src/afr-self-heal-data.c | 20 | ||||
-rw-r--r-- | xlators/cluster/afr/src/afr.c | 12 | ||||
-rw-r--r-- | xlators/cluster/afr/src/afr.h | 4 |
5 files changed, 36 insertions, 3 deletions
diff --git a/xlators/cluster/afr/src/afr-self-heal-algorithm.c b/xlators/cluster/afr/src/afr-self-heal-algorithm.c index f2d80c3e925..f6efcfa6605 100644 --- a/xlators/cluster/afr/src/afr-self-heal-algorithm.c +++ b/xlators/cluster/afr/src/afr-self-heal-algorithm.c @@ -582,4 +582,5 @@ afr_sh_algo_diff (call_frame_t *frame, xlator_t *this) struct afr_sh_algorithm afr_self_heal_algorithms[] = { {.name = "full", .fn = afr_sh_algo_full}, {.name = "diff", .fn = afr_sh_algo_diff}, + {0, 0}, }; diff --git a/xlators/cluster/afr/src/afr-self-heal-algorithm.h b/xlators/cluster/afr/src/afr-self-heal-algorithm.h index 8998ce8883d..b5dba06eedb 100644 --- a/xlators/cluster/afr/src/afr-self-heal-algorithm.h +++ b/xlators/cluster/afr/src/afr-self-heal-algorithm.h @@ -29,7 +29,7 @@ struct afr_sh_algorithm { afr_sh_algo_fn fn; }; -struct afr_sh_algorithm afr_self_heal_algorithms[2]; +struct afr_sh_algorithm afr_self_heal_algorithms[3]; typedef struct { uint8_t *checksum; /* array of MD5 checksums for each child diff --git a/xlators/cluster/afr/src/afr-self-heal-data.c b/xlators/cluster/afr/src/afr-self-heal-data.c index 4ed6071abf2..576a15e06f2 100644 --- a/xlators/cluster/afr/src/afr-self-heal-data.c +++ b/xlators/cluster/afr/src/afr-self-heal-data.c @@ -476,7 +476,25 @@ afr_sh_data_trim_sinks (call_frame_t *frame, xlator_t *this) struct afr_sh_algorithm * afr_sh_data_pick_algo (call_frame_t *frame, xlator_t *this) { - return &afr_self_heal_algorithms[1]; /* full */ + afr_private_t *priv = NULL; + int i = 0; + + priv = this->private; + + while (afr_self_heal_algorithms[i].name) { + if (!strcmp (priv->data_self_heal_algorithm, + afr_self_heal_algorithms[i].name)) { + goto out; + } + + i++; + } + + /* No match found, so fall back on "full" */ + + i = 0; +out: + return &afr_self_heal_algorithms[i]; } diff --git a/xlators/cluster/afr/src/afr.c b/xlators/cluster/afr/src/afr.c index 6b7b007aeb8..5c2320715b6 100644 --- a/xlators/cluster/afr/src/afr.c +++ b/xlators/cluster/afr/src/afr.c @@ -2341,6 +2341,7 @@ init (xlator_t *this) char * read_subvol = NULL; char * fav_child = NULL; char * self_heal = NULL; + char * algo = NULL; char * change_log = NULL; int32_t lock_server_count = 1; @@ -2389,6 +2390,14 @@ init (xlator_t *this) } } + priv->data_self_heal_algorithm = "full"; + + dict_ret = dict_get_str (this->options, "data-self-heal-algorithm", + &algo); + if (dict_ret == 0) { + priv->data_self_heal_algorithm = strdup (algo); + } + dict_ret = dict_get_str (this->options, "metadata-self-heal", &self_heal); if (dict_ret == 0) { @@ -2662,6 +2671,9 @@ struct volume_options options[] = { { .key = {"data-self-heal"}, .type = GF_OPTION_TYPE_BOOL }, + { .key = {"data-self-heal-algorithm"}, + .type = GF_OPTION_TYPE_STR + }, { .key = {"metadata-self-heal"}, .type = GF_OPTION_TYPE_BOOL }, diff --git a/xlators/cluster/afr/src/afr.h b/xlators/cluster/afr/src/afr.h index a7f980475f6..d802433132e 100644 --- a/xlators/cluster/afr/src/afr.h +++ b/xlators/cluster/afr/src/afr.h @@ -45,7 +45,9 @@ typedef struct _afr_private { char **pending_key; - gf_boolean_t data_self_heal; /* on/off */ + gf_boolean_t data_self_heal; /* on/off */ + char * data_self_heal_algorithm; /* name of algorithm */ + gf_boolean_t metadata_self_heal; /* on/off */ gf_boolean_t entry_self_heal; /* on/off */ |