[Pkg-ofed-commits] [libfabric] 25/123: - Add retry for connection timeout - Set default backlog for listen - Fixes #1195

Ana Beatriz Guerrero López ana at moszumanska.debian.org
Sat Oct 22 12:28:26 UTC 2016


This is an automated email from the git hooks/post-receive script.

ana pushed a commit to annotated tag v1.1.1
in repository libfabric.

commit 0f75747d0b0b4cad7c23340476cc5a46b4cb9a77
Author: Jithin Jose <jithin.jose at intel.com>
Date:   Thu Aug 27 14:29:09 2015 -0700

    - Add retry for connection timeout
    - Set default backlog for listen
          - Fixes #1195
    
    Signed-off-by: Jithin Jose <jithin.jose at intel.com>
---
 prov/sockets/src/sock.h      |  1 +
 prov/sockets/src/sock_conn.c | 41 +++++++++++++++++++++++++++++------------
 2 files changed, 30 insertions(+), 12 deletions(-)

diff --git a/prov/sockets/src/sock.h b/prov/sockets/src/sock.h
index fe23ffa..0a62d49 100644
--- a/prov/sockets/src/sock.h
+++ b/prov/sockets/src/sock.h
@@ -95,6 +95,7 @@
 #define SOCK_CM_COMM_TIMEOUT (2000)
 #define SOCK_EP_MAX_RETRY (5)
 #define SOCK_EP_MAX_CM_DATA_SZ (256)
+#define SOCK_CM_DEF_BACKLOG (128)
 
 #define SOCK_EP_RDM_PRI_CAP (FI_MSG | FI_RMA | FI_TAGGED | FI_ATOMICS |	\
 			 FI_NAMED_RX_CTX | \
diff --git a/prov/sockets/src/sock_conn.c b/prov/sockets/src/sock_conn.c
index 0e33ecd..3d7f4d6 100644
--- a/prov/sockets/src/sock_conn.c
+++ b/prov/sockets/src/sock_conn.c
@@ -181,6 +181,15 @@ static void sock_set_sockopt_reuseaddr(int sock)
 		SOCK_LOG_ERROR("setsockopt reuseaddr failed\n");
 }
 
+void sock_set_sockopts_conn(int sock)
+{
+	int optval;
+	optval = 1;
+	sock_set_sockopt_reuseaddr(sock);
+	if (setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, &optval, sizeof optval))
+		SOCK_LOG_ERROR("setsockopt nodelay failed\n");
+}
+
 void sock_set_sockopts(int sock)
 {
 	int optval;
@@ -205,6 +214,7 @@ int sock_conn_map_connect(struct sock_ep *ep,
 	socklen_t optlen;
 	fd_set fds;
 	struct sockaddr_in src_addr;
+	int do_retry = 5;
 
 	*index = 0;
 	conn_fd = socket(AF_INET, SOCK_STREAM, 0);
@@ -230,6 +240,7 @@ int sock_conn_map_connect(struct sock_ep *ep,
 	SOCK_LOG_DBG("Connecting using address:%s\n",
 			inet_ntoa(src_addr.sin_addr));
 
+retry:
 	if (connect(conn_fd, (struct sockaddr *) addr, sizeof *addr) < 0) {
 		if (errno == EINPROGRESS) {
 			/* timeout after 5 secs */
@@ -251,6 +262,11 @@ int sock_conn_map_connect(struct sock_ep *ep,
 						optval, strerror(optval));
 				goto err;
 			}
+		} else if (errno == ETIMEDOUT && do_retry) {
+			do_retry--;
+			SOCK_LOG_ERROR("Connect timed out, retrying - %s\n",
+				       strerror(errno));
+			goto retry;
 		} else {
 			SOCK_LOG_ERROR("Error connecting %d - %s\n", errno,
 				       strerror(errno));
@@ -269,16 +285,12 @@ int sock_conn_map_connect(struct sock_ep *ep,
 	}
 
 	do {
-		ret = recv(conn_fd, &use_conn, sizeof(use_conn), 0);
+		ret = recv(conn_fd, &use_conn, sizeof(use_conn), MSG_WAITALL);
 	} while(ret == -1 && (errno == EAGAIN || errno == EWOULDBLOCK));
 	if (ret != sizeof(use_conn)) {
-		if (ret == 0) {
-			SOCK_LOG_DBG("Peer reset, use incoming connection\n");
-			use_conn = 0;
-		} else {
-			SOCK_LOG_ERROR("Cannot exchange port: %d\n", ret);
-			goto err;
-		}
+		SOCK_LOG_ERROR("Cannot exchange port: %d - %s\n",
+			       ret, strerror(errno));
+		use_conn = 0;
 	}
 
 	SOCK_LOG_DBG("Connect response: %d\n", use_conn);
@@ -366,15 +378,19 @@ static void *_sock_conn_listen(void *arg)
 			goto err;
 		}
 
+		sock_set_sockopts_conn(conn_fd);
 		SOCK_LOG_DBG("ACCEPT: %s, %d\n", inet_ntoa(remote.sin_addr),
 				ntohs(remote.sin_port));
 
 		do {
 			ret = recv(conn_fd, &remote.sin_port, 
-				   sizeof(remote.sin_port), 0);
+				   sizeof(remote.sin_port), MSG_WAITALL);
 		} while(ret == -1 && (errno == EAGAIN || errno == EWOULDBLOCK));
-		if (ret != sizeof(remote.sin_port))
-			SOCK_LOG_ERROR("Cannot exchange port\n");
+		if (ret != sizeof(remote.sin_port)) {
+			SOCK_LOG_ERROR("Cannot exchange port: %d - %s\n", ret, strerror(errno));
+			close(conn_fd);
+			continue;
+		}
 
 		SOCK_LOG_DBG("Remote port: %d\n", ntohs(remote.sin_port));
 
@@ -398,6 +414,7 @@ static void *_sock_conn_listen(void *arg)
 			shutdown(conn_fd, SHUT_RDWR);
 			close(conn_fd);
 		}
+		SOCK_LOG_DBG("Use conn: %d\n", use_conn);
 	}
 
 err:
@@ -493,7 +510,7 @@ int sock_conn_listen(struct sock_ep *ep)
 		freeaddrinfo(rai);
 	}
 
-	if (listen(listen_fd, 0)) {
+	if (listen(listen_fd, SOCK_CM_DEF_BACKLOG)) {
 		SOCK_LOG_ERROR("failed to listen socket: %s\n", strerror(errno));
 		goto err;
 	}

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-ofed/libfabric.git



More information about the Pkg-ofed-commits mailing list