Fix heartbeat receiver not working. master
authorTatsuo Ishii <ishii@postgresql.org>
Thu, 5 Jun 2025 10:42:40 +0000 (19:42 +0900)
committerTatsuo Ishii <ishii@postgresql.org>
Thu, 5 Jun 2025 10:42:40 +0000 (19:42 +0900)
65dbbe7a0 added IPv6 support for heartbeat in 4.6. However it
mistakenly bound to only loopback addresses in heartbeat receive
process. Thus heartbeat messages from other watchdog heartbeat sender
were never received. To fix this add AI_PASSIVE flag to hints argument
to getaddrinfo(), which results in binding all network
interfaces. Note that before 4.6, heartbeat receive process uses
INADDR_ANY for bind(), which resulted in binding all network
interfaces too. So there's no big difference between 4.6 and pre-4.6.

Reviewed-by: Bo Peng <pengbo@sraoss.co.jp>
Backpatch-through: v4.6

src/watchdog/wd_heartbeat.c

index c13e12b6c1b6de597dd6bd21ff1a2ddd033fdf5c..561cdfccf2d4c13046810136184920764da17f85 100644 (file)
@@ -271,7 +271,7 @@ wd_create_hb_recv_socket(WdHbIf * hb_if)
        hints.ai_family = AF_UNSPEC;
        hints.ai_socktype = SOCK_DGRAM;
        hints.ai_protocol = 0;
-       hints.ai_flags = AI_NUMERICSERV;
+       hints.ai_flags = AI_NUMERICSERV | AI_PASSIVE;
 
        if ((gai_ret = getaddrinfo(NULL, portstr, &hints, &res)) != 0)
        {