diff options
| author | Krishnan Parthasarathi <kp@gluster.com> | 2011-10-20 12:51:44 +0530 | 
|---|---|---|
| committer | Vijay Bellur <vijay@gluster.com> | 2011-10-28 04:58:18 -0700 | 
| commit | 1fd6ad3cc85fcc07a47bb0af67a0af48349392a9 (patch) | |
| tree | 4e52b523b5558f03f526b730265f0b6c62fb0a83 | |
| parent | 8a88ae6ce413dacc363cb9d5802965d8c5dca332 (diff) | |
glusterd: Removing delayed moving of op sm for stop vol/remove brick op.
Earlier we would wait until brick disconnect or 5s whichever was earlier,
before we move op sm from brick op stage to commit stage. This involves a race
where both the above mentioned events can happen 'concurrently' and result in
double free of the event context.
Change-Id: Ia369994448e71a052679d2373b8ab9177d56a541
BUG: 3700
Reviewed-on: http://review.gluster.com/626
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Vijay Bellur <vijay@gluster.com>
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-handler.c | 2 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-op-sm.c | 22 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-op-sm.h | 1 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-rpc-ops.c | 39 | 
4 files changed, 4 insertions, 60 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-handler.c b/xlators/mgmt/glusterd/src/glusterd-handler.c index 552998ad0..f072a7004 100644 --- a/xlators/mgmt/glusterd/src/glusterd-handler.c +++ b/xlators/mgmt/glusterd/src/glusterd-handler.c @@ -3818,8 +3818,6 @@ glusterd_brick_rpc_notify (struct rpc_clnt *rpc, void *mydata,          case RPC_CLNT_DISCONNECT:                  gf_log (this->name, GF_LOG_DEBUG, "got RPC_CLNT_DISCONNECT");                  glusterd_set_brick_status (brickinfo, GF_BRICK_STOPPED); -                if (brickinfo->timer && brickinfo->timer->callbk) -                        brickinfo->timer->callbk (brickinfo->timer->data);                  break;          default: diff --git a/xlators/mgmt/glusterd/src/glusterd-op-sm.c b/xlators/mgmt/glusterd/src/glusterd-op-sm.c index 4dab7a653..9db4c2c19 100644 --- a/xlators/mgmt/glusterd/src/glusterd-op-sm.c +++ b/xlators/mgmt/glusterd/src/glusterd-op-sm.c @@ -6631,28 +6631,6 @@ out:  }  void -glusterd_op_brick_disconnect (void *data) -{ -        glusterd_brickinfo_t *brickinfo = NULL; -        glusterd_op_brick_rsp_ctx_t *ev_ctx = NULL; - -        ev_ctx = data; -        GF_ASSERT (ev_ctx); -        brickinfo = ev_ctx->brickinfo; -        GF_ASSERT (brickinfo); - -	if (brickinfo->timer) { -		gf_timer_call_cancel (THIS->ctx, brickinfo->timer); -		brickinfo->timer = NULL; -                gf_log ("", GF_LOG_DEBUG, -                        "Cancelled timer thread"); -	} - -        glusterd_op_sm_inject_event (GD_OP_EVENT_RCVD_ACC, ev_ctx); -        glusterd_op_sm (); -} - -void  glusterd_do_replace_brick (void *data)  {          glusterd_volinfo_t     *volinfo = NULL; diff --git a/xlators/mgmt/glusterd/src/glusterd-op-sm.h b/xlators/mgmt/glusterd/src/glusterd-op-sm.h index 0830f9a16..a929fe805 100644 --- a/xlators/mgmt/glusterd/src/glusterd-op-sm.h +++ b/xlators/mgmt/glusterd/src/glusterd-op-sm.h @@ -275,7 +275,6 @@ int32_t  glusterd_handle_brick_rsp (glusterd_brickinfo_t *brickinfo,                             glusterd_op_t op, dict_t *rsp_dict, dict_t *ctx_dict,                             char **op_errstr); -void glusterd_op_brick_disconnect (void *data);  int32_t  glusterd_op_init_ctx (glusterd_op_t op);  int32_t diff --git a/xlators/mgmt/glusterd/src/glusterd-rpc-ops.c b/xlators/mgmt/glusterd/src/glusterd-rpc-ops.c index faba229b4..dad6d513c 100644 --- a/xlators/mgmt/glusterd/src/glusterd-rpc-ops.c +++ b/xlators/mgmt/glusterd/src/glusterd-rpc-ops.c @@ -1694,30 +1694,6 @@ out:  }  int32_t -glusterd_start_brick_disconnect_timer (glusterd_op_brick_rsp_ctx_t *ev_ctx) -{ -        struct timeval       timeout = {0, }; -        int32_t              ret = -1; -        xlator_t             *this = NULL; -        glusterd_brickinfo_t *brickinfo = NULL; - -        timeout.tv_sec  = 5; -        timeout.tv_usec = 0; -        brickinfo = ev_ctx->brickinfo; -        GF_ASSERT (brickinfo); -        this = THIS; -        GF_ASSERT (this); - -        brickinfo->timer = gf_timer_call_after (this->ctx, timeout, -                                                glusterd_op_brick_disconnect, -                                                (void *) ev_ctx); - -        ret = 0; - -        return ret; -} - -int32_t  glusterd3_1_brick_op_cbk (struct rpc_req *req, struct iovec *iov,                            int count, void *myframe)  { @@ -1727,7 +1703,6 @@ glusterd3_1_brick_op_cbk (struct rpc_req *req, struct iovec *iov,          glusterd_op_sm_event_type_t   event_type = GD_OP_EVENT_NONE;          call_frame_t                  *frame = NULL;          glusterd_op_brick_rsp_ctx_t   *ev_ctx = NULL; -        int32_t                       op = -1;          dict_t                        *dict = NULL;          GF_ASSERT (req); @@ -1784,16 +1759,10 @@ out:          ev_ctx->brickinfo = frame->cookie;          ev_ctx->rsp_dict  = dict;          ev_ctx->commit_ctx = frame->local; -        op = glusterd_op_get_op (); -        if ((op == GD_OP_STOP_VOLUME) || -           (op == GD_OP_REMOVE_BRICK)) { -                ret = glusterd_start_brick_disconnect_timer (ev_ctx); -        } else { -                ret = glusterd_op_sm_inject_event (event_type, ev_ctx); -                if (!ret) { -                        glusterd_friend_sm (); -                        glusterd_op_sm (); -                } +        ret = glusterd_op_sm_inject_event (event_type, ev_ctx); +        if (!ret) { +                glusterd_friend_sm (); +                glusterd_op_sm ();          }          if (ret && dict)  | 
