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.

To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 8544 in the body.
You can then email your comments to 8544 AT debbugs.gnu.org in the normal way.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to owner <at> debbugs.gnu.org, bug-coreutils <at> gnu.org:
bug#8544; Package coreutils. (Sun, 24 Apr 2011 21:24:01 GMT) Full text and rfc822 format available.

Acknowledgement sent to Jim Meyering <jim <at> meyering.net>:
New bug report received and forwarded. Copy sent to bug-coreutils <at> gnu.org. (Sun, 24 Apr 2011 21:24:01 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

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




Reply sent to Jim Meyering <jim <at> meyering.net>:
You have taken responsibility. (Mon, 25 Apr 2011 09:24:02 GMT) Full text and rfc822 format available.

Notification sent to Jim Meyering <jim <at> meyering.net>:
bug acknowledged by developer. (Mon, 25 Apr 2011 09:24:02 GMT) Full text and rfc822 format available.

Message #10 received at 8544-done <at> debbugs.gnu.org (full text, mbox):

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.




Information forwarded to owner <at> debbugs.gnu.org, bug-coreutils <at> gnu.org:
bug#8544; Package coreutils. (Mon, 25 Apr 2011 16:18:02 GMT) Full text and rfc822 format available.

Message #13 received at submit <at> debbugs.gnu.org (full text, mbox):

From: Tim Underwood <timunderwood <at> gmail.com>
To: Jim Meyering <jim <at> meyering.net>
Cc: bug-coreutils <at> gnu.org
Subject: Re: tail bug - starting in 7.5 "tail --follow=name" behaves like
	"tail --follow=name --retry"
Date: Mon, 25 Apr 2011 09:01:00 -0700
[Message part 1 (text/plain, inline)]
Thanks for the quick fix Jim!  I verified the bug is now fixed in the git
repository.

-Tim

On Sun, Apr 24, 2011 at 2:22 PM, Jim Meyering <jim <at> meyering.net> wrote:

> 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 2 (text/html, inline)]

bug archived. Request was from Debbugs Internal Request <help-debbugs <at> gnu.org> to internal_control <at> debbugs.gnu.org. (Tue, 24 May 2011 11:24:03 GMT) Full text and rfc822 format available.

This bug report was last modified 12 years and 334 days ago.

Previous Next


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