From 5689195cb90fa2fd05cd8c1a2310e5c8fab3317a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Tue, 15 Sep 2020 16:27:29 +0200 Subject: [PATCH] Add the patches --- ...mit-scope-on-macos-.local-workaround.patch | 34 +++++++++++ ...-not-require-non-loopback-networking.patch | 57 +++++++++++++++++++ 2 files changed, 91 insertions(+) create mode 100644 0001-mpl-limit-scope-on-macos-.local-workaround.patch create mode 100644 0002-mpl-do-not-require-non-loopback-networking.patch diff --git a/0001-mpl-limit-scope-on-macos-.local-workaround.patch b/0001-mpl-limit-scope-on-macos-.local-workaround.patch new file mode 100644 index 0000000..f816bda --- /dev/null +++ b/0001-mpl-limit-scope-on-macos-.local-workaround.patch @@ -0,0 +1,34 @@ +From fbb8f503df077c726b0c99d467bc984566273b92 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= +Date: Tue, 15 Sep 2020 14:20:17 +0200 +Subject: [PATCH 1/2] mpl: limit scope on macos .local workaround + +This was added in 62f4178981617384fc116da4c839baf469bef512. +Assuming that "localhost" is equivalent to any name ending in .local +is unwarranted. RFC6762 reserves the ".local" suffix for MulticastDNS use, +but it is also used in other context for "local network" addresses and such. +So let's at least limit the scope to not hurt other systems. +--- + src/mpl/src/sock/mpl_sockaddr.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/src/mpl/src/sock/mpl_sockaddr.c b/src/mpl/src/sock/mpl_sockaddr.c +index 51e9f9973f..9334cc4fb2 100644 +--- a/src/mpl/src/sock/mpl_sockaddr.c ++++ b/src/mpl/src/sock/mpl_sockaddr.c +@@ -75,6 +75,7 @@ int MPL_get_sockaddr(const char *s_hostname, MPL_sockaddr_t * p_addr) + struct addrinfo *ai_list; + int ret; + ++#ifdef __APPLE__ + /* Macos adds .local to hostname when network is unavailable or limited. + * This will result in long timeout in getaddrinfo below. + * Bypass it by resetting the hostname to "localhost" +@@ -83,6 +84,7 @@ int MPL_get_sockaddr(const char *s_hostname, MPL_sockaddr_t * p_addr) + if (n > 6 && strcmp(s_hostname + n - 6, ".local") == 0) { + s_hostname = "localhost"; + } ++#endif + + /* NOTE: there is report that getaddrinfo implementations will call kernel + * even when s_hostname is entirely numerical string and it may cause diff --git a/0002-mpl-do-not-require-non-loopback-networking.patch b/0002-mpl-do-not-require-non-loopback-networking.patch new file mode 100644 index 0000000..dcddf03 --- /dev/null +++ b/0002-mpl-do-not-require-non-loopback-networking.patch @@ -0,0 +1,57 @@ +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;