]> dgit.raspbian.org Git - git-annex.git/commitdiff
update Annex.reposizes when changing location logs
authorJoey Hess <joeyh@joeyh.name>
Thu, 15 Aug 2024 17:27:14 +0000 (13:27 -0400)
committerJoey Hess <joeyh@joeyh.name>
Thu, 15 Aug 2024 17:27:14 +0000 (13:27 -0400)
The live update is only needed when Annex.reposizes has already been
populated.

Annex/Branch.hs
Annex/RepoSize.hs
Annex/RepoSize/LiveUpdate.hs [new file with mode: 0644]
Logs/ContentIdentifier.hs
Logs/Location.hs
Logs/Presence.hs
doc/todo/git-annex_proxies.mdwn
git-annex.cabal

index d75b8f249bb5ad98d8777ca84bb60b24c80ffd5f..8afe6f99128d7802d4aac8966d03ea24002a8ed9 100644 (file)
@@ -410,15 +410,21 @@ getRef ref file = withIndex $ catFile ref file
 change :: Journalable content => RegardingUUID -> RawFilePath -> (L.ByteString -> content) -> Annex ()
 change ru file f = lockJournal $ \jl -> f <$> getToChange ru file >>= set jl ru file
 
-{- Applies a function which can modify the content of a file, or not. -}
-maybeChange :: Journalable content => RegardingUUID -> RawFilePath -> (L.ByteString -> Maybe content) -> Annex ()
+{- Applies a function which can modify the content of a file, or not.
+ -
+ - Returns True when the file was modified. -}
+maybeChange :: Journalable content => RegardingUUID -> RawFilePath -> (L.ByteString -> Maybe content) -> Annex Bool
 maybeChange ru file f = lockJournal $ \jl -> do
        v <- getToChange ru file
        case f v of
                Just jv ->
                        let b = journalableByteString jv
-                       in when (v /= b) $ set jl ru file b
-               _ -> noop
+                       in if v /= b
+                               then do
+                                       set jl ru file b
+                                       return True
+                               else return False
+               _ -> return False
 
 data ChangeOrAppend t = Change t | Append t
 
index dac089a96200b9a5046301e2a102a16db60c0d56..d9fa13794da7a9c4ece8120efb7acf4a76a35a21 100644 (file)
@@ -12,6 +12,7 @@ module Annex.RepoSize (
 ) where
 
 import Annex.Common
+import Annex.RepoSize.LiveUpdate
 import qualified Annex
 import Annex.Branch (UnmergedBranches(..), getBranch)
 import Types.RepoSize
@@ -86,17 +87,3 @@ journalledRepoSizes startmap branchsha =
        accumsizes k (newlocs, removedlocs) m = return $
                let m' = foldl' (flip $ M.alter $ addKeyRepoSize k) m newlocs
                in foldl' (flip $ M.alter $ removeKeyRepoSize k) m' removedlocs
