git-annex (8.20201008) UNRELEASED; urgency=medium
* Fix build on Windows with network-3.
+ * Fix a memory leak introduced in the last release.
-- Joey Hess <id@joeyh.name> Thu, 08 Oct 2020 10:48:17 -0400
import Control.Concurrent.Async
import System.Posix.Types
+import Data.IORef
data AnnexedFileSeeker = AnnexedFileSeeker
{ startAction :: SeekInput -> RawFilePath -> Key -> CommandStart
seekHelper :: (a -> RawFilePath) -> WarnUnmatchWhen -> ([LsFiles.Options] -> [RawFilePath] -> Git.Repo -> IO ([a], IO Bool)) -> WorkTreeItems -> Annex ([(SeekInput, a)], IO Bool)
seekHelper c ww a (WorkTreeItems l) = do
os <- seekOptions ww
- inRepo $ \g -> combinelists <$> forM (segmentXargsOrdered l)
- (runSegmentPaths' mk c (\fs -> a os fs g) . map toRawFilePath)
+ v <- liftIO $ newIORef []
+ r <- inRepo $ \g -> concat . concat <$> forM (segmentXargsOrdered l)
+ (runSegmentPaths' mk c (\fs -> go v os fs g) . map toRawFilePath)
+ return (r, cleanupall v)
where
mk (Just i) f = (SeekInput [fromRawFilePath i], f)
-- This is not accurate, but it only happens when there are a
-- great many input WorkTreeItems.
mk Nothing f = (SeekInput [fromRawFilePath (c f)], f)
- combinelists v =
- let r = concat $ concat $ map fst v
- cleanup = and <$> sequence (map snd v)
- in (r, cleanup)
+ go v os fs g = do
+ (l, cleanup) <- a os fs g
+ liftIO $ modifyIORef' v (cleanup:)
+ return l
+
+ cleanupall v = do
+ cleanups <- readIORef v
+ and <$> sequence cleanups
seekHelper _ _ _ NoWorkTreeItems = return ([], pure True)
data WarnUnmatchWhen = WarnUnmatchLsFiles | WarnUnmatchWorkTreeItems
- than it would be to run the action separately with each path. In
- the case of git file list commands, that assumption tends to hold.
-}
-runSegmentPaths :: (a -> RawFilePath) -> ([RawFilePath] -> IO ([a], v)) -> [RawFilePath] -> IO ([[a]], v)
-runSegmentPaths c a paths = do
- (l, cleanup) <- a paths
- return (segmentPaths c paths l, cleanup)
+runSegmentPaths :: (a -> RawFilePath) -> ([RawFilePath] -> IO [a]) -> [RawFilePath] -> IO [[a]]
+runSegmentPaths c a paths = segmentPaths c paths <$> a paths
-runSegmentPaths' :: (Maybe RawFilePath -> a -> r) -> (a -> RawFilePath) -> ([RawFilePath] -> IO ([a], v)) -> [RawFilePath] -> IO ([[r]], v)
-runSegmentPaths' si c a paths = do
- (l, cleanup) <- a paths
- return (segmentPaths' si c paths l, cleanup)
+runSegmentPaths' :: (Maybe RawFilePath -> a -> r) -> (a -> RawFilePath) -> ([RawFilePath] -> IO [a]) -> [RawFilePath] -> IO [[r]]
+runSegmentPaths' si c a paths = segmentPaths' si c paths <$> a paths
{- Converts paths in the home directory to use ~/ -}
relHome :: FilePath -> IO String
--- /dev/null
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 8"""
+ date="2020-10-13T19:52:50Z"
+ content="""
+[[!commit f624876dc21fed141eee368c86f4b209852ab91c]] is where seekHelper
+went bad. Fixed that.
+
+git-annex is still allocating 120 mb in this situation, though the
+profile now shows a max memory use of 4 mb. Still don't understand that, so
+this remains open.
+"""]]