From 5e563e1ba1114b0c2dc316f0d7d162c9a0956f1b Mon Sep 17 00:00:00 2001 From: Ivan Frade Date: Fri, 17 Nov 2023 10:44:56 -0800 Subject: [PATCH] PackWriter: store the objects with bitmaps in the statistics 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 --- .../internal/storage/pack/PackWriter.java | 16 ++++++++++-- .../jgit/storage/pack/PackStatistics.java | 25 +++++++++++++++++++ 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriter.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriter.java index 6e02b36cc..742759825 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriter.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriter.java @@ -68,6 +68,7 @@ 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 @@ private void findObjectsToPack(@NonNull ProgressMonitor countingMonitor, 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; diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackStatistics.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackStatistics.java index 64a1eb2e1..7c8ed2433 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackStatistics.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackStatistics.java @@ -48,13 +48,16 @@ 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 static class Accumulator { /** Commits with no parents. */ public Set 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 objectsWithBitmapsFound = new HashSet<>(); + /** If a shallow pack, the depth in commits. */ public int depth; @@ -432,6 +445,18 @@ public Set getClientShallowCommits() { 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 getObjectsWithBitmapsFound() { + return Collections.unmodifiableSet(statistics.objectsWithBitmapsFound); + } + /** * Get unmodifiable list of the cached packs that were reused in the output *