-
-addKeyRepoSize :: Key -> Maybe RepoSize -> Maybe RepoSize
-addKeyRepoSize k mrs = case mrs of
-       Just (RepoSize sz) -> Just $ RepoSize $ sz + ksz
-       Nothing -> Just $ RepoSize ksz
-  where
-       ksz = fromMaybe 0 $ fromKey keySize k
-
-removeKeyRepoSize :: Key -> Maybe RepoSize -> Maybe RepoSize
-removeKeyRepoSize k mrs = case mrs of
-       Just (RepoSize sz) -> Just $ RepoSize $ sz - ksz
-       Nothing -> Nothing
-  where
-       ksz = fromMaybe 0 $ fromKey keySize k
diff --git a/Annex/RepoSize/LiveUpdate.hs b/Annex/RepoSize/LiveUpdate.hs
new file mode 100644 (file)
index 0000000..d9a7d6c
--- /dev/null
@@ -0,0 +1,46 @@
+{- git-annex repo sizes, live updates
+ -
+ - Copyright 2024 Joey Hess <id@joeyh.name>
+ -
+ - Licensed under the GNU AGPL version 3 or higher.
+ -}
+
+{-# LANGUAGE BangPatterns #-}
+
+module Annex.RepoSize.LiveUpdate where
+
+import Annex.Common
+import qualified Annex
+import Types.RepoSize
+import Logs.Presence.Pure
+
+import qualified Data.Map.Strict as M
+
+updateRepoSize :: UUID -> Key -> LogStatus -> Annex ()
+updateRepoSize u k s = Annex.getState Annex.reposizes >>= \case
+       Nothing -> noop
+       Just sizemap -> do
+               let !sizemap' = M.adjust 
+                       (fromMaybe (RepoSize 0) . f k . Just)
+                       u sizemap
+               Annex.changeState $ \st -> st
+                       { Annex.reposizes = Just sizemap' }
+  where
+       f = case s of
+               InfoPresent -> addKeyRepoSize
+               InfoMissing -> removeKeyRepoSize
+               InfoDead -> removeKeyRepoSize
+
+addKeyRepoSize :: Key -> Maybe RepoSize -> Maybe RepoSize
+addKeyRepoSize k mrs = case mrs of
+       Just (RepoSize sz) -> Just $ RepoSize $ sz + ksz
+       Nothing -> Just $ RepoSize ksz
+  where
+       ksz = fromMaybe 0 $ fromKey keySize k
+
+removeKeyRepoSize :: Key -> Maybe RepoSize -> Maybe RepoSize
+removeKeyRepoSize k mrs = case mrs of
+       Just (RepoSize sz) -> Just $ RepoSize $ sz - ksz
+       Nothing -> Nothing
+  where
+       ksz = fromMaybe 0 $ fromKey keySize k
index 6448693ae7c613a097e6c5f293230f2196db29a6..bf8fef5b2e9016e99b4cbc678a8e947e5c5a587b 100644 (file)
@@ -32,7 +32,7 @@ recordContentIdentifier :: RemoteStateHandle -> ContentIdentifier -> Key -> Anne
 recordContentIdentifier (RemoteStateHandle u) cid k = do
        c <- currentVectorClock
        config <- Annex.getGitConfig
-       Annex.Branch.maybeChange
+       void $ Annex.Branch.maybeChange
                (Annex.Branch.RegardingUUID [u])
                (remoteContentIdentifierLogFile config k)
                (addcid c . parseLog)
index 73c1c5fe481e52ad55d29ece2a5243a6715e7b73..78ad36d60a196d512ed1c581cbea103f9c40f2bb 100644 (file)
@@ -40,6 +40,7 @@ module Logs.Location (
 import Annex.Common
 import qualified Annex.Branch
 import Annex.Branch (FileContents)
+import Annex.RepoSize.LiveUpdate
 import Logs
 import Logs.Presence
 import Types.Cluster
@@ -81,11 +82,13 @@ logChange key u@(UUID _) s
        | isClusterUUID u = noop
        | otherwise = do
                config <- Annex.getGitConfig
-               maybeAddLog
+               changed <- maybeAddLog
                        (Annex.Branch.RegardingUUID [u])
                        (locationLogFile config key)
                        s
                        (LogInfo (fromUUID u))
+               when changed $
+                       updateRepoSize u key s
 logChange _ NoUUID _ = noop
 
 {- Returns a list of repository UUIDs that, according to the log, have
@@ -162,14 +165,15 @@ setDead key = do
        ls <- compactLog <$> readLog logfile
        mapM_ (go logfile) (filter (\l -> status l == InfoMissing) ls)
   where
-       go logfile l = 
+       go logfile l = do
                let u = toUUID (fromLogInfo (info l))
                    c = case date l of
                        VectorClock v -> CandidateVectorClock $
                                v + realToFrac (picosecondsToDiffTime 1)
                        Unknown -> CandidateVectorClock 0
-               in addLog' (Annex.Branch.RegardingUUID [u]) logfile InfoDead
+               addLog' (Annex.Branch.RegardingUUID [u]) logfile InfoDead
                        (info l) c
+               updateRepoSize u key InfoDead
 
 data Unchecked a = Unchecked (Annex (Maybe a))
 
index 5c8dcdb3437c7d27aece79cf0a5613b2b46765bb..6763e4676acdf46b7aa5f373894686bf0551b942 100644 (file)
@@ -49,8 +49,10 @@ addLog' ru file logstatus loginfo c =
 {- When a LogLine already exists with the same status and info, but an
  - older timestamp, that LogLine is preserved, rather than updating the log
  - with a newer timestamp.
+ -
+ - Returns True when the log was changed.
  -}
-maybeAddLog :: Annex.Branch.RegardingUUID -> RawFilePath -> LogStatus -> LogInfo -> Annex ()
+maybeAddLog :: Annex.Branch.RegardingUUID -> RawFilePath -> LogStatus -> LogInfo -> Annex Bool
 maybeAddLog ru file logstatus loginfo = do
        c <- currentVectorClock
        Annex.Branch.maybeChange ru file $ \b ->
index 89edd2bb71933ba510481adbca0ce737f038ced9..b60822aee5e8c0c35b282c64e2866cb4643abeed 100644 (file)
@@ -32,11 +32,6 @@ Planned schedule of work:
 
 * Implement [[track_free_space_in_repos_via_git-annex_branch]]:
 
-  * Update Annex.reposizes in Logs.Location.logChange,
-    when it makes a change and when Annex.reposizes has a size
-    for the UUID. So Annex.reposizes is kept up-to-date
-    for each transfer and drop.
-
   * When calling journalledRepoSizes make sure that the current
     process is prevented from making changes to the journal in another
     thread. Probably lock the journal? (No need to worry about changes made
index b54a55c7a649d4179cee3d4c868eb3c58b110a04..ce5aa132daa4f6d3657e463c85502a59780f71ba 100644 (file)
@@ -575,6 +575,7 @@ Executable git-annex
     Annex.ReplaceFile
     Annex.RemoteTrackingBranch
     Annex.RepoSize
+    Annex.RepoSize.LiveUpdate
     Annex.SafeDropProof
     Annex.SpecialRemote
     Annex.SpecialRemote.Config