git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 2/4] Rework tree/commit cache

From
Robin Rosenberg <robin.rosenberg@dewire.com>
Date
Mar 18, 2007, 22:16 UTC
Message-ID
<20070318221601.24742.14256.stgit@lathund.dewire.com>
In-Reply-To
<20070318220711.24742.90943.stgit@lathund.dewire.com>

We now use SoftRefernces to hold the value objects and reuse the object id's as cache keys. Seems to work much better, i.e. the gc only throws out stuff from the cache when memory is tight, rather than at the first opportunity.

Signed-off-by: Robin Rosenberg <robin.rosenberg@dewire.com>
---
 .../src/org/spearce/jgit/lib/Repository.java       |   30 +++++++++++++++--------
 1 files changed, 20 insertions(+), 10 deletions(-)
diff --git a/org.spearce.jgit/src/org/spearce/jgit/lib/Repository.java b/org.spearce.jgit/src/org/spearce/jgit/lib/Repository.java
index d3b2178..c7c47ae 100644
--- a/org.spearce.jgit/src/org/spearce/jgit/lib/Repository.java
+++ b/org.spearce.jgit/src/org/spearce/jgit/lib/Repository.java
@@ -23,6 +23,8 @@ import java.io.FileNotFoundException;
 import java.io.FileReader;
 import java.io.FileWriter;
 import java.io.IOException;
+import java.lang.ref.Reference;
+import java.lang.ref.SoftReference;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Map;
@@ -190,19 +192,24 @@ public class Repository {
 	}
 
 	public Commit mapCommit(final ObjectId id) throws IOException {
-		Commit ret = (Commit)commitCache.get(id);
-		if (ret != null)
-			return ret;
+//		System.out.println("commitcache.size="+commitCache.size());
+		Reference retr = (Reference)commitCache.get(id);
+		if (retr != null) {
+			Commit ret = (Commit)retr.get();
+			if (ret != null)
+				return ret;
+			System.out.println("Found a null id, size was "+commitCache.size());
+		}
 
 		final ObjectLoader or = openObject(id);
 		if (or == null)
 			return null;
 		final byte[] raw = or.getBytes();
 		if (Constants.TYPE_COMMIT.equals(or.getType())) {
-			ret = new Commit(this, id, raw);
+			Commit ret = new Commit(this, id, raw);
 			// The key must not be the referenced strongly
 			// by the value in WeakHashMaps
-			commitCache.put(new ObjectId(id.getBytes()), ret);
+			commitCache.put(id, new SoftReference(ret));
 			return ret;
 		}
 		throw new IncorrectObjectTypeException(id, Constants.TYPE_COMMIT);
@@ -214,17 +221,20 @@ public class Repository {
 	}
 
 	public Tree mapTree(final ObjectId id) throws IOException {
-		Tree ret = (Tree)treeCache.get(id);
-		if (ret != null)
-			return ret;
+		Reference wret = (Reference)treeCache.get(id);
+		if (wret != null) {
+			Tree ret = (Tree)wret.get();
+			if (ret != null)
+				return ret;
+		}
 
 		final ObjectLoader or = openObject(id);
 		if (or == null)
 			return null;
 		final byte[] raw = or.getBytes();
 		if (Constants.TYPE_TREE.equals(or.getType())) {
-			ret = new Tree(this, id, raw);
-			treeCache.put(new ObjectId(id.getBytes()), ret);
+			Tree ret = new Tree(this, id, raw);
+			treeCache.put(id, new SoftReference(ret));
 			return ret;
 		}
 		if (Constants.TYPE_COMMIT.equals(or.getType()))
Previous: Robin RosenbergNext: Robin Rosenberg
Message 3 of 6 in “Eclipse (EGIT) Structured compare”
  1. 0/4 Eclipse (EGIT) Structured compareRobin Rosenberg, Mar 18, 2007
  2. 1/4 Cache tree ObjectId's tooRobin Rosenberg, Mar 18, 2007
  3. 2/4 Rework tree/commit cacheRobin Rosenberg, Mar 18, 2007
  4. 3/4 Decode message when encoding line is presentRobin Rosenberg, Mar 18, 2007
  5. 4/4 Add support for structured comparison.Robin Rosenberg, Mar 18, 2007
  6. Shawn O. PearceMar 19, 2007

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.