GNU bug report logs - #8544
tail bug - starting in 7.5 "tail --follow=name" behaves like "tail --follow=name --retry"

Previous Next

Package: coreutils;

Reported by: Jim Meyering <jim <at> meyering.net>

Date: Sun, 24 Apr 2011 21:24:01 UTC

Severity: normal

Done: Jim Meyering <jim <at> meyering.net>

Bug is archived. No further changes may be made.

Full log


View this message in rfc822 format

From: help-debbugs <at> gnu.org (GNU bug Tracking System)
To: Jim Meyering <jim <at> meyering.net>
Cc: tracker <at> debbugs.gnu.org
Subject: bug#8544: closed (tail bug - starting in 7.5 "tail --follow=name"
 behaves like "tail --follow=name --retry")
Date: Mon, 25 Apr 2011 09:24:02 +0000
[Message part 1 (text/plain, inline)]
Your message dated Mon, 25 Apr 2011 11:23:04 +0200
with message-id <87aafeheh3.fsf <at> rho.meyering.net>
and subject line Re: bug#8544: tail bug - starting in 7.5 "tail --follow=name" behaves like "tail --follow=name --retry"
has caused the GNU bug report #8544,
regarding tail bug - starting in 7.5 "tail --follow=name" behaves like "tail --follow=name --retry"
to be marked as done.

(If you believe you have received this mail in error, please contact
help-debbugs <at> gnu.org.)


-- 
8544: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=8544
GNU Bug Tracking System
Contact help-debbugs <at> gnu.org with problems
[Message part 2 (message/rfc822, inline)]
From: Jim Meyering <jim <at> meyering.net>
To: Tim Underwood <timunderwood <at> gmail.com>
Cc: bug-coreutils <at> gnu.org
Subject: Re: tail bug - starting in 7.5 "tail --follow=name" behaves like
	"tail --follow=name --retry"
