Commit 122e2846 authored by Daniel Verkamp's avatar Daniel Verkamp Committed by Jim Harris
Browse files

jsonrpc: move closed conn handling before poll()



Make sure that we check any closed connections even if poll() indicates
that no sockets are ready, since closed sockets won't ever trigger
poll().

Change-Id: Ie543cc2848d07f3d8e22662cb22c3d0f5cf3d174
Signed-off-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
Reviewed-on: https://review.gerrithub.io/369292


Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Tested-by: default avatarSPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
parent 7f6b7861
Loading
Loading
Loading
Loading
+30 −26
Original line number Diff line number Diff line
@@ -325,33 +325,7 @@ spdk_jsonrpc_server_poll(struct spdk_jsonrpc_server *server)
	struct pollfd *pfd;
	struct spdk_jsonrpc_server_conn *conn;

	rc = poll(server->pollfds, server->num_conns + 1, 0);

	if (rc < 0) {
		if (errno == EINTR) {
			return 0;
		}

		SPDK_ERRLOG("jsonrpc poll() failed\n");
		return -1;
	}

	if (rc == 0) {
		/* No sockets are ready */
		return 0;
	}

	/* Check listen socket */
	if (server->num_conns < SPDK_JSONRPC_MAX_CONNS) {
		pfd = &server->pollfds[0];
		if (pfd->revents) {
			spdk_jsonrpc_server_accept(server);
		}
		pfd->revents = 0;
	}

	for (i = 0; i < server->num_conns; i++) {
		pfd = &server->pollfds[i + 1];
		conn = &server->conns[i];

		if (conn->closed) {
@@ -380,6 +354,36 @@ spdk_jsonrpc_server_poll(struct spdk_jsonrpc_server *server)

			continue;
		}
	}

	rc = poll(server->pollfds, server->num_conns + 1, 0);

	if (rc < 0) {
		if (errno == EINTR) {
			return 0;
		}

		SPDK_ERRLOG("jsonrpc poll() failed\n");
		return -1;
	}

	if (rc == 0) {
		/* No sockets are ready */
		return 0;
	}

	/* Check listen socket */
	if (server->num_conns < SPDK_JSONRPC_MAX_CONNS) {
		pfd = &server->pollfds[0];
		if (pfd->revents) {
			spdk_jsonrpc_server_accept(server);
		}
		pfd->revents = 0;
	}

	for (i = 0; i < server->num_conns; i++) {
		pfd = &server->pollfds[i + 1];
		conn = &server->conns[i];

		if (pfd->revents & POLLOUT) {
			rc = spdk_jsonrpc_server_conn_send(conn);