[Pkg-ofed-commits] [libfabric] 49/123: prov/sockets: Add env option to specify connection retry attempts

Ana Beatriz Guerrero López ana at moszumanska.debian.org
Sat Oct 22 12:28:29 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 c32a21bc9ca29208093f6db804830264f259eb4c
Author: Jithin Jose <jithin.jose at intel.com>
Date:   Mon Aug 31 09:37:00 2015 -0700

    prov/sockets: Add env option to specify connection retry attempts
    
    Signed-off-by: Jithin Jose <jithin.jose at intel.com>
    
    Conflicts:
    	prov/sockets/src/sock_conn.c
---
 configure.ac                   |  7 -------
 prov/sockets/src/sock.h        |  5 +----
 prov/sockets/src/sock_conn.c   | 13 ++++++++++---
 prov/sockets/src/sock_ep_msg.c | 27 +++++++++++++++++----------
 prov/sockets/src/sock_fabric.c |  5 +++++
 prov/sockets/src/sock_util.h   |  1 +
 6 files changed, 34 insertions(+), 24 deletions(-)

diff --git a/configure.ac b/configure.ac
index 87cd14b..bc447b7 100644
--- a/configure.ac
+++ b/configure.ac
@@ -143,13 +143,6 @@ AC_CACHE_CHECK(whether ld accepts --version-script, ac_cv_version_script,
         ac_cv_version_script=no
     fi])
 
-AC_CHECK_DECL([SO_REUSEPORT],
-    AC_DEFINE(HAVE_SO_REUSEPORT,1,[Define to 1 if you have SO_REUSEPORT]),
-    ,[
-    #include <sys/types.h>
-    #include <sys/socket.h>
-    ])
-
 AM_CONDITIONAL(HAVE_LD_VERSION_SCRIPT, test "$ac_cv_version_script" = "yes")
 
 dnl Disable symbol versioning when -ipo is in CFLAGS or ipo is disabled by icc.
diff --git a/prov/sockets/src/sock.h b/prov/sockets/src/sock.h
index 90f01dc..a45bbb2 100644
--- a/prov/sockets/src/sock.h
+++ b/prov/sockets/src/sock.h
@@ -97,6 +97,7 @@
 #define SOCK_EP_MAX_RETRY (5)
 #define SOCK_EP_MAX_CM_DATA_SZ (256)
 #define SOCK_CM_DEF_BACKLOG (128)
+#define SOCK_CM_DEF_RETRY (5)
 
 #define SOCK_EP_RDM_PRI_CAP (FI_MSG | FI_RMA | FI_TAGGED | FI_ATOMICS |	\
 			 FI_NAMED_RX_CTX | \
@@ -1049,10 +1050,6 @@ void sock_conn_map_destroy(struct sock_conn_map *cmap);
 void sock_set_sockopts(int sock);
 int fd_set_nonblock(int fd);
 int sock_conn_map_init(struct sock_conn_map *map, int init_size);
-void sock_set_sockopt_reuseaddr(int sock);
-#ifdef HAVE_SO_REUSEPORT
-int sock_set_sockopt_reuseport(int sock);
-#endif
 
 struct sock_pe *sock_pe_init(struct sock_domain *domain);
 void sock_pe_add_tx_ctx(struct sock_pe *pe, struct sock_tx_ctx *ctx);
