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:
parent
adb39585ef
commit
bbcb35f58b
@ -274,7 +274,8 @@ spdk_jsonrpc_server_conn_recv(struct spdk_jsonrpc_server_conn *conn)
|
|||||||
|
|
||||||
if (rc == 0) {
|
if (rc == 0) {
|
||||||
SPDK_DEBUGLOG(SPDK_LOG_RPC, "remote closed connection\n");
|
SPDK_DEBUGLOG(SPDK_LOG_RPC, "remote closed connection\n");
|
||||||
return -1;
|
conn->closed = true;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
conn->recv_len += rc;
|
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;
|
struct spdk_jsonrpc_server_conn *conn, *conn_tmp;
|
||||||
|
|
||||||
TAILQ_FOREACH_SAFE(conn, &server->conns, link, 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;
|
struct spdk_jsonrpc_request *request;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -416,7 +422,7 @@ spdk_jsonrpc_server_poll(struct spdk_jsonrpc_server *server)
|
|||||||
}
|
}
|
||||||
|
|
||||||
TAILQ_FOREACH(conn, &server->conns, link) {
|
TAILQ_FOREACH(conn, &server->conns, link) {
|
||||||
if (conn->closed) {
|
if (conn->sockfd == -1) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -426,10 +432,11 @@ spdk_jsonrpc_server_poll(struct spdk_jsonrpc_server *server)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = spdk_jsonrpc_server_conn_recv(conn);
|
if (!conn->closed) {
|
||||||
if (rc != 0) {
|
rc = spdk_jsonrpc_server_conn_recv(conn);
|
||||||
spdk_jsonrpc_server_conn_close(conn);
|
if (rc != 0) {
|
||||||
continue;
|
spdk_jsonrpc_server_conn_close(conn);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user