From fc39ee2ea3a22704ebacd0607cf6fd4eae9ec66a Mon Sep 17 00:00:00 2001 From: Krishnan Parthasarathi Date: Thu, 2 May 2013 09:11:58 +0530 Subject: Revert "glusterd: Fix spurious wakeups in glusterd syncops" This reverts commit efa154bb0a4cac34d5a9610ec25d38eebe495f22. -- Following is Avati's analysis (edited) from gerrit -- The claim of the patch (being reverted) is that it in some cases cbkfn is missed. This is wrong analysis. cbk_fn is _always_ called. The patch treats ret > 0 as a "missed cbk". ret > 0 only means socket submission was not complete, and is queued to submit asynchronously when POLLOUT is raised. This is sufficient to guarantee that cbkfn is going to be called (either the socket errors or submission succeeds and reply eventually arrives). This commit also removes spurious barrier_wake(s). call backs are guaranteed to be called even if the transport is disconnected. This means, a 'wake' would be called if rpc_clnt_submit is called. Also, we count both successful and failed operations in a particular batch of operations for the synctask_barrier_wait. So, calling synctask_barrier_wake on failure of rpc_clnt_submit (say, due to network failure) would result in a spurious wake. Change-Id: I7d508c2a54b74a65b82f097742206bc777afc53a BUG: 948686 Signed-off-by: Krishnan Parthasarathi Reviewed-on: http://review.gluster.org/4922 Tested-by: Gluster Build System Reviewed-by: Anand Avati --- xlators/mgmt/glusterd/src/glusterd-syncop.c | 35 +++++++---------------------- xlators/mgmt/glusterd/src/glusterd-syncop.h | 9 ++++---- 2 files changed, 12 insertions(+), 32 deletions(-) (limited to 'xlators/mgmt/glusterd/src') diff --git a/xlators/mgmt/glusterd/src/glusterd-syncop.c b/xlators/mgmt/glusterd/src/glusterd-syncop.c index 3cf3b5ddaa0..d8136ab8231 100644 --- a/xlators/mgmt/glusterd/src/glusterd-syncop.c +++ b/xlators/mgmt/glusterd/src/glusterd-syncop.c @@ -84,8 +84,7 @@ gd_brick_op_req_free (gd1_mgmt_brick_op_req *req) int gd_syncop_submit_request (struct rpc_clnt *rpc, void *req, void *cookie, rpc_clnt_prog_t *prog, - int procnum, fop_cbk_fn_t cbkfn, xdrproc_t xdrproc, - gf_boolean_t *cbk_lost) + int procnum, fop_cbk_fn_t cbkfn, xdrproc_t xdrproc) { int ret = -1; struct iobuf *iobuf = NULL; @@ -128,9 +127,9 @@ gd_syncop_submit_request (struct rpc_clnt *rpc, void *req, frame->local = cookie; /* Send the msg */ - ret = rpc_clnt_submit2 (rpc, prog, procnum, cbkfn, &iov, count, NULL, - 0, iobref, frame, NULL, 0, NULL, 0, NULL, - cbk_lost); + ret = rpc_clnt_submit (rpc, prog, procnum, cbkfn, + &iov, count, NULL, 0, iobref, + frame, NULL, 0, NULL, 0, NULL); /* TODO: do we need to start ping also? */ @@ -256,16 +255,12 @@ gd_syncop_mgmt_lock (struct rpc_clnt *rpc, struct syncargs *args, { int ret = -1; gd1_mgmt_cluster_lock_req req = {{0},}; - gf_boolean_t cbk_lost = _gf_true; uuid_copy (req.uuid, my_uuid); ret = gd_syncop_submit_request (rpc, &req, args, &gd_mgmt_prog, GLUSTERD_MGMT_CLUSTER_LOCK, gd_syncop_mgmt_lock_cbk, - (xdrproc_t) xdr_gd1_mgmt_cluster_lock_req, - &cbk_lost); - if (cbk_lost) - synctask_barrier_wake(args); + (xdrproc_t) xdr_gd1_mgmt_cluster_lock_req); return ret; } @@ -316,16 +311,12 @@ gd_syncop_mgmt_unlock (struct rpc_clnt *rpc, struct syncargs *args, { int ret = -1; gd1_mgmt_cluster_unlock_req req = {{0},}; - gf_boolean_t cbk_lost = _gf_true; uuid_copy (req.uuid, my_uuid); ret = gd_syncop_submit_request (rpc, &req, args, &gd_mgmt_prog, GLUSTERD_MGMT_CLUSTER_UNLOCK, gd_syncop_mgmt_unlock_cbk, - (xdrproc_t) xdr_gd1_mgmt_cluster_lock_req, - &cbk_lost); - if (cbk_lost) - synctask_barrier_wake(args); + (xdrproc_t) xdr_gd1_mgmt_cluster_lock_req); return ret; } @@ -411,7 +402,6 @@ gd_syncop_mgmt_stage_op (struct rpc_clnt *rpc, struct syncargs *args, { gd1_mgmt_stage_op_req *req = NULL; int ret = -1; - gf_boolean_t cbk_lost = _gf_true; req = GF_CALLOC (1, sizeof (*req), gf_gld_mt_mop_stage_req_t); if (!req) @@ -428,13 +418,9 @@ gd_syncop_mgmt_stage_op (struct rpc_clnt *rpc, struct syncargs *args, ret = gd_syncop_submit_request (rpc, req, args, &gd_mgmt_prog, GLUSTERD_MGMT_STAGE_OP, gd_syncop_stage_op_cbk, - (xdrproc_t) xdr_gd1_mgmt_stage_op_req, - &cbk_lost); + (xdrproc_t) xdr_gd1_mgmt_stage_op_req); out: gd_stage_op_req_free (req); - if (cbk_lost) - synctask_barrier_wake(args); - return ret; } @@ -646,7 +632,6 @@ gd_syncop_mgmt_commit_op (struct rpc_clnt *rpc, struct syncargs *args, { gd1_mgmt_commit_op_req *req = NULL; int ret = -1; - gf_boolean_t cbk_lost = _gf_true; req = GF_CALLOC (1, sizeof (*req), gf_gld_mt_mop_commit_req_t); if (!req) @@ -663,13 +648,9 @@ gd_syncop_mgmt_commit_op (struct rpc_clnt *rpc, struct syncargs *args, ret = gd_syncop_submit_request (rpc, req, args, &gd_mgmt_prog, GLUSTERD_MGMT_COMMIT_OP , gd_syncop_commit_op_cbk, - (xdrproc_t) xdr_gd1_mgmt_commit_op_req, - &cbk_lost); + (xdrproc_t) xdr_gd1_mgmt_commit_op_req); out: gd_commit_op_req_free (req); - if (cbk_lost) - synctask_barrier_wake(args); - return ret; } diff --git a/xlators/mgmt/glusterd/src/glusterd-syncop.h b/xlators/mgmt/glusterd/src/glusterd-syncop.h index 3e3980c442f..9318862e508 100644 --- a/xlators/mgmt/glusterd/src/glusterd-syncop.h +++ b/xlators/mgmt/glusterd/src/glusterd-syncop.h @@ -19,7 +19,7 @@ int ret = 0; \ struct synctask *task = NULL; \ glusterd_conf_t *conf= THIS->private; \ - gf_boolean_t cbk_lost = _gf_true; \ + \ task = synctask_get (); \ stb->task = task; \ \ @@ -28,9 +28,8 @@ synclock_unlock (&conf->big_lock); \ ret = gd_syncop_submit_request (rpc, req, stb, \ prog, procnum, cbk, \ - (xdrproc_t)xdrproc, \ - &cbk_lost); \ - if (!cbk_lost) \ + (xdrproc_t)xdrproc); \ + if (!ret) \ synctask_yield (stb->task); \ synclock_lock (&conf->big_lock); \ } while (0) @@ -39,7 +38,7 @@ int gd_syncop_submit_request (struct rpc_clnt *rpc, void *req, void *cookie, rpc_clnt_prog_t *prog, int procnum, fop_cbk_fn_t cbkfn, - xdrproc_t xdrproc, gf_boolean_t *cbk_lost); + xdrproc_t xdrproc); int gd_syncop_mgmt_lock (struct rpc_clnt *rpc, struct syncargs *arg, -- cgit