diff --git a/prov/sockets/src/sock_conn.c b/prov/sockets/src/sock_conn.c
index 3d7f4d6..74b1030 100644
--- a/prov/sockets/src/sock_conn.c
+++ b/prov/sockets/src/sock_conn.c
@@ -214,9 +214,12 @@ int sock_conn_map_connect(struct sock_ep *ep,
 	socklen_t optlen;
 	fd_set fds;
 	struct sockaddr_in src_addr;
-	int do_retry = 5;
+	int do_retry = sock_conn_retry;
 
 	*index = 0;
+	memcpy(&src_addr, ep->src_addr, sizeof src_addr);
+
+bind_retry:
 	conn_fd = socket(AF_INET, SOCK_STREAM, 0);
 	if (conn_fd < 0) {
 		SOCK_LOG_ERROR("failed to create conn_fd, errno: %d\n", errno);
@@ -224,9 +227,7 @@ int sock_conn_map_connect(struct sock_ep *ep,
 		return -errno;
 	}
 
-	memcpy(&src_addr, ep->src_addr, sizeof src_addr);
 	src_addr.sin_port = 0;
-
 	sock_set_sockopt_reuseaddr(conn_fd);
 	if (bind(conn_fd, (struct sockaddr*) &src_addr, sizeof(src_addr))) {
 		SOCK_LOG_ERROR("bind failed : %s\n", strerror(errno));
@@ -267,6 +268,12 @@ retry:
 			SOCK_LOG_ERROR("Connect timed out, retrying - %s\n",
 				       strerror(errno));
 			goto retry;
+		} else if (errno == EADDRNOTAVAIL && do_retry) {
+			do_retry--;
+			SOCK_LOG_ERROR("Connect failed with address not available, retrying - %s\n",
+				       strerror(errno));
+			close(conn_fd);
+			goto bind_retry;
 		} else {
 			SOCK_LOG_ERROR("Error connecting %d - %s\n", errno,
 				       strerror(errno));
diff --git a/prov/sockets/src/sock_ep_msg.c b/prov/sockets/src/sock_ep_msg.c
index 07d5588..f96faa6 100644
--- a/prov/sockets/src/sock_ep_msg.c
+++ b/prov/sockets/src/sock_ep_msg.c
@@ -266,7 +266,7 @@ static int sock_ep_cm_getname(fid_t fid, void *addr, size_t *addrlen)
 
 static int sock_pep_create_listener(struct sock_pep *pep)
 {
-	int ret;
+	int optval, ret;
 	socklen_t addr_size;
 	struct sockaddr_in addr;
 	struct addrinfo *s_res = NULL, *p;
@@ -297,11 +297,11 @@ static int sock_pep_create_listener(struct sock_pep *pep)
 		pep->cm.sock = socket(p->ai_family, p->ai_socktype,
 				     p->ai_protocol);
 		if (pep->cm.sock >= 0) {
-			sock_set_sockopt_reuseaddr(pep->cm.sock);
-#ifdef HAVE_SO_REUSEPORT
-			if (sock_set_sockopt_reuseport(pep->cm.sock))
-				SOCK_LOG_DBG("reuseport sockopt failed\n");
-#endif
+			optval = 1;
+			if (setsockopt(pep->cm.sock, SOL_SOCKET, SO_REUSEADDR, &optval, 
+				       sizeof optval))
+				SOCK_LOG_ERROR("setsockopt failed\n");
+			
 			if (!bind(pep->cm.sock, s_res->ai_addr, s_res->ai_addrlen))
 				break;
 			close(pep->cm.sock);
@@ -312,8 +312,12 @@ static int sock_pep_create_listener(struct sock_pep *pep)
 	freeaddrinfo(s_res);
 	if (pep->cm.sock < 0)
 		return -FI_EIO;
-
-	sock_set_sockopt_reuseaddr(pep->cm.sock);	
+	
+	optval = 1;
+	if (setsockopt(pep->cm.sock, SOL_SOCKET, SO_REUSEADDR, &optval, 
+		       sizeof optval))
+		SOCK_LOG_ERROR("setsockopt failed\n");
+	
 	if (pep->src_addr.sin_port == 0) {
 		addr_size = sizeof(addr);
 		if (getsockname(pep->cm.sock, (struct sockaddr*)&addr, &addr_size))
@@ -392,12 +396,15 @@ static int sock_ep_cm_getpeer(struct fid_ep *ep, void *addr, size_t *addrlen)
 
 static int sock_ep_cm_create_socket(void)
 {
-	int sock;
+	int sock, optval;
 	sock = socket(AF_INET, SOCK_DGRAM, 0);
 	if (sock < 0)
 		return 0;
 	
-	sock_set_sockopt_reuseaddr(sock);
+	optval = 1;
+	if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, 
+		       &optval, sizeof optval))
+		SOCK_LOG_ERROR("setsockopt failed\n");
 	return sock;
 }
 
diff --git a/prov/sockets/src/sock_fabric.c b/prov/sockets/src/sock_fabric.c
index f12d663..ba5ab81 100644
--- a/prov/sockets/src/sock_fabric.c
+++ b/prov/sockets/src/sock_fabric.c
@@ -54,6 +54,7 @@ int sock_pe_waittime = SOCK_PE_WAITTIME;
 const char sock_fab_name[] = "IP";
 const char sock_dom_name[] = "sockets";
 const char sock_prov_name[] = "sockets";
+int sock_conn_retry = SOCK_CM_DEF_RETRY;
 #if ENABLE_DEBUG
 int sock_dgram_drop_rate = 0;
 #endif
@@ -598,6 +599,10 @@ SOCKETS_INI
                         "How many milliseconds to spin while waiting for progress");
 	fi_param_get_int(&sock_prov, "pe_waittime", &sock_pe_waittime);
 
+	fi_param_define(&sock_prov, "conn_retry_attempts", FI_PARAM_INT,
+			"Number of connection retries before reporting as failure");
+	fi_param_get_int(&sock_prov, "conn_retry_attempts", &sock_conn_retry);
+
 	fastlock_init(&sock_list_lock);
 	dlist_init(&sock_fab_list);
 	dlist_init(&sock_dom_list);
diff --git a/prov/sockets/src/sock_util.h b/prov/sockets/src/sock_util.h
index b019752..7b5aca1 100644
--- a/prov/sockets/src/sock_util.h
+++ b/prov/sockets/src/sock_util.h
@@ -42,6 +42,7 @@ extern const char sock_dom_name[];
 extern const char sock_prov_name[];
 extern struct fi_provider sock_prov;
 extern int sock_pe_waittime;
+extern int sock_conn_retry;
 #if ENABLE_DEBUG
 extern int sock_dgram_drop_rate;
 #endif

-- 
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