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
This commit is contained in:
Ivan Frade 2023-11-17 10:44:56 -08:00
parent 5552242588
commit 5e563e1ba1
2 changed files with 39 additions and 2 deletions

View File

@ -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;

View File

@ -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<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 Set<ObjectId> 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<AnyObjectId> getObjectsWithBitmapsFound() {
return Collections.unmodifiableSet(statistics.objectsWithBitmapsFound);
}
/**
* Get unmodifiable list of the cached packs that were reused in the output
*