From 86b02afab780e559e82399b9e96381d8df594ed6 Mon Sep 17 00:00:00 2001 From: Dan Lambright Date: Mon, 13 Apr 2015 02:42:12 +0100 Subject: glusterd: support for tier volumes 'detach start' and 'detach commit' These commands work in a manner analagous to rebalancing when removing a brick. The existing migration daemon detects "detach start" and switches to moving data off the hot tier. While in this state all lookups are directed to the cold tier. gluster v detach-tier start gluster v detach-tier commit The status and stop cli commands shall be submitted separately. Change-Id: I24fda5cc3ba74f5fb8aa9a3234ad51f18b80a8a0 BUG: 1205540 Signed-off-by: Dan Lambright Signed-off-by: root Signed-off-by: Dan Lambright Reviewed-on: http://review.gluster.org/10108 Reviewed-by: Kaleb KEITHLEY Tested-by: NetBSD Build System --- xlators/cluster/dht/src/dht-common.c | 2 ++ xlators/cluster/dht/src/dht-common.h | 6 ++++++ xlators/cluster/dht/src/dht-rebalance.c | 24 +++++++++++++++++++++ xlators/cluster/dht/src/tier.c | 38 ++++++++++++++++++++++++++------- 4 files changed, 62 insertions(+), 8 deletions(-) (limited to 'xlators/cluster/dht') diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c index e0b159ace32..307265fb56a 100644 --- a/xlators/cluster/dht/src/dht-common.c +++ b/xlators/cluster/dht/src/dht-common.c @@ -6277,6 +6277,8 @@ dht_notify (xlator_t *this, int event, void *data, ...) goto unlock; if (cmd == GF_DEFRAG_CMD_STATUS) gf_defrag_status_get (defrag, output); + else if (cmd == GF_DEFRAG_CMD_START_DETACH_TIER) + gf_defrag_start_detach_tier(defrag); else if (cmd == GF_DEFRAG_CMD_STOP) gf_defrag_stop (defrag, GF_DEFRAG_STATUS_STOPPED, output); diff --git a/xlators/cluster/dht/src/dht-common.h b/xlators/cluster/dht/src/dht-common.h index 3ca626feec8..43f7c0264f5 100644 --- a/xlators/cluster/dht/src/dht-common.h +++ b/xlators/cluster/dht/src/dht-common.h @@ -266,6 +266,9 @@ enum gf_defrag_type { GF_DEFRAG_CMD_START_FORCE = 1 + 4, GF_DEFRAG_CMD_START_TIER = 1 + 5, GF_DEFRAG_CMD_STATUS_TIER = 1 + 6, + GF_DEFRAG_CMD_START_DETACH_TIER = 1 + 7, + GF_DEFRAG_CMD_STOP_DETACH_TIER = 1 + 8, + }; typedef enum gf_defrag_type gf_defrag_type; @@ -837,6 +840,9 @@ int dht_newfile_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int gf_defrag_status_get (gf_defrag_info_t *defrag, dict_t *dict); +int +gf_defrag_start_detach_tier (gf_defrag_info_t *defrag); + int gf_defrag_stop (gf_defrag_info_t *defrag, gf_defrag_status_t status, dict_t *output); diff --git a/xlators/cluster/dht/src/dht-rebalance.c b/xlators/cluster/dht/src/dht-rebalance.c index 9f389c12213..98d9b58385d 100644 --- a/xlators/cluster/dht/src/dht-rebalance.c +++ b/xlators/cluster/dht/src/dht-rebalance.c @@ -1985,6 +1985,22 @@ gf_defrag_start_crawl (void *data) goto out; } methods->migration_other(this, defrag); + if (defrag->cmd == GF_DEFRAG_CMD_START_DETACH_TIER) { + migrate_data = dict_new (); + if (!migrate_data) { + ret = -1; + goto out; + } + ret = dict_set_str (migrate_data, + GF_XATTR_FILE_MIGRATE_KEY, + "force"); + if (ret) + goto out; + + ret = gf_defrag_fix_layout (this, defrag, &loc, + fix_layout, + migrate_data); + } } if ((defrag->defrag_status != GF_DEFRAG_STATUS_STOPPED) && @@ -2172,6 +2188,14 @@ out: return 0; } +int +gf_defrag_start_detach_tier (gf_defrag_info_t *defrag) +{ + defrag->cmd = GF_DEFRAG_CMD_START_DETACH_TIER; + + return 0; +} + int gf_defrag_stop (gf_defrag_info_t *defrag, gf_defrag_status_t status, dict_t *output) diff --git a/xlators/cluster/dht/src/tier.c b/xlators/cluster/dht/src/tier.c index cf481c5e7f2..5c3c3aa5548 100644 --- a/xlators/cluster/dht/src/tier.c +++ b/xlators/cluster/dht/src/tier.c @@ -794,6 +794,15 @@ tier_start (xlator_t *this, gf_defrag_info_t *defrag) goto out; } + if (defrag->cmd == GF_DEFRAG_CMD_START_DETACH_TIER) { + ret = 1; + gf_msg (this->name, GF_LOG_ERROR, 0, + DHT_MSG_LOG_TIER_ERROR, + "defrag->defrag_cmd == " + "GF_DEFRAG_CMD_START_DETACH_TIER"); + goto out; + } + tick = (tick + 1) % TIMER_SECS; if ((next_demote != tick) && (next_promote != tick)) continue; @@ -893,15 +902,19 @@ tier_migration_get_dst (xlator_t *this, dht_local_t *local) { dht_conf_t *conf = NULL; int32_t ret = -1; + gf_defrag_info_t *defrag = NULL; GF_VALIDATE_OR_GOTO("tier", this, out); GF_VALIDATE_OR_GOTO(this->name, this->private, out); conf = this->private; - if (!conf) - goto out; - if (conf->subvolumes[0] == local->cached_subvol) + defrag = conf->defrag; + + if (defrag && defrag->cmd == GF_DEFRAG_CMD_START_DETACH_TIER) { + local->rebalance.target_node = conf->subvolumes[0]; + + } else if (conf->subvolumes[0] == local->cached_subvol) local->rebalance.target_node = conf->subvolumes[1]; else @@ -918,16 +931,25 @@ out: xlator_t * tier_search (xlator_t *this, dht_layout_t *layout, const char *name) { - xlator_t *subvol = NULL; - void *value; - int search_first_subvol = 0; + xlator_t *subvol = NULL; + void *value; + int search_first_subvol = 0; + dht_conf_t *conf = NULL; + gf_defrag_info_t *defrag = NULL; GF_VALIDATE_OR_GOTO("tier", this, out); GF_VALIDATE_OR_GOTO(this->name, layout, out); GF_VALIDATE_OR_GOTO(this->name, name, out); + GF_VALIDATE_OR_GOTO(this->name, this->private, out); + + conf = this->private; + + defrag = conf->defrag; + if (defrag && defrag->cmd == GF_DEFRAG_CMD_START_DETACH_TIER) + search_first_subvol = 1; - if (!dict_get_ptr (this->options, "rule", &value) && - !strcmp(layout->list[0].xlator->name, value)) { + else if (!dict_get_ptr (this->options, "rule", &value) && + !strcmp(layout->list[0].xlator->name, value)) { search_first_subvol = 1; } -- cgit