[EGIT PATCH] Cache values of symbolic refs in RefDatabase
From: Robin Rosenberg <hidden>
Date: 2016-06-15 22:45:44
Subsystem:
the rest · Maintainer:
Linus Torvalds
This way we avoid reading refs if the timestamp has not changed. This reduced the number of opens for reading symbolic refs like HEAD. Signed-off-by: Robin Rosenberg <redacted> --- .../src/org/spearce/jgit/lib/RefDatabase.java | 19 ++++++++++++++++--- 1 files changed, 16 insertions(+), 3 deletions(-)
diff --git a/org.spearce.jgit/src/org/spearce/jgit/lib/RefDatabase.java b/org.spearce.jgit/src/org/spearce/jgit/lib/RefDatabase.java
index 494aecb..4cf6e08 100644
--- a/org.spearce.jgit/src/org/spearce/jgit/lib/RefDatabase.java
+++ b/org.spearce.jgit/src/org/spearce/jgit/lib/RefDatabase.java@@ -69,6 +69,7 @@ private Map<String, Ref> looseRefs; private Map<String, Long> looseRefsMTime; + private Map<String, String> looseSymRefs; private final File packedRefsFile;
@@ -96,6 +97,7 @@ void clearCache() { looseRefs = new HashMap<String, Ref>(); looseRefsMTime = new HashMap<String, Long>(); packedRefs = new HashMap<String, Ref>(); + looseSymRefs = new HashMap<String, String>(); packedRefsLastModified = 0; packedRefsLength = 0; }
@@ -348,15 +350,26 @@ private Ref readRefBasic(final String origName, final String name, final int dep return ref; } - final String line; + String line = null; try { - line = readLine(loose); + Long cachedlastModified = looseRefsMTime.get(name); + if (cachedlastModified != null && cachedlastModified == mtime) { + line = looseSymRefs.get(name); + } + if (line == null) { + line = readLine(loose); + looseRefsMTime.put(name, mtime); + looseSymRefs.put(name, line); + } } catch (FileNotFoundException notLoose) { return packedRefs.get(name); } - if (line == null || line.length() == 0) + if (line == null || line.length() == 0) { + looseRefs.remove(origName); + looseRefsMTime.remove(origName); return new Ref(Ref.Storage.LOOSE, origName, name, null); + } if (line.startsWith("ref: ")) { if (depth >= 5) {
--
1.6.0.3.640.g6331a