aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJörg Kubitz <jkubitz-eclipse@gmx.de>2022-08-15 11:05:04 +0200
committerMatthias Sohn <matthias.sohn@sap.com>2022-09-22 10:48:50 +0200
commit2021ce3423a7db6949b9e0a71a8c15e5826ccc4c (patch)
treea0776760a70f3a90c66accf7a4a4bcb158ac3434
parenteb5124c74f9bcdedc8492a8c1eddc734adfb7226 (diff)
downloadjgit-2021ce3423a7db6949b9e0a71a8c15e5826ccc4c.tar.gz
jgit-2021ce3423a7db6949b9e0a71a8c15e5826ccc4c.zip
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
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectory.java22
1 files 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 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();
}
}