diff options
author | Gaurav Yadav <gyadav@redhat.com> | 2017-05-21 12:31:29 +0530 |
---|---|---|
committer | Atin Mukherjee <amukherj@redhat.com> | 2017-05-23 04:40:10 +0000 |
commit | 8dc63c8824fc1a00c873c16e8a16a14fca7c8cca (patch) | |
tree | 85c8f864f26fc6265aa8616d6c1a450a1c1ca8b1 /xlators | |
parent | 284cd8851bfe60984d2f11b5c52fe3204ff43b06 (diff) |
glusterd : volume profile command on one of the node crashes glusterd
When volume profile command is issued on one of the node glusterd
crashes. Its a race condition which may hit when profile command and
status command is being executed from node A and node B respectively.
While doing so event GD_OP_STATE_BRICK_OP_SENT/GD_OP_STATE_BRICK_COMMITTED
is being triggered. As handling of event is not thread safe, hence context
got modify and glusterd crashes.
With the fix now we are validating the context before using it.
Change-Id: Ic07c3cdc5644677b0e40ff0fac6fcca834158913
BUG: 1452956
Signed-off-by: Gaurav Yadav <gyadav@redhat.com>
Reviewed-on: https://review.gluster.org/17350
Smoke: Gluster Build System <jenkins@build.gluster.org>
CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
Reviewed-by: Samikshan Bairagya <samikshan@gmail.com>
NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
Diffstat (limited to 'xlators')
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-op-sm.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-op-sm.c b/xlators/mgmt/glusterd/src/glusterd-op-sm.c index 1a12b0e7160..9b68967f445 100644 --- a/xlators/mgmt/glusterd/src/glusterd-op-sm.c +++ b/xlators/mgmt/glusterd/src/glusterd-op-sm.c @@ -7606,7 +7606,7 @@ out: static int glusterd_op_ac_rcvd_brick_op_acc (glusterd_op_sm_event_t *event, void *ctx) { - int ret = 0; + int ret = -1; glusterd_op_brick_rsp_ctx_t *ev_ctx = NULL; char *op_errstr = NULL; glusterd_op_t op = GD_OP_NONE; @@ -7617,13 +7617,14 @@ glusterd_op_ac_rcvd_brick_op_acc (glusterd_op_sm_event_t *event, void *ctx) xlator_t *this = NULL; this = THIS; - GF_ASSERT (this); - GF_ASSERT (event); - GF_ASSERT (ctx); + GF_VALIDATE_OR_GOTO ("glusterd", this, out); + GF_VALIDATE_OR_GOTO (this->name, event, out); + GF_VALIDATE_OR_GOTO (this->name, ctx, out); ev_ctx = ctx; + GF_VALIDATE_OR_GOTO(this->name, ev_ctx, out); req_ctx = ev_ctx->commit_ctx; - GF_ASSERT (req_ctx); + GF_VALIDATE_OR_GOTO (this->name, req_ctx, out); op = req_ctx->op; op_ctx = glusterd_op_get_ctx (); |