From aee982627874e9719bc151007b7e0144edd3963e Mon Sep 17 00:00:00 2001
From: =?utf8?q?P=C3=A1draig=20Brady?=
Date: Tue, 9 Jun 2015 11:33:44 +0100
Subject: [PATCH] tail: display consistent diagnostics upon file replacement
* src/tail.c (recheck): Display diagnostices for replaced files
even with reused inodes which is a common case.
* tests/tail-2/F-vs-missing.sh: Use correct diagnostic in comment.
* tests/tail-2/F-vs-rename.sh: Likewise.
---
src/tail.c | 55 ++++++++++++++++--------------------
tests/tail-2/F-vs-missing.sh | 2 +-
tests/tail-2/F-vs-rename.sh | 2 +-
3 files changed, 27 insertions(+), 32 deletions(-)
diff --git a/src/tail.c b/src/tail.c
index 4d6b28a195..c062d403ff 100644
--- a/src/tail.c
+++ b/src/tail.c
@@ -1019,42 +1019,37 @@ recheck (struct File_spec *f, bool blocking)
assert (f->fd == -1);
error (0, 0, _("%s has become accessible"), quote (pretty_name (f)));
}
+ else if (f->fd == -1)
+ {
+ /* A new file even when inodes haven't changed as
+ pairs can be reused, and we know the file was missing
+ on the previous iteration. Note this also means the file
+ is redisplayed in --follow=name mode if renamed away from
+ and back to a monitored name. */
+ new_file = true;
+
+ error (0, 0,
+ _("%s has appeared; following new file"),
+ quote (pretty_name (f)));
+ }
else if (f->ino != new_stats.st_ino || f->dev != new_stats.st_dev)
{
+ /* File has been replaced (e.g., via log rotation) --
+ tail the new one. */
new_file = true;
- if (f->fd == -1)
- {
- error (0, 0,
- _("%s has appeared; following new file"),
- quote (pretty_name (f)));
- }
- else
- {
- /* Close the old one. */
- close_fd (f->fd, pretty_name (f));
-
- /* File has been replaced (e.g., via log rotation) --
- tail the new one. */
- error (0, 0,
- _("%s has been replaced; following new file"),
- quote (pretty_name (f)));
- }
+
+ error (0, 0,
+ _("%s has been replaced; following new file"),
+ quote (pretty_name (f)));
+
+ /* Close the old one. */
+ close_fd (f->fd, pretty_name (f));
+
}
else
{
- if (f->fd == -1)
- {
- /* This happens when one iteration finds the file missing,
- then the preceding pair is reused as the
- file is recreated. Note this also means the file is redisplayed
- in --follow=name mode if renamed away from and back to
- a monitored name. */
- new_file = true;
- }
- else
- {
- close_fd (fd, pretty_name (f));
- }
+ /* No changes detected, so close new fd. */
+ close_fd (fd, pretty_name (f));
}
/* FIXME: When a log is rotated, daemons tend to log to the
diff --git a/tests/tail-2/F-vs-missing.sh b/tests/tail-2/F-vs-missing.sh
index be20ee3b88..54fe30a884 100755
--- a/tests/tail-2/F-vs-missing.sh
+++ b/tests/tail-2/F-vs-missing.sh
@@ -48,7 +48,7 @@ for mode in '' '---disable-inotify'; do
(cd missing && echo x > file) || framework_failure_
# Wait up to 12.7s for this to appear in the output:
- # "tail: '...' has appeared; following end of new file"
+ # "tail: '...' has appeared; following new file"
tail_re='has appeared' retry_delay_ check_tail_output .1 7 ||
{ echo "$0: file: unexpected delay?"; cat out; fail=1; }
diff --git a/tests/tail-2/F-vs-rename.sh b/tests/tail-2/F-vs-rename.sh
index ee61a548b6..06733fb410 100755
--- a/tests/tail-2/F-vs-rename.sh
+++ b/tests/tail-2/F-vs-rename.sh
@@ -53,7 +53,7 @@ for mode in '' '---disable-inotify'; do
echo x > a
# Wait up to 12.7s for this to appear in the output:
- # "tail: '...' has appeared; following end of new file"
+ # "tail: '...' has appeared; following new file"
tail_re='has appeared' retry_delay_ check_tail_output .1 7 ||
{ echo "$0: a: unexpected delay?"; cat out; fail=1; }
--
2.47.2