[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