Avoid referencing gerrit specific Executor.

WorkQueue.Executor is a thin layer on top of
ScheduledThreadPoolExecutor. Since it is a class, rather than an
implementation, it is impossible to inject a wrapper around an
existing implementation.

This change is one step towards enabling this.

Change-Id: Id6b1d0fd10b5f8549cbc76a4867b3afb750aca02
This commit is contained in:
Han-Wen Nienhuys
2017-06-12 14:54:59 +02:00
parent 0c8a4ddebd
commit 40270c4bef
17 changed files with 56 additions and 45 deletions

View File

@@ -28,7 +28,6 @@ import com.google.gerrit.server.DynamicOptions;
import com.google.gerrit.server.IdentifiedUser;
import com.google.gerrit.server.RequestCleanup;
import com.google.gerrit.server.git.ProjectRunnable;
import com.google.gerrit.server.git.WorkQueue;
import com.google.gerrit.server.git.WorkQueue.CancelableRunnable;
import com.google.gerrit.server.permissions.GlobalPermission;
import com.google.gerrit.server.permissions.PermissionBackend;
@@ -50,6 +49,7 @@ import java.io.PrintWriter;
import java.io.StringWriter;
import java.nio.charset.Charset;
import java.util.concurrent.Future;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.atomic.AtomicReference;
import org.apache.sshd.common.SshException;
import org.apache.sshd.server.Command;
@@ -85,7 +85,7 @@ public abstract class BaseCommand implements Command {
@Inject private RequestCleanup cleanup;
@Inject @CommandExecutor private WorkQueue.Executor executor;
@Inject @CommandExecutor private ScheduledThreadPoolExecutor executor;
@Inject private PermissionBackend permissionBackend;
@Inject private CurrentUser user;

View File

@@ -16,11 +16,11 @@ package com.google.gerrit.sshd;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import com.google.gerrit.server.git.WorkQueue.Executor;
import com.google.inject.BindingAnnotation;
import java.lang.annotation.Retention;
import java.util.concurrent.ScheduledThreadPoolExecutor;
/** Marker on {@link Executor} used by SSH threads. */
/** Marker on {@link ScheduledThreadPoolExecutor} used by SSH threads. */
@Retention(RUNTIME)
@BindingAnnotation
public @interface CommandExecutor {}

View File

@@ -16,11 +16,11 @@ package com.google.gerrit.sshd;
import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.git.QueueProvider;
import com.google.gerrit.server.git.WorkQueue;
import com.google.inject.Inject;
import com.google.inject.Provider;
import java.util.concurrent.ScheduledThreadPoolExecutor;
class CommandExecutorProvider implements Provider<WorkQueue.Executor> {
class CommandExecutorProvider implements Provider<ScheduledThreadPoolExecutor> {
private final QueueProvider queues;
private final CurrentUser user;
@@ -32,7 +32,7 @@ class CommandExecutorProvider implements Provider<WorkQueue.Executor> {
}
@Override
public WorkQueue.Executor get() {
public ScheduledThreadPoolExecutor get() {
return queues.getQueue(user.getCapabilities().getQueueType());
}
}

View File

@@ -19,6 +19,7 @@ import com.google.gerrit.server.config.ThreadSettingsConfig;
import com.google.gerrit.server.git.QueueProvider;
import com.google.gerrit.server.git.WorkQueue;
import com.google.inject.Inject;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.ThreadFactory;
import org.eclipse.jgit.lib.Config;
@@ -26,8 +27,8 @@ public class CommandExecutorQueueProvider implements QueueProvider {
private int poolSize;
private final int batchThreads;
private final WorkQueue.Executor interactiveExecutor;
private final WorkQueue.Executor batchExecutor;
private final ScheduledThreadPoolExecutor interactiveExecutor;
private final ScheduledThreadPoolExecutor batchExecutor;
@Inject
public CommandExecutorQueueProvider(
@@ -51,7 +52,7 @@ public class CommandExecutorQueueProvider implements QueueProvider {
setThreadFactory(interactiveExecutor);
}
private void setThreadFactory(WorkQueue.Executor executor) {
private void setThreadFactory(ScheduledThreadPoolExecutor executor) {
final ThreadFactory parent = executor.getThreadFactory();
executor.setThreadFactory(
new ThreadFactory() {
@@ -65,7 +66,7 @@ public class CommandExecutorQueueProvider implements QueueProvider {
}
@Override
public WorkQueue.Executor getQueue(QueueType type) {
public ScheduledThreadPoolExecutor getQueue(QueueType type) {
switch (type) {
case INTERACTIVE:
return interactiveExecutor;

View File

@@ -26,7 +26,6 @@ import com.google.gerrit.server.config.GerritRequestModule;
import com.google.gerrit.server.config.GerritServerConfig;
import com.google.gerrit.server.git.AsyncReceiveCommits;
import com.google.gerrit.server.git.QueueProvider;
import com.google.gerrit.server.git.WorkQueue;
import com.google.gerrit.server.plugins.ModuleGenerator;
import com.google.gerrit.server.plugins.ReloadPluginListener;
import com.google.gerrit.server.plugins.StartPluginListener;
@@ -39,6 +38,7 @@ import com.google.inject.servlet.RequestScoped;
import java.net.SocketAddress;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import org.apache.sshd.server.CommandFactory;
import org.apache.sshd.server.auth.gss.GSSAuthenticator;
import org.apache.sshd.server.auth.pubkey.PublickeyAuthenticator;
@@ -77,7 +77,7 @@ public class SshModule extends LifecycleModule {
.toInstance(new DispatchCommandProvider(Commands.CMD_ROOT));
bind(CommandFactoryProvider.class);
bind(CommandFactory.class).toProvider(CommandFactoryProvider.class);
bind(WorkQueue.Executor.class)
bind(ScheduledThreadPoolExecutor.class)
.annotatedWith(StreamCommandExecutor.class)
.toProvider(StreamCommandExecutorProvider.class)
.in(SINGLETON);
@@ -126,7 +126,7 @@ public class SshModule extends LifecycleModule {
.toProvider(SshRemotePeerProvider.class)
.in(SshScope.REQUEST);
bind(WorkQueue.Executor.class)
bind(ScheduledThreadPoolExecutor.class)
.annotatedWith(CommandExecutor.class)
.toProvider(CommandExecutorProvider.class)
.in(SshScope.REQUEST);

View File

@@ -16,11 +16,11 @@ package com.google.gerrit.sshd;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import com.google.gerrit.server.git.WorkQueue.Executor;
import com.google.inject.BindingAnnotation;
import java.lang.annotation.Retention;
import java.util.concurrent.ScheduledThreadPoolExecutor;
/** Marker on {@link Executor} used by delayed event streaming. */
/** Marker on {@link ScheduledThreadPoolExecutor} used by delayed event streaming. */
@Retention(RUNTIME)
@BindingAnnotation
public @interface StreamCommandExecutor {}

View File

@@ -18,10 +18,11 @@ import com.google.gerrit.server.config.GerritServerConfig;
import com.google.gerrit.server.git.WorkQueue;
import com.google.inject.Inject;
import com.google.inject.Provider;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.ThreadFactory;
import org.eclipse.jgit.lib.Config;
class StreamCommandExecutorProvider implements Provider<WorkQueue.Executor> {
class StreamCommandExecutorProvider implements Provider<ScheduledThreadPoolExecutor> {
private final int poolSize;
private final WorkQueue queues;
@@ -33,8 +34,8 @@ class StreamCommandExecutorProvider implements Provider<WorkQueue.Executor> {
}
@Override
public WorkQueue.Executor get() {
final WorkQueue.Executor executor;
public ScheduledThreadPoolExecutor get() {
final ScheduledThreadPoolExecutor executor;
executor = queues.createQueue(poolSize, "SSH-Stream-Worker");

View File

@@ -38,6 +38,7 @@ import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import org.apache.sshd.server.Environment;
import org.kohsuke.args4j.Option;
@@ -108,7 +109,7 @@ final class ShowQueue extends SshCommand {
if (groupByQueue) {
ListMultimap<String, TaskInfo> byQueue = byQueue(tasks);
for (String queueName : byQueue.keySet()) {
WorkQueue.Executor e = workQueue.getExecutor(queueName);
ScheduledThreadPoolExecutor e = workQueue.getExecutor(queueName);
stdout.print(String.format("Queue: %s\n", queueName));
print(byQueue.get(queueName), now, viewAll, e.getCorePoolSize());
}

View File

@@ -29,7 +29,6 @@ import com.google.gerrit.server.events.Event;
import com.google.gerrit.server.events.EventTypes;
import com.google.gerrit.server.events.ProjectNameKeySerializer;
import com.google.gerrit.server.events.SupplierSerializer;
import com.google.gerrit.server.git.WorkQueue;
import com.google.gerrit.server.git.WorkQueue.CancelableRunnable;
import com.google.gerrit.sshd.BaseCommand;
import com.google.gerrit.sshd.CommandMetaData;
@@ -43,6 +42,7 @@ import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Future;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import org.apache.sshd.server.Environment;
import org.kohsuke.args4j.Option;
import org.slf4j.Logger;
@@ -71,7 +71,7 @@ final class StreamEvents extends BaseCommand {
@Inject private DynamicSet<UserScopedEventListener> eventListeners;
@Inject @StreamCommandExecutor private WorkQueue.Executor pool;
@Inject @StreamCommandExecutor private ScheduledThreadPoolExecutor pool;
/** Queue of events to stream to the connected user. */
private final LinkedBlockingQueue<Event> queue = new LinkedBlockingQueue<>(MAX_EVENTS);