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:
		
				
					committed by
					
						
						Ulrik Sjölin
					
				
			
			
				
	
			
			
			
						parent
						
							8ef3b69f35
						
					
				
				
					commit
					617be71c21
				
			@@ -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 {
 | 
			
		||||
}
 | 
			
		||||
@@ -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>
 | 
			
		||||
 
 | 
			
		||||
@@ -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;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user