Don't depend on string options to be valid always
updates bz#1650403 Change-Id: Ib5a11e691599ce4bd93c1ed5aca6060592893961 Signed-off-by: Pranith Kumar K <pkarampu@redhat.com>
This commit is contained in:
parent
bdcb2d8497
commit
c228f0c2d9
@ -1156,18 +1156,12 @@ ret:
|
||||
}
|
||||
|
||||
gf_boolean_t
|
||||
afr_selfheal_enabled(xlator_t *this)
|
||||
afr_selfheal_enabled(const xlator_t *this)
|
||||
{
|
||||
afr_private_t *priv = NULL;
|
||||
gf_boolean_t data = _gf_false;
|
||||
int ret = 0;
|
||||
const afr_private_t *priv = this->private;
|
||||
|
||||
priv = this->private;
|
||||
|
||||
ret = gf_string2boolean(priv->data_self_heal, &data);
|
||||
GF_ASSERT(!ret);
|
||||
|
||||
return data || priv->metadata_self_heal || priv->entry_self_heal;
|
||||
return priv->data_self_heal || priv->metadata_self_heal ||
|
||||
priv->entry_self_heal;
|
||||
}
|
||||
|
||||
int
|
||||
@ -4876,7 +4870,7 @@ afr_priv_dump(xlator_t *this)
|
||||
sprintf(key, "child_latency[%d]", i);
|
||||
gf_proc_dump_write(key, "%" PRId64, priv->child_latency[i]);
|
||||
}
|
||||
gf_proc_dump_write("data_self_heal", "%s", priv->data_self_heal);
|
||||
gf_proc_dump_write("data_self_heal", "%d", priv->data_self_heal);
|
||||
gf_proc_dump_write("metadata_self_heal", "%d", priv->metadata_self_heal);
|
||||
gf_proc_dump_write("entry_self_heal", "%d", priv->entry_self_heal);
|
||||
gf_proc_dump_write("read_child", "%d", priv->read_child);
|
||||
@ -6020,8 +6014,10 @@ afr_selfheal_locked_entry_inspect(call_frame_t *frame, xlator_t *this,
|
||||
gf_boolean_t granular_locks = _gf_false;
|
||||
|
||||
priv = this->private;
|
||||
if (strcmp("granular", priv->locking_scheme) == 0)
|
||||
granular_locks = _gf_true;
|
||||
granular_locks = priv->granular_locks; /*Assign to local variable so that
|
||||
reconfigure doesn't change this
|
||||
value between locking and unlocking
|
||||
below*/
|
||||
locked_on = alloca0(priv->child_count);
|
||||
data_lock = alloca0(priv->child_count);
|
||||
sources = alloca0(priv->child_count);
|
||||
|
@ -2469,14 +2469,9 @@ afr_selfheal_do(call_frame_t *frame, xlator_t *this, uuid_t gfid)
|
||||
gf_boolean_t metadata_selfheal = _gf_false;
|
||||
gf_boolean_t entry_selfheal = _gf_false;
|
||||
afr_private_t *priv = NULL;
|
||||
gf_boolean_t dataheal_enabled = _gf_false;
|
||||
|
||||
priv = this->private;
|
||||
|
||||
ret = gf_string2boolean(priv->data_self_heal, &dataheal_enabled);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
ret = afr_selfheal_unlocked_inspect(frame, this, gfid, &inode,
|
||||
&data_selfheal, &metadata_selfheal,
|
||||
&entry_selfheal);
|
||||
@ -2496,7 +2491,7 @@ afr_selfheal_do(call_frame_t *frame, xlator_t *this, uuid_t gfid)
|
||||
}
|
||||
}
|
||||
|
||||
if (data_selfheal && dataheal_enabled)
|
||||
if (data_selfheal && priv->data_self_heal)
|
||||
data_ret = afr_selfheal_data(frame, this, fd);
|
||||
|
||||
if (metadata_selfheal && priv->metadata_self_heal)
|
||||
|
@ -15,11 +15,6 @@
|
||||
#include "afr-messages.h"
|
||||
#include <glusterfs/events.h>
|
||||
|
||||
enum {
|
||||
AFR_SELFHEAL_DATA_FULL = 0,
|
||||
AFR_SELFHEAL_DATA_DIFF,
|
||||
};
|
||||
|
||||
#define HAS_HOLES(i) ((i->ia_blocks * 512) < (i->ia_size))
|
||||
static int
|
||||
__checksum_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,
|
||||
@ -301,7 +296,7 @@ afr_data_self_heal_type_get(afr_private_t *priv, unsigned char *healed_sinks,
|
||||
int type = AFR_SELFHEAL_DATA_FULL;
|
||||
int i = 0;
|
||||
|
||||
if (priv->data_self_heal_algorithm == NULL) {
|
||||
if (priv->data_self_heal_algorithm == AFR_SELFHEAL_DATA_DYNAMIC) {
|
||||
type = AFR_SELFHEAL_DATA_FULL;
|
||||
for (i = 0; i < priv->child_count; i++) {
|
||||
if (!healed_sinks[i] && i != source)
|
||||
@ -311,10 +306,8 @@ afr_data_self_heal_type_get(afr_private_t *priv, unsigned char *healed_sinks,
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else if (strcmp(priv->data_self_heal_algorithm, "full") == 0) {
|
||||
type = AFR_SELFHEAL_DATA_FULL;
|
||||
} else if (strcmp(priv->data_self_heal_algorithm, "diff") == 0) {
|
||||
type = AFR_SELFHEAL_DATA_DIFF;
|
||||
} else {
|
||||
type = priv->data_self_heal_algorithm;
|
||||
}
|
||||
return type;
|
||||
}
|
||||
|
@ -120,6 +120,21 @@ afr_set_favorite_child_policy(afr_private_t *priv, char *policy)
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
set_data_self_heal_algorithm(afr_private_t *priv, char *algo)
|
||||
{
|
||||
if (!algo) {
|
||||
priv->data_self_heal_algorithm = AFR_SELFHEAL_DATA_DYNAMIC;
|
||||
} else if (strcmp(algo, "full") == 0) {
|
||||
priv->data_self_heal_algorithm = AFR_SELFHEAL_DATA_FULL;
|
||||
} else if (strcmp(algo, "diff") == 0) {
|
||||
priv->data_self_heal_algorithm = AFR_SELFHEAL_DATA_DIFF;
|
||||
} else {
|
||||
priv->data_self_heal_algorithm = AFR_SELFHEAL_DATA_DYNAMIC;
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
reconfigure(xlator_t *this, dict_t *options)
|
||||
{
|
||||
@ -130,13 +145,14 @@ reconfigure(xlator_t *this, dict_t *options)
|
||||
int index = -1;
|
||||
char *qtype = NULL;
|
||||
char *fav_child_policy = NULL;
|
||||
char *data_self_heal = NULL;
|
||||
char *data_self_heal_algorithm = NULL;
|
||||
char *locking_scheme = NULL;
|
||||
gf_boolean_t consistent_io = _gf_false;
|
||||
gf_boolean_t choose_local_old = _gf_false;
|
||||
|
||||
priv = this->private;
|
||||
|
||||
GF_OPTION_RECONF("afr-dirty-xattr", priv->afr_dirty, options, str, out);
|
||||
|
||||
GF_OPTION_RECONF("metadata-splitbrain-forced-heal",
|
||||
priv->metadata_splitbrain_forced_heal, options, bool, out);
|
||||
|
||||
@ -149,7 +165,8 @@ reconfigure(xlator_t *this, dict_t *options)
|
||||
GF_OPTION_RECONF("metadata-self-heal", priv->metadata_self_heal, options,
|
||||
bool, out);
|
||||
|
||||
GF_OPTION_RECONF("data-self-heal", priv->data_self_heal, options, str, out);
|
||||
GF_OPTION_RECONF("data-self-heal", data_self_heal, options, str, out);
|
||||
gf_string2boolean(data_self_heal, &priv->data_self_heal);
|
||||
|
||||
GF_OPTION_RECONF("entry-self-heal", priv->entry_self_heal, options, bool,
|
||||
out);
|
||||
@ -157,8 +174,9 @@ reconfigure(xlator_t *this, dict_t *options)
|
||||
GF_OPTION_RECONF("data-self-heal-window-size",
|
||||
priv->data_self_heal_window_size, options, uint32, out);
|
||||
|
||||
GF_OPTION_RECONF("data-self-heal-algorithm", priv->data_self_heal_algorithm,
|
||||
GF_OPTION_RECONF("data-self-heal-algorithm", data_self_heal_algorithm,
|
||||
options, str, out);
|
||||
set_data_self_heal_algorithm(priv, data_self_heal_algorithm);
|
||||
|
||||
GF_OPTION_RECONF("halo-enabled", priv->halo_enabled, options, bool, out);
|
||||
|
||||
@ -214,7 +232,8 @@ reconfigure(xlator_t *this, dict_t *options)
|
||||
}
|
||||
|
||||
GF_OPTION_RECONF("pre-op-compat", priv->pre_op_compat, options, bool, out);
|
||||
GF_OPTION_RECONF("locking-scheme", priv->locking_scheme, options, str, out);
|
||||
GF_OPTION_RECONF("locking-scheme", locking_scheme, options, str, out);
|
||||
priv->granular_locks = (strcmp(locking_scheme, "granular") == 0);
|
||||
GF_OPTION_RECONF("full-lock", priv->full_lock, options, bool, out);
|
||||
GF_OPTION_RECONF("granular-entry-heal", priv->esh_granular, options, bool,
|
||||
out);
|
||||
@ -366,6 +385,9 @@ init(xlator_t *this)
|
||||
char *qtype = NULL;
|
||||
char *fav_child_policy = NULL;
|
||||
char *thin_arbiter = NULL;
|
||||
char *data_self_heal = NULL;
|
||||
char *locking_scheme = NULL;
|
||||
char *data_self_heal_algorithm = NULL;
|
||||
|
||||
if (!this->children) {
|
||||
gf_msg(this->name, GF_LOG_ERROR, 0, AFR_MSG_CHILD_MISCONFIGURED,
|
||||
@ -448,10 +470,12 @@ init(xlator_t *this)
|
||||
|
||||
GF_OPTION_INIT("heal-wait-queue-length", priv->heal_wait_qlen, uint32, out);
|
||||
|
||||
GF_OPTION_INIT("data-self-heal", priv->data_self_heal, str, out);
|
||||
GF_OPTION_INIT("data-self-heal", data_self_heal, str, out);
|
||||
gf_string2boolean(data_self_heal, &priv->data_self_heal);
|
||||
|
||||
GF_OPTION_INIT("data-self-heal-algorithm", priv->data_self_heal_algorithm,
|
||||
str, out);
|
||||
GF_OPTION_INIT("data-self-heal-algorithm", data_self_heal_algorithm, str,
|
||||
out);
|
||||
set_data_self_heal_algorithm(priv, data_self_heal_algorithm);
|
||||
|
||||
GF_OPTION_INIT("data-self-heal-window-size",
|
||||
priv->data_self_heal_window_size, uint32, out);
|
||||
@ -479,7 +503,8 @@ init(xlator_t *this)
|
||||
out);
|
||||
|
||||
GF_OPTION_INIT("pre-op-compat", priv->pre_op_compat, bool, out);
|
||||
GF_OPTION_INIT("locking-scheme", priv->locking_scheme, str, out);
|
||||
GF_OPTION_INIT("locking-scheme", locking_scheme, str, out);
|
||||
priv->granular_locks = (strcmp(locking_scheme, "granular") == 0);
|
||||
GF_OPTION_INIT("full-lock", priv->full_lock, bool, out);
|
||||
GF_OPTION_INIT("granular-entry-heal", priv->esh_granular, bool, out);
|
||||
|
||||
|
@ -104,6 +104,12 @@ typedef enum {
|
||||
AFR_FAV_CHILD_POLICY_MAX,
|
||||
} afr_favorite_child_policy;
|
||||
|
||||
typedef enum {
|
||||
AFR_SELFHEAL_DATA_FULL = 0,
|
||||
AFR_SELFHEAL_DATA_DIFF,
|
||||
AFR_SELFHEAL_DATA_DYNAMIC,
|
||||
} afr_data_self_heal_type_t;
|
||||
|
||||
typedef enum {
|
||||
AFR_CHILD_UNKNOWN = -1,
|
||||
AFR_CHILD_ZERO,
|
||||
@ -155,8 +161,7 @@ typedef struct _afr_private {
|
||||
|
||||
char **pending_key;
|
||||
|
||||
char *data_self_heal; /* on/off/open */
|
||||
char *data_self_heal_algorithm; /* name of algorithm */
|
||||
afr_data_self_heal_type_t data_self_heal_algorithm;
|
||||
unsigned int data_self_heal_window_size; /* max number of pipelined
|
||||
read/writes */
|
||||
|
||||
@ -230,10 +235,11 @@ typedef struct _afr_private {
|
||||
/* pump dependencies */
|
||||
void *pump_private;
|
||||
gf_boolean_t use_afr_in_pump;
|
||||
char *locking_scheme;
|
||||
gf_boolean_t granular_locks;
|
||||
gf_boolean_t full_lock;
|
||||
gf_boolean_t esh_granular;
|
||||
gf_boolean_t consistent_io;
|
||||
gf_boolean_t data_self_heal; /* on/off */
|
||||
} afr_private_t;
|
||||
|
||||
typedef enum {
|
||||
|
@ -1396,7 +1396,7 @@ error_gen_priv_dump(xlator_t *this)
|
||||
|
||||
gf_proc_dump_write("op_count", "%d", conf->op_count);
|
||||
gf_proc_dump_write("failure_iter_no", "%d", conf->failure_iter_no);
|
||||
gf_proc_dump_write("error_no", "%s", conf->error_no);
|
||||
gf_proc_dump_write("error_no", "%d", conf->error_no_int);
|
||||
gf_proc_dump_write("random_failure", "%d", conf->random_failure);
|
||||
|
||||
UNLOCK(&conf->lock);
|
||||
@ -1430,6 +1430,7 @@ reconfigure(xlator_t *this, dict_t *options)
|
||||
eg_t *pvt = NULL;
|
||||
int32_t ret = 0;
|
||||
char *error_enable_fops = NULL;
|
||||
char *error_no = NULL;
|
||||
double failure_percent_dbl = 0.0;
|
||||
|
||||
if (!this || !this->private)
|
||||
@ -1439,10 +1440,10 @@ reconfigure(xlator_t *this, dict_t *options)
|
||||
|
||||
ret = -1;
|
||||
|
||||
GF_OPTION_RECONF("error-no", pvt->error_no, options, str, out);
|
||||
GF_OPTION_RECONF("error-no", error_no, options, str, out);
|
||||
|
||||
if (pvt->error_no)
|
||||
pvt->error_no_int = conv_errno_to_int(&pvt->error_no);
|
||||
if (error_no)
|
||||
pvt->error_no_int = conv_errno_to_int(&error_no);
|
||||
|
||||
GF_OPTION_RECONF("failure", failure_percent_dbl, options, percent, out);
|
||||
|
||||
@ -1466,6 +1467,7 @@ init(xlator_t *this)
|
||||
eg_t *pvt = NULL;
|
||||
int32_t ret = 0;
|
||||
char *error_enable_fops = NULL;
|
||||
char *error_no = NULL;
|
||||
double failure_percent_dbl = 0.0;
|
||||
|
||||
if (!this->children || this->children->next) {
|
||||
@ -1490,10 +1492,10 @@ init(xlator_t *this)
|
||||
|
||||
ret = -1;
|
||||
|
||||
GF_OPTION_INIT("error-no", pvt->error_no, str, out);
|
||||
GF_OPTION_INIT("error-no", error_no, str, out);
|
||||
|
||||
if (pvt->error_no)
|
||||
pvt->error_no_int = conv_errno_to_int(&pvt->error_no);
|
||||
if (error_no)
|
||||
pvt->error_no_int = conv_errno_to_int(&error_no);
|
||||
|
||||
GF_OPTION_INIT("failure", failure_percent_dbl, percent, out);
|
||||
|
||||
|
@ -36,7 +36,6 @@ typedef struct {
|
||||
* It's just not worth blowing up the diff by changing it.
|
||||
*/
|
||||
int failure_iter_no;
|
||||
char *error_no;
|
||||
int error_no_int;
|
||||
gf_boolean_t random_failure;
|
||||
gf_lock_t lock;
|
||||
|
@ -173,7 +173,6 @@ struct ios_conf {
|
||||
*/
|
||||
char *unique_id;
|
||||
ios_dump_type_t dump_format;
|
||||
char *dump_format_str;
|
||||
};
|
||||
|
||||
struct ios_fd {
|
||||
@ -3680,15 +3679,15 @@ io_priv(xlator_t *this)
|
||||
}
|
||||
|
||||
static void
|
||||
ios_set_log_format_code(struct ios_conf *conf)
|
||||
ios_set_log_format_code(struct ios_conf *conf, char *dump_format_str)
|
||||
{
|
||||
if (strcmp(conf->dump_format_str, "json") == 0)
|
||||
if (strcmp(dump_format_str, "json") == 0)
|
||||
conf->dump_format = IOS_DUMP_TYPE_JSON_FILE;
|
||||
else if (strcmp(conf->dump_format_str, "text") == 0)
|
||||
else if (strcmp(dump_format_str, "text") == 0)
|
||||
conf->dump_format = IOS_DUMP_TYPE_FILE;
|
||||
else if (strcmp(conf->dump_format_str, "dict") == 0)
|
||||
else if (strcmp(dump_format_str, "dict") == 0)
|
||||
conf->dump_format = IOS_DUMP_TYPE_DICT;
|
||||
else if (strcmp(conf->dump_format_str, "samples") == 0)
|
||||
else if (strcmp(dump_format_str, "samples") == 0)
|
||||
conf->dump_format = IOS_DUMP_TYPE_SAMPLES;
|
||||
}
|
||||
|
||||
@ -3729,6 +3728,7 @@ reconfigure(xlator_t *this, dict_t *options)
|
||||
char *sys_log_str = NULL;
|
||||
char *log_format_str = NULL;
|
||||
char *logger_str = NULL;
|
||||
char *dump_format_str = NULL;
|
||||
int sys_log_level = -1;
|
||||
char *log_str = NULL;
|
||||
int log_level = -1;
|
||||
@ -3773,9 +3773,8 @@ reconfigure(xlator_t *this, dict_t *options)
|
||||
|
||||
GF_OPTION_RECONF("ios-sample-interval", conf->ios_sample_interval, options,
|
||||
int32, out);
|
||||
GF_OPTION_RECONF("ios-dump-format", conf->dump_format_str, options, str,
|
||||
out);
|
||||
ios_set_log_format_code(conf);
|
||||
GF_OPTION_RECONF("ios-dump-format", dump_format_str, options, str, out);
|
||||
ios_set_log_format_code(conf, dump_format_str);
|
||||
GF_OPTION_RECONF("ios-sample-buf-size", conf->ios_sample_buf_size, options,
|
||||
int32, out);
|
||||
GF_OPTION_RECONF("sys-log-level", sys_log_str, options, str, out);
|
||||
@ -3880,6 +3879,7 @@ init(xlator_t *this)
|
||||
char *sys_log_str = NULL;
|
||||
char *logger_str = NULL;
|
||||
char *log_format_str = NULL;
|
||||
char *dump_format_str = NULL;
|
||||
int logger = -1;
|
||||
int log_format = -1;
|
||||
int sys_log_level = -1;
|
||||
@ -3940,8 +3940,8 @@ init(xlator_t *this)
|
||||
GF_OPTION_INIT("ios-sample-interval", conf->ios_sample_interval, int32,
|
||||
out);
|
||||
|
||||
GF_OPTION_INIT("ios-dump-format", conf->dump_format_str, str, out);
|
||||
ios_set_log_format_code(conf);
|
||||
GF_OPTION_INIT("ios-dump-format", dump_format_str, str, out);
|
||||
ios_set_log_format_code(conf, dump_format_str);
|
||||
|
||||
GF_OPTION_INIT("ios-sample-buf-size", conf->ios_sample_buf_size, int32,
|
||||
out);
|
||||
|
@ -29,7 +29,7 @@ typedef struct {
|
||||
gf_boolean_t worm_files_deletable;
|
||||
uint64_t reten_period;
|
||||
uint64_t com_period;
|
||||
char *reten_mode;
|
||||
int reten_mode;
|
||||
time_t start_time;
|
||||
} read_only_priv_t;
|
||||
|
||||
|
@ -84,10 +84,7 @@ worm_set_state(xlator_t *this, gf_boolean_t fop_with_fd, void *file_ptr,
|
||||
retention_state->worm = 1;
|
||||
retention_state->retain = 1;
|
||||
retention_state->legal_hold = 0;
|
||||
if (strcmp(priv->reten_mode, "relax") == 0)
|
||||
retention_state->ret_mode = 0;
|
||||
else
|
||||
retention_state->ret_mode = 1;
|
||||
retention_state->ret_mode = priv->reten_mode;
|
||||
retention_state->ret_period = priv->reten_period;
|
||||
retention_state->auto_commit_period = priv->com_period;
|
||||
if (fop_with_fd)
|
||||
|
@ -475,11 +475,21 @@ worm_create(call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
set_reten_mode(read_only_priv_t *priv, char *reten_mode)
|
||||
{
|
||||
if (strcmp(reten_mode, "relax") == 0)
|
||||
priv->reten_mode = 0;
|
||||
else
|
||||
priv->reten_mode = 1;
|
||||
}
|
||||
|
||||
int32_t
|
||||
init(xlator_t *this)
|
||||
{
|
||||
int ret = -1;
|
||||
read_only_priv_t *priv = NULL;
|
||||
char *reten_mode = NULL;
|
||||
|
||||
if (!this->children || this->children->next) {
|
||||
gf_log(this->name, GF_LOG_ERROR,
|
||||
@ -511,7 +521,8 @@ init(xlator_t *this)
|
||||
GF_OPTION_INIT("worm-file-level", priv->worm_file, bool, out);
|
||||
GF_OPTION_INIT("default-retention-period", priv->reten_period, uint64, out);
|
||||
GF_OPTION_INIT("auto-commit-period", priv->com_period, uint64, out);
|
||||
GF_OPTION_INIT("retention-mode", priv->reten_mode, str, out);
|
||||
GF_OPTION_INIT("retention-mode", reten_mode, str, out);
|
||||
set_reten_mode(priv, reten_mode);
|
||||
GF_OPTION_INIT("worm-files-deletable", priv->worm_files_deletable, bool,
|
||||
out);
|
||||
|
||||
@ -524,6 +535,7 @@ int
|
||||
reconfigure(xlator_t *this, dict_t *options)
|
||||
{
|
||||
read_only_priv_t *priv = NULL;
|
||||
char *reten_mode = NULL;
|
||||
int ret = -1;
|
||||
|
||||
priv = this->private;
|
||||
@ -534,7 +546,8 @@ reconfigure(xlator_t *this, dict_t *options)
|
||||
GF_OPTION_RECONF("worm-file-level", priv->worm_file, options, bool, out);
|
||||
GF_OPTION_RECONF("default-retention-period", priv->reten_period, options,
|
||||
uint64, out);
|
||||
GF_OPTION_RECONF("retention-mode", priv->reten_mode, options, str, out);
|
||||
GF_OPTION_RECONF("retention-mode", reten_mode, options, str, out);
|
||||
set_reten_mode(priv, reten_mode);
|
||||
GF_OPTION_RECONF("auto-commit-period", priv->com_period, options, uint64,
|
||||
out);
|
||||
GF_OPTION_RECONF("worm-files-deletable", priv->worm_files_deletable,
|
||||
|
Loading…
x
Reference in New Issue
Block a user