mh-cache-idx

Change-Id: I17cd17881c35045b0479e77049b378b3338924ab
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/ReftableReader.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/ReftableReader.java
index b3bf33a..f1ca1a7 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/ReftableReader.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/ReftableReader.java
@@ -49,6 +49,7 @@
 import static org.eclipse.jgit.internal.storage.reftable.ReftableConstants.REF_BLOCK_TYPE;
 import static org.eclipse.jgit.internal.storage.reftable.ReftableConstants.VERSION_1;
 import static org.eclipse.jgit.internal.storage.reftable.ReftableConstants.isFileHeaderMagic;
+import static org.eclipse.jgit.internal.storage.reftable.ReftableConstants.INDEX_BLOCK_TYPE;
 
 import java.io.IOException;
 import java.nio.ByteBuffer;
@@ -60,6 +61,7 @@
 import org.eclipse.jgit.internal.storage.io.BlockSource;
 import org.eclipse.jgit.lib.AnyObjectId;
 import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.util.LongMap;
 import org.eclipse.jgit.util.NB;
 
 /**
@@ -77,6 +79,7 @@
 	long objRootChunkAddr;
 
 	private BlockReader refRoot;
+	private LongMap<BlockReader> idxCache;
 
 	/**
 	 * Initialize a new reftable reader.
@@ -230,12 +233,25 @@
 	}
 
 	private BlockReader readBlock(long position, long end) throws IOException {
-		int sz = 1024; // what a fucking hack
+		if (idxCache != null) {
+			BlockReader b = idxCache.get(position);
+			if (b != null) {
+				return b;
+			}
+		}
+
+		int sz = 4096; // what a fucking hack
 		if (position + sz > end) {
 			sz = (int) (end - position);
 		}
 		BlockReader b = new BlockReader();
 		b.readBlock(src, position, sz);
+		if (b.type() == INDEX_BLOCK_TYPE) {
+			if (idxCache == null) {
+				idxCache = new LongMap<>();
+			}
+			idxCache.put(position, b);
+		}
 		return b;
 	}