diff options
Diffstat (limited to 'rpc')
-rw-r--r-- | rpc/rpc-lib/src/rpcsvc.c | 33 | ||||
-rw-r--r-- | rpc/rpc-lib/src/rpcsvc.h | 3 |
2 files changed, 23 insertions, 13 deletions
diff --git a/rpc/rpc-lib/src/rpcsvc.c b/rpc/rpc-lib/src/rpcsvc.c index ad1e4f478..eef1f0504 100644 --- a/rpc/rpc-lib/src/rpcsvc.c +++ b/rpc/rpc-lib/src/rpcsvc.c @@ -276,6 +276,9 @@ rpcsvc_request_destroy (rpcsvc_request_t *req) iobref_unref (req->iobref); } + if (req->hdr_iobuf) + iobuf_unref (req->hdr_iobuf); + rpc_transport_unref (req->trans); mem_put (req); @@ -434,19 +437,22 @@ err: int -rpcsvc_synctask_cbk (int ret, call_frame_t *frame, void *opaque) +rpcsvc_check_and_reply_error (int ret, call_frame_t *frame, void *opaque) { rpcsvc_request_t *req = NULL; req = opaque; - if (ret == RPCSVC_ACTOR_ERROR) - rpcsvc_error_reply (req); + if (ret == RPCSVC_ACTOR_ERROR) { + ret = rpcsvc_error_reply (req); + if (ret) + gf_log ("rpcsvc", GF_LOG_WARNING, + "failed to queue error reply"); + } return 0; } - int rpcsvc_handle_rpc_call (rpcsvc_t *svc, rpc_transport_t *trans, rpc_transport_pollin_t *msg) @@ -527,22 +533,23 @@ rpcsvc_handle_rpc_call (rpcsvc_t *svc, rpc_transport_t *trans, goto err_reply; } - if (req->synctask) + if (req->synctask) { + if (msg->hdr_iobuf) + req->hdr_iobuf = iobuf_ref (msg->hdr_iobuf); + ret = synctask_new (THIS->ctx->env, (synctask_fn_t) actor_fn, - rpcsvc_synctask_cbk, NULL, req); - else + rpcsvc_check_and_reply_error, NULL, + req); + } else { ret = actor_fn (req); + req->hdr_iobuf = NULL; + } } err_reply: - if (ret == RPCSVC_ACTOR_ERROR) { - ret = rpcsvc_error_reply (req); - } - - if (ret) - gf_log ("rpcsvc", GF_LOG_WARNING, "failed to queue error reply"); + ret = rpcsvc_check_and_reply_error (ret, NULL, req); /* No need to propagate error beyond this function since the reply * has now been queued. */ ret = 0; diff --git a/rpc/rpc-lib/src/rpcsvc.h b/rpc/rpc-lib/src/rpcsvc.h index 5a0ddc9da..39ae383f4 100644 --- a/rpc/rpc-lib/src/rpcsvc.h +++ b/rpc/rpc-lib/src/rpcsvc.h @@ -234,6 +234,9 @@ struct rpcsvc_request { /* Container for transport to store request-specific item */ void *trans_private; + + /* we need to ref the 'iobuf' in case of 'synctasking' it */ + struct iobuf *hdr_iobuf; }; #define rpcsvc_request_program(req) ((rpcsvc_program_t *)((req)->prog)) |