diff options
author | Anand Avati <avati@redhat.com> | 2012-08-20 10:19:15 -0700 |
---|---|---|
committer | Anand Avati <avati@redhat.com> | 2012-09-19 23:18:08 -0700 |
commit | 38afd84faa383c5e0be21c48c918112b7b01a5cf (patch) | |
tree | d43a43445165ac2005fe4424f7b8fb2bd15d979a | |
parent | a3c5722b39895f5fa4721cfae456e26bc758b33a (diff) |
rpcsvc: framework for executing actors as synctask
An rpcsvc_program can be registered by setting .synctask field
to 1 which will make actors of that program be executed in a
synctask, thus freeing up the rpc/poll thread while the actor
executes.
Change-Id: Idacef2ad3bcae0f354fd0fc16ca06ba7094d7b98
BUG: 762935
Signed-off-by: Anand Avati <avati@redhat.com>
Reviewed-on: http://review.gluster.org/3833
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Amar Tumballi <amarts@redhat.com>
-rw-r--r-- | rpc/rpc-lib/src/rpcsvc.c | 24 | ||||
-rw-r--r-- | rpc/rpc-lib/src/rpcsvc.h | 6 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-handler.c | 3 |
3 files changed, 32 insertions, 1 deletions
diff --git a/rpc/rpc-lib/src/rpcsvc.c b/rpc/rpc-lib/src/rpcsvc.c index ca637a50617..ad1e4f47888 100644 --- a/rpc/rpc-lib/src/rpcsvc.c +++ b/rpc/rpc-lib/src/rpcsvc.c @@ -27,6 +27,7 @@ #include "xdr-common.h" #include "xdr-generic.h" #include "rpc-common-xdr.h" +#include "syncop.h" #include <errno.h> #include <pthread.h> @@ -206,6 +207,8 @@ rpcsvc_program_actor (rpcsvc_request_t *req) goto err; } + req->synctask = program->synctask; + err = SUCCESS; gf_log (GF_RPCSVC, GF_LOG_TRACE, "Actor found: %s - %s", program->progname, actor->procname); @@ -431,6 +434,20 @@ err: int +rpcsvc_synctask_cbk (int ret, call_frame_t *frame, void *opaque) +{ + rpcsvc_request_t *req = NULL; + + req = opaque; + + if (ret == RPCSVC_ACTOR_ERROR) + rpcsvc_error_reply (req); + + return 0; +} + + +int rpcsvc_handle_rpc_call (rpcsvc_t *svc, rpc_transport_t *trans, rpc_transport_pollin_t *msg) { @@ -510,7 +527,12 @@ rpcsvc_handle_rpc_call (rpcsvc_t *svc, rpc_transport_t *trans, goto err_reply; } - ret = actor_fn (req); + if (req->synctask) + ret = synctask_new (THIS->ctx->env, + (synctask_fn_t) actor_fn, + rpcsvc_synctask_cbk, NULL, req); + else + ret = actor_fn (req); } err_reply: diff --git a/rpc/rpc-lib/src/rpcsvc.h b/rpc/rpc-lib/src/rpcsvc.h index 9f526cb05cd..5a0ddc9da9d 100644 --- a/rpc/rpc-lib/src/rpcsvc.h +++ b/rpc/rpc-lib/src/rpcsvc.h @@ -224,6 +224,9 @@ struct rpcsvc_request { */ rpcsvc_auth_data_t verf; + /* Execute this request's actor function as a synctask? */ + gf_boolean_t synctask; + /* Container for a RPC program wanting to store a temp * request-specific item. */ @@ -367,6 +370,9 @@ struct rpcsvc_program { */ int min_auth; + /* Execute actor function as a synctask? */ + gf_boolean_t synctask; + /* list member to link to list of registered services with rpcsvc */ struct list_head program; }; diff --git a/xlators/mgmt/glusterd/src/glusterd-handler.c b/xlators/mgmt/glusterd/src/glusterd-handler.c index dd88ed0c251..01f2adb3858 100644 --- a/xlators/mgmt/glusterd/src/glusterd-handler.c +++ b/xlators/mgmt/glusterd/src/glusterd-handler.c @@ -2961,6 +2961,7 @@ struct rpcsvc_program gd_svc_mgmt_prog = { .progver = GD_MGMT_VERSION, .numactors = GLUSTERD_MGMT_MAXVALUE, .actors = gd_svc_mgmt_actors, + .synctask = _gf_false, }; rpcsvc_actor_t gd_svc_peer_actors[] = { @@ -2977,6 +2978,7 @@ struct rpcsvc_program gd_svc_peer_prog = { .progver = GD_FRIEND_VERSION, .numactors = GLUSTERD_FRIEND_MAXVALUE, .actors = gd_svc_peer_actors, + .synctask = _gf_false, }; @@ -3018,4 +3020,5 @@ struct rpcsvc_program gd_svc_cli_prog = { .progver = GLUSTER_CLI_VERSION, .numactors = GLUSTER_CLI_MAXVALUE, .actors = gd_svc_cli_actors, + .synctask = _gf_false, }; |