Subject: Re: tail bug - starting in 7.5 "tail --follow=name" behaves like "tail --follow=name --retry"

From: Tim Underwood <[email-masked]>
Date: Mon, 25 Apr 2011 09:01:00 -0700

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 <[email-masked]> wrote:

> Thanks again.
> Here's the fix I expect to use:
>
> From 79a476abb35a69f409e2848019c8ebc24cc687cf Mon Sep 17 00:00:00 2001
> From: Jim Meyering <[email-masked]>
> 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                      [email-masked]
>  Tim Mooney                          [email-masked]
>  Tim Ryan                            [email-masked]
>  Tim Smithers                        [email-masked]
> +Tim Underwood                       [email-masked]
>  Tim Waugh                           twaugh@redhat
>  Toby Peterson                       [email-masked]
>  Todd A. Jacobs                      [email-masked]
> 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
>