]> source.dussan.org Git - jgit.git/commitdiff
Add bitmap index misses to PackWriter.Statistics 92/48692/3
authorTerry Parker <tparker@google.com>
Tue, 12 May 2015 00:37:02 +0000 (17:37 -0700)
committerTerry Parker <tparker@google.com>
Tue, 26 May 2015 21:37:17 +0000 (14:37 -0700)
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>
org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriter.java
org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriterBitmapWalker.java

index 8fac907270ca3fed7ca5b652868b66b3a4ba2bef..adc6bf11ab36f1c4babe68b99bda49c61fa0db43 100644 (file)
@@ -1591,6 +1591,7 @@ public class PackWriter implements AutoCloseable {
                                findObjectsToPackUsingBitmaps(bitmapWalker, want, have);
                                endPhase(countingMonitor);
                                stats.timeCounting = System.currentTimeMillis() - countingStart;
+                               stats.bitmapIndexMisses = bitmapWalker.getCountOfBitmapIndexMisses();
                                return;
                        }
                }
@@ -2084,6 +2085,8 @@ public class PackWriter implements AutoCloseable {
 
                long totalObjects;
 
+               long bitmapIndexMisses;
+
                long totalDeltas;
 
                long reusedObjects;
@@ -2165,6 +2168,16 @@ public class PackWriter implements AutoCloseable {
                        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
                 *         actual number of deltas if a cached pack was reused.
index 63a91cd82d4449a39cb4838fba695add3866cd93..debb2f2abc18e2b415b6c468317d060170f878dc 100644 (file)
@@ -71,6 +71,8 @@ final class PackWriterBitmapWalker {
 
        private final ProgressMonitor pm;
 
+       private long countOfBitmapIndexMisses;
+
        PackWriterBitmapWalker(
                        ObjectWalk walker, BitmapIndex bitmapIndex, ProgressMonitor pm) {
                this.walker = walker;
@@ -78,6 +80,10 @@ final class PackWriterBitmapWalker {
                this.pm = (pm == null) ? NullProgressMonitor.INSTANCE : pm;
        }
 
+       long getCountOfBitmapIndexMisses() {
+               return countOfBitmapIndexMisses;
+       }
+
        BitmapBuilder findObjects(Set<? extends ObjectId> start, BitmapBuilder seen, boolean ignoreMissingStart)
                        throws MissingObjectException, IncorrectObjectTypeException,
                        IOException {
@@ -104,7 +110,8 @@ final class PackWriterBitmapWalker {
                }
 
                if (marked) {
-                       walker.setRevFilter(newRevFilter(seen, bitmapResult));
+                       BitmapRevFilter filter = newRevFilter(seen, bitmapResult);
+                       walker.setRevFilter(filter);
 
                        while (walker.next() != null) {
                                // Iterate through all of the commits. The BitmapRevFilter does
@@ -117,6 +124,7 @@ final class PackWriterBitmapWalker {
                                bitmapResult.add(ro, ro.getType());
                                pm.update(1);
                        }
+                       countOfBitmapIndexMisses += filter.getCountOfLoadedCommits();
                }
 
                return bitmapResult;
@@ -126,7 +134,7 @@ final class PackWriterBitmapWalker {
                walker.reset();
        }
 
-       static RevFilter newRevFilter(
+       static BitmapRevFilter newRevFilter(
                        final BitmapBuilder seen, final BitmapBuilder bitmapResult) {
                if (seen != null) {
                        return new BitmapRevFilter() {
@@ -146,12 +154,16 @@ final class PackWriterBitmapWalker {
        }
 
        static abstract class BitmapRevFilter extends RevFilter {
+               private long countOfLoadedCommits;
+
                protected abstract boolean load(RevCommit cmit);
 
                @Override
                public final boolean include(RevWalk walker, RevCommit cmit) {
-                       if (load(cmit))
+                       if (load(cmit)) {
+                               countOfLoadedCommits++;
                                return true;
+                       }
                        for (RevCommit p : cmit.getParents())
                                p.add(RevFlag.SEEN);
                        return false;
@@ -166,5 +178,9 @@ final class PackWriterBitmapWalker {
                public final boolean requiresCommitBody() {
                        return false;
                }
+
+               long getCountOfLoadedCommits() {
+                       return countOfLoadedCommits;
+               }
        }
 }