Browse Source

Add bitmap index misses to PackWriter.Statistics

RevWalks to find commits that are not in bitmap indices are expensive.
Track the count of commits that are enumerated via RevWalks as "bitmap
index misses" in the PackWriter.Statistics class.

Change-Id: Ie0135a0a0aeba2dfb6df78839d545006629f16cb
Signed-off-by: Terry Parker <tparker@google.com>
stable-4.1
Terry Parker 10 years ago
parent
commit
0e8ac496cd
  1. 13
      org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriter.java
  2. 22
      org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriterBitmapWalker.java

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

@ -1591,6 +1591,7 @@ public class PackWriter implements AutoCloseable {
findObjectsToPackUsingBitmaps(bitmapWalker, want, have); findObjectsToPackUsingBitmaps(bitmapWalker, want, have);
endPhase(countingMonitor); endPhase(countingMonitor);
stats.timeCounting = System.currentTimeMillis() - countingStart; stats.timeCounting = System.currentTimeMillis() - countingStart;
stats.bitmapIndexMisses = bitmapWalker.getCountOfBitmapIndexMisses();
return; return;
} }
} }
@ -2084,6 +2085,8 @@ public class PackWriter implements AutoCloseable {
long totalObjects; long totalObjects;
long bitmapIndexMisses;
long totalDeltas; long totalDeltas;
long reusedObjects; long reusedObjects;
@ -2165,6 +2168,16 @@ public class PackWriter implements AutoCloseable {
return totalObjects; return totalObjects;
} }
/**
* @return the count of objects that needed to be discovered through an
* object walk because they were not found in bitmap indices.
*
* @since 4.0
*/
public long getBitmapIndexMisses() {
return bitmapIndexMisses;
}
/** /**
* @return total number of deltas output. This may be lower than the * @return total number of deltas output. This may be lower than the
* actual number of deltas if a cached pack was reused. * actual number of deltas if a cached pack was reused.

22
org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriterBitmapWalker.java

@ -71,6 +71,8 @@ final class PackWriterBitmapWalker {
private final ProgressMonitor pm; private final ProgressMonitor pm;
private long countOfBitmapIndexMisses;
PackWriterBitmapWalker( PackWriterBitmapWalker(
ObjectWalk walker, BitmapIndex bitmapIndex, ProgressMonitor pm) { ObjectWalk walker, BitmapIndex bitmapIndex, ProgressMonitor pm) {
this.walker = walker; this.walker = walker;
@ -78,6 +80,10 @@ final class PackWriterBitmapWalker {
this.pm = (pm == null) ? NullProgressMonitor.INSTANCE : pm; this.pm = (pm == null) ? NullProgressMonitor.INSTANCE : pm;
} }
long getCountOfBitmapIndexMisses() {
return countOfBitmapIndexMisses;
}
BitmapBuilder findObjects(Set<? extends ObjectId> start, BitmapBuilder seen, boolean ignoreMissingStart) BitmapBuilder findObjects(Set<? extends ObjectId> start, BitmapBuilder seen, boolean ignoreMissingStart)
throws MissingObjectException, IncorrectObjectTypeException, throws MissingObjectException, IncorrectObjectTypeException,
IOException { IOException {
@ -104,7 +110,8 @@ final class PackWriterBitmapWalker {
} }
if (marked) { if (marked) {
walker.setRevFilter(newRevFilter(seen, bitmapResult)); BitmapRevFilter filter = newRevFilter(seen, bitmapResult);
walker.setRevFilter(filter);
while (walker.next() != null) { while (walker.next() != null) {
// Iterate through all of the commits. The BitmapRevFilter does // Iterate through all of the commits. The BitmapRevFilter does
@ -117,6 +124,7 @@ final class PackWriterBitmapWalker {
bitmapResult.add(ro, ro.getType()); bitmapResult.add(ro, ro.getType());
pm.update(1); pm.update(1);
} }
countOfBitmapIndexMisses += filter.getCountOfLoadedCommits();
} }
return bitmapResult; return bitmapResult;
@ -126,7 +134,7 @@ final class PackWriterBitmapWalker {
walker.reset(); walker.reset();
} }
static RevFilter newRevFilter( static BitmapRevFilter newRevFilter(
final BitmapBuilder seen, final BitmapBuilder bitmapResult) { final BitmapBuilder seen, final BitmapBuilder bitmapResult) {
if (seen != null) { if (seen != null) {
return new BitmapRevFilter() { return new BitmapRevFilter() {
@ -146,12 +154,16 @@ final class PackWriterBitmapWalker {
} }
static abstract class BitmapRevFilter extends RevFilter { static abstract class BitmapRevFilter extends RevFilter {
private long countOfLoadedCommits;
protected abstract boolean load(RevCommit cmit); protected abstract boolean load(RevCommit cmit);
@Override @Override
public final boolean include(RevWalk walker, RevCommit cmit) { public final boolean include(RevWalk walker, RevCommit cmit) {
if (load(cmit)) if (load(cmit)) {
countOfLoadedCommits++;
return true; return true;
}
for (RevCommit p : cmit.getParents()) for (RevCommit p : cmit.getParents())
p.add(RevFlag.SEEN); p.add(RevFlag.SEEN);
return false; return false;
@ -166,5 +178,9 @@ final class PackWriterBitmapWalker {
public final boolean requiresCommitBody() { public final boolean requiresCommitBody() {
return false; return false;
} }
long getCountOfLoadedCommits() {
return countOfLoadedCommits;
}
} }
} }

Loading…
Cancel
Save