summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--rpc/rpc-lib/src/rpc-transport.h1
-rw-r--r--rpc/rpc-lib/src/rpcsvc.c21
2 files changed, 19 insertions, 3 deletions
diff --git a/rpc/rpc-lib/src/rpc-transport.h b/rpc/rpc-lib/src/rpc-transport.h
index 97eeff2a3e3..8888b5e5736 100644
--- a/rpc/rpc-lib/src/rpc-transport.h
+++ b/rpc/rpc-lib/src/rpc-transport.h
@@ -210,6 +210,7 @@ struct rpc_transport {
uint64_t total_bytes_read;
uint64_t total_bytes_write;
+ uint32_t xid; /* RPC/XID used for callbacks */
struct list_head list;
int bind_insecure;
diff --git a/rpc/rpc-lib/src/rpcsvc.c b/rpc/rpc-lib/src/rpcsvc.c
index 7d5cc937d86..8d15eb93281 100644
--- a/rpc/rpc-lib/src/rpcsvc.c
+++ b/rpc/rpc-lib/src/rpcsvc.c
@@ -874,6 +874,20 @@ err:
return txrecord;
}
+static uint32_t
+rpc_callback_new_callid (struct rpc_transport *trans)
+{
+ uint32_t callid = 0;
+
+ pthread_mutex_lock (&trans->lock);
+ {
+ callid = ++trans->xid;
+ }
+ pthread_mutex_unlock (&trans->lock);
+
+ return callid;
+}
+
int
rpcsvc_fill_callback (int prognum, int progver, int procnum, int payload,
uint32_t xid, struct rpc_msg *request)
@@ -1052,6 +1066,7 @@ rpcsvc_callback_submit (rpcsvc_t *rpc, rpc_transport_t *trans,
rpc_transport_req_t req;
int ret = -1;
int proglen = 0;
+ uint32_t xid = 0;
if (!rpc) {
goto out;
@@ -1063,11 +1078,11 @@ rpcsvc_callback_submit (rpcsvc_t *rpc, rpc_transport_t *trans,
proglen += iov_length (proghdr, proghdrcount);
}
+ xid = rpc_callback_new_callid (trans);
+
request_iob = rpcsvc_callback_build_record (rpc, prog->prognum,
prog->progver, procnum,
- proglen,
- GF_UNIVERSAL_ANSWER,
- &rpchdr);
+ proglen, xid, &rpchdr);
if (!request_iob) {
gf_log ("rpcsvc", GF_LOG_WARNING,
"cannot build rpc-record");