diff --git a/changelog.html b/changelog.html index ae30b3a974e112e6425b9085ca0dbab72565673f..d59202fe006aa8f1b2c487589a0009f25f16292e 100644 --- a/changelog.html +++ b/changelog.html @@ -58,6 +58,9 @@ Upcoming changes
  • Expensive symlink-related calls on Windows can be simplified. (issue 20534) +
  • + Slow rendering of directories with many entries in remote workspaces. + (issue 21780) diff --git a/core/src/main/java/hudson/model/DirectoryBrowserSupport.java b/core/src/main/java/hudson/model/DirectoryBrowserSupport.java index bfc6d917da53bb845f969f96d0479ae60273b9e7..1dfd2b3a3b3993b68fec9922df76c6fe5036f176 100644 --- a/core/src/main/java/hudson/model/DirectoryBrowserSupport.java +++ b/core/src/main/java/hudson/model/DirectoryBrowserSupport.java @@ -25,14 +25,6 @@ package hudson.model; import hudson.FilePath; import hudson.Util; -import jenkins.model.Jenkins; -import org.apache.commons.io.IOUtils; -import org.kohsuke.stapler.StaplerRequest; -import org.kohsuke.stapler.StaplerResponse; -import org.kohsuke.stapler.HttpResponse; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -42,14 +34,23 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; +import java.util.HashMap; import java.util.List; import java.util.Locale; +import java.util.Map; import java.util.StringTokenizer; -import java.util.logging.Logger; import java.util.logging.Level; +import java.util.logging.Logger; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import jenkins.model.Jenkins; import jenkins.util.VirtualFile; +import org.apache.commons.io.IOUtils; +import org.kohsuke.stapler.HttpResponse; +import org.kohsuke.stapler.StaplerRequest; +import org.kohsuke.stapler.StaplerResponse; /** * Has convenience methods to serve file system. @@ -430,8 +431,9 @@ public final class DirectoryBrowserSupport implements HttpResponse { private static final class FileComparator implements Comparator { private Collator collator; + private final Map isDirCache = new HashMap(); - public FileComparator(Locale locale) { + FileComparator(Locale locale) { this.collator = Collator.getInstance(locale); } @@ -443,9 +445,18 @@ public final class DirectoryBrowserSupport implements HttpResponse { return this.collator.compare(lhs.getName(), rhs.getName()); } + private boolean isDirectory(VirtualFile f) throws IOException { + Boolean known = isDirCache.get(f); + if (known == null) { + known = f.isDirectory(); + isDirCache.put(f, known); + } + return known; + } + private int dirRank(VirtualFile f) { try { - if(f.isDirectory()) return 0; + if(isDirectory(f)) return 0; else return 1; } catch (IOException ex) { return 0;