Re: glibc read blocking since kernel 4.19
I've tried to switch everything back to C library using popen and it
hanged too. In all places it hangs using pstream.h. Notice malformed
_IO_read_ptr. and all other pointers. It should look like " 9
10.13.19.18 4.762 ms 4.613 ms 4.158 ms\n", but there is " 4.613
ms.19.18 4.762 mss 3.658 ms 3.681 ms 3.144 ms0 byte packetsms".
Almost identical problem, just with totaly different approach. This
one worked for more than a year on tens of servers. No matter the
version of glibc. It happens with kernels 4.19 and 5.0. However I
didn't test older ones.
FILE* pipe = popen(command, "r");
if (!pipe)
{
return false;
}
while (fgets(buffer.data(), sizeof(buffer), pipe) != NULL) // it
blocked here - #7 in backtrace
{
returnSstream << buffer.data();
}
int processReturnValue = pclose(pipe);
gdb - output of pipe
+print *pipe
$1 = {_flags = -72539000, _IO_read_ptr = 0x7f22d006cca0 " 4.613
ms.19.18 4.762 mss 3.658 ms 3.681 ms 3.144 ms0 byte packetsms",
_IO_read_end = 0x7f22d006cca0 " 4.613 ms.19.18 4.762 mss 3.658 ms
3.681 ms 3.144 ms0 byte packetsms", _IO_read_base = 0x7f22d006cca0 "
4.613 ms.19.18 4.762 mss 3.658 ms 3.681 ms 3.144 ms0 byte
packetsms",
_IO_write_base = 0x7f22d006cca0 " 4.613 ms.19.18 4.762 mss 3.658
ms 3.681 ms 3.144 ms0 byte packetsms", _IO_write_ptr =
0x7f22d006cca0 " 4.613 ms.19.18 4.762 mss 3.658 ms 3.681 ms 3.144
ms0 byte packetsms",
_IO_write_end = 0x7f22d006cca0 " 4.613 ms.19.18 4.762 mss 3.658
ms 3.681 ms 3.144 ms0 byte packetsms", _IO_buf_base = 0x7f22d006cca0
" 4.613 ms.19.18 4.762 mss 3.658 ms 3.681 ms 3.144 ms0 byte
packetsms",
_IO_buf_end = 0x7f22d006dca0 "0W*\210hU", _IO_save_base = 0x0,
_IO_backup_base = 0x0, _IO_save_end = 0x0, _markers = 0x0, _chain =
0x7f23016c0680 <_IO_2_1_stderr_>, _fileno = 3, _flags2 = 128,
_old_offset = 5282249573778077746,
_cur_column = 0, _vtable_offset = 14 '\016', _shortbuf = <incomplete
sequence \320>, _lock = 0x7f22d00e5590, _offset = -1, _codecvt =
0x756f72003234322e, _wide_data = 0xffffffffffffffff, _freeres_list =
0x0,
_freeres_buf = 0x39312e33312e3031, __pad5 = 2333181267236106798,
_mode = -1, _unused2 =
"\"\177\000\000\f\000\000\000\000\000\000\000\061\060.13.19"}
gdb backtrace:
where
#0 __GI___libc_read (nbytes=4096, buf=0x7f22d006cca0, fd=3) at
../sysdeps/unix/sysv/linux/read.c:26
#1 __GI___libc_read (fd=3, buf=0x7f22d006cca0, nbytes=4096) at
../sysdeps/unix/sysv/linux/read.c:24
#2 0x00007f23015808e0 in _IO_new_file_underflow (fp=0x7f22d00e54a0)
at libioP.h:839
#3 0x00007f2301581a02 in __GI__IO_default_uflow (fp=0x7f22d00e54a0)
at libioP.h:839
#4 0x00007f23015751ba in __GI__IO_getline_info
(fp=fp@entry=0x7f22d00e54a0, buf=buf@entry=0x7f2300612160 " 9
10.13.19.18 4.762 ms 4.613 ms 4.158 ms\n", n=4060,
delim=delim@entry=10, extract_delim=extract_delim@entry=1,
eof=eof@entry=0x0) at iogetline.c:60
#5 0x00007f23015752a8 in __GI__IO_getline
(fp=fp@entry=0x7f22d00e54a0, buf=buf@entry=0x7f2300612160 " 9
10.13.19.18 4.762 ms 4.613 ms 4.158 ms\n", n=<optimized out>,
delim=delim@entry=10, extract_delim=extract_delim@entry=1)
at iogetline.c:34
#6 0x00007f230157425b in _IO_fgets (buf=0x7f2300612160 " 9
10.13.19.18 4.762 ms 4.613 ms 4.158 ms\n", n=<optimized out>,
fp=0x7f22d00e54a0) at iofgets.c:53
#7 0x00005568881d9b36 in Command::RunGetStringStream
(rCommandString="traceroute -T -n -q 3 -w 0.020000 10.13.19.193",
pCommandOutput=0x7f2300613380, logName="10.13.19.193") at
/root/shaperd/projects/lib/libCommand.cpp:1020
----
S pozdravem / Best Regards
Vaclav Zindulka
Reply to: