Improve pid locking code to work on filesystems that don't support hard links.

Probing for hard link support in the pid locking code is redundant since
git-annex init already probes that. But, it didn't seem worth threading
that data through; the pid locking code runs at most once per git-annex
process, and only on unusual filesystems. Optimising a single hard link
and unlink isn't worth it.

This commit was sponsored by Francois Marier on Patreon.
This commit is contained in:
Joey Hess 2017-02-10 15:21:58 -04:00
parent 913b3b51e3
commit 5e6ced7d0f
No known key found for this signature in database
GPG key ID: C910D9222512E3C7
3 changed files with 36 additions and 5 deletions
CHANGELOG
Utility/LockFile
doc/forum/git_annex_init_timeout

View file

@ -49,6 +49,8 @@ git-annex (6.20170102) UNRELEASED; urgency=medium
* import: Added --reinject-duplicates.
* Added git template directory to Linux standalone tarball and OSX
app bundle.
* Improve pid locking code to work on filesystems that don't support hard
links.
-- Joey Hess <id@joeyh.name> Fri, 06 Jan 2017 15:22:06 -0400

View file

@ -150,14 +150,30 @@ tryLock lockfile = trySideLock lockfile $ \sidelock -> do
-- open(2) suggests that link can sometimes appear to fail
-- on NFS but have actually succeeded, and the way to find out is to stat
-- the file and check its link count etc.
--
-- However, not all filesystems support hard links. So, first probe
-- to see if they are supported. If not, use open with O_EXCL.
linkToLock :: SideLockHandle -> FilePath -> FilePath -> IO Bool
linkToLock Nothing _ _ = return False
linkToLock (Just _) src dest = do
_ <- tryIO $ createLink src dest
ifM (catchBoolIO checklinked)
( catchBoolIO $ not <$> checkInsaneLustre dest
, return False
)
let probe = src ++ ".lnk"
v <- tryIO $ createLink src probe
nukeFile probe
case v of
Right _ -> do
_ <- tryIO $ createLink src dest
ifM (catchBoolIO checklinked)
( catchBoolIO $ not <$> checkInsaneLustre dest
, return False
)
Left _ -> catchBoolIO $ do
fd <- openFd dest WriteOnly
(Just $ combineModes readModes)
(defaultFileFlags {exclusive = True})
h <- fdToHandle fd
readFile src >>= hPutStr h
hClose h
return True
where
checklinked = do
x <- getSymbolicLinkStatus src

View file

@ -0,0 +1,13 @@
[[!comment format=mdwn
username="joey"
subject="""comment 2"""
date="2017-02-10T18:52:59Z"
content="""
I was able to reproduce the problem with a FAT filesystem
mounted on Linux, if I manually enabled annex.pidlock
before git-annex init. Hard linking does not work on FAT, so that
matches my earlier guess.
I've committed a fix for this, so try again with a recent autobuild of
git-annex and it will probably fix your problem.
"""]]