From 122e284652f30a16911bce3f5bc9e562ce4d1595 Mon Sep 17 00:00:00 2001 From: Daniel Verkamp Date: Wed, 12 Jul 2017 13:11:11 -0700 Subject: [PATCH] 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: Daniel Verkamp Reviewed-on: https://review.gerrithub.io/369292 Reviewed-by: Ben Walker Tested-by: SPDK Automated Test System Reviewed-by: Jim Harris --- lib/jsonrpc/jsonrpc_server_tcp.c | 58 +++++++++++++++++--------------- 1 file changed, 31 insertions(+), 27 deletions(-) diff --git a/lib/jsonrpc/jsonrpc_server_tcp.c b/lib/jsonrpc/jsonrpc_server_tcp.c index 3f137eef9..8e32d5785 100644 --- a/lib/jsonrpc/jsonrpc_server_tcp.c +++ b/lib/jsonrpc/jsonrpc_server_tcp.c @@ -325,6 +325,37 @@ spdk_jsonrpc_server_poll(struct spdk_jsonrpc_server *server) struct pollfd *pfd; struct spdk_jsonrpc_server_conn *conn; + for (i = 0; i < server->num_conns; i++) { + conn = &server->conns[i]; + + if (conn->closed) { + struct spdk_jsonrpc_request *request; + + /* + * The client closed the connection, but there may still be requests + * outstanding; we have no way to cancel outstanding requests, so wait until + * each outstanding request sends a response (which will be discarded, since + * the connection is closed). + */ + + if (conn->send_request) { + spdk_jsonrpc_free_request(conn->send_request); + conn->send_request = NULL; + } + + while (spdk_ring_dequeue(conn->send_queue, (void **)&request, 1) == 1) { + spdk_jsonrpc_free_request(request); + } + + if (conn->outstanding_requests == 0) { + SPDK_TRACELOG(SPDK_TRACE_RPC, "all outstanding requests completed\n"); + spdk_jsonrpc_server_conn_remove(conn); + } + + continue; + } + } + rc = poll(server->pollfds, server->num_conns + 1, 0); if (rc < 0) { @@ -354,33 +385,6 @@ spdk_jsonrpc_server_poll(struct spdk_jsonrpc_server *server) pfd = &server->pollfds[i + 1]; conn = &server->conns[i]; - if (conn->closed) { - struct spdk_jsonrpc_request *request; - - /* - * The client closed the connection, but there may still be requests - * outstanding; we have no way to cancel outstanding requests, so wait until - * each outstanding request sends a response (which will be discarded, since - * the connection is closed). - */ - - if (conn->send_request) { - spdk_jsonrpc_free_request(conn->send_request); - conn->send_request = NULL; - } - - while (spdk_ring_dequeue(conn->send_queue, (void **)&request, 1) == 1) { - spdk_jsonrpc_free_request(request); - } - - if (conn->outstanding_requests == 0) { - SPDK_TRACELOG(SPDK_TRACE_RPC, "all outstanding requests completed\n"); - spdk_jsonrpc_server_conn_remove(conn); - } - - continue; - } - if (pfd->revents & POLLOUT) { rc = spdk_jsonrpc_server_conn_send(conn); if (rc != 0) {