assistant: More robust inotify handling; avoid crashing if a directory cannot be read.
This commit is contained in:
parent
87c7f5dd62
commit
6b37fcffd8
3 changed files with 16 additions and 6 deletions
|
@ -54,11 +54,12 @@ watchDir i dir ignored hooks
|
|||
-- scan come before real inotify events.
|
||||
lock <- newLock
|
||||
let handler event = withLock lock (void $ go event)
|
||||
void (addWatch i watchevents dir handler)
|
||||
`catchIO` failedaddwatch
|
||||
withLock lock $
|
||||
mapM_ scan =<< filter (not . dirCruft) <$>
|
||||
getDirectoryContents dir
|
||||
flip catchNonAsync failedwatch $ do
|
||||
void (addWatch i watchevents dir handler)
|
||||
`catchIO` failedaddwatch
|
||||
withLock lock $
|
||||
mapM_ scan =<< filter (not . dirCruft) <$>
|
||||
getDirectoryContents dir
|
||||
where
|
||||
recurse d = watchDir i d ignored hooks
|
||||
|
||||
|
@ -149,12 +150,14 @@ watchDir i dir ignored hooks
|
|||
-- disk full error.
|
||||
| isFullError e =
|
||||
case errHook hooks of
|
||||
Nothing -> throw e
|
||||
Nothing -> error $ "failed to add inotify watch on directory " ++ dir ++ " (" ++ show e ++ ")"
|
||||
Just hook -> tooManyWatches hook dir
|
||||
-- The directory could have been deleted.
|
||||
| isDoesNotExistError e = return ()
|
||||
| otherwise = throw e
|
||||
|
||||
failedwatch e = hPutStrLn stderr $ "failed to add watch on directory " ++ dir ++ " (" ++ show e ++ ")"
|
||||
|
||||
tooManyWatches :: (String -> Maybe FileStatus -> IO ()) -> FilePath -> IO ()
|
||||
tooManyWatches hook dir = do
|
||||
sysctlval <- querySysctl [Param maxwatches] :: IO (Maybe Integer)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue