]> source.dussan.org Git - jgit.git/commitdiff
PackWriter: store the objects with bitmaps in the statistics 04/205504/17
authorIvan Frade <ifrade@google.com>
Fri, 17 Nov 2023 18:44:56 +0000 (10:44 -0800)
committerIvan Frade <ifrade@google.com>
Thu, 30 Nov 2023 19:58:32 +0000 (11:58 -0800)
We want to know what objects had bitmaps in the walk of the
request. We can check their position in the history and evaluate
our bitmap selection algorithm.

Use the listener interface of the BitmapWalker to get the objects
walked with bitmaps and store them in the statistics.

Change-Id: Id15a904eb642d7f50d80ac77d1146db4fe4706eb

org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriter.java
org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackStatistics.java

index 6e02b36ccb4dec17cf06c6488ae22632c7da9fd1..7427598257537dab9f4304f46aeb77582f7b38e9 100644 (file)
@@ -68,6 +68,7 @@ import org.eclipse.jgit.lib.AsyncObjectSizeQueue;
 import org.eclipse.jgit.lib.BatchingProgressMonitor;
 import org.eclipse.jgit.lib.BitmapIndex;
 import org.eclipse.jgit.lib.BitmapIndex.BitmapBuilder;
+import org.eclipse.jgit.lib.BitmapIndex.BitmapLookupListener;
 import org.eclipse.jgit.lib.BitmapObject;
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.NullProgressMonitor;
@@ -2029,8 +2030,19 @@ public class PackWriter implements AutoCloseable {
                if (!shallowPack && useBitmaps) {
                        BitmapIndex bitmapIndex = reader.getBitmapIndex();
                        if (bitmapIndex != null) {
-                               BitmapWalker bitmapWalker = new BitmapWalker(
-                                               walker, bitmapIndex, countingMonitor);
+                               bitmapIndex.addBitmapLookupListener(new BitmapLookupListener() {
+                                       @Override
+                                       public void onBitmapFound(AnyObjectId oid) {
+                                               stats.objectsWithBitmapsFound.add(oid);
+                                       }
+
+                                       @Override
+                                       public void onBitmapNotFound(AnyObjectId oid) {
+                                               // Nothing to do
+                                       }
+                               });
+                               BitmapWalker bitmapWalker = new BitmapWalker(walker,
+                                               bitmapIndex, countingMonitor);
                                findObjectsToPackUsingBitmaps(bitmapWalker, want, have);
                                endPhase(countingMonitor);
                                stats.timeCounting = System.currentTimeMillis() - countingStart;
index 64a1eb2e1a1f9917926c96cf95af857c6e4bda42..7c8ed2433055879b2ddfcd466eedec06caaf30c0 100644 (file)
@@ -48,13 +48,16 @@ import static org.eclipse.jgit.lib.Constants.OBJ_TAG;
 import static org.eclipse.jgit.lib.Constants.OBJ_TREE;
 
 import java.text.MessageFormat;
+import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
 import org.eclipse.jgit.internal.JGitText;
 import org.eclipse.jgit.internal.storage.pack.CachedPack;
+import org.eclipse.jgit.lib.AnyObjectId;
 import org.eclipse.jgit.lib.ObjectId;
 
 /**
@@ -232,6 +235,16 @@ public class PackStatistics {
                /** Commits with no parents. */
                public Set<ObjectId> rootCommits;
 
+               /**
+                * Set of objects with bitmap hit when finding objects to pack.
+                *
+                * The size of this set plus {@link #bitmapIndexMisses} should be the
+                * walked size of the graph
+                *
+                * @since 6.9
+                */
+               public Set<AnyObjectId> objectsWithBitmapsFound = new HashSet<>();
+
                /** If a shallow pack, the depth in commits. */
                public int depth;
 
@@ -432,6 +445,18 @@ public class PackStatistics {
                return statistics.clientShallowCommits;
        }
 
+       /**
+        * Get unmodifiable collection of objects walked in the request that had a
+        * bitmap.
+        *
+        * @return ummodifiable collection of objects that had a bitmap attached
+        *
+        * @since 6.9
+        */
+       public Set<AnyObjectId> getObjectsWithBitmapsFound() {
+               return Collections.unmodifiableSet(statistics.objectsWithBitmapsFound);
+       }
+
        /**
         * Get unmodifiable list of the cached packs that were reused in the output
         *