locking in checkLiveUpdate
This makes sure that two threads don't check balanced preferred content at the same time, so each thread always sees a consistent picture of what is happening. This does add a fairly expensive file level lock to every check of preferred content, in commands that use prepareLiveUpdate. It would be good to only do that when live updates are actually needed, eg when the preferred content expression uses balanced preferred content.
This commit is contained in:
parent
4d2f95853d
commit
8555fb88ef
3 changed files with 35 additions and 22 deletions
|
@ -15,8 +15,6 @@ import qualified Database.RepoSize as Db
|
|||
import Annex.UUID
|
||||
|
||||
import Control.Concurrent
|
||||
import qualified Data.Map.Strict as M
|
||||
import qualified Data.Set as S
|
||||
import System.Process
|
||||
|
||||
{- Called when a location log change is journalled, so the LiveUpdate
|
||||
|
@ -93,15 +91,21 @@ needLiveUpdate lu = liftIO $ void $ tryPutMVar (liveUpdateNeeded lu) ()
|
|||
--
|
||||
-- This can be called more than once on the same LiveUpdate. It will
|
||||
-- only start it once.
|
||||
--
|
||||
-- This serializes calls to the action, so that if the action
|
||||
-- queries getLiveRepoSizes it will not race with another such action
|
||||
-- that may also be starting a live update.
|
||||
checkLiveUpdate :: LiveUpdate -> Annex Bool -> Annex Bool
|
||||
checkLiveUpdate NoLiveUpdate a = a
|
||||
checkLiveUpdate lu a = do
|
||||
r <- a
|
||||
needed <- liftIO $ isJust <$> tryTakeMVar (liveUpdateNeeded lu)
|
||||
when (r && needed) $ do
|
||||
liftIO $ void $ tryPutMVar (liveUpdateStart lu) ()
|
||||
liftIO $ void $ readMVar (liveUpdateReady lu)
|
||||
return r
|
||||
checkLiveUpdate lu a = Db.lockDbWhile (const go) go
|
||||
where
|
||||
go = do
|
||||
r <- a
|
||||
needed <- liftIO $ isJust <$> tryTakeMVar (liveUpdateNeeded lu)
|
||||
when (r && needed) $ do
|
||||
liftIO $ void $ tryPutMVar (liveUpdateStart lu) ()
|
||||
liftIO $ void $ readMVar (liveUpdateReady lu)
|
||||
return r
|
||||
|
||||
finishedLiveUpdate :: LiveUpdate -> UUID -> Key -> SizeChange -> IO ()
|
||||
finishedLiveUpdate NoLiveUpdate _ _ _ = noop
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue