1#!/bin/sh 2# ensure that tail -F handles rotation 3 4# Copyright (C) 2009-2023 Free Software Foundation, Inc. 5 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. 10 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. 15 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/>. 18 19. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src 20print_ver_ tail 21 22grep '^#define HAVE_INOTIFY 1' "$CONFIG_HEADER" >/dev/null \ 23 || expensive_ 24 25check_tail_output() 26{ 27 local delay="$1" 28 grep "$tail_re" out > /dev/null || 29 { sleep $delay; return 1; } 30} 31 32# Wait up to 25.5 seconds for grep REGEXP 'out' to succeed. 33grep_timeout() { tail_re="$1" retry_delay_ check_tail_output .1 8; } 34 35# Terminate any background tail process 36cleanup_() { kill $pid 2>/dev/null && wait $pid; } 37 38cleanup_fail() 39{ 40 cat out 41 warn_ $1 42 cleanup_ 43 fail=1 44} 45 46# Speedup the non inotify case 47fastpoll='-s.1 --max-unchanged-stats=1' 48 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 52for i in $(seq 50); do 53 echo $i 54 rm -f k x out 55 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=$! 61 62 echo 'tailed' > k; 63 # wait for 'tailed' to appear in out 64 grep_timeout 'tailed' || { cleanup_fail 'failed to find "tailed"'; break; } 65 66 mv x k 67 # wait for tail to detect the rename 68 grep_timeout 'tail:' || { cleanup_fail 'failed to detect rename'; break; } 69 70 echo ok >> k 71 # wait for "ok" to appear in 'out' 72 grep_timeout 'ok' || { cleanup_fail 'failed to detect echoed ok'; break; } 73 74 cleanup_ 75done 76 77Exit $fail 78