FreeBSD socket.test FAIL: recvmsg() error EAGAIN on accept TCP socket receive
Matthias Andree <[email protected]> Wed, 27 Aug 2025 16:50:36 +0200
| Newsgroups | gmane.comp.time.chrony.user |
|---|---|
| Message-ID | <[email protected]> |
This is a multi-part message in MIME format.
--------------MtidpPEoWnnQ8xRB0CLT5IRR
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: quoted-printable
Greetings,
chrony 4.7 and 4.8 (and possibly others) have an issue with=20
test/util/socket.c's self test,
UNLESS running under "truss" (think strace in the Linux world).
Apparently we're looking at OS-specific differences WRT non-blocking=20
accept()ed sockets for TCP between FreeBSD and, say, Linux, or with=20
something that a syscall tracer will cause to be retried.
$ truss test/unit/socket.test
=3D> passes
> close(3)=C2=A0=3D 0 (0x0)
> close(4)=C2=A0=3D 0 (0x0)
> PASS
> write(1,"PASS\n",5)=C2=A0=3D 5 (0x5)
> exit(0x0)
> process exit, rval =3D 0
>
$ test/unit/socket.test
=3D> prints Testing socket =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0FAIL (on line 75)
FAIL (on line 75).
Building with debug enabled and -d on the command line yields:
...
> 2025-08-27T14:39:14Z D:../../socket.c:813:(log_message) Received=20
> message from 127.0.0.1:57724 fd=3D3 len=3D16
> 2025-08-27T14:39:14Z D:../../socket.c:813:(log_message) Sent message=20
> to 127.0.0.1:57724 fd=3D3 len=3D16
> 2025-08-27T14:39:14Z D:../../socket.c:1648:(SCK_Receive) Received data=
=20
> fd=3D4 len=3D16
> 2025-08-27T14:39:14Z D:../../socket.c:595:(open_ip_socket) Opened=20
> UDPv4 socket fd=3D3 local=3D127.0.0.1:28164
> 2025-08-27T14:39:14Z D:../../socket.c:595:(open_ip_socket) Opened=20
> UDPv4 socket fd=3D4 remote=3D127.0.0.1:28164
> 2025-08-27T14:39:14Z D:../../socket.c:1674:(SCK_Send) Sent data fd=3D4=
=20
> len=3D16
> 2025-08-27T14:39:14Z D:../../socket.c:813:(log_message) Received=20
> message from 127.0.0.1:39243 fd=3D3 len=3D16
> 2025-08-27T14:39:14Z D:../../socket.c:813:(log_message) Sent message=20
> to 127.0.0.1:39243 fd=3D3 len=3D16
> 2025-08-27T14:39:14Z D:../../socket.c:1648:(SCK_Receive) Received data=
=20
> fd=3D4 len=3D16
> 2025-08-27T14:39:14Z D:../../socket.c:595:(open_ip_socket) Opened=20
> UDPv4 socket fd=3D3 local=3D127.0.0.1:41555
> 2025-08-27T14:39:14Z D:../../socket.c:595:(open_ip_socket) Opened=20
> UDPv4 socket fd=3D4 remote=3D127.0.0.1:41555
> 2025-08-27T14:39:14Z D:../../socket.c:1674:(SCK_Send) Sent data fd=3D4=
=20
> len=3D16
> 2025-08-27T14:39:14Z D:../../socket.c:813:(log_message) Received=20
> message from 127.0.0.1:19472 fd=3D3 len=3D16
> 2025-08-27T14:39:14Z D:../../socket.c:813:(log_message) Sent message=20
> to 127.0.0.1:19472 fd=3D3 len=3D16
> 2025-08-27T14:39:14Z D:../../socket.c:1648:(SCK_Receive) Received data=
=20
> fd=3D4 len=3D16
> 2025-08-27T14:39:14Z D:../../socket.c:595:(open_ip_socket) Opened=20
> TCPv4 socket fd=3D3 local=3D127.0.0.1:6992
> 2025-08-27T14:39:14Z D:../../socket.c:595:(open_ip_socket) Opened=20
> TCPv4 socket fd=3D4 remote=3D127.0.0.1:6992
> 2025-08-27T14:39:14Z D:../../socket.c:1674:(SCK_Send) Sent data fd=3D4=
=20
> len=3D16
> 2025-08-27T14:39:14Z D:../../socket.c:813:(log_message) Received=20
> message fd=3D5 len=3D16
> 2025-08-27T14:39:14Z D:../../socket.c:813:(log_message) Sent message=20
> fd=3D5 len=3D16
> 2025-08-27T14:39:14Z D:../../socket.c:1648:(SCK_Receive) Received data=
=20
> fd=3D4 len=3D16
> 2025-08-27T14:39:14Z D:../../socket.c:595:(open_ip_socket) Opened=20
> TCPv4 socket fd=3D3 local=3D127.0.0.1:27407
> 2025-08-27T14:39:14Z D:../../socket.c:595:(open_ip_socket) Opened=20
> TCPv4 socket fd=3D4 remote=3D127.0.0.1:27407 local=3D127.0.0.1:17334
> 2025-08-27T14:39:14Z D:../../socket.c:1674:(SCK_Send) Sent data fd=3D4=
=20
> len=3D16
> 2025-08-27T14:39:14Z D:../../socket.c:752:(handle_recv_error) Could=20
> not receive message fd=3D5 : Resource temporarily unavailable
> FAIL (on line 75)
>
Debugging this, SCK_AcceptConnection unconditionally sets O_NONBLOCK on=20
the socket,
and recvmsg() (FreeBSD offers recvmmsg() but chrony doesn't use it, see=20
below) "Resource temporarily unavailable" is EAGAIN.
I will disable the socket.c unit test on FreeBSD port for the time being.
Speaking of which, configure states that FreeBSD 11.0 had a broken=20
recvmmsg() - have there been bug reports at the time or fixes? Have we=20
retried this on 13.5, 14.2, 14.3? What do we need to look for?
Cheers,
Matthias
--------------MtidpPEoWnnQ8xRB0CLT5IRR
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<!DOCTYPE html>
<html>
<head>
<meta http-equiv=3D"content-type" content=3D"text/html; charset=3DUTF-=
8">
</head>
<body>
<p>Greetings,</p>
<p>chrony 4.7 and 4.8 (and possibly others) have an issue with
test/util/socket.c's self test,<br>
UNLESS running under "truss" (think strace in the Linux world).</p>
<p>Apparently we're looking at OS-specific differences WRT
non-blocking accept()ed sockets for TCP between FreeBSD and, say,
Linux, or with something that a syscall tracer will cause to be
retried.<br>
</p>
<p><br>
</p>
<p>$ truss test/unit/socket.test <br>
</p>
<p>=3D> passes</p>
<p>
<blockquote type=3D"cite">
<span style=3D"font-family:monospace"><span
style=3D"color:#000000;background-color:#ffffff;">close(3)</sp=
an><span
style=3D"color:#000000;background-color:#ffffff;">
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0</span><span
style=3D"color:#000000;background-color:#ffffff;">=C2=A0=3D 0 =
(0x0)</span><span
style=3D"color:#000000;background-color:#ffffff;">
</span><br>
<span style=3D"color:#000000;background-color:#ffffff;">close(4)=
</span><span
style=3D"color:#000000;background-color:#ffffff;">
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0</span><span
style=3D"color:#000000;background-color:#ffffff;">=C2=A0=3D 0 =
(0x0)</span><span
style=3D"color:#000000;background-color:#ffffff;">
</span><br>
<span style=3D"color:#000000;background-color:#ffffff;">PASS</sp=
an><span
style=3D"color:#000000;background-color:#ffffff;">
</span><br>
<span style=3D"color:#000000;background-color:#ffffff;">write(1,=
"PASS\n",5)</span><span
style=3D"color:#000000;background-color:#ffffff;">
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0</span><span
style=3D"color:#000000;background-color:#ffffff;">=C2=A0=3D 5 =
(0x5)</span><span
style=3D"color:#000000;background-color:#ffffff;">
</span><br>
<span style=3D"color:#000000;background-color:#ffffff;">exit(0x0=
)</span><span
style=3D"color:#000000;background-color:#ffffff;">
</span><br>
<span style=3D"color:#000000;background-color:#ffffff;">process
exit, rval =3D 0</span><br>
<span style=3D"color:#000000;background-color:#ffffff;">
</span><br>
</span>
</blockquote>
<br>
</p>
<p>$ test/unit/socket.test</p>
<p>=3D> prints <span style=3D"font-family:monospace"><span
style=3D"color:#000000;background-color:#ffffff;">Testing socket
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0FAIL (on line 75)</span><br>
<span style=3D"color:#000000;background-color:#ffffff;">
</span><br>
</span>
FAIL (on line 75).</p>
<p><br>
</p>
<p>Building with debug enabled and -d on the command line yields:</p>
<p>...</p>
<p>
<blockquote type=3D"cite">
<span style=3D"font-family:monospace"><span
style=3D"color:#000000;background-color:#ffffff;">2025-08-27T1=
4:39:14Z
D:../../socket.c:813:(log_message) Received message from
127.0.0.1:57724 fd=3D3 len=3D16</span><span
style=3D"color:#000000;background-color:#ffffff;">
</span><br>
<span style=3D"color:#000000;background-color:#ffffff;">2025-08-=
27T14:39:14Z
D:../../socket.c:813:(log_message) Sent message to
127.0.0.1:57724 fd=3D3 len=3D16</span><span
style=3D"color:#000000;background-color:#ffffff;">
</span><br>
<span style=3D"color:#000000;background-color:#ffffff;">2025-08-=
27T14:39:14Z
D:../../socket.c:1648:(SCK_Receive) Received data fd=3D4
len=3D16</span><span
style=3D"color:#000000;background-color:#ffffff;">
</span><br>
<span style=3D"color:#000000;background-color:#ffffff;">2025-08-=
27T14:39:14Z
D:../../socket.c:595:(open_ip_socket) Opened UDPv4 socket
fd=3D3 local=3D127.0.0.1:28164</span><span
style=3D"color:#000000;background-color:#ffffff;">
</span><br>
<span style=3D"color:#000000;background-color:#ffffff;">2025-08-=
27T14:39:14Z
D:../../socket.c:595:(open_ip_socket) Opened UDPv4 socket
fd=3D4 remote=3D127.0.0.1:28164</span><span
style=3D"color:#000000;background-color:#ffffff;">
</span><br>
<span style=3D"color:#000000;background-color:#ffffff;">2025-08-=
27T14:39:14Z
D:../../socket.c:1674:(SCK_Send) Sent data fd=3D4 len=3D16</sp=
an><span
style=3D"color:#000000;background-color:#ffffff;">
</span><br>
<span style=3D"color:#000000;background-color:#ffffff;">2025-08-=
27T14:39:14Z
D:../../socket.c:813:(log_message) Received message from
127.0.0.1:39243 fd=3D3 len=3D16</span><span
style=3D"color:#000000;background-color:#ffffff;">
</span><br>
<span style=3D"color:#000000;background-color:#ffffff;">2025-08-=
27T14:39:14Z
D:../../socket.c:813:(log_message) Sent message to
127.0.0.1:39243 fd=3D3 len=3D16</span><span
style=3D"color:#000000;background-color:#ffffff;">
</span><br>
<span style=3D"color:#000000;background-color:#ffffff;">2025-08-=
27T14:39:14Z
D:../../socket.c:1648:(SCK_Receive) Received data fd=3D4
len=3D16</span><span
style=3D"color:#000000;background-color:#ffffff;">
</span><br>
<span style=3D"color:#000000;background-color:#ffffff;">2025-08-=
27T14:39:14Z
D:../../socket.c:595:(open_ip_socket) Opened UDPv4 socket
fd=3D3 local=3D127.0.0.1:41555</span><span
style=3D"color:#000000;background-color:#ffffff;">
</span><br>
<span style=3D"color:#000000;background-color:#ffffff;">2025-08-=
27T14:39:14Z
D:../../socket.c:595:(open_ip_socket) Opened UDPv4 socket
fd=3D4 remote=3D127.0.0.1:41555</span><span
style=3D"color:#000000;background-color:#ffffff;">
</span><br>
<span style=3D"color:#000000;background-color:#ffffff;">2025-08-=
27T14:39:14Z
D:../../socket.c:1674:(SCK_Send) Sent data fd=3D4 len=3D16</sp=
an><span
style=3D"color:#000000;background-color:#ffffff;">
</span><br>
<span style=3D"color:#000000;background-color:#ffffff;">2025-08-=
27T14:39:14Z
D:../../socket.c:813:(log_message) Received message from
127.0.0.1:19472 fd=3D3 len=3D16</span><span
style=3D"color:#000000;background-color:#ffffff;">
</span><br>
<span style=3D"color:#000000;background-color:#ffffff;">2025-08-=
27T14:39:14Z
D:../../socket.c:813:(log_message) Sent message to
127.0.0.1:19472 fd=3D3 len=3D16</span><span
style=3D"color:#000000;background-color:#ffffff;">
</span><br>
<span style=3D"color:#000000;background-color:#ffffff;">2025-08-=
27T14:39:14Z
D:../../socket.c:1648:(SCK_Receive) Received data fd=3D4
len=3D16</span><span
style=3D"color:#000000;background-color:#ffffff;">
</span><br>
<span style=3D"color:#000000;background-color:#ffffff;">2025-08-=
27T14:39:14Z
D:../../socket.c:595:(open_ip_socket) Opened TCPv4 socket
fd=3D3 local=3D127.0.0.1:6992</span><span
style=3D"color:#000000;background-color:#ffffff;">
</span><br>
<span style=3D"color:#000000;background-color:#ffffff;">2025-08-=
27T14:39:14Z
D:../../socket.c:595:(open_ip_socket) Opened TCPv4 socket
fd=3D4 remote=3D127.0.0.1:6992</span><span
style=3D"color:#000000;background-color:#ffffff;">
</span><br>
<span style=3D"color:#000000;background-color:#ffffff;">2025-08-=
27T14:39:14Z
D:../../socket.c:1674:(SCK_Send) Sent data fd=3D4 len=3D16</sp=
an><span
style=3D"color:#000000;background-color:#ffffff;">
</span><br>
<span style=3D"color:#000000;background-color:#ffffff;">2025-08-=
27T14:39:14Z
D:../../socket.c:813:(log_message) Received message fd=3D5
len=3D16</span><span
style=3D"color:#000000;background-color:#ffffff;">
</span><br>
<span style=3D"color:#000000;background-color:#ffffff;">2025-08-=
27T14:39:14Z
D:../../socket.c:813:(log_message) Sent message fd=3D5 len=3D1=
6</span><span
style=3D"color:#000000;background-color:#ffffff;">
</span><br>
<span style=3D"color:#000000;background-color:#ffffff;">2025-08-=
27T14:39:14Z
D:../../socket.c:1648:(SCK_Receive) Received data fd=3D4
len=3D16</span><span
style=3D"color:#000000;background-color:#ffffff;">
</span><br>
<span style=3D"color:#000000;background-color:#ffffff;">2025-08-=
27T14:39:14Z
D:../../socket.c:595:(open_ip_socket) Opened TCPv4 socket
fd=3D3 local=3D127.0.0.1:27407</span><span
style=3D"color:#000000;background-color:#ffffff;">
</span><br>
<span style=3D"color:#000000;background-color:#ffffff;">2025-08-=
27T14:39:14Z
D:../../socket.c:595:(open_ip_socket) Opened TCPv4 socket
fd=3D4 remote=3D127.0.0.1:27407 local=3D127.0.0.1:17334</span>=
<span
style=3D"color:#000000;background-color:#ffffff;">
</span><br>
<span style=3D"color:#000000;background-color:#ffffff;">2025-08-=
27T14:39:14Z
D:../../socket.c:1674:(SCK_Send) Sent data fd=3D4 len=3D16</sp=
an><span
style=3D"color:#000000;background-color:#ffffff;">
</span><br>
<span style=3D"color:#000000;background-color:#ffffff;">2025-08-=
27T14:39:14Z
D:../../socket.c:752:(handle_recv_error) Could not receive
message fd=3D5 : Resource temporarily unavailable</span><br>
<span style=3D"color:#000000;background-color:#ffffff;">
</span></span>
<span style=3D"font-family:monospace"><span
style=3D"color:#000000;background-color:#ffffff;">FAIL (on
line 75)</span><br>
<span style=3D"color:#000000;background-color:#ffffff;">
</span><br>
</span>
</blockquote>
<br>
</p>
<p>Debugging this, SCK_AcceptConnection unconditionally sets
O_NONBLOCK on the socket, <br>
and recvmsg() (FreeBSD offers recvmmsg() but chrony doesn't use
it, see below) "Resource temporarily unavailable" is EAGAIN.</p>
<p>I will disable the socket.c unit test on FreeBSD port for the
time being.</p>
<p><br>
</p>
<p>Speaking of which, configure states that FreeBSD 11.0 had a
broken recvmmsg() - have there been bug reports at the time or
fixes? Have we retried this on 13.5, 14.2, 14.3? What do we need
to look for?<br>
</p>
<p><br>
</p>
<p>Cheers,<br>
Matthias<br>
</p>
</body>
</html>
--------------MtidpPEoWnnQ8xRB0CLT5IRR--
--
To unsubscribe email chrony-users-request-kWFZVVI9zxvPqho9SqqRMmD2FQJk+8+b@public.gmane.org
with "unsubscribe" in the subject.
For help email chrony-users-request-kWFZVVI9zxvPqho9SqqRMmD2FQJk+8+b@public.gmane.org
with "help" in the subject.
Trouble? Email [email protected]