diff options
author | Pranith Kumar K <pkarampu@redhat.com> | 2015-11-17 14:00:10 +0530 |
---|---|---|
committer | Kaushal M <kaushal@redhat.com> | 2015-12-10 04:34:52 -0800 |
commit | fe96043b80c647513c2d3a7d63ef9548f92ce11c (patch) | |
tree | 2be3995ec1eb50fd1eb032fba34b60d2346a14bf /xlators/mgmt/glusterd/src/glusterd-utils.c | |
parent | e8d15e3be48dc53256fcc71277f8d81bbaa23d21 (diff) |
mgmt/gluster: Handle tier brick volgen
Backport of http://review.gluster.org/#/c/12595/
Index xlator watches only some xattrs based on type of volume. i.e.
disperse/afr. When the volume becomes tiered then index is not adding these
options in the volfile leading to no maintenance of indices. Thus no
proactive self-heals. With this fix, we write brick volfiles considering
the type of volume they belong to.
Change-Id: Ibe8f2d4ad5cb350306ab7ca0753e0f9a40b96a26
BUG: 1283756
Signed-off-by: Pranith Kumar K <pkarampu@redhat.com>
Reviewed-on: http://review.gluster.org/12595
Tested-by: NetBSD Build System <jenkins@build.gluster.org>
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Kaushal M <kaushal@redhat.com>
Signed-off-by: Anuradha Talur <atalur@redhat.com>
Reviewed-on: http://review.gluster.org/12847
Diffstat (limited to 'xlators/mgmt/glusterd/src/glusterd-utils.c')
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.c | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c index 7676513cc50..df5ac17242b 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-utils.c @@ -98,6 +98,79 @@ extern struct volopt_map_entry glusterd_volopt_map[]; static glusterd_lock_t lock; +static int +_brick_for_each (glusterd_volinfo_t *volinfo, dict_t *mod_dict, + void *data, + int (*fn) (glusterd_volinfo_t *, glusterd_brickinfo_t *, + dict_t *mod_dict, void *)) +{ + int ret = 0; + glusterd_brickinfo_t *brickinfo = NULL; + xlator_t *this = THIS; + + cds_list_for_each_entry (brickinfo, &volinfo->bricks, brick_list) { + gf_msg_debug (this->name, 0, "Found a brick - %s:%s", + brickinfo->hostname, brickinfo->path); + ret = fn (volinfo, brickinfo, mod_dict, data); + if (ret) + goto out; + } +out: + return ret; +} + +int +glusterd_volume_brick_for_each (glusterd_volinfo_t *volinfo, void *data, + int (*fn) (glusterd_volinfo_t *, glusterd_brickinfo_t *, + dict_t *mod_dict, void *)) +{ + dict_t *mod_dict = NULL; + glusterd_volinfo_t *dup_volinfo = NULL; + int ret = 0; + + if (volinfo->type != GF_CLUSTER_TYPE_TIER) { + ret = _brick_for_each (volinfo, NULL, data, fn); + if (ret) + goto out; + } else { + ret = glusterd_create_sub_tier_volinfo (volinfo, &dup_volinfo, + _gf_true, + volinfo->volname); + if (ret) + goto out; + + mod_dict = dict_new(); + if (!mod_dict) { + ret = -1; + goto out; + } + + ret = dict_set_str (mod_dict, "hot-brick", "on"); + if (ret) + goto out; + + ret = _brick_for_each (dup_volinfo, mod_dict, data, fn); + if (ret) + goto out; + GF_FREE (dup_volinfo); + dup_volinfo = NULL; + ret = glusterd_create_sub_tier_volinfo (volinfo, &dup_volinfo, + _gf_false, + volinfo->volname); + if (ret) + goto out; + ret = _brick_for_each (dup_volinfo, NULL, data, fn); + if (ret) + goto out; + } +out: + if (dup_volinfo) + glusterd_volinfo_delete (dup_volinfo); + + if (mod_dict) + dict_unref (mod_dict); + return ret; +} int32_t glusterd_get_lock_owner (uuid_t *uuid) @@ -654,6 +727,7 @@ glusterd_create_sub_tier_volinfo (glusterd_volinfo_t *volinfo, return ret; } + gf_uuid_copy ((*dup_volinfo)->volume_id, volinfo->volume_id); (*dup_volinfo)->is_snap_volume = volinfo->is_snap_volume; (*dup_volinfo)->status = volinfo->status; (*dup_volinfo)->snapshot = volinfo->snapshot; |