diff options
author | hari gowtham <hgowtham@redhat.com> | 2017-11-24 11:47:01 +0530 |
---|---|---|
committer | Atin Mukherjee <amukherj@redhat.com> | 2017-12-01 05:57:28 +0000 |
commit | 48e3ae7482a7c70dc130dc7f8198636a87649d54 (patch) | |
tree | f1321e3c5cbb1faf59fcc70cb1736018dbfeee52 /xlators/mgmt/glusterd | |
parent | 5529659dec7607bf9b94ea2195672ae553458785 (diff) |
Tier: Stop tierd for detach start
Problem: tierd was stopped only after detach commit
This makes the detach take a longer time. The detach
demotes the files to the cold brick and if the promotion
frequency is hit, then the tierd starts to promote files to
hot tier again.
Fix: stop tierd after detach start so the files get
demoted faster.
Note: the is_tier_enabled was not maintained properly.
That has been fixed too. some code clean up has been done.
Signed-off-by: hari gowtham <hgowtham@redhat.com>
Change-Id: I532f7410cea04fbb960105483810ea3560ca149b
BUG: 1446381
Diffstat (limited to 'xlators/mgmt/glusterd')
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-messages.h | 10 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-mgmt.c | 2 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-tier.c | 224 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-tierd-svc.c | 65 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.c | 10 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.h | 3 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-volume-ops.c | 17 |
7 files changed, 158 insertions, 173 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-messages.h b/xlators/mgmt/glusterd/src/glusterd-messages.h index cf84cd30f11..a112d72d822 100644 --- a/xlators/mgmt/glusterd/src/glusterd-messages.h +++ b/xlators/mgmt/glusterd/src/glusterd-messages.h @@ -41,7 +41,7 @@ #define GLUSTERD_COMP_BASE GLFS_MSGID_GLUSTERD -#define GLFS_NUM_MESSAGES 613 +#define GLFS_NUM_MESSAGES 614 #define GLFS_MSGID_END (GLUSTERD_COMP_BASE + GLFS_NUM_MESSAGES + 1) /* Messaged with message IDs */ @@ -4953,6 +4953,14 @@ */ #define GD_MSG_CHANGELOG_GET_FAIL (GLUSTERD_COMP_BASE + 613) +/*! + * @messageid + * @diagnosis + * @recommendedaction + * + */ +#define GD_MSG_MANAGER_FUNCTION_FAILED (GLUSTERD_COMP_BASE + 614) + /*------------*/ #define glfs_msg_end_x GLFS_MSGID_END, "Invalid: End of messages" diff --git a/xlators/mgmt/glusterd/src/glusterd-mgmt.c b/xlators/mgmt/glusterd/src/glusterd-mgmt.c index 3fb90766082..a1596f0944d 100644 --- a/xlators/mgmt/glusterd/src/glusterd-mgmt.c +++ b/xlators/mgmt/glusterd/src/glusterd-mgmt.c @@ -539,8 +539,6 @@ gd_mgmt_v3_post_validate_fn (glusterd_op_t op, int32_t op_ret, dict_t *dict, goto out; } - volinfo->is_tier_enabled = _gf_true; - if (ret) { gf_msg (this->name, GF_LOG_ERROR, errno, GD_MSG_DICT_SET_FAILED, "dict set " diff --git a/xlators/mgmt/glusterd/src/glusterd-tier.c b/xlators/mgmt/glusterd/src/glusterd-tier.c index f9a1d35803d..5df87fdfa33 100644 --- a/xlators/mgmt/glusterd/src/glusterd-tier.c +++ b/xlators/mgmt/glusterd/src/glusterd-tier.c @@ -244,116 +244,6 @@ glusterd_handle_tier (rpcsvc_request_t *req) return glusterd_big_locked_handler (req, __glusterd_handle_tier); } - -static int -glusterd_manage_tier (glusterd_volinfo_t *volinfo, int opcode) -{ - int ret = -1; - xlator_t *this = NULL; - glusterd_conf_t *priv = NULL; - - this = THIS; - GF_VALIDATE_OR_GOTO (THIS->name, this, out); - GF_VALIDATE_OR_GOTO (this->name, volinfo, out); - priv = this->private; - GF_VALIDATE_OR_GOTO (this->name, priv, out); - - switch (opcode) { - case GF_DEFRAG_CMD_START_TIER: - case GF_DEFRAG_CMD_STOP_TIER: - ret = volinfo->tierd.svc.manager (&(volinfo->tierd.svc), - volinfo, PROC_START_NO_WAIT); - break; - default: - ret = 0; - break; - } - -out: - return ret; - -} - -static int -glusterd_tier_enable (glusterd_volinfo_t *volinfo, char **op_errstr) -{ - int32_t ret = -1; - xlator_t *this = NULL; - int32_t tier_online = -1; - char pidfile[PATH_MAX] = {0}; - int32_t pid = -1; - glusterd_conf_t *priv = NULL; - - this = THIS; - - GF_VALIDATE_OR_GOTO (THIS->name, this, out); - GF_VALIDATE_OR_GOTO (this->name, volinfo, out); - GF_VALIDATE_OR_GOTO (this->name, op_errstr, out); - priv = this->private; - GF_VALIDATE_OR_GOTO (this->name, priv, out); - - if (glusterd_is_volume_started (volinfo) == 0) { - *op_errstr = gf_strdup ("Volume is stopped, start volume " - "to enable tier."); - ret = -1; - goto out; - } - - GLUSTERD_GET_TIER_PID_FILE(pidfile, volinfo, priv); - tier_online = gf_is_service_running (pidfile, &pid); - - if (tier_online) { - *op_errstr = gf_strdup ("tier is already enabled"); - ret = -1; - goto out; - } - - volinfo->is_tier_enabled = _gf_true; - - ret = 0; -out: - if (ret && op_errstr && !*op_errstr) - gf_asprintf (op_errstr, "Enabling tier on volume %s has been " - "unsuccessful", volinfo->volname); - return ret; -} - -static int -glusterd_tier_disable (glusterd_volinfo_t *volinfo, char **op_errstr) -{ - int32_t ret = -1; - xlator_t *this = NULL; - int32_t tier_online = -1; - char pidfile[PATH_MAX] = {0}; - int32_t pid = -1; - glusterd_conf_t *priv = NULL; - - this = THIS; - - GF_VALIDATE_OR_GOTO (THIS->name, this, out); - GF_VALIDATE_OR_GOTO (this->name, volinfo, out); - GF_VALIDATE_OR_GOTO (this->name, op_errstr, out); - priv = this->private; - - GLUSTERD_GET_TIER_PID_FILE(pidfile, volinfo, priv); - tier_online = gf_is_service_running (pidfile, &pid); - - if (!tier_online) { - *op_errstr = gf_strdup ("tier is already disabled"); - ret = -1; - goto out; - } - - volinfo->is_tier_enabled = _gf_false; - - ret = 0; -out: - if (ret && op_errstr && !*op_errstr) - gf_asprintf (op_errstr, "Disabling tier volume %s has " - "been unsuccessful", volinfo->volname); - return ret; -} - int glusterd_op_remove_tier_brick (dict_t *dict, char **op_errstr, dict_t *rsp_dict) { @@ -455,6 +345,19 @@ glusterd_op_remove_tier_brick (dict_t *dict, char **op_errstr, dict_t *rsp_dict) continue; brickinfo->decommissioned = 0; } + volinfo->tier.op = GD_OP_DETACH_NOT_STARTED; + ret = volinfo->tierd.svc.manager (&(volinfo->tierd.svc), + volinfo, + PROC_START_NO_WAIT); + if (ret) { + gf_msg (this->name, GF_LOG_ERROR, 0, + GD_MSG_MANAGER_FUNCTION_FAILED, + "Calling manager for tier " + "failed on volume: %s for " + "detach stop", volinfo->volname); + goto out; + } + ret = glusterd_create_volfiles_and_notify_services (volinfo); @@ -473,22 +376,24 @@ glusterd_op_remove_tier_brick (dict_t *dict, char **op_errstr, dict_t *rsp_dict) "failed to store volinfo"); goto out; } - ret = glusterd_tierdsvc_restart (); - if (ret) { - gf_msg (this->name, GF_LOG_ERROR, 0, - GD_MSG_TIERD_START_FAIL, - "Couldn't restart tierd for " - "vol: %s", volinfo->volname); - goto out; - } - - volinfo->tier.op = GD_OP_DETACH_NOT_STARTED; ret = 0; goto out; case GF_DEFRAG_CMD_DETACH_START: + volinfo->tier.op = GD_OP_DETACH_TIER; + svc = &(volinfo->tierd.svc); + ret = svc->manager (svc, volinfo, + PROC_START_NO_WAIT); + if (ret) { + gf_msg (this->name, GF_LOG_ERROR, 0, + GD_MSG_MANAGER_FUNCTION_FAILED, + "calling manager for tier " + "failed on volume: %s for " + "detach start", volname); + goto out; + } ret = dict_get_str (dict, GF_REMOVE_BRICK_TID_KEY, &task_id_str); if (ret) { @@ -510,8 +415,6 @@ glusterd_op_remove_tier_brick (dict_t *dict, char **op_errstr, dict_t *rsp_dict) } force = 0; - volinfo->tier.op = GD_OP_DETACH_TIER; - volinfo->tier.defrag_status = GF_DEFRAG_STATUS_STARTED; break; case GF_DEFRAG_CMD_DETACH_COMMIT: @@ -529,6 +432,19 @@ glusterd_op_remove_tier_brick (dict_t *dict, char **op_errstr, dict_t *rsp_dict) /* Fall through */ case GF_DEFRAG_CMD_DETACH_COMMIT_FORCE: + if (cmd == GF_DEFRAG_CMD_DETACH_COMMIT_FORCE) { + svc = &(volinfo->tierd.svc); + ret = svc->manager (svc, volinfo, + PROC_START_NO_WAIT); + if (ret) { + gf_msg (this->name, GF_LOG_ERROR, 0, + GD_MSG_MANAGER_FUNCTION_FAILED, + "calling manager for tier " + "failed on volume: %s for " + "commit force", volname); + goto out; + } + } glusterd_op_perform_detach_tier (volinfo); detach_commit = 1; @@ -707,11 +623,6 @@ glusterd_op_remove_tier_brick (dict_t *dict, char **op_errstr, dict_t *rsp_dict) if (cmd == GF_DEFRAG_CMD_DETACH_START && volinfo->status == GLUSTERD_STATUS_STARTED) { - svc = &(volinfo->tierd.svc); - ret = svc->reconfigure (volinfo); - if (ret) - goto out; - ret = glusterd_svcs_reconfigure (); if (ret) { gf_msg (this->name, GF_LOG_WARNING, 0, @@ -780,6 +691,7 @@ glusterd_op_tier_start_stop (dict_t *dict, char **op_errstr, dict_t *rsp_dict) glusterd_conf_t *priv = NULL; int32_t pid = -1; char pidfile[PATH_MAX] = {0}; + int is_force = 0; this = THIS; GF_VALIDATE_OR_GOTO (THIS->name, this, out); @@ -821,24 +733,48 @@ glusterd_op_tier_start_stop (dict_t *dict, char **op_errstr, dict_t *rsp_dict) if (!retval) goto out; + if (glusterd_is_volume_started (volinfo) == 0) { + *op_errstr = gf_strdup ("Volume is stopped, start " + "volume to enable/disable tier."); + ret = -1; + goto out; + } + + GLUSTERD_GET_TIER_PID_FILE(pidfile, volinfo, priv); + switch (cmd) { case GF_DEFRAG_CMD_START_TIER: - GLUSTERD_GET_TIER_PID_FILE(pidfile, volinfo, priv); /* we check if its running and skip so that we dont get a * failure during force start */ - if (gf_is_service_running (pidfile, &pid)) - goto out; - ret = glusterd_tier_enable (volinfo, op_errstr); - if (ret < 0) - goto out; - glusterd_store_perform_node_state_store (volinfo); + ret = dict_get_int32 (dict, "force", &is_force); + if (ret) { + gf_msg_debug (this->name, 0, "Unable to get is_force" + " from dict"); + } + ret = dict_set_int32 (volinfo->dict, "force", is_force); + if (ret) { + gf_msg_debug (this->name, errno, "Unable to set" + " is_force to dict"); + } + + if (!is_force) { + if (gf_is_service_running (pidfile, &pid)) { + gf_asprintf (op_errstr, "Tier is already " + "enabled on volume %s." , + volinfo->volname); + goto out; + } + } + break; case GF_DEFRAG_CMD_STOP_TIER: - ret = glusterd_tier_disable (volinfo, op_errstr); - if (ret < 0) + if (!gf_is_service_running (pidfile, &pid)) { + gf_asprintf (op_errstr, "Tier is alreaady disabled on " + "volume %s.", volinfo->volname); goto out; + } break; default: gf_asprintf (op_errstr, "tier command failed. Invalid " @@ -847,7 +783,8 @@ glusterd_op_tier_start_stop (dict_t *dict, char **op_errstr, dict_t *rsp_dict) goto out; } - ret = glusterd_manage_tier (volinfo, cmd); + ret = volinfo->tierd.svc.manager (&(volinfo->tierd.svc), + volinfo, PROC_START_NO_WAIT); if (ret) goto out; @@ -984,6 +921,19 @@ glusterd_op_stage_tier (dict_t *dict, char **op_errstr, dict_t *rsp_dict) "start validate failed"); goto out; } + if (volinfo->tier.op == GD_OP_DETACH_TIER) { + snprintf (msg, sizeof (msg), "A detach tier task " + "exists for volume %s. Either commit it" + " or stop it before starting a new task.", + volinfo->volname); + gf_msg (this->name, GF_LOG_ERROR, 0, + GD_MSG_OLD_REMOVE_BRICK_EXISTS, + "Earlier detach-tier" + " task exists for volume %s.", + volinfo->volname); + ret = -1; + goto out; + } break; case GF_DEFRAG_CMD_STOP_TIER: diff --git a/xlators/mgmt/glusterd/src/glusterd-tierd-svc.c b/xlators/mgmt/glusterd/src/glusterd-tierd-svc.c index bb2cbff6e93..378ecdb7a0d 100644 --- a/xlators/mgmt/glusterd/src/glusterd-tierd-svc.c +++ b/xlators/mgmt/glusterd/src/glusterd-tierd-svc.c @@ -72,6 +72,8 @@ glusterd_tierdsvc_init (void *data) notify = glusterd_svc_common_rpc_notify; glusterd_store_perform_node_state_store (volinfo); + volinfo->type = GF_CLUSTER_TYPE_TIER; + glusterd_svc_build_tierd_rundir (volinfo, rundir, sizeof (rundir)); glusterd_svc_create_rundir (rundir); @@ -150,6 +152,7 @@ glusterd_tierdsvc_manager (glusterd_svc_t *svc, void *data, int flags) int ret = 0; xlator_t *this = THIS; glusterd_volinfo_t *volinfo = NULL; + int is_force = 0; volinfo = data; GF_VALIDATE_OR_GOTO (this->name, data, out); @@ -169,25 +172,29 @@ glusterd_tierdsvc_manager (glusterd_svc_t *svc, void *data, int flags) } } - ret = glusterd_is_tierd_enabled (volinfo); - if (ret == -1) { - gf_msg (this->name, GF_LOG_ERROR, 0, - GD_MSG_VOLINFO_GET_FAIL, "Failed to read volume " - "options"); - goto out; + ret = dict_get_int32 (volinfo->dict, "force", &is_force); + if (ret) { + gf_msg_debug (this->name, errno, "Unable to get" + " is_force from dict"); } + if (is_force) + ret = 1; + else + ret = (glusterd_is_tierd_supposed_to_be_enabled (volinfo)); + if (ret) { if (!glusterd_is_volume_started (volinfo)) { if (glusterd_proc_is_running (&svc->proc)) { ret = svc->stop (svc, SIGTERM); if (ret) gf_msg (this->name, GF_LOG_ERROR, 0, - GD_MSG_TIERD_STOP_FAIL, + GD_MSG_SNAPD_STOP_FAIL, "Couldn't stop tierd for " "volume: %s", volinfo->volname); } else { + /* Since tierd is not running set ret to 0 */ ret = 0; } goto out; @@ -209,6 +216,7 @@ glusterd_tierdsvc_manager (glusterd_svc_t *svc, void *data, int flags) "tierd for volume: %s", volinfo->volname); goto out; } + volinfo->is_tier_enabled = _gf_true; glusterd_volinfo_ref (volinfo); ret = glusterd_conn_connect (&(svc->conn)); @@ -216,16 +224,19 @@ glusterd_tierdsvc_manager (glusterd_svc_t *svc, void *data, int flags) glusterd_volinfo_unref (volinfo); goto out; } - - } else if (glusterd_proc_is_running (&svc->proc)) { - ret = svc->stop (svc, SIGTERM); - if (ret) { - gf_msg (this->name, GF_LOG_ERROR, 0, - GD_MSG_TIERD_STOP_FAIL, - "Couldn't stop tierd for volume: %s", - volinfo->volname); - goto out; + } else { + if (glusterd_proc_is_running (&svc->proc)) { + ret = svc->stop (svc, SIGTERM); + if (ret) { + gf_msg (this->name, GF_LOG_ERROR, 0, + GD_MSG_TIERD_STOP_FAIL, + "Couldn't stop tierd for volume: %s", + volinfo->volname); + goto out; + } + volinfo->is_tier_enabled = _gf_false; } + ret = 0; } out: @@ -362,7 +373,6 @@ out: return ret; } - int glusterd_tierdsvc_restart () { @@ -380,15 +390,18 @@ glusterd_tierdsvc_restart () cds_list_for_each_entry (volinfo, &conf->volumes, vol_list) { /* Start per volume tierd svc */ if (volinfo->status == GLUSTERD_STATUS_STARTED && - glusterd_is_tierd_enabled (volinfo)) { + volinfo->type == GF_CLUSTER_TYPE_TIER) { svc = &(volinfo->tierd.svc); - ret = svc->manager (svc, volinfo, PROC_START_NO_WAIT); - if (ret) { - gf_msg (this->name, GF_LOG_ERROR, 0, - GD_MSG_TIERD_START_FAIL, - "Couldn't restart tierd for " - "vol: %s", volinfo->volname); - goto out; + if (volinfo->tier.op != GD_OP_DETACH_TIER) { + ret = svc->manager (svc, volinfo, + PROC_START_NO_WAIT); + if (ret) { + gf_msg (this->name, GF_LOG_ERROR, 0, + GD_MSG_TIERD_START_FAIL, + "Couldn't restart tierd for " + "vol: %s", volinfo->volname); + goto out; + } } } } @@ -419,7 +432,7 @@ glusterd_tierdsvc_reconfigure (void *data) this = THIS; GF_VALIDATE_OR_GOTO (THIS->name, this, out); - if (glusterd_is_tierd_enabled (volinfo)) + if (!glusterd_is_tierd_enabled (volinfo)) goto manager; /* * Check both OLD and NEW volfiles, if they are SAME by size diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c index fe96d6be094..066d2f72f81 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-utils.c @@ -12174,6 +12174,16 @@ glusterd_is_volume_inode_quota_enabled (glusterd_volinfo_t *volinfo) } int +glusterd_is_tierd_supposed_to_be_enabled (glusterd_volinfo_t *volinfo) +{ + if ((volinfo->type != GF_CLUSTER_TYPE_TIER) || + (volinfo->tier.op == GD_OP_DETACH_TIER)) + return _gf_false; + else + return _gf_true; +} + +int glusterd_is_tierd_enabled (glusterd_volinfo_t *volinfo) { return volinfo->is_tier_enabled; diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.h b/xlators/mgmt/glusterd/src/glusterd-utils.h index e76ee63edf1..6111ea1100f 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.h +++ b/xlators/mgmt/glusterd/src/glusterd-utils.h @@ -628,6 +628,9 @@ int glusterd_is_tierd_enabled (glusterd_volinfo_t *volinfo); int +glusterd_is_tierd_supposed_to_be_enabled (glusterd_volinfo_t *volinfo); + +int glusterd_is_volume_quota_enabled (glusterd_volinfo_t *volinfo); int diff --git a/xlators/mgmt/glusterd/src/glusterd-volume-ops.c b/xlators/mgmt/glusterd/src/glusterd-volume-ops.c index 0db91a30fff..a87dfc39eb7 100644 --- a/xlators/mgmt/glusterd/src/glusterd-volume-ops.c +++ b/xlators/mgmt/glusterd/src/glusterd-volume-ops.c @@ -2729,6 +2729,16 @@ glusterd_stop_volume (glusterd_volinfo_t *volinfo) } } + /* call tier manager before the voluem status is set as stopped + * as tier uses that as a check in the manager + * */ + if (volinfo->type == GF_CLUSTER_TYPE_TIER) { + svc = &(volinfo->tierd.svc); + ret = svc->manager (svc, volinfo, PROC_START_NO_WAIT); + if (ret) + goto out; + } + glusterd_set_volume_status (volinfo, GLUSTERD_STATUS_STOPPED); ret = glusterd_store_volinfo (volinfo, GLUSTERD_VOLINFO_VER_AC_INCREMENT); @@ -2746,13 +2756,6 @@ glusterd_stop_volume (glusterd_volinfo_t *volinfo) goto out; } - if (volinfo->type == GF_CLUSTER_TYPE_TIER) { - svc = &(volinfo->tierd.svc); - ret = svc->manager (svc, volinfo, PROC_START_NO_WAIT); - if (ret) - goto out; - } - ret = glusterd_svcs_manager (volinfo); if (ret) { gf_msg (this->name, GF_LOG_ERROR, 0, |