From 55a6ba56bea9ec0d3316c005300c514ea3ab0e54 Mon Sep 17 00:00:00 2001 From: Amar Tumballi Date: Wed, 3 Oct 2018 17:00:24 +0530 Subject: tiering: remove the translator from build and glusterd Based on the proposal to remove few features as they are not actively maintained [1], removing tier translator from the build. Also make sure there are no regression tests involving tiering feature are present. [1] https://lists.gluster.org/pipermail/gluster-users/2018-July/034400.html Change-Id: I2c177f711f9b54b7b24e1a13525ff3132bd9a9c5 updates: bz#1642807 Signed-off-by: Amar Tumballi --- xlators/mgmt/glusterd/src/glusterd-volgen.c | 75 --- xlators/mgmt/glusterd/src/glusterd-volume-set.c | 723 ------------------------ 2 files changed, 798 deletions(-) (limited to 'xlators/mgmt/glusterd') diff --git a/xlators/mgmt/glusterd/src/glusterd-volgen.c b/xlators/mgmt/glusterd/src/glusterd-volgen.c index 57b0fccac3b..b7c658e19fc 100644 --- a/xlators/mgmt/glusterd/src/glusterd-volgen.c +++ b/xlators/mgmt/glusterd/src/glusterd-volgen.c @@ -1856,78 +1856,6 @@ out: return ret; } -#if USE_GFDB /* only add changetimerecorder when GFDB is enabled */ -static int -brick_graph_add_changetimerecorder(volgen_graph_t *graph, - glusterd_volinfo_t *volinfo, - dict_t *set_dict, - glusterd_brickinfo_t *brickinfo) -{ - xlator_t *xl = NULL; - int ret = -1; - char *brickname = NULL; - char *path = NULL; - char index_basepath[PATH_MAX] = {0}; - char *hotbrick = NULL; - - if (!graph || !volinfo || !set_dict || !brickinfo) - goto out; - - path = brickinfo->path; - - xl = volgen_graph_add(graph, "features/changetimerecorder", - volinfo->volname); - if (!xl) - goto out; - - ret = xlator_set_option(xl, "db-type", "sqlite3"); - if (ret) - goto out; - - if (!set_dict || dict_get_str(set_dict, "hot-brick", &hotbrick)) - hotbrick = "off"; - - ret = xlator_set_option(xl, "hot-brick", hotbrick); - if (ret) - goto out; - - brickname = strrchr(path, '/') + 1; - snprintf(index_basepath, sizeof(index_basepath), "%s.db", brickname); - ret = xlator_set_option(xl, "db-name", index_basepath); - if (ret) - goto out; - - snprintf(index_basepath, sizeof(index_basepath), "%s/%s", path, - ".glusterfs/"); - ret = xlator_set_option(xl, "db-path", index_basepath); - if (ret) - goto out; - - ret = xlator_set_option(xl, "record-exit", "off"); - if (ret) - goto out; - - ret = xlator_set_option(xl, "ctr_link_consistency", "off"); - if (ret) - goto out; - - ret = xlator_set_option(xl, "ctr_lookupheal_link_timeout", "300"); - if (ret) - goto out; - - ret = xlator_set_option(xl, "ctr_lookupheal_inode_timeout", "300"); - if (ret) - goto out; - - ret = xlator_set_option(xl, "record-entry", "on"); - if (ret) - goto out; - -out: - return ret; -} -#endif /* USE_GFDB */ - static int brick_graph_add_acl(volgen_graph_t *graph, glusterd_volinfo_t *volinfo, dict_t *set_dict, glusterd_brickinfo_t *brickinfo) @@ -2684,9 +2612,6 @@ static volgen_brick_xlator_t server_graph_table[] = { {brick_graph_add_acl, "acl"}, {brick_graph_add_bitrot_stub, "bitrot-stub"}, {brick_graph_add_changelog, "changelog"}, -#if USE_GFDB /* changetimerecorder depends on gfdb */ - {brick_graph_add_changetimerecorder, "changetimerecorder"}, -#endif {brick_graph_add_bd, "bd"}, {brick_graph_add_trash, "trash"}, {brick_graph_add_arbiter, "arbiter"}, diff --git a/xlators/mgmt/glusterd/src/glusterd-volume-set.c b/xlators/mgmt/glusterd/src/glusterd-volume-set.c index 988d547e14e..ac1e011043d 100644 --- a/xlators/mgmt/glusterd/src/glusterd-volume-set.c +++ b/xlators/mgmt/glusterd/src/glusterd-volume-set.c @@ -11,474 +11,6 @@ cases as published by the Free Software Foundation. #include "glusterd-volgen.h" #include "glusterd-utils.h" -#if USE_GFDB /* no GFDB means tiering is disabled */ - -static int -get_tier_freq_threshold(glusterd_volinfo_t *volinfo, char *threshold_key) -{ - int threshold = 0; - char *str_thresold = NULL; - int ret = -1; - xlator_t *this = NULL; - - this = THIS; - GF_ASSERT(this); - - glusterd_volinfo_get(volinfo, threshold_key, &str_thresold); - if (str_thresold) { - ret = gf_string2int(str_thresold, &threshold); - if (ret == -1) { - threshold = ret; - gf_msg(this->name, GF_LOG_ERROR, EINVAL, GD_MSG_INCOMPATIBLE_VALUE, - "Failed to convert " - "string to integer"); - } - } - - return threshold; -} - -/* - * Validation function for record-counters - * if write-freq-threshold and read-freq-threshold both have non-zero values - * record-counters cannot be set to off - * if record-counters is set to on - * check if both the frequency thresholds are zero, then pop - * a note, but volume set is not failed. - * */ -static int -validate_tier_counters(glusterd_volinfo_t *volinfo, dict_t *dict, char *key, - char *value, char **op_errstr) -{ - char errstr[2048] = ""; - int ret = -1; - xlator_t *this = NULL; - gf_boolean_t origin_val = -1; - int current_wt = 0; - int current_rt = 0; - - this = THIS; - GF_ASSERT(this); - - if (volinfo->type != GF_CLUSTER_TYPE_TIER) { - snprintf(errstr, sizeof(errstr), - "Volume %s is not a tier " - "volume. Option %s is only valid for tier volume.", - volinfo->volname, key); - goto out; - } - - ret = gf_string2boolean(value, &origin_val); - if (ret) { - snprintf(errstr, sizeof(errstr), - "%s is not a compatible " - "value. %s expects an boolean value", - value, key); - goto out; - } - - current_rt = get_tier_freq_threshold(volinfo, - "cluster.read-freq-threshold"); - if (current_rt == -1) { - snprintf(errstr, sizeof(errstr), - " Failed to retrieve value" - " of cluster.read-freq-threshold"); - goto out; - } - current_wt = get_tier_freq_threshold(volinfo, - "cluster.write-freq-threshold"); - if (current_wt == -1) { - snprintf(errstr, sizeof(errstr), - " Failed to retrieve value " - "of cluster.write-freq-threshold"); - goto out; - } - /* If record-counters is set to off */ - if (!origin_val) { - /* Both the thresholds should be zero to set - * record-counters to off*/ - if (current_rt || current_wt) { - snprintf(errstr, sizeof(errstr), - "Cannot set features.record-counters to \"%s\"" - " as cluster.write-freq-threshold is %d" - " and cluster.read-freq-threshold is %d. Please" - " set both cluster.write-freq-threshold and " - " cluster.read-freq-threshold to 0, to set " - " features.record-counters to \"%s\".", - value, current_wt, current_rt, value); - ret = -1; - goto out; - } - } - /* TODO give a warning message to the user. errstr without re = -1 will - * not result in a warning on cli for now. - else { - if (!current_rt && !current_wt) { - snprintf (errstr, sizeof (errstr), - " Note : cluster.write-freq-threshold is %d" - " and cluster.read-freq-threshold is %d. Please" - " set both cluster.write-freq-threshold and " - " cluster.read-freq-threshold to" - " appropriate positive values.", - current_wt, current_rt); - } - }*/ - - ret = 0; -out: - - if (ret) { - gf_msg(this->name, GF_LOG_ERROR, EINVAL, GD_MSG_INCOMPATIBLE_VALUE, - "%s", errstr); - *op_errstr = gf_strdup(errstr); - } - - return ret; -} - -/* - * Validation function for ctr sql params - * features.ctr-sql-db-cachesize (Range: 1000 to 262144 pages) - * features.ctr-sql-db-wal-autocheckpoint (Range: 1000 to 262144 pages) - * */ -static int -validate_ctr_sql_params(glusterd_volinfo_t *volinfo, dict_t *dict, char *key, - char *value, char **op_errstr) -{ - int ret = -1; - xlator_t *this = NULL; - char errstr[2048] = ""; - int origin_val = -1; - - this = THIS; - GF_ASSERT(this); - - ret = gf_string2int(value, &origin_val); - if (ret) { - snprintf(errstr, sizeof(errstr), - "%s is not a compatible " - "value. %s expects an integer value.", - value, key); - ret = -1; - goto out; - } - - if (origin_val < 0) { - snprintf(errstr, sizeof(errstr), - "%s is not a " - "compatible value. %s expects a positive" - "integer value.", - value, key); - ret = -1; - goto out; - } - - if (strstr(key, "sql-db-cachesize") || - strstr(key, "sql-db-wal-autocheckpoint")) { - if ((origin_val < 1000) || (origin_val > 262144)) { - snprintf(errstr, sizeof(errstr), - "%s is not a " - "compatible value. %s " - "expects a value between : " - "1000 to 262144.", - value, key); - ret = -1; - goto out; - } - } - - ret = 0; -out: - if (ret) { - gf_msg(this->name, GF_LOG_ERROR, EINVAL, GD_MSG_INCOMPATIBLE_VALUE, - "%s", errstr); - *op_errstr = gf_strdup(errstr); - } - return ret; -} - -/* Validation for tiering frequency thresholds - * If any of the frequency thresholds are set to a non-zero value, - * switch record-counters on, if not already on - * If both the frequency thresholds are set to zero, - * switch record-counters off, if not already off - * */ -static int -validate_tier_thresholds(glusterd_volinfo_t *volinfo, dict_t *dict, char *key, - char *value, char **op_errstr) -{ - char errstr[2048] = ""; - int ret = -1; - xlator_t *this = NULL; - int origin_val = -1; - gf_boolean_t current_rc = _gf_false; - int current_wt = 0; - int current_rt = 0; - gf_boolean_t is_set_rc = _gf_false; - char *proposed_rc = NULL; - - this = THIS; - GF_ASSERT(this); - - if (volinfo->type != GF_CLUSTER_TYPE_TIER) { - snprintf(errstr, sizeof(errstr), - "Volume %s is not a tier " - "volume. Option %s is only valid for tier volume.", - volinfo->volname, key); - goto out; - } - - ret = gf_string2int(value, &origin_val); - if (ret) { - snprintf(errstr, sizeof(errstr), - "%s is not a compatible " - "value. %s expects an integer value.", - value, key); - ret = -1; - goto out; - } - - if (origin_val < 0) { - snprintf(errstr, sizeof(errstr), - "%s is not a " - "compatible value. %s expects a positive" - "integer value.", - value, key); - ret = -1; - goto out; - } - - /* Get the record-counters value */ - ret = glusterd_volinfo_get_boolean(volinfo, "features.record-counters"); - if (ret == -1) { - snprintf(errstr, sizeof(errstr), - "Failed to retrieve value of" - "features.record-counters from volume info"); - goto out; - } - current_rc = ret; - - /* if any of the thresholds are set to a non-zero value - * switch record-counters on, if not already on*/ - if (origin_val > 0) { - if (!current_rc) { - is_set_rc = _gf_true; - current_rc = _gf_true; - } - } else { - /* if the set is for write-freq-threshold */ - if (strstr(key, "write-freq-threshold")) { - current_rt = get_tier_freq_threshold(volinfo, - "cluster.read-freq-threshold"); - if (current_rt == -1) { - snprintf(errstr, sizeof(errstr), - " Failed to retrieve value of" - "cluster.read-freq-threshold"); - goto out; - } - current_wt = origin_val; - } - /* else it should be read-freq-threshold */ - else { - current_wt = get_tier_freq_threshold( - volinfo, "cluster.write-freq-threshold"); - if (current_wt == -1) { - snprintf(errstr, sizeof(errstr), - " Failed to retrieve value of" - "cluster.write-freq-threshold"); - goto out; - } - current_rt = origin_val; - } - - /* Since both the thresholds are zero, set record-counters - * to off, if not already off */ - if (current_rt == 0 && current_wt == 0) { - if (current_rc) { - is_set_rc = _gf_true; - current_rc = _gf_false; - } - } - } - - /* if record-counter has to be set to proposed value */ - if (is_set_rc) { - if (current_rc) { - ret = gf_asprintf(&proposed_rc, "on"); - } else { - ret = gf_asprintf(&proposed_rc, "off"); - } - if (ret < 0) { - gf_msg(this->name, GF_LOG_ERROR, EINVAL, GD_MSG_INCOMPATIBLE_VALUE, - "Failed to allocate memory to dict_value"); - goto error; - } - ret = dict_set_str(volinfo->dict, "features.record-counters", - proposed_rc); - error: - if (ret) { - snprintf(errstr, sizeof(errstr), - "Failed to set features.record-counters" - "to \"%s\" automatically." - "Please try to set features.record-counters " - "\"%s\" manually. The options " - "cluster.write-freq-threshold and " - "cluster.read-freq-threshold can only " - "be set to a non zero value, if " - "features.record-counters is " - "set to \"on\".", - proposed_rc, proposed_rc); - goto out; - } - } - ret = 0; -out: - if (ret) { - gf_msg(this->name, GF_LOG_ERROR, EINVAL, GD_MSG_INCOMPATIBLE_VALUE, - "%s", errstr); - *op_errstr = gf_strdup(errstr); - if (proposed_rc) - GF_FREE(proposed_rc); - } - return ret; -} - -static int -validate_tier(glusterd_volinfo_t *volinfo, dict_t *dict, char *key, char *value, - char **op_errstr) -{ - char errstr[2048] = ""; - int ret = 0; - xlator_t *this = NULL; - int origin_val = -1; - char *current_wm_hi = NULL; - char *current_wm_low = NULL; - uint64_t wm_hi = 0; - uint64_t wm_low = 0; - - this = THIS; - GF_ASSERT(this); - - if (volinfo->type != GF_CLUSTER_TYPE_TIER) { - snprintf(errstr, sizeof(errstr), - "Volume %s is not a tier " - "volume. Option %s is only valid for tier volume.", - volinfo->volname, key); - gf_msg(this->name, GF_LOG_ERROR, EINVAL, GD_MSG_INCOMPATIBLE_VALUE, - "%s", errstr); - *op_errstr = gf_strdup(errstr); - ret = -1; - goto out; - } - - if (strstr(key, "cluster.tier-mode")) { - if (strcmp(value, "test") && strcmp(value, "cache")) { - ret = -1; - goto out; - } - goto out; - } else if (strstr(key, "tier-pause")) { - if (strcmp(value, "off") && strcmp(value, "on")) { - ret = -1; - goto out; - } - goto out; - } else if (strstr(key, "tier-compact")) { - if (strcmp(value, "on") && strcmp(value, "off")) { - ret = -1; - goto out; - } - - goto out; - } - - /* - * Rest of the volume set options for tier are expecting a positive - * Integer. Change the function accordingly if this constraint is - * changed. - */ - ret = gf_string2int(value, &origin_val); - if (ret) { - snprintf(errstr, sizeof(errstr), - "%s is not a compatible " - "value. %s expects an integer value.", - value, key); - gf_msg(this->name, GF_LOG_ERROR, EINVAL, GD_MSG_INCOMPATIBLE_VALUE, - "%s", errstr); - *op_errstr = gf_strdup(errstr); - ret = -1; - goto out; - } - - if (strstr(key, "watermark-hi") || strstr(key, "watermark-low")) { - if ((origin_val < 1) || (origin_val > 99)) { - snprintf(errstr, sizeof(errstr), - "%s is not a " - "compatible value. %s expects a " - "percentage from 1-99.", - value, key); - gf_msg(this->name, GF_LOG_ERROR, EINVAL, GD_MSG_INCOMPATIBLE_VALUE, - "%s", errstr); - *op_errstr = gf_strdup(errstr); - ret = -1; - goto out; - } - - if (strstr(key, "watermark-hi")) { - wm_hi = origin_val; - } else { - glusterd_volinfo_get(volinfo, "cluster.watermark-hi", - ¤t_wm_hi); - gf_string2bytesize_uint64(current_wm_hi, &wm_hi); - } - - if (strstr(key, "watermark-low")) { - wm_low = origin_val; - } else { - glusterd_volinfo_get(volinfo, "cluster.watermark-low", - ¤t_wm_low); - gf_string2bytesize_uint64(current_wm_low, &wm_low); - } - if (wm_low >= wm_hi) { - snprintf(errstr, sizeof(errstr), - "lower watermark" - " cannot be equal or exceed upper " - "watermark."); - gf_msg(this->name, GF_LOG_ERROR, EINVAL, GD_MSG_INCOMPATIBLE_VALUE, - "%s", errstr); - *op_errstr = gf_strdup(errstr); - ret = -1; - goto out; - } - } else if (strstr(key, "tier-promote-frequency") || - strstr(key, "tier-max-mb") || - strstr(key, "tier-max-promote-file-size") || - strstr(key, "tier-max-files") || - strstr(key, "tier-demote-frequency") || - strstr(key, "tier-hot-compact-frequency") || - strstr(key, "tier-cold-compact-frequency") || - strstr(key, "tier-query-limit")) { - if (origin_val < 1) { - snprintf(errstr, sizeof(errstr), - "%s is not a " - " compatible value. %s expects a positive " - "integer value greater than 0.", - value, key); - gf_msg(this->name, GF_LOG_ERROR, EINVAL, GD_MSG_INCOMPATIBLE_VALUE, - "%s", errstr); - *op_errstr = gf_strdup(errstr); - ret = -1; - goto out; - } - } -out: - gf_msg_debug(this->name, 0, "Returning %d", ret); - - return ret; -} - -#endif /* End for USE_GFDB */ - static int validate_cache_max_min_size(glusterd_volinfo_t *volinfo, dict_t *dict, char *key, char *value, char **op_errstr) @@ -2940,261 +2472,6 @@ struct volopt_map_entry glusterd_volopt_map[] = { "/var/run/gluster/shared_storage on enabling this " "option. Unmount and delete the shared storage volume " " on disabling this option."}, -#if USE_GFDB /* no GFDB means tiering is disabled */ - /* tier translator - global tunables */ - {.key = "cluster.write-freq-threshold", - .voltype = "cluster/tier", - .value = "0", - .option = "write-freq-threshold", - .op_version = GD_OP_VERSION_3_7_0, - .flags = VOLOPT_FLAG_CLIENT_OPT, - .validate_fn = validate_tier_thresholds, - .description = "Defines the number of writes, in a promotion/demotion" - " cycle, that would mark a file HOT for promotion. Any" - " file that has write hits less than this value will " - "be considered as COLD and will be demoted."}, - {.key = "cluster.read-freq-threshold", - .voltype = "cluster/tier", - .value = "0", - .option = "read-freq-threshold", - .op_version = GD_OP_VERSION_3_7_0, - .flags = VOLOPT_FLAG_CLIENT_OPT, - .validate_fn = validate_tier_thresholds, - .description = "Defines the number of reads, in a promotion/demotion " - "cycle, that would mark a file HOT for promotion. Any " - "file that has read hits less than this value will be " - "considered as COLD and will be demoted."}, - { - .key = "cluster.tier-pause", - .voltype = "cluster/tier", - .option = "tier-pause", - .op_version = GD_OP_VERSION_3_7_6, - .flags = VOLOPT_FLAG_CLIENT_OPT, - .validate_fn = validate_tier, - }, - { - .key = "cluster.tier-promote-frequency", - .voltype = "cluster/tier", - .value = "120", - .option = "tier-promote-frequency", - .op_version = GD_OP_VERSION_3_7_0, - .flags = VOLOPT_FLAG_CLIENT_OPT, - .validate_fn = validate_tier, - }, - { - .key = "cluster.tier-demote-frequency", - .voltype = "cluster/tier", - .value = "3600", - .option = "tier-demote-frequency", - .op_version = GD_OP_VERSION_3_7_0, - .flags = VOLOPT_FLAG_CLIENT_OPT, - .validate_fn = validate_tier, - }, - {.key = "cluster.watermark-hi", - .voltype = "cluster/tier", - .value = "90", - .option = "watermark-hi", - .op_version = GD_OP_VERSION_3_7_6, - .flags = VOLOPT_FLAG_CLIENT_OPT, - .validate_fn = validate_tier, - .description = - "Upper % watermark for promotion. If hot tier fills" - " above this percentage, no promotion will happen and demotion will " - "happen with high probability."}, - {.key = "cluster.watermark-low", - .voltype = "cluster/tier", - .value = "75", - .option = "watermark-low", - .op_version = GD_OP_VERSION_3_7_6, - .flags = VOLOPT_FLAG_CLIENT_OPT, - .validate_fn = validate_tier, - .description = - "Lower % watermark. If hot tier is less " - "full than this, promotion will happen and demotion will not happen. " - "If greater than this, promotion/demotion will happen at a " - "probability " - "relative to how full the hot tier is."}, - {.key = "cluster.tier-mode", - .voltype = "cluster/tier", - .option = "tier-mode", - .value = "cache", - .op_version = GD_OP_VERSION_3_7_6, - .flags = VOLOPT_FLAG_CLIENT_OPT, - .validate_fn = validate_tier, - .description = - "Either 'test' or 'cache'. Test mode periodically" - " demotes or promotes files automatically based on access." - " Cache mode does so based on whether the cache is full or not," - " as specified with watermarks."}, - {.key = "cluster.tier-max-promote-file-size", - .voltype = "cluster/tier", - .option = "tier-max-promote-file-size", - .value = "0", - .op_version = GD_OP_VERSION_3_7_10, - .flags = VOLOPT_FLAG_CLIENT_OPT, - .validate_fn = validate_tier, - .description = - "The maximum file size in bytes that is promoted. If 0, there" - " is no maximum size (default)."}, - {.key = "cluster.tier-max-mb", - .voltype = "cluster/tier", - .option = "tier-max-mb", - .value = "4000", - .op_version = GD_OP_VERSION_3_7_6, - .flags = VOLOPT_FLAG_CLIENT_OPT, - .validate_fn = validate_tier, - .description = "The maximum number of MB that may be migrated" - " in any direction in a given cycle by a single node."}, - {.key = "cluster.tier-max-files", - .voltype = "cluster/tier", - .option = "tier-max-files", - .value = "10000", - .op_version = GD_OP_VERSION_3_7_6, - .flags = VOLOPT_FLAG_CLIENT_OPT, - .validate_fn = validate_tier, - .description = "The maximum number of files that may be migrated" - " in any direction in a given cycle by a single node."}, - {.key = "cluster.tier-query-limit", - .voltype = "cluster/tier", - .option = "tier-query-limit", - .value = "100", - .op_version = GD_OP_VERSION_3_9_1, - .flags = VOLOPT_FLAG_CLIENT_OPT, - .validate_fn = validate_tier, - .type = NO_DOC, - .description = "The maximum number of files that may be migrated " - "during an emergency demote. An emergency condition " - "is flagged when writes breach the hi-watermark."}, - {.key = "cluster.tier-compact", - .voltype = "cluster/tier", - .option = "tier-compact", - .value = "on", - .op_version = GD_OP_VERSION_3_9_0, - .flags = VOLOPT_FLAG_CLIENT_OPT, - .validate_fn = validate_tier, - .description = "Activate or deactivate the compaction of the DB" - " for the volume's metadata."}, - { - .key = "cluster.tier-hot-compact-frequency", - .voltype = "cluster/tier", - .value = "604800", - .option = "tier-hot-compact-frequency", - .op_version = GD_OP_VERSION_3_9_0, - .flags = VOLOPT_FLAG_CLIENT_OPT, - .validate_fn = validate_tier, - }, - { - .key = "cluster.tier-cold-compact-frequency", - .voltype = "cluster/tier", - .value = "604800", - .option = "tier-cold-compact-frequency", - .op_version = GD_OP_VERSION_3_9_0, - .flags = VOLOPT_FLAG_CLIENT_OPT, - .validate_fn = validate_tier, - }, - {.key = "features.ctr-enabled", - .voltype = "features/changetimerecorder", - .value = "off", - .option = "ctr-enabled", - .op_version = GD_OP_VERSION_3_7_0, - .description = "Enable CTR xlator"}, - {.key = "features.record-counters", - .voltype = "features/changetimerecorder", - .value = "off", - .option = "record-counters", - .op_version = GD_OP_VERSION_3_7_0, - .validate_fn = validate_tier_counters, - .description = "Its a Change Time Recorder Xlator option to " - "enable recording write " - "and read heat counters. The default is disabled. " - "If enabled, \"cluster.write-freq-threshold\" and " - "\"cluster.read-freq-threshold\" defined the number " - "of writes (or reads) to a given file are needed " - "before triggering migration."}, - {.key = "features.ctr-record-metadata-heat", - .voltype = "features/changetimerecorder", - .value = "off", - .option = "ctr-record-metadata-heat", - .op_version = GD_OP_VERSION_3_7_0, - .type = NO_DOC, - .description = "Its a Change Time Recorder Xlator option to " - "enable recording write heat on metadata of the file. " - "The default is disabled. " - "Metadata is inode attributes like atime, mtime," - " permissions etc and " - "extended attributes of a file ."}, - {.key = "features.ctr_link_consistency", - .voltype = "features/changetimerecorder", - .value = "off", - .option = "ctr_link_consistency", - .op_version = GD_OP_VERSION_3_7_0, - .type = NO_DOC, - .description = "Enable a crash consistent way of recording hardlink " - "updates by Change Time Recorder Xlator. " - "When recording in a crash " - "consistent way the data operations will " - "experience more latency."}, - {.key = "features.ctr_lookupheal_link_timeout", - .voltype = "features/changetimerecorder", - .value = "300", - .option = "ctr_lookupheal_link_timeout", - .op_version = GD_OP_VERSION_3_7_2, - .type = NO_DOC, - .description = "Defines the expiry period of in-memory " - "hardlink of an inode," - "used by lookup heal in Change Time Recorder." - "Once the expiry period" - "hits an attempt to heal the database per " - "hardlink is done and the " - "in-memory hardlink period is reset"}, - {.key = "features.ctr_lookupheal_inode_timeout", - .voltype = "features/changetimerecorder", - .value = "300", - .option = "ctr_lookupheal_inode_timeout", - .op_version = GD_OP_VERSION_3_7_2, - .type = NO_DOC, - .description = "Defines the expiry period of in-memory inode," - "used by lookup heal in Change Time Recorder. " - "Once the expiry period" - "hits an attempt to heal the database per " - "inode is done"}, - {.key = "features.ctr-sql-db-cachesize", - .voltype = "features/changetimerecorder", - .value = "12500", - .option = "sql-db-cachesize", - .validate_fn = validate_ctr_sql_params, - .op_version = GD_OP_VERSION_3_7_7, - .description = "Defines the cache size of the sqlite database of " - "changetimerecorder xlator." - "The input to this option is in pages." - "Each page is 4096 bytes. Default value is 12500 " - "pages." - "The max value is 262144 pages i.e 1 GB and " - "the min value is 1000 pages i.e ~ 4 MB. "}, - {.key = "features.ctr-sql-db-wal-autocheckpoint", - .voltype = "features/changetimerecorder", - .value = "25000", - .option = "sql-db-wal-autocheckpoint", - .validate_fn = validate_ctr_sql_params, - .op_version = GD_OP_VERSION_3_7_7, - .description = "Defines the autocheckpoint of the sqlite database of " - " changetimerecorder. " - "The input to this option is in pages. " - "Each page is 4096 bytes. Default value is 25000 " - "pages." - "The max value is 262144 pages i.e 1 GB and " - "the min value is 1000 pages i.e ~4 MB."}, - {.key = VKEY_FEATURES_SELINUX, - .voltype = "features/selinux", - .type = NO_DOC, - .value = "on", - .op_version = GD_OP_VERSION_3_11_0, - .description = "Convert security.selinux xattrs to " - "trusted.gluster.selinux on the bricks. Recommended " - "to have enabled when clients and/or bricks support " - "SELinux."}, - -#endif /* USE_GFDB */ { .key = "locks.trace", .voltype = "features/locks", -- cgit