Merge branch 'stable-2.16' into stable-3.0

* stable-2.16:
  Allow to configure the number of hook execution workers
  Submit: Handle potentially missing username

Change-Id: I19cc4953e64bcba429e72fe033b79f03154b41d9
diff --git a/src/main/java/com/googlesource/gerrit/plugins/hooks/HookQueue.java b/src/main/java/com/googlesource/gerrit/plugins/hooks/HookQueue.java
index 88ae311..50ba975 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/hooks/HookQueue.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/hooks/HookQueue.java
@@ -16,21 +16,25 @@
 
 import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.extensions.events.LifecycleListener;
+import com.google.gerrit.server.config.GerritServerConfig;
 import com.google.gerrit.server.git.WorkQueue;
 import com.google.inject.Inject;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.concurrent.ScheduledExecutorService;
+import org.eclipse.jgit.lib.Config;
 
 class HookQueue implements LifecycleListener {
   private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   private final WorkQueue workQueue;
+  private final int executorThreads;
 
   private ScheduledExecutorService queue;
 
   @Inject
-  HookQueue(WorkQueue workQueue) {
+  HookQueue(WorkQueue workQueue, @GerritServerConfig Config config) {
+    this.executorThreads = config.getInt("hooks", "executorThreads", 1);
     this.workQueue = workQueue;
   }
 
@@ -48,7 +52,7 @@
 
   @Override
   public void start() {
-    queue = workQueue.createQueue(1, "HookQueue");
+    queue = workQueue.createQueue(executorThreads, "HookQueue");
   }
 
   @Override
diff --git a/src/main/java/com/googlesource/gerrit/plugins/hooks/Submit.java b/src/main/java/com/googlesource/gerrit/plugins/hooks/Submit.java
index 7474553..e383200 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/hooks/Submit.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/hooks/Submit.java
@@ -51,7 +51,7 @@
     args.add("--project", projectName);
     args.add("--branch", destBranch.get());
     args.add("--submitter", caller.getNameEmail());
-    args.add("--submitter-username", caller.getUserName().get());
+    args.add("--submitter-username", caller.getUserName().orElse(null));
     args.add("--patchset", patchSetId.get());
     args.add("--commit", commit.getId().name());
 
diff --git a/src/main/resources/Documentation/config.md b/src/main/resources/Documentation/config.md
index 9303587..2aea566 100644
--- a/src/main/resources/Documentation/config.md
+++ b/src/main/resources/Documentation/config.md
@@ -37,6 +37,9 @@
 :	Timeout value in seconds for synchronous hooks. If not set, defaults
 to 30 seconds.
 
+hooks.executorThreads
+:	Number of workers to use for hook execution. If not set, defaults to 1.
+
 hooks.changeAbandonedHook
 :	Filename for the change abandoned hook. If not set, defaults to `change-abandoned`.