summaryrefslogtreecommitdiff
path: root/tests/tail-2/F-vs-rename
diff options
context:
space:
mode:
authorPádraig Brady <P@draigBrady.com>2010-10-12 01:39:58 +0100
committerPádraig Brady <P@draigBrady.com>2010-10-12 11:41:17 +0100
commit61b77891c2d9af299063850a0c4d1d721340cfff (patch)
tree53d70fd61a8c64ab6be607a0f9083ff6583f0886 /tests/tail-2/F-vs-rename
parent9f4744534f1de87b9630dfbde91b9ebd9592d056 (diff)
downloadcoreutils-61b77891c2d9af299063850a0c4d1d721340cfff.tar.xz
tail: fix checking of currently unavailable directories
* src/tail.c (tail_forever_inotify): Handle the case where tail --follow=name with inotify, is not able to add a watch on a specified directory. This may happen due to inotify resource limits or if the directory is currently missing or inaccessible. In all these cases, revert to polling which will try to reopen the file later. Note inotify returns ENOSPC when it runs out of resources, and instead we report a particular error message, lest users think one of their file systems is full. (main): Document another caveat with using inotify, where we currently don't recheck directories recreated after the initial watch is setup. * tests/tail-2/F-vs-rename: Fix the endless loop triggered by the above issue. * tests/tail-2/inotify-hash-abuse: Likewise. * tests/tail-2/wait: Don't fail in the resource exhaustion case. * tests/tail-2/F-vs-missing: A new test for this failure mode which was until now just triggered on older buggy linux kernels which returned ENOSPC constantly from inotify_add_watch(). * NEWS: Mention the fix.
Diffstat (limited to 'tests/tail-2/F-vs-rename')
-rwxr-xr-xtests/tail-2/F-vs-rename35
1 files changed, 16 insertions, 19 deletions
diff --git a/tests/tail-2/F-vs-rename b/tests/tail-2/F-vs-rename
index 74db80137..98b36e745 100755
--- a/tests/tail-2/F-vs-rename
+++ b/tests/tail-2/F-vs-rename
@@ -18,39 +18,36 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-if test "$VERBOSE" = yes; then
- set -x
- tail --version
-fi
-
-. $srcdir/test-lib.sh
+. "${srcdir=.}/init.sh"; path_prepend_ ../src
+test "$VERBOSE" = yes && tail --version
touch a b || framework_failure
-debug='---disable-inotify -s .01'
+debug='---disable-inotify'
debug=
-tail $debug -F a b > out 2>&1 & pid=$!
+tail $debug -F -s.1 a b > out 2>&1 & pid=$!
+
+check_tail_output()
+{
+ local delay="$1"
+ grep "$tail_re" out > /dev/null ||
+ { sleep $delay; return 1; }
+}
-# Wait until tail has started...
+# Wait up to 6.3s for tail to start
echo x > a
-until grep '^x$' out >/dev/null 2>&1; do :; done
+tail_re='^x$' retry_delay_ check_tail_output .1 7 || fail=1
mv a b || fail=1
-# Wait for the diagnostic:
+# Wait 6.3s for this diagnostic:
# tail: `a' has become inaccessible: No such file or directory
-until grep inaccessible out >/dev/null 2>&1; do :; done
+tail_re='inaccessible' retry_delay_ check_tail_output .1 7 || fail=1
echo x > a
# Wait up to 6.3s for this to appear in the output:
# "tail: `...' has appeared; following end of new file"
-tail_f_vs_rename_1()
-{
- local delay="$1"
- grep 'has appeared;' out > /dev/null ||
- { sleep $delay; return 1; }
-}
-retry_delay_ tail_f_vs_rename_1 .1 7 ||
+tail_re='has appeared' retry_delay_ check_tail_output .1 7 ||
{ echo "$0: a: unexpected delay?"; cat out; fail=1; }
echo y >> b