summaryrefslogtreecommitdiffstats
path: root/xlators/mgmt/glusterd/src/glusterd-volume-ops.c
diff options
context:
space:
mode:
authorKrishnan Parthasarathi <kp@gluster.com>2012-04-03 15:37:25 +0530
committerVijay Bellur <vijay@gluster.com>2012-04-12 23:07:08 -0700
commit8a45a0e480f7e8c6ea1195f77ce3810d4817dc37 (patch)
tree9b50579b53228f6a605b4c74e36fe0fb7a3827e2 /xlators/mgmt/glusterd/src/glusterd-volume-ops.c
parentb337b755325f75a6fcf65616eaf4467b70b8b245 (diff)
glusterd: Added volume-id to 'op' dictionary
Volume-id passed in op dictionary would help detect possible split brains among peers in a cluster. The idea is to check if the volume's id and the vol-id that was passed are equal. ie, same volume name, but different volume id indicate that glusterd 'metadata' of one of the participating peers is stale or there is a split brain. This is over and above the existing checksum based validation of peer supplied cluster 'metadata' (ie, volume info file). Change-Id: I1049ef249e417e540ccb4243e450f92fcd0f46f9 BUG: 797734 Signed-off-by: Krishnan Parthasarathi <kp@gluster.com> Reviewed-on: http://review.gluster.com/3083 Tested-by: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Jeff Darcy <jdarcy@redhat.com> Reviewed-by: Vijay Bellur <vijay@gluster.com>
Diffstat (limited to 'xlators/mgmt/glusterd/src/glusterd-volume-ops.c')
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-volume-ops.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-volume-ops.c b/xlators/mgmt/glusterd/src/glusterd-volume-ops.c
index b30c4631..85e7abba 100644
--- a/xlators/mgmt/glusterd/src/glusterd-volume-ops.c
+++ b/xlators/mgmt/glusterd/src/glusterd-volume-ops.c
@@ -830,6 +830,10 @@ glusterd_op_stage_start_volume (dict_t *dict, char **op_errstr)
if (ret)
goto out;
+ ret = glusterd_validate_volume_id (dict, volinfo);
+ if (ret)
+ goto out;
+
list_for_each_entry (brickinfo, &volinfo->bricks, brick_list) {
ret = glusterd_resolve_brick (brickinfo);
if (ret) {
@@ -905,6 +909,10 @@ glusterd_op_stage_stop_volume (dict_t *dict, char **op_errstr)
if (ret)
goto out;
+ ret = glusterd_validate_volume_id (dict, volinfo);
+ if (ret)
+ goto out;
+
/* If 'force' flag is given, no check is required */
if (flags & GF_CLI_FLAG_OP_FORCE)
goto out;
@@ -1003,6 +1011,10 @@ glusterd_op_stage_delete_volume (dict_t *dict, char **op_errstr)
if (ret)
goto out;
+ ret = glusterd_validate_volume_id (dict, volinfo);
+ if (ret)
+ goto out;
+
if (glusterd_is_volume_started (volinfo)) {
snprintf (msg, sizeof (msg), "Volume %s has been started."
"Volume needs to be stopped before deletion.",
@@ -1056,6 +1068,10 @@ glusterd_op_stage_heal_volume (dict_t *dict, char **op_errstr)
goto out;
}
+ ret = glusterd_validate_volume_id (dict, volinfo);
+ if (ret)
+ goto out;
+
if (!glusterd_is_volume_replicate (volinfo)) {
ret = -1;
snprintf (msg, sizeof (msg), "Volume %s is not of type "
@@ -1142,6 +1158,10 @@ glusterd_op_stage_statedump_volume (dict_t *dict, char **op_errstr)
goto out;
}
+ ret = glusterd_validate_volume_id (dict, volinfo);
+ if (ret)
+ goto out;
+
is_running = glusterd_is_volume_started (volinfo);
if (!is_running) {
snprintf (msg, sizeof(msg), "Volume %s is not in a started"
@@ -1209,6 +1229,10 @@ glusterd_op_stage_clearlocks_volume (dict_t *dict, char **op_errstr)
goto out;
}
+ ret = glusterd_validate_volume_id (dict, volinfo);
+ if (ret)
+ goto out;
+
if (!glusterd_is_volume_started (volinfo)) {
snprintf (msg, sizeof(msg), "Volume %s is not started",
volname);