claw back annexed file scan speedup
authorJoey Hess <joeyh@joeyh.name>
Tue, 8 Jun 2021 15:09:15 +0000 (11:09 -0400)
committerJoey Hess <joeyh@joeyh.name>
Tue, 8 Jun 2021 15:09:15 +0000 (11:09 -0400)
Following commit c941ab6f5b98becfa2880cb69cbc2c4a39057cd9, this avoids
the second, redundant scan when annex.thin is not set.

The benchmark now runs in 35.5 seconds, down from 40 seconds.

Note that the inode cache of the annex object has to be passed to
addInodeCaches now, because it might not already be in the inode caches,
unlike previously.

Sponsored-by: Dartmouth College's Datalad project
Annex/WorkTree.hs
Database/Keys.hs

index 30e7366396d5005d42471fc325f3ab300a19992d..ac9c49b27d43fd56f63541923481624a3ed41682 100644 (file)
@@ -86,15 +86,16 @@ scanAnnexedFiles = whenM (inRepo Git.Ref.headExists <&&> not <$> isBareRepo) $ d
        -- The above tries to populate pointer files, but one thing it
        -- is not able to handle is populating a pointer file when the
        -- annex object file already exists, but its inode is not yet
-       -- cached. So, the rest of this makes another pass over the
-       -- tree to do that.
-       g <- Annex.gitRepo
-       (l, cleanup) <- inRepo $ Git.LsTree.lsTree
-               Git.LsTree.LsTreeRecursive
-               (Git.LsTree.LsTreeLong True)
-               Git.Ref.headRef
-       catObjectStreamLsTree l want g go
-       liftIO $ void cleanup
+       -- cached and annex.thin is set. So, the rest of this makes
+       -- another pass over the tree to do that.
+       whenM (annexThin <$> Annex.getGitConfig) $ do
+               g <- Annex.gitRepo
+               (l, cleanup) <- inRepo $ Git.LsTree.lsTree
+                       Git.LsTree.LsTreeRecursive
+                       (Git.LsTree.LsTreeLong True)
+                       Git.Ref.headRef
+               catObjectStreamLsTree l want g go
+               liftIO $ void cleanup
   where
        -- Want to process symlinks, and regular files.
        want i = case Git.Types.toTreeItemType (Git.LsTree.mode i) of
index ac8aa7f5bd3493c5cdd17cb991e06ab8dcdfb596..aca13f94e254903308e7abc5b5e430cffda43c71 100644 (file)
@@ -362,17 +362,25 @@ reconcileStaged qh = do
        procmergeconflictdiff _ _ conflicted = return conflicted
 
        reconcilepointerfile file key = do
-               caches <- liftIO $ SQL.getInodeCaches key (SQL.ReadHandle qh)
-               keyloc <- calcRepo (gitAnnexLocation key)
-               keypopulated <- sameInodeCache keyloc caches
+               ics <- liftIO $ SQL.getInodeCaches key (SQL.ReadHandle qh)
+               obj <- calcRepo (gitAnnexLocation key)
+               objic <- withTSDelta (liftIO . genInodeCache obj)
+               -- Like inAnnex, check the annex object's inode cache
+               -- when annex.thin is set.
+               keypopulated <- ifM (annexThin <$> Annex.getGitConfig)
+                       ( maybe (pure False) (`elemInodeCaches` ics) objic
+                       , pure (isJust objic)
+                       )
                p <- fromRepo $ fromTopFilePath file
-               filepopulated <- sameInodeCache p caches
+               filepopulated <- sameInodeCache p ics
                case (keypopulated, filepopulated) of
                        (True, False) ->
-                               populatePointerFile (Restage True) key keyloc p >>= \case
+                               populatePointerFile (Restage True) key obj p >>= \case
                                        Nothing -> return ()
                                        Just ic -> liftIO $
-                                               SQL.addInodeCaches key [ic] (SQL.WriteHandle qh)
+                                               SQL.addInodeCaches key
+                                                       (catMaybes [Just ic, objic])
+                                                       (SQL.WriteHandle qh)
                        (False, True) -> depopulatePointerFile key p
                        _ -> return ()