From 2021ce3423a7db6949b9e0a71a8c15e5826ccc4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Kubitz?= Date: Mon, 15 Aug 2022 11:05:04 +0200 Subject: [PATCH] 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 --- .../storage/file/ObjectDirectory.java | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) 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 769943912..ff7ef9327 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 File fileFor(AnyObjectId objectId) { 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 int hashCode() { final ObjectDirectory db; + private AlternateHandle.Id id; + AlternateHandle(ObjectDirectory db) { this.db = db; } @@ -765,8 +770,11 @@ void close() { 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 @@ CachedObjectDirectory newCachedFileObjectDatabase() { } AlternateHandle.Id getAlternateId() { - return new AlternateHandle.Id(objects); + return handle.getId(); } }