From 451d66b27efb332bd16f79dcee374b6a2c85186f Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Tue, 13 Sep 2016 16:17:04 -0400 Subject: [PATCH] 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 --- include/ust-comm.h | 3 ++- liblttng-ust-comm/lttng-ust-comm.c | 11 ++++++++++- liblttng-ust/lttng-ust-comm.c | 16 +++++++++++++--- 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/include/ust-comm.h b/include/ust-comm.h index fb0c0bbc..6a08b306 100644 --- a/include/ust-comm.h +++ b/include/ust-comm.h @@ -190,7 +190,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 129ad8f2..c01eb9de 100644 --- a/liblttng-ust-comm/lttng-ust-comm.c +++ b/liblttng-ust-comm/lttng-ust-comm.c @@ -95,7 +95,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; @@ -110,6 +110,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 1720bca9..dd8822cf 100644 --- a/liblttng-ust/lttng-ust-comm.c +++ b/liblttng-ust/lttng-ust-comm.c @@ -459,7 +459,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 @@ -479,12 +479,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. */ @@ -1367,7 +1375,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; @@ -1423,7 +1432,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; -- 2.34.1