]> source.dussan.org Git - jgit.git/commitdiff
PackBitmapIndex: Not buffer inflated bitmap during bitmap creation. 82/165082/4
authorYunjie Li <yunjieli@google.com>
Wed, 17 Jun 2020 18:58:18 +0000 (11:58 -0700)
committerYunjie Li <yunjieli@google.com>
Thu, 18 Jun 2020 19:36:42 +0000 (12:36 -0700)
Currently we're buffering the inflated bitmap entry in
BasePackBitmapIndex to optimize running time. However, this will use
lots of memory during the creation of the pack bitmap index file.

And change 161456, which rewrote the entire getBitmap method, increased
the fetch latency significantly.

This commit introduces getBitmapWithoutCaching method which is used in
the pack bitmap index file creation only and aims to save memory during
garbage collection and not increase fetch latency.

Change-Id: I7b982c9d4e38f5f6193eaa03894e894ba992b33b
Signed-off-by: Yunjie Li <yunjieli@google.com>
org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/BasePackBitmapIndex.java
org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackBitmapIndexRemapper.java

index c9bb167f02f0484f889f0fbb5278b1663a9d6c0d..ec53818b4eb3bf9ed8929176c6718fa24cc282b6 100644 (file)
@@ -59,12 +59,26 @@ abstract class BasePackBitmapIndex extends PackBitmapIndex {
                 * @return the full bitmap
                 */
                EWAHCompressedBitmap getBitmap() {
+                       EWAHCompressedBitmap bitmap = getBitmapWithoutCaching();
+                       // Cache the result.
+                       bitmapContainer = bitmap;
+                       return bitmap;
+               }
+
+               /**
+                * Compute and return the full bitmap, do NOT cache the expanded bitmap,
+                * which saves memory and should only be used during bitmap creation in
+                * garbage collection.
+                *
+                * @return the full bitmap
+                */
+               EWAHCompressedBitmap getBitmapWithoutCaching() {
                        // Fast path to immediately return the expanded result.
                        Object r = bitmapContainer;
                        if (r instanceof EWAHCompressedBitmap)
                                return (EWAHCompressedBitmap) r;
 
-                       // Expand the bitmap and cache the result.
+                       // Expand the bitmap but not cache the result.
                        XorCompressedBitmap xb = (XorCompressedBitmap) r;
                        EWAHCompressedBitmap out = xb.bitmap;
                        for (;;) {
@@ -72,7 +86,6 @@ abstract class BasePackBitmapIndex extends PackBitmapIndex {
                                if (r instanceof EWAHCompressedBitmap) {
                                        out = out.xor((EWAHCompressedBitmap) r);
                                        out.trim();
-                                       bitmapContainer = out;
                                        return out;
                                }
                                xb = (XorCompressedBitmap) r;
index 4b252845175a2c5c37f53f5092ad9b622d6eff1c..dd5d03c6e9eb02851df673fb9e58864a742007a4 100644 (file)
@@ -156,7 +156,8 @@ public class PackBitmapIndexRemapper extends PackBitmapIndex
                        return null;
 
                inflated.clear();
-               for (IntIterator i = oldBitmap.getBitmap().intIterator(); i.hasNext();)
+               for (IntIterator i = oldBitmap.getBitmapWithoutCaching()
+                               .intIterator(); i.hasNext();)
                        inflated.set(prevToNewMapping[i.next()]);
                bitmap = inflated.toEWAHCompressedBitmap();
                bitmap.trim();