From 98f2352a098be1734cd8ab9fbedfd6e8b2a95f34 Mon Sep 17 00:00:00 2001 From: Dariusz Luksza Date: Wed, 11 Mar 2015 11:41:41 +0100 Subject: [PATCH] Add plugins.jsLoadTimeout configuration option JavaScript plugin load time depends highly on the network performance. In some cases default value of 5s would be not enough to load all plugins. This will result in standard Gerrit error page saying that plugin failed to load. New configuration option plugins.jsLoadTimeout allows administrators to configure the plugin load timeout value, giving them possibility to increase this value when 'plugin load failed' message is showing too often. Change-Id: I5979bc16e218db514a7eadefb2b41eacd935897d Signed-off-by: Dariusz Luksza --- Documentation/config-gerrit.txt | 7 +++++++ .../google/gerrit/common/data/HostPageData.java | 1 + .../java/com/google/gerrit/client/Gerrit.java | 1 + .../google/gerrit/client/api/PluginLoader.java | 13 +++++++------ .../google/gerrit/httpd/raw/HostPageServlet.java | 16 ++++++++++++++++ 5 files changed, 32 insertions(+), 6 deletions(-) diff --git a/Documentation/config-gerrit.txt b/Documentation/config-gerrit.txt index 17ce8eafdc..9268267c75 100644 --- a/Documentation/config-gerrit.txt +++ b/Documentation/config-gerrit.txt @@ -2648,6 +2648,13 @@ Enable remote installation, enable and disable of plugins over HTTP and SSH. If set to true Administrators can install new plugins remotely, or disable existing plugins. Defaults to false. +[[plugins.jsLoadTimeout]]plugins.jsLoadTimeout:: ++ +Set the timeout value for loading JavaScript plugins in Gerrit UI. +Values can be specified using standard time unit abbreviations ('ms', +'sec', 'min', etc.). ++ +Default is 5 seconds. Negative values will be converted to 0. [[receive]] === Section receive diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/HostPageData.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/HostPageData.java index 430c23c8bc..fa3d7a8b16 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/data/HostPageData.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/HostPageData.java @@ -30,6 +30,7 @@ public class HostPageData { public Theme theme; public List plugins; public List messages; + public Integer pluginsLoadTimeout; public boolean isNoteDbEnabled; public static class Theme { diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/Gerrit.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/Gerrit.java index 718b36f23f..bd0fc41377 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/Gerrit.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/Gerrit.java @@ -579,6 +579,7 @@ public class Gerrit implements EntryPoint { AccountApi.self().view("preferences").get(cbg.add(createMyMenuBarCallback())); } PluginLoader.load(hpd.plugins, + hpd.pluginsLoadTimeout, cbg.addFinal(new GerritCallback() { @Override public void onSuccess(VoidResult result) { diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/PluginLoader.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/PluginLoader.java index f0fb4369a2..ceb0eeea15 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/PluginLoader.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/PluginLoader.java @@ -32,15 +32,14 @@ import java.util.List; /** Loads JavaScript plugins with a progress meter visible. */ public class PluginLoader extends DialogBox { - private static final int MAX_LOAD_TIME_MILLIS = 5000; private static PluginLoader self; public static void load(List plugins, - AsyncCallback callback) { + int loadTimeout, AsyncCallback callback) { if (plugins == null || plugins.isEmpty()) { callback.onSuccess(VoidResult.create()); } else { - self = new PluginLoader(callback); + self = new PluginLoader(loadTimeout, callback); self.load(plugins); self.startTimers(); self.center(); @@ -51,6 +50,7 @@ public class PluginLoader extends DialogBox { self.loadedOne(); } + private final int loadTimeout; private final AsyncCallback callback; private ProgressBar progress; private Timer show; @@ -58,9 +58,10 @@ public class PluginLoader extends DialogBox { private Timer timeout; private boolean visible; - private PluginLoader(AsyncCallback cb) { + private PluginLoader(int loadTimeout, AsyncCallback cb) { super(/* auto hide */false, /* modal */true); callback = cb; + this.loadTimeout = loadTimeout; progress = new ProgressBar(Gerrit.C.loadingPlugins()); setStyleName(Gerrit.RESOURCES.css().errorDialog()); @@ -98,7 +99,7 @@ public class PluginLoader extends DialogBox { @Override public void run() { - progress.setValue(100 * ++cycle * 250 / MAX_LOAD_TIME_MILLIS); + progress.setValue(100 * ++cycle * 250 / loadTimeout); } }; update.scheduleRepeating(250); @@ -109,7 +110,7 @@ public class PluginLoader extends DialogBox { finish(); } }; - timeout.schedule(MAX_LOAD_TIME_MILLIS); + timeout.schedule(loadTimeout); } private void loadedOne() { diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/HostPageServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/HostPageServlet.java index 1bc11258ec..f3895b8a08 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/HostPageServlet.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/HostPageServlet.java @@ -32,6 +32,7 @@ import com.google.gerrit.httpd.HtmlDomUtil; import com.google.gerrit.httpd.WebSession; import com.google.gerrit.server.CurrentUser; import com.google.gerrit.server.IdentifiedUser; +import com.google.gerrit.server.config.ConfigUtil; import com.google.gerrit.server.config.GerritServerConfig; import com.google.gerrit.server.config.SitePaths; import com.google.gerrit.server.notedb.NotesMigration; @@ -57,6 +58,7 @@ import java.io.StringWriter; import java.nio.file.Path; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.TimeUnit; import javax.servlet.ServletContext; import javax.servlet.ServletException; @@ -72,6 +74,7 @@ public class HostPageServlet extends HttpServlet { LoggerFactory.getLogger(HostPageServlet.class); private static final boolean IS_DEV = Boolean.getBoolean("Gerrit.GwtDevMode"); private static final String HPD_ID = "gerrit_hostpagedata"; + private static final int DEFAULT_JS_LOAD_TIMEOUT = 5000; private final Provider currentUser; private final DynamicItem session; @@ -86,6 +89,7 @@ public class HostPageServlet extends HttpServlet { private final boolean refreshHeaderFooter; private final StaticServlet staticServlet; private final boolean isNoteDbEnabled; + private final Integer pluginsLoadTimeout; private volatile Page page; @Inject @@ -109,6 +113,7 @@ public class HostPageServlet extends HttpServlet { refreshHeaderFooter = cfg.getBoolean("site", "refreshHeaderFooter", true); staticServlet = ss; isNoteDbEnabled = migration.enabled(); + pluginsLoadTimeout = getPluginsLoadTimeout(cfg); final String pageName = "HostPage.html"; template = HtmlDomUtil.parseFile(getClass(), pageName); @@ -156,6 +161,16 @@ public class HostPageServlet extends HttpServlet { page = new Page(); } + private static int getPluginsLoadTimeout(final Config cfg) { + long cfgValue = + ConfigUtil.getTimeUnit(cfg, "plugins", null, "jsLoadTimeout", + DEFAULT_JS_LOAD_TIMEOUT, TimeUnit.MILLISECONDS); + if (cfgValue < 0) { + return 0; + } + return (int) cfgValue; + } + private void json(final Object data, final StringWriter w) { JsonServlet.defaultGsonBuilder().create().toJson(data, w); } @@ -318,6 +333,7 @@ public class HostPageServlet extends HttpServlet { pageData.version = Version.getVersion(); pageData.config = config; pageData.isNoteDbEnabled = isNoteDbEnabled; + pageData.pluginsLoadTimeout = pluginsLoadTimeout; final StringWriter w = new StringWriter(); w.write("var " + HPD_ID + "=");