diff options
Diffstat (limited to 'xlators/mgmt')
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-store.c | 132 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-store.h | 6 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd.c | 27 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd.h | 7 |
4 files changed, 160 insertions, 12 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-store.c b/xlators/mgmt/glusterd/src/glusterd-store.c index be5f072de66..4a967ae7494 100644 --- a/xlators/mgmt/glusterd/src/glusterd-store.c +++ b/xlators/mgmt/glusterd/src/glusterd-store.c @@ -2087,7 +2087,7 @@ glusterd_store_global_info(xlator_t *this) } handle->fd = gf_store_mkstemp(handle); - if (handle->fd <= 0) { + if (handle->fd < 0) { ret = -1; goto out; } @@ -2103,7 +2103,7 @@ glusterd_store_global_info(xlator_t *this) goto out; } - snprintf(op_version_str, 15, "%d", conf->op_version); + snprintf(op_version_str, sizeof(op_version_str), "%d", conf->op_version); ret = gf_store_save_value(handle->fd, GD_OP_VERSION_KEY, op_version_str); if (ret) { gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_OP_VERS_STORE_FAIL, @@ -2114,12 +2114,8 @@ glusterd_store_global_info(xlator_t *this) ret = gf_store_rename_tmppath(handle); out: if (handle) { - if (ret && (handle->fd > 0)) + if (ret && (handle->fd >= 0)) gf_store_unlink_tmppath(handle); - - if (handle->fd > 0) { - handle->fd = 0; - } } if (uuid_str) @@ -2134,6 +2130,128 @@ out: } int +glusterd_store_max_op_version(xlator_t *this) +{ + int ret = -1; + glusterd_conf_t *conf = NULL; + char op_version_str[15] = { + 0, + }; + char path[PATH_MAX] = { + 0, + }; + gf_store_handle_t *handle = NULL; + int32_t len = 0; + + conf = this->private; + + len = snprintf(path, PATH_MAX, "%s/%s", conf->workdir, + GLUSTERD_UPGRADE_FILE); + if ((len < 0) || (len >= PATH_MAX)) { + goto out; + } + ret = gf_store_handle_new(path, &handle); + if (ret) { + gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_STORE_HANDLE_GET_FAIL, + "Unable to get store handle"); + goto out; + } + + /* These options need to be available for all users */ + ret = sys_chmod(handle->path, 0644); + if (ret) { + gf_msg(this->name, GF_LOG_ERROR, errno, GD_MSG_FILE_OP_FAILED, + "chmod error for %s", GLUSTERD_UPGRADE_FILE); + goto out; + } + + handle->fd = gf_store_mkstemp(handle); + if (handle->fd < 0) { + ret = -1; + goto out; + } + + snprintf(op_version_str, sizeof(op_version_str), "%d", GD_OP_VERSION_MAX); + ret = gf_store_save_value(handle->fd, GD_MAX_OP_VERSION_KEY, + op_version_str); + if (ret) { + gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_OP_VERS_STORE_FAIL, + "Storing op-version failed ret = %d", ret); + goto out; + } + + ret = gf_store_rename_tmppath(handle); +out: + if (handle) { + if (ret && (handle->fd >= 0)) + gf_store_unlink_tmppath(handle); + } + + if (ret) + gf_msg(this->name, GF_LOG_ERROR, 0, + GD_MSG_GLUSTERD_GLOBAL_INFO_STORE_FAIL, + "Failed to store max op-version"); + if (handle) + gf_store_handle_destroy(handle); + return ret; +} + +int +glusterd_retrieve_max_op_version(xlator_t *this, int *op_version) +{ + char *op_version_str = NULL; + glusterd_conf_t *priv = NULL; + int ret = -1; + int tmp_version = 0; + char *tmp = NULL; + char path[PATH_MAX] = { + 0, + }; + gf_store_handle_t *handle = NULL; + int32_t len = 0; + + priv = this->private; + + len = snprintf(path, PATH_MAX, "%s/%s", priv->workdir, + GLUSTERD_UPGRADE_FILE); + if ((len < 0) || (len >= PATH_MAX)) { + goto out; + } + ret = gf_store_handle_retrieve(path, &handle); + + if (ret) { + gf_msg_debug(this->name, 0, + "Unable to get store " + "handle!"); + goto out; + } + + ret = gf_store_retrieve_value(handle, GD_MAX_OP_VERSION_KEY, + &op_version_str); + if (ret) { + gf_msg_debug(this->name, 0, "No previous op_version present"); + goto out; + } + + tmp_version = strtol(op_version_str, &tmp, 10); + if ((tmp_version <= 0) || (tmp && strlen(tmp) > 1)) { + gf_msg(this->name, GF_LOG_WARNING, EINVAL, GD_MSG_UNSUPPORTED_VERSION, + "invalid version number"); + goto out; + } + + *op_version = tmp_version; + + ret = 0; +out: + if (op_version_str) + GF_FREE(op_version_str); + if (handle) + gf_store_handle_destroy(handle); + return ret; +} + +int glusterd_retrieve_op_version(xlator_t *this, int *op_version) { char *op_version_str = NULL; diff --git a/xlators/mgmt/glusterd/src/glusterd-store.h b/xlators/mgmt/glusterd/src/glusterd-store.h index 5db77703482..63e7617b1dc 100644 --- a/xlators/mgmt/glusterd/src/glusterd-store.h +++ b/xlators/mgmt/glusterd/src/glusterd-store.h @@ -156,6 +156,12 @@ int glusterd_retrieve_op_version(xlator_t *this, int *op_version); int +glusterd_retrieve_max_op_version(xlator_t *this, int *op_version); + +int +glusterd_store_max_op_version(xlator_t *this); + +int glusterd_store_global_info(xlator_t *this); int32_t diff --git a/xlators/mgmt/glusterd/src/glusterd.c b/xlators/mgmt/glusterd/src/glusterd.c index b1fa6247ee1..a3082717c27 100644 --- a/xlators/mgmt/glusterd/src/glusterd.c +++ b/xlators/mgmt/glusterd/src/glusterd.c @@ -1404,6 +1404,7 @@ init(xlator_t *this) gf_boolean_t downgrade = _gf_false; char *localtime_logging = NULL; int32_t len = 0; + int op_version = 0; #ifndef GF_DARWIN_HOST_OS { @@ -1979,17 +1980,33 @@ init(xlator_t *this) } GF_ATOMIC_INIT(conf->blockers, 0); + ret = glusterd_handle_upgrade_downgrade(this->options, conf, upgrade, + downgrade); + if (ret) + goto out; + + ret = glusterd_retrieve_max_op_version(this, &op_version); + /* first condition indicates file isn't present which means this code + * change is hitting for the first time or someone has deleted it from the + * backend.second condition is when max op_version differs, in both cases + * volfiles should be regenerated + */ + if (op_version == 0 || op_version != GD_OP_VERSION_MAX) { + gf_log(this->name, GF_LOG_INFO, + "Regenerating volfiles due to a max op-version mismatch or " + "glusterd.upgrade file not being present, op_version retrieved:" + "%d, max op_version: %d", + op_version, GD_OP_VERSION_MAX); + glusterd_recreate_volfiles(conf); + ret = glusterd_store_max_op_version(this); + } + /* If the peer count is less than 2 then this would be the best time to * spawn process/bricks that may need (re)starting since last time * (this) glusterd was up. */ if (glusterd_get_peers_count() < 2) glusterd_launch_synctask(glusterd_spawn_daemons, NULL); - ret = glusterd_handle_upgrade_downgrade(this->options, conf, upgrade, - downgrade); - if (ret) - goto out; - ret = glusterd_hooks_spawn_worker(this); if (ret) goto out; diff --git a/xlators/mgmt/glusterd/src/glusterd.h b/xlators/mgmt/glusterd/src/glusterd.h index be1eed04a68..bbe1c7b535f 100644 --- a/xlators/mgmt/glusterd/src/glusterd.h +++ b/xlators/mgmt/glusterd/src/glusterd.h @@ -599,6 +599,9 @@ typedef enum { #define GLUSTERD_DEFAULT_PORT GF_DEFAULT_BASE_PORT #define GLUSTERD_INFO_FILE "glusterd.info" +#define GLUSTERD_UPGRADE_FILE \ + "glusterd.upgrade" /* zero byte file to detect a need for regenerating \ + volfiles in container mode */ #define GLUSTERD_VOLUME_QUOTA_CONFIG "quota.conf" #define GLUSTERD_VOLUME_DIR_PREFIX "vols" #define GLUSTERD_PEER_DIR_PREFIX "peers" @@ -1507,4 +1510,8 @@ glusterd_tier_prevalidate(dict_t *dict, char **op_errstr, dict_t *rsp_dict, int glusterd_options_init(xlator_t *this); + +int32_t +glusterd_recreate_volfiles(glusterd_conf_t *conf); + #endif |