summaryrefslogtreecommitdiffstats
path: root/xlators/mgmt/glusterd/src
diff options
context:
space:
mode:
Diffstat (limited to 'xlators/mgmt/glusterd/src')
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-messages.h10
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-op-sm.c86
2 files changed, 95 insertions, 1 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-messages.h b/xlators/mgmt/glusterd/src/glusterd-messages.h
index 28c73d23d82..d185db0d2e5 100644
--- a/xlators/mgmt/glusterd/src/glusterd-messages.h
+++ b/xlators/mgmt/glusterd/src/glusterd-messages.h
@@ -41,7 +41,7 @@
#define GLUSTERD_COMP_BASE GLFS_MSGID_GLUSTERD
-#define GLFS_NUM_MESSAGES 597
+#define GLFS_NUM_MESSAGES 598
#define GLFS_MSGID_END (GLUSTERD_COMP_BASE + GLFS_NUM_MESSAGES + 1)
/* Messaged with message IDs */
@@ -4835,6 +4835,14 @@
*/
#define GD_MSG_NO_SIG_TO_PID_ZERO (GLUSTERD_COMP_BASE + 597)
+/*!
+ * @messageid
+ * @diagnosis
+ * @recommendedaction
+ *
+ */
+
+#define GD_MSG_TIER_WATERMARK_RESET_FAIL (GLUSTERD_COMP_BASE + 598)
/*------------*/
diff --git a/xlators/mgmt/glusterd/src/glusterd-op-sm.c b/xlators/mgmt/glusterd/src/glusterd-op-sm.c
index 5169f414e94..75469d68e26 100644
--- a/xlators/mgmt/glusterd/src/glusterd-op-sm.c
+++ b/xlators/mgmt/glusterd/src/glusterd-op-sm.c
@@ -1449,6 +1449,82 @@ out:
}
return ret;
}
+static int
+glusterd_water_limit_check (glusterd_volinfo_t *volinfo, gf_boolean_t is_hi,
+ char **op_errstr)
+{
+
+ int ret = -1;
+ char *default_value = NULL;
+ char *temp = NULL;
+ uint64_t wm = 0;
+ uint64_t default_wm = 0;
+ struct volopt_map_entry *vmap = NULL;
+ xlator_t *this = NULL;
+ extern struct volopt_map_entry glusterd_volopt_map[];
+ char msg[2048] = {0};
+
+ this = THIS;
+ GF_ASSERT (this);
+
+ if (is_hi)
+ ret = glusterd_volinfo_get (volinfo,
+ "cluster.watermark-low", &temp);
+ else
+ ret = glusterd_volinfo_get (volinfo,
+ "cluster.watermark-hi", &temp);
+ if (ret) {
+ gf_msg (this->name, GF_LOG_ERROR, 0,
+ GD_MSG_VOLINFO_GET_FAIL, "failed to get watermark");
+ goto out;
+ }
+
+ gf_string2bytesize_uint64 (temp, &wm);
+
+ if (is_hi)
+ for (vmap = glusterd_volopt_map; vmap->key; vmap++) {
+ if (strcmp (vmap->key, "cluster.watermark-hi") == 0)
+ default_value = vmap->value;
+ }
+ else
+ for (vmap = glusterd_volopt_map; vmap->key; vmap++) {
+ if (strcmp (vmap->key, "cluster.watermark-low") == 0)
+ default_value = vmap->value;
+ }
+
+ gf_string2bytesize_uint64 (default_value, &default_wm);
+
+ if (is_hi) {
+ if (default_wm <= wm) {
+ snprintf (msg, sizeof (msg), "Resetting hi-watermark "
+ "to default will make it lower or equal to "
+ "the low-watermark, which is an invalid "
+ "configuration state. Please lower the "
+ "low-watermark first to the desired value "
+ "and then reset the hi-watermark.");
+ ret = -1;
+ goto out;
+ }
+ } else {
+ if (default_wm >= wm) {
+ snprintf (msg, sizeof (msg), "Resetting low-watermark "
+ "to default will make it higher or equal to "
+ "the hi-watermark, which is an invalid "
+ "configuration state. Please raise the "
+ "hi-watermark first to the desired value "
+ "and then reset the low-watermark.");
+ ret = -1;
+ goto out;
+ }
+ }
+out:
+ if (msg[0] != '\0') {
+ gf_msg (THIS->name, GF_LOG_ERROR, 0,
+ GD_MSG_TIER_WATERMARK_RESET_FAIL, "%s", msg);
+ *op_errstr = gf_strdup (msg);
+ }
+ return ret;
+}
static int
glusterd_op_stage_reset_volume (dict_t *dict, char **op_errstr)
@@ -1525,6 +1601,16 @@ glusterd_op_stage_reset_volume (dict_t *dict, char **op_errstr)
if (exists == -1) {
ret = -1;
goto out;
+ } else if (strcmp (key, "cluster.watermark-low") == 0) {
+ ret = glusterd_water_limit_check (volinfo, _gf_false,
+ op_errstr);
+ if (ret)
+ return ret;
+ } else if (strcmp (key, "cluster.watermark-hi") == 0) {
+ ret = glusterd_water_limit_check (volinfo, _gf_true,
+ op_errstr);
+ if (ret)
+ return ret;
}
if (!exists) {