From: Mathieu Desnoyers Date: Tue, 13 Sep 2016 20:17:04 +0000 (-0400) Subject: Fix: honor send timeout on unix socket connect X-Git-Tag: v2.7.5~5 X-Git-Url: https://git.lttng.org./?a=commitdiff_plain;h=27d8df8abdd6b40203be18365146889d88a28e11;p=lttng-ust.git Fix: honor send timeout on unix socket connect Needed if we want to hold the ust_lock() while we connect to the session daemon without blocking the application forever if the session daemon is hung on SIGSTOP. This only triggers if we launchs _many_ applications with a session daemon SIGSTOP'd (e.g. 1000 in parallel), so we fill the socket queue, and applications hang there until the session daemon is SIGCONT'd. Signed-off-by: Mathieu Desnoyers --- diff --git a/include/ust-comm.h b/include/ust-comm.h index b9bbb39b..1fb5796f 100644 --- a/include/ust-comm.h +++ b/include/ust-comm.h @@ -170,7 +170,8 @@ struct ustcomm_notify_channel_reply { */ extern int ustcomm_create_unix_sock(const char *pathname); -extern int ustcomm_connect_unix_sock(const char *pathname); +extern int ustcomm_connect_unix_sock(const char *pathname, + long timeout); extern int ustcomm_accept_unix_sock(int sock); extern int ustcomm_listen_unix_sock(int sock); extern int ustcomm_close_unix_sock(int sock); diff --git a/liblttng-ust-comm/lttng-ust-comm.c b/liblttng-ust-comm/lttng-ust-comm.c index cee1b694..d065499a 100644 --- a/liblttng-ust-comm/lttng-ust-comm.c +++ b/liblttng-ust-comm/lttng-ust-comm.c @@ -86,7 +86,7 @@ const char *lttng_ust_strerror(int code) * * Connect to unix socket using the path name. */ -int ustcomm_connect_unix_sock(const char *pathname) +int ustcomm_connect_unix_sock(const char *pathname, long timeout) { struct sockaddr_un sun; int fd, ret; @@ -101,6 +101,15 @@ int ustcomm_connect_unix_sock(const char *pathname) ret = -errno; goto error; } + if (timeout >= 0) { + /* Give at least 10ms. */ + if (timeout < 10) + timeout = 10; + ret = ustcomm_setsockopt_snd_timeout(fd, timeout); + if (ret < 0) { + WARN("Error setting connect socket send timeout"); + } + } ret = fcntl(fd, F_SETFD, FD_CLOEXEC); if (ret < 0) { PERROR("fcntl"); diff --git a/liblttng-ust/lttng-ust-comm.c b/liblttng-ust/lttng-ust-comm.c index 373a1c2d..335279fb 100644 --- a/liblttng-ust/lttng-ust-comm.c +++ b/liblttng-ust/lttng-ust-comm.c @@ -433,7 +433,7 @@ int setup_local_apps(void) } /* - * Get notify_sock timeout, in ms. + * Get socket timeout, in ms. * -1: wait forever. 0: don't wait. >0: timeout, in ms. */ static @@ -453,12 +453,20 @@ long get_timeout(void) return constructor_delay_ms; } +/* Timeout for notify socket send and recv. */ static long get_notify_sock_timeout(void) { return get_timeout(); } +/* Timeout for connecting to cmd and notify sockets. */ +static +long get_connect_sock_timeout(void) +{ + return get_timeout(); +} + /* * Return values: -1: wait forever. 0: don't wait. 1: timeout wait. */ @@ -1274,7 +1282,8 @@ restart: * first connect registration message. */ /* Connect cmd socket */ - ret = ustcomm_connect_unix_sock(sock_info->sock_path); + ret = ustcomm_connect_unix_sock(sock_info->sock_path, + get_connect_sock_timeout()); if (ret < 0) { DBG("Info: sessiond not accepting connections to %s apps socket", sock_info->name); prev_connect_failed = 1; @@ -1330,7 +1339,8 @@ restart: ust_unlock(); /* Connect notify socket */ - ret = ustcomm_connect_unix_sock(sock_info->sock_path); + ret = ustcomm_connect_unix_sock(sock_info->sock_path, + get_connect_sock_timeout()); if (ret < 0) { DBG("Info: sessiond not accepting connections to %s apps socket", sock_info->name); prev_connect_failed = 1;