]> git.ipfire.org Git - thirdparty/coreutils.git/commitdiff
tail: ensure -f --retry 'missing' handles truncation
authorPádraig Brady <P@draigBrady.com>
Wed, 9 Nov 2016 17:51:13 +0000 (17:51 +0000)
committerPádraig Brady <P@draigBrady.com>
Wed, 9 Nov 2016 21:38:33 +0000 (21:38 +0000)
* src/tail.c (tail_forever): The BLOCKING optimization is only
enabled for non regular files (which can't be truncated), so ensure
we don't enable that unless we've a valid file descriptor.
* tests/tail-2/retry.sh: Add a test case.
* NEWS: Mention the bug fix.

NEWS
src/tail.c
tests/tail-2/retry.sh

diff --git a/NEWS b/NEWS
index c223b562d036558ec7e6bc350837793564a484e8..d88fbd9d4d433045799cea81ba9efa194e8a4bd4 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -59,6 +59,10 @@ GNU coreutils NEWS                                    -*- outline -*-
   file systems that misreport file sizes through stale metadata.
   [This bug was present in "the beginning" but exacerbated in coreutils-8.24]
 
+  tail -f --retry 'missing file' will now process truncations of that file.
+  Previously truncation was ignored thus not outputting new data in the file.
+  [bug introduced in coreutils-5.3.0]
+
   yes now handles short writes, rather than assuming all writes complete.
   [bug introduced in coreutils-8.24]
 
index b3018d526d0f5d03a533544d25effb1a9addc273..66aad5b7894e3373b5c02e8dabb455af7f86d48c 100644 (file)
@@ -1111,7 +1111,7 @@ tail_forever (struct File_spec *f, size_t n_files, double sleep_interval)
 {
   /* Use blocking I/O as an optimization, when it's easy.  */
   bool blocking = (pid == 0 && follow_mode == Follow_descriptor
-                   && n_files == 1 && ! S_ISREG (f[0].mode));
+                   && n_files == 1 && f[0].fd != -1 && ! S_ISREG (f[0].mode));
   size_t last;
   bool writer_is_dead = false;
 
index b764aa7f1b091895cc3148b290b71f3905a9d1c1..858909f65f0f0905844fa31c505cf31302c611ee 100755 (executable)
@@ -83,17 +83,22 @@ timeout 10 \
   tail $mode $fastpoll --follow=descriptor --retry missing >out 2>&1 & pid=$!
 # Wait for "cannot open" error.
 retry_delay_ wait4lines_ .1 6 2 || { cat out; fail=1; }
-echo "X" > missing              || framework_failure_
+echo "X1" > missing             || framework_failure_
 # Wait for the expected output.
 retry_delay_ wait4lines_ .1 6 4 || { cat out; fail=1; }
+# Ensure truncation is detected
+# tail-8.25 failed at this (as assumed non file and went into blocking mode)
+echo "X" > missing             || framework_failure_
+retry_delay_ wait4lines_ .1 6 6 || { cat out; fail=1; }
 cleanup_
-# Expect 4 lines in the output file.
-[ "$(countlines_)" = 4 ]   || { fail=1; cat out; }
+[ "$(countlines_)" = 6 ]   || { fail=1; cat out; }
 grep -F 'retry only effective for the initial open' out \
                            || { fail=1; cat out; }
 grep -F 'cannot open' out  || { fail=1; cat out; }
 grep -F 'has appeared' out || { fail=1; cat out; }
-grep '^X$' out             || { fail=1; cat out; }
+grep '^X1$' out            || { fail=1; cat out; }
+grep -F 'file truncated' out || { fail=1; cat out; }
+grep '^X$' out            || { fail=1; cat out; }
 rm -f missing out          || framework_failure_
 
 # === Test: