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