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());
   }
 }