diff options
author | Prasanna Kumar Kalever <prasanna.kalever@redhat.com> | 2017-09-18 19:49:10 +0530 |
---|---|---|
committer | Prasanna Kumar Kalever <pkalever@redhat.com> | 2017-09-19 04:07:48 +0000 |
commit | 3d0953aa99eed434a1977de3131b264c48fca64b (patch) | |
tree | bcf3008e0ced0365069a9414ee4efc85e0f96b09 /rpc | |
parent | 2ab382593a3dea2e6ca2dc213bf735574933c10b (diff) |
rpc: switch to MT-safe block RPC routines
blockResponse *
block_delete_1(blockDelete *argp, CLIENT *clnt)
{
static blockResponse clnt_res; <<<<<<-------- Same memory is used by everyone
memset((char *)&clnt_res, 0, sizeof(clnt_res)); <<<<<---- Here memset is happening
if (clnt_call (clnt, BLOCK_DELETE,
(xdrproc_t) xdr_blockDelete, (caddr_t) argp,
(xdrproc_t) xdr_blockResponse, (caddr_t) &clnt_res,
TIMEOUT) != RPC_SUCCESS) {
return (NULL);
}
return (&clnt_res); <<<<<---- ptr to this memory is returned.
}
So while Thread-1 is returned "return (&clnt_res);" another thread could be
doing "memset((char *)&clnt_res, 0, sizeof(clnt_res));"
This seem to be a day-1 gluster-blockd bug from the looks of it.
Change-Id: I3fc76d7814c4fe5b286577586ec44d752dcc73f0
Signed-off-by: Prasanna Kumar Kalever <prasanna.kalever@redhat.com>
Signed-off-by: Pranith Kumar K <pkarampu@redhat.com>
Diffstat (limited to 'rpc')
-rw-r--r-- | rpc/block_svc_routines.c | 143 | ||||
-rw-r--r-- | rpc/rpcl/Makefile.am | 8 |
2 files changed, 125 insertions, 26 deletions
diff --git a/rpc/block_svc_routines.c b/rpc/block_svc_routines.c index d47a841..51b56ec 100644 --- a/rpc/block_svc_routines.c +++ b/rpc/block_svc_routines.c @@ -363,7 +363,7 @@ glusterBlockCallRPC_1(char *host, void *cobj, int ret = -1; int sockfd; int errsv = 0; - blockResponse *reply = NULL; + blockResponse reply = {0,}; struct sockaddr_in *sain = NULL; @@ -386,8 +386,7 @@ glusterBlockCallRPC_1(char *host, void *cobj, strcpy(((blockCreate *)cobj)->ipaddr, host); *rpc_sent = TRUE; - reply = block_create_1((blockCreate *)cobj, clnt); - if (!reply) { + if (block_create_1((blockCreate *)cobj, &reply, clnt) != RPC_SUCCESS) { LOG("mgmt", GB_LOG_ERROR, "%son host %s", clnt_sperror(clnt, "block remote create failed"), host); goto out; @@ -395,8 +394,7 @@ glusterBlockCallRPC_1(char *host, void *cobj, break; case DELETE_SRV: *rpc_sent = TRUE; - reply = block_delete_1((blockDelete *)cobj, clnt); - if (!reply) { + if (block_delete_1((blockDelete *)cobj, &reply, clnt) != RPC_SUCCESS) { LOG("mgmt", GB_LOG_ERROR, "%son host %s", clnt_sperror(clnt, "block remote delete failed"), host); goto out; @@ -404,8 +402,7 @@ glusterBlockCallRPC_1(char *host, void *cobj, break; case MODIFY_SRV: *rpc_sent = TRUE; - reply = block_modify_1((blockModify *)cobj, clnt); - if (!reply) { + if (block_modify_1((blockModify *)cobj, &reply, clnt) != RPC_SUCCESS) { LOG("mgmt", GB_LOG_ERROR, "%son host %s", clnt_sperror(clnt, "block remote modify failed"), host); goto out; @@ -417,16 +414,15 @@ glusterBlockCallRPC_1(char *host, void *cobj, goto out; } - if (reply) { - if (GB_STRDUP(*out, reply->out) < 0) { - goto out; - } - ret = reply->exit; + if (GB_STRDUP(*out, reply.out) < 0) { + goto out; } + ret = reply.exit; out: - if (clnt && reply) { - if (!clnt_freeres(clnt, (xdrproc_t)xdr_blockResponse, (char *)reply)) { + if (clnt) { + if (reply.out && !clnt_freeres(clnt, (xdrproc_t)xdr_blockResponse, + (char *)&reply)) { LOG("mgmt", GB_LOG_ERROR, "%s", clnt_sperror(clnt, "clnt_freeres failed")); @@ -1467,7 +1463,7 @@ blockModifyCliFormatResponse (blockModifyCli *blk, struct blockModify *mobj, } blockResponse * -block_modify_cli_1_svc(blockModifyCli *blk, struct svc_req *rqstp) +block_modify_cli_1_svc_st(blockModifyCli *blk, struct svc_req *rqstp) { int ret = -1; static blockModify mobj = {0}; @@ -1781,7 +1777,7 @@ blockCreateCliFormatResponse(struct glfs *glfs, blockCreateCli *blk, } blockResponse * -block_create_cli_1_svc(blockCreateCli *blk, struct svc_req *rqstp) +block_create_cli_1_svc_st(blockCreateCli *blk, struct svc_req *rqstp) { int errCode = -1; uuid_t uuid; @@ -2048,7 +2044,7 @@ out: blockResponse * -block_create_1_svc(blockCreate *blk, struct svc_req *rqstp) +block_create_1_svc_st(blockCreate *blk, struct svc_req *rqstp) { char *tmp = NULL; char *backstore = NULL; @@ -2276,7 +2272,7 @@ blockDeleteCliFormatResponse(blockDeleteCli *blk, int errCode, char *errMsg, } blockResponse * -block_delete_cli_1_svc(blockDeleteCli *blk, struct svc_req *rqstp) +block_delete_cli_1_svc_st(blockDeleteCli *blk, struct svc_req *rqstp) { blockRemoteDeleteResp *savereply = NULL; MetaInfo *info = NULL; @@ -2377,7 +2373,7 @@ block_delete_cli_1_svc(blockDeleteCli *blk, struct svc_req *rqstp) blockResponse * -block_delete_1_svc(blockDelete *blk, struct svc_req *rqstp) +block_delete_1_svc_st(blockDelete *blk, struct svc_req *rqstp) { int ret; char *iqn = NULL; @@ -2445,7 +2441,7 @@ block_delete_1_svc(blockDelete *blk, struct svc_req *rqstp) blockResponse * -block_modify_1_svc(blockModify *blk, struct svc_req *rqstp) +block_modify_1_svc_st(blockModify *blk, struct svc_req *rqstp) { int ret; char *authattr = NULL; @@ -2570,7 +2566,7 @@ block_modify_1_svc(blockModify *blk, struct svc_req *rqstp) blockResponse * -block_list_cli_1_svc(blockListCli *blk, struct svc_req *rqstp) +block_list_cli_1_svc_st(blockListCli *blk, struct svc_req *rqstp) { blockResponse *reply; struct glfs *glfs; @@ -2815,7 +2811,7 @@ blockInfoCliFormatResponse(blockInfoCli *blk, int errCode, } blockResponse * -block_info_cli_1_svc(blockInfoCli *blk, struct svc_req *rqstp) +block_info_cli_1_svc_st(blockInfoCli *blk, struct svc_req *rqstp) { blockResponse *reply; struct glfs *glfs; @@ -2884,3 +2880,106 @@ block_info_cli_1_svc(blockInfoCli *blk, struct svc_req *rqstp) return reply; } + + +bool_t +block_create_1_svc(blockCreate *blk, blockResponse *reply, struct svc_req *rqstp) +{ + int ret; + + GB_RPC_CALL(create, blk, reply, rqstp, ret); + return ret; +} + + +bool_t +block_delete_1_svc(blockDelete *blk, blockResponse *reply, struct svc_req *rqstp) +{ + int ret; + + GB_RPC_CALL(delete, blk, reply, rqstp, ret); + return ret; +} + + +bool_t +block_modify_1_svc(blockModify *blk, blockResponse *reply, struct svc_req *rqstp) +{ + int ret; + + GB_RPC_CALL(modify, blk, reply, rqstp, ret); + return ret; +} + + +bool_t +block_create_cli_1_svc(blockCreateCli *blk, blockResponse *reply, + struct svc_req *rqstp) +{ + int ret; + + GB_RPC_CALL(create_cli, blk, reply, rqstp, ret); + return ret; +} + + +bool_t +block_modify_cli_1_svc(blockModifyCli *blk, blockResponse *reply, + struct svc_req *rqstp) +{ + int ret; + + GB_RPC_CALL(modify_cli, blk, reply, rqstp, ret); + return ret; +} + + +bool_t +block_list_cli_1_svc(blockListCli *blk, blockResponse *reply, + struct svc_req *rqstp) +{ + int ret; + + GB_RPC_CALL(list_cli, blk, reply, rqstp, ret); + return ret; +} + + +bool_t +block_info_cli_1_svc(blockInfoCli *blk, blockResponse *reply, + struct svc_req *rqstp) +{ + int ret; + + GB_RPC_CALL(info_cli, blk, reply, rqstp, ret); + return ret; +} + + +bool_t +block_delete_cli_1_svc(blockDeleteCli *blk, blockResponse *reply, + struct svc_req *rqstp) +{ + int ret; + + GB_RPC_CALL(delete_cli, blk, reply, rqstp, ret); + return ret; +} + + +int +gluster_block_1_freeresult (SVCXPRT *transp, xdrproc_t xdr_result, caddr_t result) +{ + xdr_free (xdr_result, result); + + return 1; +} + + +int +gluster_block_cli_1_freeresult (SVCXPRT *transp, xdrproc_t xdr_result, caddr_t result) +{ + xdr_free (xdr_result, result); + + return 1; +} diff --git a/rpc/rpcl/Makefile.am b/rpc/rpcl/Makefile.am index 38b1dbf..08a40ea 100644 --- a/rpc/rpcl/Makefile.am +++ b/rpc/rpcl/Makefile.am @@ -10,17 +10,17 @@ DISTCLEANFILES = Makefile.in $(BUILT_SOURCES) CLEANFILES = *~ $(BUILT_SOURCES) block.h: block.x - rpcgen -h -o $(top_builddir)/rpc/rpcl/$@ $^ + rpcgen -hM -o $(top_builddir)/rpc/rpcl/$@ $^ block_xdr.c: block.x - rpcgen -c -o $(top_builddir)/rpc/rpcl/$@ $^ + rpcgen -cM -o $(top_builddir)/rpc/rpcl/$@ $^ block_clnt.c: block.x - rpcgen -l -o $(top_builddir)/rpc/rpcl/$@ $^ + rpcgen -lM -o $(top_builddir)/rpc/rpcl/$@ $^ $(SED) -i 's|TIMEOUT = { 25, 0 }|TIMEOUT = { 300, 0 }|' $(top_builddir)/rpc/rpcl/$@ block_svc.c: block.x - rpcgen -m -o $(top_builddir)/rpc/rpcl/$@ $^ + rpcgen -mM -o $(top_builddir)/rpc/rpcl/$@ $^ dist-hook: find $(distdir) -type f \ |