From: Robin Rosenberg Date: Mon, 08 Dec 2008 21:48:56 GMT Subject: [EGIT PATCH] Cache values of symbolic refs in RefDatabase Message-ID: <1228772936-2447-1-git-send-email-robin.rosenberg@dewire.com> 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 --- .../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 looseRefs; private Map looseRefsMTime; + private Map looseSymRefs; private final File packedRefsFile; @@ -96,6 +97,7 @@ void clearCache() { looseRefs = new HashMap(); looseRefsMTime = new HashMap(); packedRefs = new HashMap(); + looseSymRefs = new HashMap(); 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