summaryrefslogtreecommitdiff
path: root/Command
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2012-06-06 16:50:28 -0400
committerGravatar Joey Hess <joey@kitenet.net>2012-06-06 16:50:28 -0400
commitc5b11561f0110c70454b6123ab64ac044c81a5c3 (patch)
tree4cf94daeecb653b586b2b79e7388425fed9d6a3d /Command
parentdb8effb8f3e861c61bc4c640d712688a8ed342e1 (diff)
handle running out of watch descriptors
Diffstat (limited to 'Command')
-rw-r--r--Command/Watch.hs27
1 files changed, 27 insertions, 0 deletions
diff --git a/Command/Watch.hs b/Command/Watch.hs
index d6f77b6ae..dcd411d43 100644
--- a/Command/Watch.hs
+++ b/Command/Watch.hs
@@ -44,6 +44,7 @@ start = notBareRepo $ do
next $ next $ liftIO $ withINotify $ \i -> do
let hook a = Just $ runAnnex mvar a
watchDir i "." (ignored . takeFileName)
+ (hook onTooMany)
(hook onAdd) (hook onAddSymlink)
(hook onDel) (hook onDelDir)
putStrLn "(started)"
@@ -119,6 +120,32 @@ onDelDir :: FilePath -> Annex ()
onDelDir dir = inRepo $ Git.Command.run "rm"
[Params "--quiet -r --cached --ignore-unmatch --", File dir]
+{- There are too many directories for inotify to watch them all. -}
+onTooMany :: FilePath -> Annex ()
+onTooMany dir = do
+ sysctlval <- liftIO $ runsysctl [Param maxwatches]
+ warning $ unlines $
+ basewarning : maybe withoutsysctl withsysctl sysctlval
+ where
+ maxwatches = "fs.inotify.max_user_watches"
+ basewarning = "Too many directories to watch! (Not watching " ++ dir ++")"
+ withoutsysctl = ["Increase the value in /proc/sys/fs/inotify/max_user_watches"]
+ withsysctl n = let new = n * 10 in
+ [ "Increase the limit by running:"
+ , " echo " ++ maxwatches ++ "=" ++ show new ++
+ " | sudo tee -a /etc/sysctl.conf; sudo sysctl -p"
+ ]
+ runsysctl ps = do
+ v <- catchMaybeIO $ hPipeFrom "sysctl" $ toCommand ps
+ case v of
+ Nothing -> return Nothing
+ Just (pid, h) -> do
+ val <- parsesysctl <$> liftIO (hGetContentsStrict h)
+ void $ getProcessStatus True False $ processID pid
+ return val
+ parsesysctl :: String -> Maybe Integer
+ parsesysctl s = readish =<< lastMaybe (words s)
+
{- Adds a symlink to the index, without ever accessing the actual symlink
- on disk. -}
stageSymlink :: FilePath -> String -> Git.Repo -> IO ()