summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--rpc/rpc-lib/src/rpcsvc.c33
-rw-r--r--rpc/rpc-lib/src/rpcsvc.h3
-rw-r--r--xlators/mgmt/glusterd/src/glusterd.c6
-rw-r--r--xlators/protocol/server/src/server.c20
4 files changed, 50 insertions, 12 deletions
diff --git a/rpc/rpc-lib/src/rpcsvc.c b/rpc/rpc-lib/src/rpcsvc.c
index f07e745a4b3..5a5c65114c4 100644
--- a/rpc/rpc-lib/src/rpcsvc.c
+++ b/rpc/rpc-lib/src/rpcsvc.c
@@ -1020,6 +1020,7 @@ int rpcsvc_request_submit (rpcsvc_t *rpc, rpc_transport_t *trans,
struct iovec iov = {0, };
struct iobuf *iobuf = NULL;
ssize_t xdr_size = 0;
+ struct iobref *iobref = NULL;
if (!req)
goto out;
@@ -1042,20 +1043,33 @@ int rpcsvc_request_submit (rpcsvc_t *rpc, rpc_transport_t *trans,
iov.iov_len = ret;
count = 1;
+ iobref = iobref_new ();
+ if (!iobref) {
+ ret = -1;
+ gf_log ("rpcsvc", GF_LOG_WARNING, "Failed to create iobref");
+ goto out;
+ }
+
+ iobref_add (iobref, iobuf);
+
ret = rpcsvc_callback_submit (rpc, trans, prog, procnum,
- &iov, count);
+ &iov, count, iobref);
out:
if (iobuf)
iobuf_unref (iobuf);
+ if (iobref)
+ iobref_unref (iobref);
+
return ret;
}
int
rpcsvc_callback_submit (rpcsvc_t *rpc, rpc_transport_t *trans,
rpcsvc_cbk_program_t *prog, int procnum,
- struct iovec *proghdr, int proghdrcount)
+ struct iovec *proghdr, int proghdrcount,
+ struct iobref *iobref)
{
struct iobuf *request_iob = NULL;
struct iovec rpchdr = {0,};
@@ -1063,6 +1077,7 @@ rpcsvc_callback_submit (rpcsvc_t *rpc, rpc_transport_t *trans,
int ret = -1;
int proglen = 0;
uint32_t xid = 0;
+ gf_boolean_t new_iobref = _gf_false;
if (!rpc) {
goto out;
@@ -1084,11 +1099,22 @@ rpcsvc_callback_submit (rpcsvc_t *rpc, rpc_transport_t *trans,
"cannot build rpc-record");
goto out;
}
+ if (!iobref) {
+ iobref = iobref_new ();
+ if (!iobref) {
+ gf_log ("rpcsvc", GF_LOG_WARNING, "Failed to create iobref");
+ goto out;
+ }
+ new_iobref = 1;
+ }
+
+ iobref_add (iobref, request_iob);
req.msg.rpchdr = &rpchdr;
req.msg.rpchdrcount = 1;
req.msg.proghdr = proghdr;
req.msg.proghdrcount = proghdrcount;
+ req.msg.iobref = iobref;
ret = rpc_transport_submit_request (trans, &req);
if (ret == -1) {
@@ -1102,6 +1128,9 @@ rpcsvc_callback_submit (rpcsvc_t *rpc, rpc_transport_t *trans,
out:
iobuf_unref (request_iob);
+ if (new_iobref)
+ iobref_unref (iobref);
+
return ret;
}
diff --git a/rpc/rpc-lib/src/rpcsvc.h b/rpc/rpc-lib/src/rpcsvc.h
index 02e467e68a7..08402373be6 100644
--- a/rpc/rpc-lib/src/rpcsvc.h
+++ b/rpc/rpc-lib/src/rpcsvc.h
@@ -584,7 +584,8 @@ int rpcsvc_request_submit (rpcsvc_t *rpc, rpc_transport_t *trans,
int rpcsvc_callback_submit (rpcsvc_t *rpc, rpc_transport_t *trans,
rpcsvc_cbk_program_t *prog, int procnum,
- struct iovec *proghdr, int proghdrcount);
+ struct iovec *proghdr, int proghdrcount,
+ struct iobref *iobref);
rpcsvc_actor_t *
rpcsvc_program_actor (rpcsvc_request_t *req);
diff --git a/xlators/mgmt/glusterd/src/glusterd.c b/xlators/mgmt/glusterd/src/glusterd.c
index 26cd0fc4f25..c2272558939 100644
--- a/xlators/mgmt/glusterd/src/glusterd.c
+++ b/xlators/mgmt/glusterd/src/glusterd.c
@@ -244,7 +244,8 @@ glusterd_fetchspec_notify (xlator_t *this)
list_for_each_entry (trans, &priv->xprt_list, list) {
rpcsvc_callback_submit (priv->rpc, trans,
&glusterd_cbk_prog,
- GF_CBK_FETCHSPEC, NULL, 0);
+ GF_CBK_FETCHSPEC, NULL, 0,
+ NULL);
}
}
pthread_mutex_unlock (&priv->xprt_lock);
@@ -280,7 +281,8 @@ glusterd_fetchsnap_notify (xlator_t *this)
list_for_each_entry (trans, &priv->xprt_list, list) {
rpcsvc_callback_submit (priv->rpc, trans,
&glusterd_cbk_prog,
- GF_CBK_GET_SNAPS, NULL, 0);
+ GF_CBK_GET_SNAPS, NULL, 0,
+ NULL);
}
}
pthread_mutex_unlock (&priv->xprt_lock);
diff --git a/xlators/protocol/server/src/server.c b/xlators/protocol/server/src/server.c
index 10009e2b4a7..7ab0862b0a2 100644
--- a/xlators/protocol/server/src/server.c
+++ b/xlators/protocol/server/src/server.c
@@ -1235,12 +1235,18 @@ server_process_event_upcall (xlator_t *this, void *data)
if (!client || strcmp(client->client_uid, client_uid))
continue;
- rpcsvc_request_submit(conf->rpc, xprt,
- &server_cbk_prog,
- cbk_procnum,
- up_req,
- this->ctx,
- xdrproc);
+ ret = rpcsvc_request_submit (conf->rpc, xprt,
+ &server_cbk_prog,
+ cbk_procnum,
+ up_req,
+ this->ctx,
+ xdrproc);
+ if (ret < 0) {
+ gf_msg_debug (this->name, 0, "Failed to send "
+ "upcall to client:%s upcall "
+ "event:%d", client_uid,
+ upcall_data->event_type);
+ }
break;
}
}
@@ -1272,7 +1278,7 @@ server_process_child_event (xlator_t *this, int32_t event, void *data,
rpcsvc_callback_submit (conf->rpc, xprt,
&server_cbk_prog,
cbk_procnum,
- NULL, 0);
+ NULL, 0, NULL);
}
}
pthread_mutex_unlock (&conf->mutex);