From 3118df84f037fe293ba60191b787c6605aa9877f Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Wed, 5 Mar 2014 18:26:53 -0400 Subject: assistant: Smarter log file rotation, which takes free disk space into account. --- Assistant/Threads/SanityChecker.hs | 19 +++++++++++++++---- debian/changelog | 2 ++ doc/bugs/Log_rotation_loses_large_logs.mdwn | 8 ++++++++ 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/Assistant/Threads/SanityChecker.hs b/Assistant/Threads/SanityChecker.hs index d7fe366e2..d7a71d477 100644 --- a/Assistant/Threads/SanityChecker.hs +++ b/Assistant/Threads/SanityChecker.hs @@ -38,6 +38,7 @@ import Assistant.Unused import Logs.Unused import Logs.Transfer import Config.Files +import Utility.DiskFree import qualified Annex #ifdef WITH_WEBAPP import Assistant.WebApp.Types @@ -203,17 +204,27 @@ hourlyCheck = do #endif #ifndef mingw32_HOST_OS -{- Rotate logs until log file size is < 1 mb. -} +{- Rotate logs once when total log file size is > 2 mb. + - + - If total log size is larger than the amount of free disk space, + - continue rotating logs until size is < 2 mb, even if this + - results in immediately losing the just logged data. + -} checkLogSize :: Int -> Assistant () checkLogSize n = do f <- liftAnnex $ fromRepo gitAnnexLogFile logs <- liftIO $ listLogs f totalsize <- liftIO $ sum <$> mapM filesize logs - when (totalsize > oneMegabyte) $ do + when (totalsize > 2 * oneMegabyte) $ do notice ["Rotated logs due to size:", show totalsize] liftIO $ openLog f >>= redirLog - when (n < maxLogs + 1) $ - checkLogSize $ n + 1 + when (n < maxLogs + 1) $ do + df <- liftIO $ getDiskFree $ takeDirectory f + case df of + Just free + | free < fromIntegral totalsize -> + checkLogSize (n + 1) + _ -> noop where filesize f = fromIntegral . fileSize <$> liftIO (getFileStatus f) diff --git a/debian/changelog b/debian/changelog index e3fa18572..80b310de2 100644 --- a/debian/changelog +++ b/debian/changelog @@ -30,6 +30,8 @@ git-annex (5.20140228) UNRELEASED; urgency=medium * webdav: When built with a new enough haskell DAV (0.6), disable the http response timeout, which was only 5 seconds. * webapp: Include no-pty in ssh authorized_keys lines. + * assistant: Smarter log file rotation, which takes free disk space + into account. -- Joey Hess Fri, 28 Feb 2014 14:52:15 -0400 diff --git a/doc/bugs/Log_rotation_loses_large_logs.mdwn b/doc/bugs/Log_rotation_loses_large_logs.mdwn index d1c14c0cc..c38c198b6 100644 --- a/doc/bugs/Log_rotation_loses_large_logs.mdwn +++ b/doc/bugs/Log_rotation_loses_large_logs.mdwn @@ -59,3 +59,11 @@ pgl@....:/....../.git/annex$ cat daemon.log.9 # End of transcript or log. """]] + +> Changed log rotation to only rotate 1 log per hour max, +> unless the total size of the log files is larger than the +> free disk space on the filesystem containing them. +> +> This way, runaway log growth will still be contained, +> but logs will generally rotate slowly enough to give plenty of time +> to see what's in them. [[done]] --[[Joey]] -- cgit v1.2.3