glusterd: bitrot scrub-throttle/scrub-frequency/scrub option handling

CLI commands for bitrot features:
volume bitrot <volname> {scrub-throttle frozen|lazy|normal|aggressive}
volume bitrot <volname> {scrub-frequency daily|weekly|biweekly|monthly}
volume bitrot <volname> {scrub pause|resume}

These commands will handle their options and set respective value in
dictionary.

Change-Id: I1e8aa1b1c7d91a7f0faec9a2968b3072f42f8ba8
BUG: 1170075
Signed-off-by: Gaurav Kumar Garg <ggarg@redhat.com>
Reviewed-on: http://review.gluster.org/9985
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
Reviewed-by: Vijay Bellur <vbellur@redhat.com>
This commit is contained in:
Gaurav Kumar Garg 2015-03-24 18:20:42 +05:30 committed by Vijay Bellur
parent 91708968d0
commit 1579d633db
2 changed files with 117 additions and 4 deletions

View File

@ -4859,12 +4859,14 @@ cli_cmd_bitrot_parse (const char **words, int wordcount, dict_t **options)
char *opwords[] = {"enable", "disable",
"scrub-throttle",
"scrub-frequency",
"scrub"};
"scrub", NULL};
char *scrub_throt_values[] = {"frozen", "lazy", "normal",
"aggressive"};
"aggressive", NULL};
char *scrub_freq_values[] = {"daily", "weekly",
"biweekly", "monthly"};
char *scrub_values[] = {"pause", "resume"};
"biweekly", "monthly",
NULL};
char *scrub_values[] = {"pause", "resume",
NULL};
dict_t *dict = NULL;
gf_bitrot_type type = GF_BITROT_OPTION_TYPE_NONE;

View File

@ -127,6 +127,99 @@ glusterd_handle_bitrot (rpcsvc_request_t *req)
return glusterd_big_locked_handler (req, __glusterd_handle_bitrot);
}
static int
glusterd_bitrot_scrub_throttle (glusterd_volinfo_t *volinfo, dict_t *dict,
char *key, char **op_errstr)
{
int32_t ret = -1;
char *scrub_throttle = NULL;
char *option = NULL;
xlator_t *this = NULL;
this = THIS;
GF_ASSERT (this);
ret = dict_get_str (dict, "scrub-throttle-value", &scrub_throttle);
if (ret) {
gf_log (this->name, GF_LOG_ERROR, "Unable to fetch scrub-"
"throttle value");
goto out;
}
option = gf_strdup (scrub_throttle);
ret = dict_set_dynstr (volinfo->dict, key, option);
if (ret) {
gf_log (this->name, GF_LOG_ERROR, "Failed to set option %s",
key);
goto out;
}
out:
return ret;
}
static int
glusterd_bitrot_scrub_freq (glusterd_volinfo_t *volinfo, dict_t *dict,
char *key, char **op_errstr)
{
int32_t ret = -1;
char *scrub_freq = NULL;
xlator_t *this = NULL;
char *option = NULL;
this = THIS;
GF_ASSERT (this);
ret = dict_get_str (dict, "scrub-frequency-value", &scrub_freq);
if (ret) {
gf_log (this->name, GF_LOG_ERROR, "Unable to fetch scrub-"
"freq value");
goto out;
}
option = gf_strdup (scrub_freq);
ret = dict_set_dynstr (volinfo->dict, key, option);
if (ret) {
gf_log (this->name, GF_LOG_ERROR, "Failed to set option %s",
key);
goto out;
}
out:
return ret;
}
static int
glusterd_bitrot_scrub (glusterd_volinfo_t *volinfo, dict_t *dict,
char *key, char **op_errstr)
{
int32_t ret = -1;
char *scrub_value = NULL;
xlator_t *this = NULL;
char *option = NULL;
this = THIS;
GF_ASSERT (this);
ret = dict_get_str (dict, "scrub-value", &scrub_value);
if (ret) {
gf_log (this->name, GF_LOG_ERROR, "Unable to fetch scrub"
"value");
goto out;
}
option = gf_strdup (scrub_value);
ret = dict_set_dynstr (volinfo->dict, key, option);
if (ret) {
gf_log (this->name, GF_LOG_ERROR, "Failed to set option %s",
key);
goto out;
}
out:
return ret;
}
static int
glusterd_bitrot_enable (glusterd_volinfo_t *volinfo, char **op_errstr)
{
@ -295,6 +388,24 @@ glusterd_op_bitrot (dict_t *dict, char **op_errstr, dict_t *rsp_dict)
goto out;
break;
case GF_BITROT_OPTION_TYPE_SCRUB_THROTTLE:
ret = glusterd_bitrot_scrub_throttle (volinfo, dict,
"features.scrub-throttle",
op_errstr);
goto out;
case GF_BITROT_OPTION_TYPE_SCRUB_FREQ:
ret = glusterd_bitrot_scrub_freq (volinfo, dict,
"features.scrub-freq",
op_errstr);
goto out;
case GF_BITROT_OPTION_TYPE_SCRUB:
ret = glusterd_bitrot_scrub (volinfo, dict, "features.scrub",
op_errstr);
goto out;
default:
gf_asprintf (op_errstr, "Bitrot command failed. Invalid "
"opcode");