jsonrpc: support half closed connections

Fix case when remote is doing SHUT_WR but we still have requests in
progress. In this case we should finish requests, send response and then
close the connection.

Fixes #604

Change-Id: I009029c95e0557c7347a78c3a50d35b30fc8141e
Signed-off-by: Pawel Wodkowski <pawelx.wodkowski@intel.com>
Reviewed-on: https://review.gerrithub.io/c/441718
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Tomasz Kulasek <tomaszx.kulasek@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Darek Stojaczyk <dariusz.stojaczyk@intel.com>
This commit is contained in:
Pawel Wodkowski 2019-01-23 14:38:01 +01:00 committed by Darek Stojaczyk
parent adb39585ef
commit bbcb35f58b

View File

@ -274,7 +274,8 @@ spdk_jsonrpc_server_conn_recv(struct spdk_jsonrpc_server_conn *conn)
if (rc == 0) {
SPDK_DEBUGLOG(SPDK_LOG_RPC, "remote closed connection\n");
return -1;
conn->closed = true;
return 0;
}
conn->recv_len += rc;
@ -386,7 +387,12 @@ spdk_jsonrpc_server_poll(struct spdk_jsonrpc_server *server)
struct spdk_jsonrpc_server_conn *conn, *conn_tmp;
TAILQ_FOREACH_SAFE(conn, &server->conns, link, conn_tmp) {
if (conn->closed) {
/* If we can't receive and there are no outstanding requests close the connection. */
if (conn->closed == true && conn->outstanding_requests == 0) {
spdk_jsonrpc_server_conn_close(conn);
}
if (conn->sockfd == -1) {
struct spdk_jsonrpc_request *request;
/*
@ -416,7 +422,7 @@ spdk_jsonrpc_server_poll(struct spdk_jsonrpc_server *server)
}
TAILQ_FOREACH(conn, &server->conns, link) {
if (conn->closed) {
if (conn->sockfd == -1) {
continue;
}
@ -426,10 +432,11 @@ spdk_jsonrpc_server_poll(struct spdk_jsonrpc_server *server)
continue;
}
rc = spdk_jsonrpc_server_conn_recv(conn);
if (rc != 0) {
spdk_jsonrpc_server_conn_close(conn);
continue;
if (!conn->closed) {
rc = spdk_jsonrpc_server_conn_recv(conn);
if (rc != 0) {
spdk_jsonrpc_server_conn_close(conn);
}
}
}