aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Annex.hs6
-rw-r--r--Annex/CatFile.hs9
-rw-r--r--Remote/Git.hs6
-rw-r--r--debian/changelog3
4 files changed, 23 insertions, 1 deletions
diff --git a/Annex.hs b/Annex.hs
index b915e852b..a04bfd1bb 100644
--- a/Annex.hs
+++ b/Annex.hs
@@ -15,6 +15,7 @@ module Annex (
eval,
getState,
changeState,
+ withState,
setFlag,
setField,
setOutput,
@@ -214,6 +215,11 @@ changeState modifier = do
mvar <- ask
liftIO $ modifyMVar_ mvar $ return . modifier
+withState :: (AnnexState -> (AnnexState, b)) -> Annex b
+withState modifier = do
+ mvar <- ask
+ liftIO $ modifyMVar mvar $ return . modifier
+
{- Sets a flag to True -}
setFlag :: String -> Annex ()
setFlag flag = changeState $ \s ->
diff --git a/Annex/CatFile.hs b/Annex/CatFile.hs
index 2f8c43079..8b4d746e1 100644
--- a/Annex/CatFile.hs
+++ b/Annex/CatFile.hs
@@ -12,6 +12,7 @@ module Annex.CatFile (
catTree,
catObjectDetails,
catFileHandle,
+ catFileStop,
catKey,
catKeyFile,
catKeyFileHEAD,
@@ -71,6 +72,14 @@ catFileHandle = do
Annex.changeState $ \s -> s { Annex.catfilehandles = m' }
return h
+{- Stops all running cat-files. Should only be run when it's known that
+ - nothing is using the handles, eg at shutdown. -}
+catFileStop :: Annex ()
+catFileStop = do
+ m <- Annex.withState $ \s ->
+ (s { Annex.catfilehandles = M.empty }, Annex.catfilehandles s)
+ liftIO $ mapM_ Git.CatFile.catFileStop (M.elems m)
+
{- From the Sha or Ref of a symlink back to the key.
-
- Requires a mode witness, to guarantee that the file is a symlink.
diff --git a/Remote/Git.hs b/Remote/Git.hs
index 5416a5cda..db5b2fbd0 100644
--- a/Remote/Git.hs
+++ b/Remote/Git.hs
@@ -51,6 +51,7 @@ import qualified Remote.Helper.Ssh as Ssh
import qualified Remote.GCrypt
import Config.Files
import Creds
+import Annex.CatFile
import Control.Concurrent
import Control.Concurrent.MSampleVar
@@ -500,6 +501,8 @@ repairRemote r a = return $ do
{- Runs an action from the perspective of a local remote.
-
- The AnnexState is cached for speed and to avoid resource leaks.
+ - However, catFileStop is called to avoid git-cat-file processes hanging
+ - around on removable media.
-
- The repository's git-annex branch is not updated, as an optimisation.
- No caller of onLocal can query data from the branch and be ensured
@@ -520,7 +523,8 @@ onLocal r a = do
cache st = Annex.changeState $ \s -> s
{ Annex.remoteannexstate = M.insert (uuid r) st (Annex.remoteannexstate s) }
go st a' = do
- (ret, st') <- liftIO $ Annex.run st a'
+ (ret, st') <- liftIO $ Annex.run st $
+ catFileStop `after` a'
cache st'
return ret
diff --git a/debian/changelog b/debian/changelog
index 2e2200696..9e5dfcf8c 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -3,6 +3,9 @@ git-annex (5.20140818) UNRELEASED; urgency=medium
* Make --help work when not in a git repository. Closes: #758592
* Ensure that all lock fds are close-on-exec, fixing various problems with
them being inherited by child processes such as git commands.
+ * When accessing a local remote, shut down git-cat-file processes
+ afterwards, to ensure that remotes on removable media can be unmounted.
+ Closes: #758630
-- Joey Hess <joeyh@debian.org> Tue, 19 Aug 2014 12:52:41 -0400