2 # ensure that tail -F handles rotation
4 # Copyright (C) 2009-2024 Free Software Foundation, Inc.
6 # This program is free software: you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
16 # You should have received a copy of the GNU General Public License
17 # along with this program. If not, see <https://www.gnu.org/licenses/>.
19 .
"${srcdir=.}/tests/init.sh"; path_prepend_ .
/src
22 grep '^#define HAVE_INOTIFY 1' "$CONFIG_HEADER" >/dev
/null \
28 grep "$tail_re" out
> /dev
/null ||
29 { sleep $delay; return 1; }
32 # Wait up to 25.5 seconds for grep REGEXP 'out' to succeed.
33 grep_timeout
() { tail_re
="$1" retry_delay_ check_tail_output
.1 8; }
35 # Terminate any background tail process
36 cleanup_
() { kill $pid 2>/dev
/null
&& wait $pid; }
46 # Speedup the non inotify case
47 fastpoll
='-s.1 --max-unchanged-stats=1'
49 # Perform at least this many iterations, because on multi-core systems
50 # the offending sequence of events can be surprisingly uncommon.
51 # See: https://lists.gnu.org/r/bug-coreutils/2009-11/msg00213.html
52 for i
in $
(seq 50); do
56 # Normally less than a second is required here, but with heavy load
57 # and a lot of file system activity, even 20 seconds is insufficient, which
58 # leads to this timeout killing tail before the "ok" is written below.
59 >k
&& >x || framework_failure_ failed to initialize files
60 timeout
60 tail $fastpoll -F k
> out
2>&1 & pid
=$
!
63 # wait for 'tailed' to appear in out
64 grep_timeout
'tailed' ||
{ cleanup_fail
'failed to find "tailed"'; break; }
67 # wait for tail to detect the rename
68 grep_timeout
'tail:' ||
{ cleanup_fail
'failed to detect rename'; break; }
71 # wait for "ok" to appear in 'out'
72 grep_timeout
'ok' ||
{ cleanup_fail
'failed to detect echoed ok'; break; }