fix assistant's use of lsof in crippled filesystem mode

This commit is contained in:
Joey Hess 2013-02-15 13:08:22 -04:00
parent a988b90826
commit 630f4531a7
2 changed files with 21 additions and 12 deletions

View file

@ -240,8 +240,7 @@ handleAdds delayadd cs = returnWhen (null incomplete) $ do
{- Files can Either be Right to be added now,
- or are unsafe, and must be Left for later.
-
- Check by running lsof on the temp directory, which
- the KeySources are locked down in.
- Check by running lsof on the repository.
-}
safeToAdd :: Maybe Seconds -> [Change] -> [Change] -> Assistant [Either Change Change]
safeToAdd _ [] [] = return []
@ -249,12 +248,12 @@ safeToAdd delayadd pending inprocess = do
maybe noop (liftIO . threadDelaySeconds) delayadd
liftAnnex $ do
keysources <- mapM Command.Add.lockDown (map changeFile pending)
let inprocess' = catMaybes $
map mkinprocess (zip pending keysources)
tmpdir <- fromRepo gitAnnexTmpDir
let inprocess' = inprocess ++ catMaybes (map mkinprocess $ zip pending keysources)
openfiles <- S.fromList . map fst3 . filter openwrite <$>
liftIO (Lsof.queryDir tmpdir)
let checked = map (check openfiles) $ inprocess ++ inprocess'
findopenfiles (map keySource inprocess')
liftIO $ print openfiles
let checked = map (check openfiles) inprocess'
liftIO $ print checked
{- If new events are received when files are closed,
- there's no need to retry any changes that cannot
@ -290,3 +289,18 @@ safeToAdd delayadd pending inprocess = do
| otherwise = False
allRight = return . map Right
{- Normally the KeySources are locked down inside the temp directory,
- so can just lsof that, which is quite efficient.
-
- In crippled filesystem mode, there is no lock down, so must run lsof
- on each individual file.
-}
findopenfiles keysources = ifM crippledFileSystem
( liftIO $ do
let segments = segmentXargs $ map keyFilename keysources
concat <$> forM segments (\fs -> Lsof.query $ "--" : fs)
, do
tmpdir <- fromRepo gitAnnexTmpDir
liftIO $ Lsof.queryDir tmpdir
)

View file

@ -20,11 +20,6 @@ is probably needed for at least older Android devices that have SD cards.
## TODO
* In crippled filesystem mode, files are not hardlinked to a quarantine
directory, so the assistant's use of lsof on that directory won't work.
Instead, it should run lsof on the whole repository, and ignore other
stuff. (Not really much slower even in a large repo, according to
benchmarks.)
* rsync backend creates hard links
* migrate creates hard links between old and new keys
* avoid all symlink creation in crippled filesystem + direct mode