From: Jörg Kubitz Date: Mon, 15 Aug 2022 09:05:04 +0000 (+0200) Subject: ObjectDirectory: avoid using File.getCanonicalPath() X-Git-Tag: v6.4.0.202210260700-m2~17 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=2021ce3423a7db6949b9e0a71a8c15e5826ccc4c;p=jgit.git ObjectDirectory: avoid using File.getCanonicalPath() On java 17 + Windows OS java.io.File.getCanonicalPath is a very slow system call which uses most time during clone. That is since JDK 12 the result of File.getCanonicalPath is not cached anymore by default: https://bugs.openjdk.java.net/browse/JDK-8207005 * Use toRealPath() to follow symbolic links also on windows. * Cache the result. Bug: 580568 Change-Id: I95f4f5b2babefd7210ee4740646230225ebf3788 --- diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectory.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectory.java index 7699439128..ff7ef93278 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectory.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectory.java @@ -724,14 +724,17 @@ public class ObjectDirectory extends FileObjectDatabase { static class AlternateHandle { static class Id { - String alternateId; + private final String alternateId; public Id(File object) { + String id = null; try { - this.alternateId = object.getCanonicalPath(); - } catch (Exception e) { - alternateId = null; + // resolve symbolic links to their final target: + id = object.toPath().toRealPath().normalize().toString(); + } catch (Exception ignored) { + // id == null } + this.alternateId = id; } @Override @@ -757,6 +760,8 @@ public class ObjectDirectory extends FileObjectDatabase { final ObjectDirectory db; + private AlternateHandle.Id id; + AlternateHandle(ObjectDirectory db) { this.db = db; } @@ -765,8 +770,11 @@ public class ObjectDirectory extends FileObjectDatabase { db.close(); } - public Id getId(){ - return db.getAlternateId(); + public synchronized Id getId() { + if (id == null) { + id = new AlternateHandle.Id(db.objects); + } + return id; } } @@ -795,6 +803,6 @@ public class ObjectDirectory extends FileObjectDatabase { } AlternateHandle.Id getAlternateId() { - return new AlternateHandle.Id(objects); + return handle.getId(); } }