From ecb72e6699f4f8525115e0b42f81121a1cf8eefa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Tue, 15 Sep 2020 14:59:58 +0200 Subject: [PATCH 2/2] mpl: do not require non-loopback networking getaddrinfo(3) says: If hints.ai_flags includes the AI_ADDRCONFIG flag, then IPv4 addresses are returned in the list pointed to by res only if the local system has at least one IPv4 address configured, and IPv6 addresses are returned only if the local system has at least one IPv6 address configured. The loopback address is not considered for this case as valid as a configured address. This means that MPL_get_sockaddr() will fail to resolve the local host (either as "localhost" or by the actual hostname) on a system that has no non-loopback networking. This break exection of mpirun e.g. in a container for tests and such. From https://bugzilla.redhat.com/show_bug.cgi?id=1839007: sh-5.0# hostname 68da8e7c62a2404bb4bf75c9ce643e06 sh-5.0# module load mpi/mpich-x86_64 sh-5.0# mpirun ./a.out Fatal error in PMPI_Init: Other MPI error, error stack: MPIR_Init_thread(586)..............: MPID_Init(224).....................: channel initialization failed MPIDI_CH3_Init(105)................: MPID_nem_init(324).................: MPID_nem_tcp_init(175).............: MPID_nem_tcp_get_business_card(404): MPID_nem_tcp_init(375).............: gethostbyname failed, 68da8e7c62a2404bb4bf75c9ce643e06 (errno 0) sh-5.0# ip a 1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever --- src/mpl/src/sock/mpl_sockaddr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mpl/src/sock/mpl_sockaddr.c b/src/mpl/src/sock/mpl_sockaddr.c index 9334cc4fb2..c0e991c68d 100644 --- a/src/mpl/src/sock/mpl_sockaddr.c +++ b/src/mpl/src/sock/mpl_sockaddr.c @@ -98,7 +98,7 @@ int MPL_get_sockaddr(const char *s_hostname, MPL_sockaddr_t * p_addr) ai_hint.ai_family = af_type; ai_hint.ai_socktype = SOCK_STREAM; ai_hint.ai_protocol = IPPROTO_TCP; - ai_hint.ai_flags = AI_ADDRCONFIG | AI_V4MAPPED; + ai_hint.ai_flags = AI_V4MAPPED; ret = getaddrinfo(s_hostname, NULL, &ai_hint, &ai_list); if (ret) { return ret;