diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/AdminHighPriorityCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/AdminHighPriorityCommand.java new file mode 100644 index 0000000000..04f6eb84f7 --- /dev/null +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/AdminHighPriorityCommand.java @@ -0,0 +1,31 @@ +// Copyright (C) 2009 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.gerrit.sshd; + +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +/** + * Annotation tagged on a concrete Command that requires + * high priority thread creation whenever called by administrators users. + *
+ */ +@Target( {ElementType.TYPE}) +@Retention(RUNTIME) +public @interface AdminHighPriorityCommand { +} diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/BaseCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/BaseCommand.java index e94f1767f5..f46b3ec784 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/BaseCommand.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/BaseCommand.java @@ -238,7 +238,8 @@ public abstract class BaseCommand implements Command { */ protected synchronized void startThread(final CommandRunnable thunk) { final TaskThunk tt = new TaskThunk(thunk); - if (isAdminCommand()) { + + if (isAdminCommand()||(isAdminHighPriorityCommand() && userProvider.get().isAdministrator())) { // Admin commands should not block the main work threads (there // might be an interactive shell there), nor should they wait // for the main work threads. @@ -253,6 +254,10 @@ public abstract class BaseCommand implements Command { return getClass().getAnnotation(AdminCommand.class) != null; } + private final boolean isAdminHighPriorityCommand() { + return getClass().getAnnotation(AdminHighPriorityCommand.class) != null; + } + /** * Terminate this command and return a result code to the remote client. *
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ShowQueue.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ShowQueue.java index 499dda9f71..a196a3e329 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ShowQueue.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ShowQueue.java @@ -22,6 +22,7 @@ import com.google.gerrit.server.git.WorkQueue.Task; import com.google.gerrit.server.project.ProjectCache; import com.google.gerrit.server.project.ProjectState; import com.google.gerrit.server.util.IdGenerator; +import com.google.gerrit.sshd.AdminHighPriorityCommand; import com.google.gerrit.sshd.BaseCommand; import com.google.inject.Inject; @@ -37,6 +38,7 @@ import java.util.List; import java.util.concurrent.TimeUnit; /** Display the current work queue. */ +@AdminHighPriorityCommand final class ShowQueue extends BaseCommand { @Option(name = "-w", usage = "display without line width truncation") private boolean wide;