Mercurial > hg
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 |
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` |