summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2014-03-05 18:26:53 -0400
committerGravatar Joey Hess <joey@kitenet.net>2014-03-05 18:26:53 -0400
commit3118df84f037fe293ba60191b787c6605aa9877f (patch)
treeac75ab92189a1a95e2f6b21fd3e628ee91c2c9d6
parentb21d58eaf55608f4e49b2615319b900d29b9c32f (diff)
assistant: Smarter log file rotation, which takes free disk space into account.
-rw-r--r--Assistant/Threads/SanityChecker.hs19
-rw-r--r--debian/changelog2
-rw-r--r--doc/bugs/Log_rotation_loses_large_logs.mdwn8
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 <joeyh@debian.org> 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]]