show-queue cannot be starved for admins

When admin executes the show-queue command a new thread will be
created to make sure that the commmand is always executed even if
the thread pool is exhausted.

Bug: issue 570
This commit is contained in:
carloseduardo.baldacin
2010-05-20 14:41:52 -03:00
committed by Ulrik Sjölin
parent 8ef3b69f35
commit 617be71c21
3 changed files with 39 additions and 1 deletions

View File

@@ -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.
* <p>
*/
@Target( {ElementType.TYPE})
@Retention(RUNTIME)
public @interface AdminHighPriorityCommand {
}

View File

@@ -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.
* <p>

View File

@@ -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;