1f2f23ddef
Resolves: bz#1350745 bz#1362129 bz#1541568 bz#1597252 bz#1599220 Resolves: bz#1633177 bz#1637564 bz#1639476 bz#1639568 bz#1643370 Resolves: bz#1645480 bz#1648296 bz#1648893 bz#1651040 bz#1651460 Resolves: bz#1652466 bz#1652537 bz#1653224 bz#1653613 bz#1654103 Resolves: bz#1654161 bz#1655385 bz#1655578 bz#1656357 bz#1659439 Signed-off-by: Milind Changire <mchangir@redhat.com>
305 lines
11 KiB
Diff
305 lines
11 KiB
Diff
From 647b4d4e8edefd256de2a9f3916763b8cfa8429b Mon Sep 17 00:00:00 2001
|
|
From: Atin Mukherjee <amukherj@redhat.com>
|
|
Date: Tue, 20 Nov 2018 12:32:32 +0530
|
|
Subject: [PATCH 467/493] glusterd: glusterd to regenerate volfiles when
|
|
GD_OP_VERSION_MAX changes
|
|
|
|
While glusterd has an infra to allow post install of spec to bring it up
|
|
in the interim upgrade mode to allow all the volfiles to be regenerated
|
|
with the latest executable, in container world the same methodology is
|
|
not followed as container image always point to the specific gluster rpm
|
|
and gluster rpm doesn't go through an upgrade process.
|
|
|
|
This fix does the following:
|
|
1. If glusterd.upgrade file doesn't exist, regenerate the volfiles
|
|
2. If maximum-operating-version read from glusterd.upgrade doesn't match
|
|
with GD_OP_VERSION_MAX, glusterd detects it to be a version where new
|
|
options are introduced and regenerate the volfiles.
|
|
|
|
Tests done:
|
|
|
|
1. Bring up glusterd, check if glusterd.upgrade file has been created
|
|
with GD_OP_VERSION_MAX value.
|
|
2. Post 1, restart glusterd and check glusterd hasn't regenerated the
|
|
volfiles as there's is no change in the GD_OP_VERSION_MAX vs the
|
|
op_version read from the file.
|
|
3. Bump up the GD_OP_VERSION_MAX in the code by 1 and post compilation
|
|
restart glusterd where the volfiles should be again regenerated.
|
|
|
|
Note: The old way of having volfiles regenerated during an rpm upgrade
|
|
is kept as it is for now but eventually this can be sunset later.
|
|
|
|
> Change-Id: I75b49a1601c71e99f6a6bc360dd12dd03a96414b
|
|
> Fixes: bz#1651463
|
|
> Signed-off-by: Atin Mukherjee <amukherj@redhat.com>
|
|
|
|
upstream patch: https://review.gluster.org/#/c/glusterfs/+/21687/
|
|
|
|
Change-Id: I75b49a1601c71e99f6a6bc360dd12dd03a96414b
|
|
BUG: 1651460
|
|
Signed-off-by: Sanju Rakonde <srakonde@redhat.com>
|
|
Reviewed-on: https://code.engineering.redhat.com/gerrit/158645
|
|
Tested-by: RHGS Build Bot <nigelb@redhat.com>
|
|
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
|
|
---
|
|
xlators/mgmt/glusterd/src/glusterd-store.c | 126 +++++++++++++++++++++++++++--
|
|
xlators/mgmt/glusterd/src/glusterd-store.h | 6 ++
|
|
xlators/mgmt/glusterd/src/glusterd.c | 27 +++++--
|
|
xlators/mgmt/glusterd/src/glusterd.h | 7 ++
|
|
4 files changed, 154 insertions(+), 12 deletions(-)
|
|
|
|
diff --git a/xlators/mgmt/glusterd/src/glusterd-store.c b/xlators/mgmt/glusterd/src/glusterd-store.c
|
|
index 37542e7..f276fef 100644
|
|
--- a/xlators/mgmt/glusterd/src/glusterd-store.c
|
|
+++ b/xlators/mgmt/glusterd/src/glusterd-store.c
|
|
@@ -2063,7 +2063,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;
|
|
}
|
|
@@ -2081,7 +2081,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) {
|
|
@@ -2094,12 +2094,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)
|
|
@@ -2114,6 +2110,122 @@ 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 383a475..76c5500 100644
|
|
--- a/xlators/mgmt/glusterd/src/glusterd-store.h
|
|
+++ b/xlators/mgmt/glusterd/src/glusterd-store.h
|
|
@@ -161,6 +161,12 @@ glusterd_retrieve_op_version (xlator_t *this, int *op_version);
|
|
int
|
|
glusterd_store_global_info (xlator_t *this);
|
|
|
|
+int
|
|
+glusterd_retrieve_max_op_version(xlator_t *this, int *op_version);
|
|
+
|
|
+int
|
|
+glusterd_store_max_op_version(xlator_t *this);
|
|
+
|
|
int32_t
|
|
glusterd_store_retrieve_options (xlator_t *this);
|
|
|
|
diff --git a/xlators/mgmt/glusterd/src/glusterd.c b/xlators/mgmt/glusterd/src/glusterd.c
|
|
index ca17526..29d5de1 100644
|
|
--- a/xlators/mgmt/glusterd/src/glusterd.c
|
|
+++ b/xlators/mgmt/glusterd/src/glusterd.c
|
|
@@ -1428,6 +1428,7 @@ init (xlator_t *this)
|
|
gf_boolean_t upgrade = _gf_false;
|
|
gf_boolean_t downgrade = _gf_false;
|
|
char *localtime_logging = NULL;
|
|
+ int op_version = 0;
|
|
|
|
#ifndef GF_DARWIN_HOST_OS
|
|
{
|
|
@@ -1976,6 +1977,27 @@ 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. */
|
|
@@ -1983,11 +2005,6 @@ init (xlator_t *this)
|
|
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 bfa8310..cbdca52 100644
|
|
--- a/xlators/mgmt/glusterd/src/glusterd.h
|
|
+++ b/xlators/mgmt/glusterd/src/glusterd.h
|
|
@@ -582,6 +582,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"
|
|
@@ -1333,4 +1336,8 @@ glusterd_tier_prevalidate (dict_t *dict, char **op_errstr,
|
|
|
|
int
|
|
glusterd_options_init (xlator_t *this);
|
|
+
|
|
+int32_t
|
|
+glusterd_recreate_volfiles(glusterd_conf_t *conf);
|
|
+
|
|
#endif
|
|
--
|
|
1.8.3.1
|
|
|