Date: Sun, 24 Apr 2011 23:22:46 +0200
Tim Underwood wrote:
> Going from Ubuntu 10.04 (coreutils 7.4) to Ubuntu 10.10 (coreutils 8.5) I
> noticed that "tail --follow=name" started behaving like "tail --follow=name
> --retry".  It looks like the issue started in 7.5 and still exists in 8.9.
>
> To reproduce:
>
> tail --follow=name this_file_does_not_exist
>
> The expected behavior is:
>
> $ ./coreutils-7.4/src/tail --follow=name this_file_does_not_exist
> ./coreutils-7.4/src/tail: cannot open `this_file_does_not_exist' for
> reading: No such file or directory
> ./coreutils-7.4/src/tail: no files remaining
>
> The wrong behavior is:
>
> $ ./coreutils-7.5/src/tail --follow=name this_file_does_not_exist
> ./coreutils-7.5/src/tail: cannot open `this_file_does_not_exist' for
> reading: No such file or directory
> <tail waits forever for this_file_does_not_exist to become available which
> is what --retry is for>
>
> Here's the wrong behavior on 8.9:
>
> $ ./coreutils-8.9/src/tail --follow=name this_file_does_not_exist
> ./coreutils-8.9/src/tail: cannot open `this_file_does_not_exist' for
> reading: No such file or directory
> <waits forever...>
>
> My specific use case is to tail a log file until it gets deleted at which
> point tail should exit allowing my script to continue.

Thanks again.
Here's the fix I expect to use:

From 79a476abb35a69f409e2848019c8ebc24cc687cf Mon Sep 17 00:00:00 2001
From: Jim Meyering <meyering <at> redhat.com>
Date: Sun, 24 Apr 2011 23:20:01 +0200
Subject: [PATCH] tail --follow=name no longer implies --retry

* src/tail.c (tail_forever_inotify): Just as without inotify,
tail --follow=name now terminates when the last tailed-by-name file
is unlinked or moved aside.  This bug was introduced on 2009-06-15
via commit ae494d4b, "tail: use inotify if it is available".
Reported by Tim Underwood in
http://thread.gmane.org/gmane.comp.gnu.coreutils.bugs/22286
* NEWS (Bug fixes): Mention this.
* tests/tail-2/follow-name: Test for this.
* tests/Makefile.am (TESTS): Add it.
---
 NEWS                     |    5 +++++
 THANKS.in                |    1 +
 src/tail.c               |   10 ++++++++++
 tests/Makefile.am        |    1 +
 tests/tail-2/follow-name |   32 ++++++++++++++++++++++++++++++++
 5 files changed, 49 insertions(+), 0 deletions(-)
 create mode 100755 tests/tail-2/follow-name

diff --git a/NEWS b/NEWS
index 7bc2ef3..3307e71 100644
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,11 @@ GNU coreutils NEWS                                    -*- outline -*-

 * Noteworthy changes in release ?.? (????-??-??) [?]

+** Bug fixes
+
+  tail's --follow=name option no longer implies --retry on systems
+  with inotify support.  [bug introduced in coreutils-7.5]
+
 ** Changes in behavior

   cp's extent-based (FIEMAP) copying code is more reliable in the face
diff --git a/THANKS.in b/THANKS.in
index 342a52c..d1ca380 100644
--- a/THANKS.in
+++ b/THANKS.in
@@ -560,6 +560,7 @@ Tim J. Robbins                      tjr <at> FreeBSD.org
 Tim Mooney                          mooney <at> dogbert.cc.ndsu.NoDak.edu
 Tim Ryan                            Tim_Ryan <at> bnz.co.nz
 Tim Smithers                        mouse <at> dmouse.com.au
+Tim Underwood                       timunderwood <at> gmail.com
 Tim Waugh                           twaugh <at> redhat
 Toby Peterson                       toby <at> opendarwin.org
 Todd A. Jacobs                      tjacobs <at> codegnome.org
diff --git a/src/tail.c b/src/tail.c
index 88fbd10..e6d8164 100644
--- a/src/tail.c
+++ b/src/tail.c
@@ -1432,6 +1432,16 @@ tail_forever_inotify (int wd, struct File_spec *f, size_t n_files,
       struct File_spec *fspec;
       struct inotify_event *ev;

+      /* When following by name without --retry, and the last file has
+         been unlinked or renamed-away, diagnose it and return.  */
+      if (follow_mode == Follow_name
+          && ! reopen_inaccessible_files
+          && hash_get_n_entries (wd_to_name) == 0)
+        {
+          error (0, 0, _("no files remaining"));
+          return false;
+        }
+
       /* When watching a PID, ensure that a read from WD will not block
          indefinitely.  */
       if (pid)
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 685eb52..2f4a561 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -489,6 +489,7 @@ TESTS =						\
   tail-2/assert-2				\
   tail-2/big-4gb				\
   tail-2/flush-initial				\
+  tail-2/follow-name				\
   tail-2/follow-stdin				\
   tail-2/pipe-f					\
   tail-2/pipe-f2				\
diff --git a/tests/tail-2/follow-name b/tests/tail-2/follow-name
new file mode 100755
index 0000000..ef9434a
--- /dev/null
+++ b/tests/tail-2/follow-name
@@ -0,0 +1,32 @@
+#!/bin/sh
+# ensure that --follow=name does not imply --retry
+
+# Copyright (C) 2011 Free Software Foundation, Inc.
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+. "${srcdir=.}/init.sh"; path_prepend_ ../src
+print_ver_ tail
+
+cat <<\EOF > exp || framework_failure_
+tail: cannot open `no-such' for reading: No such file or directory
+tail: no files remaining
+EOF
+
+timeout 10 tail --follow=name no-such > out 2> err
+test $? = 1 || fail=1
+
+compare err exp || fail=1
+
+Exit $fail
--
1.7.5.rc3.316.gd1ff9


[Message part 3 (message/rfc822, inline)]
From: Jim Meyering <jim <at> meyering.net>
To: Tim Underwood <timunderwood <at> gmail.com>
Cc: 8544-done <at> debbugs.gnu.org
Subject: Re: bug#8544: tail bug - starting in 7.5 "tail --follow=name" behaves
	like "tail --follow=name --retry"
Date: Mon, 25 Apr 2011 11:23:04 +0200
Jim Meyering wrote:
> Tim Underwood wrote:
>> Going from Ubuntu 10.04 (coreutils 7.4) to Ubuntu 10.10 (coreutils 8.5) I
>> noticed that "tail --follow=name" started behaving like "tail --follow=name
>> --retry".  It looks like the issue started in 7.5 and still exists in 8.9.
...
>
> Thanks again.
> Here's the fix I expect to use:
>
> Subject: [PATCH] tail --follow=name no longer implies --retry
>
> * src/tail.c (tail_forever_inotify): Just as without inotify,
> tail --follow=name now terminates when the last tailed-by-name file
> is unlinked or moved aside.  This bug was introduced on 2009-06-15
> via commit ae494d4b, "tail: use inotify if it is available".
> Reported by Tim Underwood in
> http://thread.gmane.org/gmane.comp.gnu.coreutils.bugs/22286
> * NEWS (Bug fixes): Mention this.
> * tests/tail-2/follow-name: Test for this.
> * tests/Makefile.am (TESTS): Add it.

I've pushed that, and am closing this issue.


This bug report was last modified 14 years and 31 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.