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

[JGIT PATCH 08/11] Change Daemon to use RepositoryCache

From
Shawn O. Pearce <spearce@spearce.org>
Date
Jul 11, 2009, 20:19 UTC
Message-ID
<1247343566-19025-9-git-send-email-spearce@spearce.org>
In-Reply-To
<1247343566-19025-8-git-send-email-spearce@spearce.org>

Now that we have a nice JVM wide cache for Repository instances, we can use that inside of the Daemon code to manage setting up a Repository and locating it on disk using the standard search rules defined by FileKey.resolve().

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
---
 .../src/org/spearce/jgit/transport/Daemon.java     |   38 +++++++++-----------
 .../org/spearce/jgit/transport/DaemonService.java  |   14 +++++---
 2 files changed, 26 insertions(+), 26 deletions(-)
diff --git a/org.spearce.jgit/src/org/spearce/jgit/transport/Daemon.java b/org.spearce.jgit/src/org/spearce/jgit/transport/Daemon.java
index f55e049..790745d 100644
--- a/org.spearce.jgit/src/org/spearce/jgit/transport/Daemon.java
+++ b/org.spearce.jgit/src/org/spearce/jgit/transport/Daemon.java
@@ -53,6 +53,8 @@
 
 import org.spearce.jgit.lib.PersonIdent;
 import org.spearce.jgit.lib.Repository;
+import org.spearce.jgit.lib.RepositoryCache;
+import org.spearce.jgit.lib.RepositoryCache.FileKey;
 
 /** Basic daemon for the anonymous <code>git://</code> transport protocol. */
 public class Daemon {
@@ -199,6 +201,7 @@ public void exportRepository(String name, final Repository db) {
 		if (!name.endsWith(".git"))
 			name = name + ".git";
 		exports.put(name, db);
+		RepositoryCache.register(db);
 	}
 
 	/**
@@ -350,34 +353,27 @@ Repository openRepository(String name) {
 
 		Repository db;
 		db = exports.get(name.endsWith(".git") ? name : name + ".git");
-		if (db != null)
+		if (db != null) {
+			db.incrementOpen();
 			return db;
+		}
 
-		for (final File f : exportBase) {
-			db = openRepository(new File(f, name));
-			if (db != null)
-				return db;
-
-			db = openRepository(new File(f, name + ".git"));
-			if (db != null)
-				return db;
-
-			db = openRepository(new File(f, name + "/.git"));
-			if (db != null)
-				return db;
+		for (final File baseDir : exportBase) {
+			final File gitdir = FileKey.resolve(new File(baseDir, name));
+			if (gitdir != null && canExport(gitdir))
+				return openRepository(gitdir);
 		}
 		return null;
 	}
 
-	private Repository openRepository(final File d) {
-		if (d.isDirectory() && canExport(d)) {
-			try {
-				return new Repository(d);
-			} catch (IOException err) {
-				// Ignore
-			}
+	private static Repository openRepository(final File gitdir) {
+		try {
+			return RepositoryCache.open(FileKey.exact(gitdir));
+		} catch (IOException err) {
+			// null signals it "wasn't found", which is all that is suitable
+			// for the remote client to know. 
+			return null;
 		}
-		return null;
 	}
 
 	private boolean canExport(final File d) {
diff --git a/org.spearce.jgit/src/org/spearce/jgit/transport/DaemonService.java b/org.spearce.jgit/src/org/spearce/jgit/transport/DaemonService.java
index c511d5a..817aeee 100644
--- a/org.spearce.jgit/src/org/spearce/jgit/transport/DaemonService.java
+++ b/org.spearce.jgit/src/org/spearce/jgit/transport/DaemonService.java
@@ -108,11 +108,15 @@ void execute(final DaemonClient client, final String commandLine)
 		final Repository db = client.getDaemon().openRepository(name);
 		if (db == null)
 			return;
-		boolean on = isEnabled();
-		if (isOverridable())
-			on = db.getConfig().getBoolean("daemon", config, on);
-		if (on)
-			execute(client, db);
+		try {
+			boolean on = isEnabled();
+			if (isOverridable())
+				on = db.getConfig().getBoolean("daemon", config, on);
+			if (on)
+				execute(client, db);
+		} finally {
+			db.close();
+		}
 	}
 
 	abstract void execute(DaemonClient client, Repository db)
-- 
1.6.4.rc0.117.g28cb
Previous: Shawn O. PearceNext: Shawn O. Pearce
Message 9 of 14 in “Repository instance caching”
  1. 00/11 Repository instance cachingShawn O. Pearce, Jul 11, 2009
  2. 01/11 Change Daemon to use concurrent collections for exported repositoriesShawn O. Pearce, Jul 11, 2009
  3. 02/11 Make Daemon's exportAll check not require synchronizationShawn O. Pearce, Jul 11, 2009
  4. 03/11 Don't retry ".git" suffix in daemon if already triedShawn O. Pearce, Jul 11, 2009
  5. 04/11 Refactor ref advertisement code from server implementationsShawn O. Pearce, Jul 11, 2009
  6. 05/11 Don't advertise HEAD from ReceivePackShawn O. Pearce, Jul 11, 2009
  7. 06/11 Add a use reference counter to RepositoryShawn O. Pearce, Jul 11, 2009
  8. 07/11 Introduce RepositoryCache to cache handles of Repository objectsShawn O. Pearce, Jul 11, 2009
  9. 08/11 Change Daemon to use RepositoryCacheShawn O. Pearce, Jul 11, 2009
  10. 09/11 Expose the Repository's ObjectDatabase objectShawn O. Pearce, Jul 11, 2009
  11. 10/11 Use cached Repository instances when resolving alternatesShawn O. Pearce, Jul 11, 2009
  12. 11/11 Send .have lines in ReceivePack for alternate repositoriesShawn O. Pearce, Jul 11, 2009
  13. Robin RosenbergJul 21, 2009
  14. Shawn O. PearceJul 21, 2009

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.