annotate tests/test-inotify-issue1208.t @ 12938:bf826c0b9537 stable

opener: check hardlink count reporting (issue1866) The Linux CIFS kernel driver (even in 2.6.36) suffers from a hardlink count blindness bug (lstat() returning 1 in st_nlink when it is expected to return >1), which causes repository corruption if Mercurial running on Linux pushes or commits to a hardlinked repository stored on a Windows share, if that share is mounted using the CIFS driver. This patch works around issue1866 and improves the workaround done in 50523b4407f6 to fix issue761, by teaching the opener to lazily execute a runtime check (new function checknlink) to see if the hardlink count reported by nlinks() can be trusted. Since nlinks() is also known to return varying count values (1 or >1) depending on whether the file is open or not and depending on what client and server software combination is being used for accessing and serving the Windows share, we deliberately open the file before calling nlinks() in order to have a stable precondition. Trying to depend on the precondition "file closed" would be fragile, as the file could have been opened very easily somewhere else in the program.
author Adrian Buehlmann <adrian@cadifra.com>
date Sun, 07 Nov 2010 18:21:29 +0100
parents fed4bb2c8def
children f2719b387380
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6996
fecf060f32a1 inotify: deactivate inotify status on failure
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
1
12453
b98d931482e6 tests: unify test-inotify-issue1208
Matt Mackall <mpm@selenic.com>
parents: 6997
diff changeset
2 $ "$TESTDIR/hghave" inotify || exit 80
b98d931482e6 tests: unify test-inotify-issue1208
Matt Mackall <mpm@selenic.com>
parents: 6997
diff changeset
3 $ echo "[extensions]" >> $HGRCPATH
b98d931482e6 tests: unify test-inotify-issue1208
Matt Mackall <mpm@selenic.com>
parents: 6997
diff changeset
4 $ echo "inotify=" >> $HGRCPATH
b98d931482e6 tests: unify test-inotify-issue1208
Matt Mackall <mpm@selenic.com>
parents: 6997
diff changeset
5 $ p="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
b98d931482e6 tests: unify test-inotify-issue1208
Matt Mackall <mpm@selenic.com>
parents: 6997
diff changeset
6 $ hg init $p
b98d931482e6 tests: unify test-inotify-issue1208
Matt Mackall <mpm@selenic.com>
parents: 6997
diff changeset
7 $ cd $p
6996
fecf060f32a1 inotify: deactivate inotify status on failure
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
8
12453
b98d931482e6 tests: unify test-inotify-issue1208
Matt Mackall <mpm@selenic.com>
parents: 6997
diff changeset
9 fail
6996
fecf060f32a1 inotify: deactivate inotify status on failure
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
10
12453
b98d931482e6 tests: unify test-inotify-issue1208
Matt Mackall <mpm@selenic.com>
parents: 6997
diff changeset
11 $ ln -sf doesnotexist .hg/inotify.sock
b98d931482e6 tests: unify test-inotify-issue1208
Matt Mackall <mpm@selenic.com>
parents: 6997
diff changeset
12 $ hg st
b98d931482e6 tests: unify test-inotify-issue1208
Matt Mackall <mpm@selenic.com>
parents: 6997
diff changeset
13 abort: inotify-server: cannot start: .hg/inotify.sock is a broken symlink
b98d931482e6 tests: unify test-inotify-issue1208
Matt Mackall <mpm@selenic.com>
parents: 6997
diff changeset
14 inotify-client: could not start inotify server: child process failed to start
b98d931482e6 tests: unify test-inotify-issue1208
Matt Mackall <mpm@selenic.com>
parents: 6997
diff changeset
15 $ hg inserve
b98d931482e6 tests: unify test-inotify-issue1208
Matt Mackall <mpm@selenic.com>
parents: 6997
diff changeset
16 abort: inotify-server: cannot start: .hg/inotify.sock is a broken symlink
b98d931482e6 tests: unify test-inotify-issue1208
Matt Mackall <mpm@selenic.com>
parents: 6997
diff changeset
17 [255]
b98d931482e6 tests: unify test-inotify-issue1208
Matt Mackall <mpm@selenic.com>
parents: 6997
diff changeset
18 $ rm .hg/inotify.sock
6997
9c4e488f105e inotify: workaround ENAMETOOLONG by using symlinks
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 6996
diff changeset
19
12453
b98d931482e6 tests: unify test-inotify-issue1208
Matt Mackall <mpm@selenic.com>
parents: 6997
diff changeset
20 inserve
b98d931482e6 tests: unify test-inotify-issue1208
Matt Mackall <mpm@selenic.com>
parents: 6997
diff changeset
21
b98d931482e6 tests: unify test-inotify-issue1208
Matt Mackall <mpm@selenic.com>
parents: 6997
diff changeset
22 $ hg inserve -d --pid-file=hg.pid
b98d931482e6 tests: unify test-inotify-issue1208
Matt Mackall <mpm@selenic.com>
parents: 6997
diff changeset
23 $ cat hg.pid >> "$DAEMON_PIDS"
6997
9c4e488f105e inotify: workaround ENAMETOOLONG by using symlinks
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 6996
diff changeset
24
12453
b98d931482e6 tests: unify test-inotify-issue1208
Matt Mackall <mpm@selenic.com>
parents: 6997
diff changeset
25 status
b98d931482e6 tests: unify test-inotify-issue1208
Matt Mackall <mpm@selenic.com>
parents: 6997
diff changeset
26
b98d931482e6 tests: unify test-inotify-issue1208
Matt Mackall <mpm@selenic.com>
parents: 6997
diff changeset
27 $ hg status
b98d931482e6 tests: unify test-inotify-issue1208
Matt Mackall <mpm@selenic.com>
parents: 6997
diff changeset
28 ? hg.pid
12650
fed4bb2c8def inotify: raise correct error if server is already started in a deep repository
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12453
diff changeset
29
fed4bb2c8def inotify: raise correct error if server is already started in a deep repository
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12453
diff changeset
30 if we try to start twice the server, make sure we get a correct error
fed4bb2c8def inotify: raise correct error if server is already started in a deep repository
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12453
diff changeset
31
fed4bb2c8def inotify: raise correct error if server is already started in a deep repository
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12453
diff changeset
32 $ hg inserve -d --pid-file=hg2.pid
fed4bb2c8def inotify: raise correct error if server is already started in a deep repository
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12453
diff changeset
33 abort: inotify-server: cannot start: socket is already bound
fed4bb2c8def inotify: raise correct error if server is already started in a deep repository
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12453
diff changeset
34 abort: child process failed to start
fed4bb2c8def inotify: raise correct error if server is already started in a deep repository
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12453
diff changeset
35 [255]
12453
b98d931482e6 tests: unify test-inotify-issue1208
Matt Mackall <mpm@selenic.com>
parents: 6997
diff changeset
36 $ kill `cat hg.pid`