bug-coreutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: tail aborts while following by name if using inotify


From: Giuseppe Scrivano
Subject: Re: tail aborts while following by name if using inotify
Date: Wed, 30 Dec 2009 00:24:32 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/23.1.90 (gnu/linux)

Hi Jim,


Jim Meyering <address@hidden> writes:

> However, while looking at it, I discovered another problem.
> When tail-F'd files may be renamed, tail may fail to track
> the target of a rename.

good catch and very useful test case!  I am going to like the test
driven development we we had today :-)

This patch should fix the problem, other tests remain green.


>From f108dc01f86fb8df057172d2bafd8224759be884 Mon Sep 17 00:00:00 2001
From: Giuseppe Scrivano <address@hidden>
Date: Wed, 30 Dec 2009 00:20:24 +0100
Subject: [PATCH] tail: ensure the wd is not already present in the hash table 
before add it

* src/tail.c (tail_forever_inotify): When a new watch descriptor is
added to the `wd_to_name' hash table, check that it is not already
present.  If it is present then remove the previous element.
---
 src/tail.c |   15 ++++++++++++++-
 1 files changed, 14 insertions(+), 1 deletions(-)

diff --git a/src/tail.c b/src/tail.c
index 3d5e221..28a0e26 100644
--- a/src/tail.c
+++ b/src/tail.c
@@ -1486,11 +1486,24 @@ tail_forever_inotify (int wd, struct File_spec *f, 
size_t n_files,
           /* Remove `fspec' and re-add it using `new_fd' as its key.  */
           hash_delete (wd_to_name, fspec);
           fspec->wd = new_wd;
+
+          /* If the file was moved then inotify will use the source file wd for
+             the destination file.  Make sure the key is not present in the
+             table.  */
+          struct File_spec *prev = hash_delete (wd_to_name, fspec);
+          if (prev && prev != fspec)
+            {
+              if (follow_mode == Follow_name)
+                recheck (prev, false);
+              prev->wd = -1;
+              close_fd (prev->fd, pretty_name (prev));
+            }
+
           if (hash_insert (wd_to_name, fspec) == NULL)
             xalloc_die ();
 
           if (follow_mode == Follow_name)
-            recheck (&(f[j]), false);
+            recheck (fspec, false);
         }
       else
         {
-- 
1.6.5


> Here's a similar test that fails with inotify-enabled tail,
> yet passes with ---disable-inotify:
>

> +debug='---disable-inotify -s .01'
> +debug=

What do you think about run the test in both modes?


Cheers,
Giuseppe




reply via email to

[Prev in Thread] Current Thread [Next in Thread]