Make GitHub job pool configurable via gerrit.config.
Allows limiting the number of parallel jobs and their
scheduled execution time via gerrit.config properties.
Example:
[github]
jobPoolLimit = 1
jobExecTimeout = 10
The above configuration will limit to 1 concurrent
GitHub API executed with a random interval of 10 secs
between calls.
Randomisation and limitation of GitHub API execution
is needed in order to avoid going over the maximum
threshold allowed by GitHub front-end servers.
(they are very aggressive nowadays, after the outages
and DDoS they've experienced)
Change-Id: Ib273dbb9f42640b841d98d58565771f6a0157518
diff --git a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/GitHubConfig.java b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/GitHubConfig.java
index ddada01..9857e5b 100644
--- a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/GitHubConfig.java
+++ b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/GitHubConfig.java
@@ -33,7 +33,11 @@
private HashMap<String, NextPage> wizardFromTo = Maps.newHashMap();
private static final String FROM_TO_SEPARATOR = "=>";
private static final String FROM_TO_REDIRECT_SEPARATOR = "R>";
+ private static final String CONF_JOB_POOL_LIMIT = "jobPoolLimit";
+ private static final String CONF_JOB_EXEC_TIMEOUT = "jobExecTimeout";
public final File gitDir;
+ private int jobPoolLimit;
+ private int jobExecTimeout;
public static class NextPage {
public final String uri;
@@ -60,7 +64,11 @@
new NextPage(fromTo.substring(
sepPos + getSeparator(redirect).length() + 1).trim(), redirect);
wizardFromTo.put(fromPage, toPage);
+
+ jobPoolLimit = config.getInt(CONF_SECTION, CONF_JOB_POOL_LIMIT, 5);
+ jobExecTimeout = config.getInt(CONF_SECTION, CONF_JOB_EXEC_TIMEOUT, 10);
}
+
gitDir = site.resolve(config.getString("gerrit", null, "basePath"));
if (gitDir == null) {
throw new IllegalStateException("gerrit.basePath must be configured");
@@ -84,4 +92,12 @@
public NextPage getNextPage(String sourcePage) {
return wizardFromTo.get(sourcePage);
}
+
+ public int getJobPoolLimit() {
+ return jobPoolLimit;
+ }
+
+ public int getJobExecTimeout() {
+ return jobExecTimeout;
+ }
}
diff --git a/github-plugin/src/main/java/com/googlesrouce/gerrit/plugins/github/git/GitImportJob.java b/github-plugin/src/main/java/com/googlesrouce/gerrit/plugins/github/git/GitImportJob.java
index fa8a90c..6b8c59b 100644
--- a/github-plugin/src/main/java/com/googlesrouce/gerrit/plugins/github/git/GitImportJob.java
+++ b/github-plugin/src/main/java/com/googlesrouce/gerrit/plugins/github/git/GitImportJob.java
@@ -24,7 +24,7 @@
private int currUnit;
private int lastPercentage;
private boolean cancelled;
- private String task = "Initializing ...";
+ private String task = "Waiting ...";
private Exception exception;
private GitJobStatus status;
private int index;
diff --git a/github-plugin/src/main/java/com/googlesrouce/gerrit/plugins/github/git/JobExecutor.java b/github-plugin/src/main/java/com/googlesrouce/gerrit/plugins/github/git/JobExecutor.java
index ba4d50c..3625b50 100644
--- a/github-plugin/src/main/java/com/googlesrouce/gerrit/plugins/github/git/JobExecutor.java
+++ b/github-plugin/src/main/java/com/googlesrouce/gerrit/plugins/github/git/JobExecutor.java
@@ -21,19 +21,21 @@
import com.google.gerrit.server.util.RequestScopePropagator;
import com.google.inject.Inject;
import com.google.inject.Singleton;
+import com.googlesource.gerrit.plugins.github.GitHubConfig;
@Singleton
public class JobExecutor {
- private static final int MAX_THREADS = 10;
- private static final int MAX_EXEC_TIMEOUT_SECS = 30;
-
- private final ScheduledExecutorService executor = Executors
- .newScheduledThreadPool(MAX_THREADS);
+ private final ScheduledExecutorService executor;
private final RequestScopePropagator requestScopePropagator;
+ private final GitHubConfig config;
@Inject
- public JobExecutor(final RequestScopePropagator requestScopePropagator) {
+ public JobExecutor(final RequestScopePropagator requestScopePropagator,
+ final GitHubConfig config) {
this.requestScopePropagator = requestScopePropagator;
+ this.config = config;
+ this.executor = Executors
+ .newScheduledThreadPool(config.getJobPoolLimit());
}
public void exec(GitJob job) {
@@ -43,6 +45,6 @@
private int getRandomExecutionDelay(GitJob job) {
Random rnd = new Random(System.currentTimeMillis() + job.hashCode());
- return rnd.nextInt(MAX_EXEC_TIMEOUT_SECS);
+ return rnd.nextInt(config.getJobExecTimeout());
}
}