summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVijaikumar M <vmallika@redhat.com>2014-05-06 14:56:23 +0530
committerKrishnan Parthasarathi <kparthas@redhat.com>2014-05-08 22:24:56 -0700
commit26043d1f8ed6892aca47abcb75cedfdc51e86a0a (patch)
tree20f096c086d26bbc2e80e09dda2b9def69e7719f
parent5dda1d4e00b8235656b7e4e8de35f599bf033148 (diff)
glusterd/snapshot: Don't release big_lock before completing snapshot creation
Releasing the big-lock can cause problem like deadlock or memory corruption. Same happened with bug 1091926 where glusterd on node-2 entered a commit phase and released a big-lock. The originator node received timeout for the commit phase and triggered a post-validate cleanup to the node-2. Now node-2 continued to work with the object that are alreday cleaned-up and resulted in a crash. Solution is to not to release big-lock in the commit phase of snapshot creation. Change-Id: I571194fdb0b0ecc91bd13f2a9fc92fe4338d14dc BUG: 1091926 Signed-off-by: Vijaikumar M <vmallika@redhat.com> Reviewed-on: http://review.gluster.org/7579 Tested-by: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Rajesh Joseph <rjoseph@redhat.com> Reviewed-by: Krishnan Parthasarathi <kparthas@redhat.com> Tested-by: Krishnan Parthasarathi <kparthas@redhat.com>
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-snapshot.c2
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-volume-ops.c7
-rw-r--r--xlators/mgmt/glusterd/src/glusterd.h4
3 files changed, 8 insertions, 5 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-snapshot.c b/xlators/mgmt/glusterd/src/glusterd-snapshot.c
index 65b0fb12cd5..c42aac57936 100644
--- a/xlators/mgmt/glusterd/src/glusterd-snapshot.c
+++ b/xlators/mgmt/glusterd/src/glusterd-snapshot.c
@@ -4422,7 +4422,7 @@ glusterd_snapshot_activate_commit (dict_t *dict, char **op_errstr,
goto out;
}
- ret = glusterd_start_volume (snap_volinfo, flags);
+ ret = glusterd_start_volume (snap_volinfo, flags, _gf_true);
if (ret) {
gf_log (this->name, GF_LOG_ERROR,
diff --git a/xlators/mgmt/glusterd/src/glusterd-volume-ops.c b/xlators/mgmt/glusterd/src/glusterd-volume-ops.c
index 25b87b661e0..6cce4a89f08 100644
--- a/xlators/mgmt/glusterd/src/glusterd-volume-ops.c
+++ b/xlators/mgmt/glusterd/src/glusterd-volume-ops.c
@@ -1828,7 +1828,8 @@ out:
}
int
-glusterd_start_volume (glusterd_volinfo_t *volinfo, int flags)
+glusterd_start_volume (glusterd_volinfo_t *volinfo, int flags,
+ gf_boolean_t wait)
{
int ret = 0;
@@ -1841,7 +1842,7 @@ glusterd_start_volume (glusterd_volinfo_t *volinfo, int flags)
GF_ASSERT (volinfo);
list_for_each_entry (brickinfo, &volinfo->bricks, brick_list) {
- ret = glusterd_brick_start (volinfo, brickinfo, _gf_true);
+ ret = glusterd_brick_start (volinfo, brickinfo, wait);
/* If 'force' try to start all bricks regardless of success or
* failure
*/
@@ -1917,7 +1918,7 @@ glusterd_op_start_volume (dict_t *dict, char **op_errstr)
}
}
- ret = glusterd_start_volume (volinfo, flags);
+ ret = glusterd_start_volume (volinfo, flags, _gf_true);
if (ret)
goto out;
diff --git a/xlators/mgmt/glusterd/src/glusterd.h b/xlators/mgmt/glusterd/src/glusterd.h
index 2304e75bc5b..bf4a8e283d6 100644
--- a/xlators/mgmt/glusterd/src/glusterd.h
+++ b/xlators/mgmt/glusterd/src/glusterd.h
@@ -946,7 +946,9 @@ int glusterd_op_statedump_volume_args_get (dict_t *dict, char **volname,
int glusterd_op_gsync_args_get (dict_t *dict, char **op_errstr,
char **master, char **slave, char **host_uuid);
-int glusterd_start_volume (glusterd_volinfo_t *volinfo, int flags);
+int glusterd_start_volume (glusterd_volinfo_t *volinfo, int flags,
+ gf_boolean_t wait);
+
int glusterd_stop_volume (glusterd_volinfo_t *volinfo);
/* Synctask part */