Commit bbcb35f5 authored by Pawel Wodkowski's avatar Pawel Wodkowski Committed by Darek Stojaczyk
Browse files

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: default avatarPawel Wodkowski <pawelx.wodkowski@intel.com>
Reviewed-on: https://review.gerrithub.io/c/441718


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarTomasz Kulasek <tomaszx.kulasek@intel.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-by: default avatarDarek Stojaczyk <dariusz.stojaczyk@intel.com>
parent adb39585
Loading
Loading
Loading
Loading
+14 −7
Original line number Diff line number Diff line
@@ -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;
		}

		if (!conn->closed) {
			rc = spdk_jsonrpc_server_conn_recv(conn);
			if (rc != 0) {
				spdk_jsonrpc_server_conn_close(conn);
			continue;
			}
		}
	}