Blob Blame History Raw
From eb9d5dc96befec76eb2e1960e522ede1dc87551c Mon Sep 17 00:00:00 2001
From: Gaurav Yadav <gyadav@redhat.com>
Date: Sun, 21 May 2017 12:31:29 +0530
Subject: [PATCH 466/473] 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.

> 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>

Change-Id: Ic07c3cdc5644677b0e40ff0fac6fcca834158913
BUG: 1452205
Signed-off-by: Gaurav Yadav <gyadav@redhat.com>
Reviewed-on: https://code.engineering.redhat.com/gerrit/106947
Reviewed-by: Samikshan Bairagya <sbairagy@redhat.com>
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
---
 xlators/mgmt/glusterd/src/glusterd-op-sm.c | 11 ++++++-----
 1 file 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 8ebece6..f82a8f1 100644
--- a/xlators/mgmt/glusterd/src/glusterd-op-sm.c
+++ b/xlators/mgmt/glusterd/src/glusterd-op-sm.c
@@ -7511,7 +7511,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;
@@ -7522,13 +7522,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 ();
-- 
1.8.3.1