Split the thread pool out of MergeQueue for reuse
There are other types of tasks that we'd like to perform in a delay fashion beyond just merge retries. Signed-off-by: Shawn O. Pearce <sop@google.com>
This commit is contained in:
		@@ -22,39 +22,13 @@ import org.slf4j.LoggerFactory;
 | 
			
		||||
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.concurrent.ScheduledThreadPoolExecutor;
 | 
			
		||||
import java.util.concurrent.TimeUnit;
 | 
			
		||||
 | 
			
		||||
public class MergeQueue {
 | 
			
		||||
  private static final Logger log = LoggerFactory.getLogger(MergeQueue.class);
 | 
			
		||||
  private static ScheduledThreadPoolExecutor pool;
 | 
			
		||||
  private static final Map<Branch.NameKey, MergeEntry> active =
 | 
			
		||||
      new HashMap<Branch.NameKey, MergeEntry>();
 | 
			
		||||
 | 
			
		||||
  public static void terminate() {
 | 
			
		||||
    final ScheduledThreadPoolExecutor p = shutdown();
 | 
			
		||||
    if (p != null) {
 | 
			
		||||
      boolean isTerminated;
 | 
			
		||||
      do {
 | 
			
		||||
        try {
 | 
			
		||||
          isTerminated = p.awaitTermination(10, TimeUnit.SECONDS);
 | 
			
		||||
        } catch (InterruptedException ie) {
 | 
			
		||||
          isTerminated = false;
 | 
			
		||||
        }
 | 
			
		||||
      } while (!isTerminated);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private static synchronized ScheduledThreadPoolExecutor shutdown() {
 | 
			
		||||
    final ScheduledThreadPoolExecutor p = pool;
 | 
			
		||||
    if (p != null) {
 | 
			
		||||
      p.shutdown();
 | 
			
		||||
      pool = null;
 | 
			
		||||
      return p;
 | 
			
		||||
    }
 | 
			
		||||
    return null;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public static void merge(final Branch.NameKey branch) {
 | 
			
		||||
    if (start(branch)) {
 | 
			
		||||
      try {
 | 
			
		||||
@@ -100,12 +74,8 @@ public class MergeQueue {
 | 
			
		||||
      // No job has been scheduled to execute this branch, but it needs
 | 
			
		||||
      // to run a merge again.
 | 
			
		||||
      //
 | 
			
		||||
      if (pool == null) {
 | 
			
		||||
        pool = new ScheduledThreadPoolExecutor(1);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      e.jobScheduled = true;
 | 
			
		||||
      pool.schedule(new Runnable() {
 | 
			
		||||
      WorkQueue.schedule(new Runnable() {
 | 
			
		||||
        public void run() {
 | 
			
		||||
          unschedule(e);
 | 
			
		||||
          try {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										56
									
								
								appjar/src/main/java/com/google/gerrit/git/WorkQueue.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								appjar/src/main/java/com/google/gerrit/git/WorkQueue.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,56 @@
 | 
			
		||||
// Copyright 2009 Google Inc.
 | 
			
		||||
//
 | 
			
		||||
// 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.git;
 | 
			
		||||
 | 
			
		||||
import java.util.concurrent.ScheduledThreadPoolExecutor;
 | 
			
		||||
import java.util.concurrent.TimeUnit;
 | 
			
		||||
 | 
			
		||||
public class WorkQueue {
 | 
			
		||||
  private static ScheduledThreadPoolExecutor pool;
 | 
			
		||||
 | 
			
		||||
  public static synchronized void schedule(final Runnable task,
 | 
			
		||||
      final long delay, final TimeUnit unit) {
 | 
			
		||||
    if (pool == null) {
 | 
			
		||||
      pool = new ScheduledThreadPoolExecutor(1);
 | 
			
		||||
      pool.setKeepAliveTime(60, TimeUnit.SECONDS);
 | 
			
		||||
      pool.setMaximumPoolSize(5);
 | 
			
		||||
    }
 | 
			
		||||
    pool.schedule(task, delay, unit);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public static void terminate() {
 | 
			
		||||
    final ScheduledThreadPoolExecutor p = shutdown();
 | 
			
		||||
    if (p != null) {
 | 
			
		||||
      boolean isTerminated;
 | 
			
		||||
      do {
 | 
			
		||||
        try {
 | 
			
		||||
          isTerminated = p.awaitTermination(10, TimeUnit.SECONDS);
 | 
			
		||||
        } catch (InterruptedException ie) {
 | 
			
		||||
          isTerminated = false;
 | 
			
		||||
        }
 | 
			
		||||
      } while (!isTerminated);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private static synchronized ScheduledThreadPoolExecutor shutdown() {
 | 
			
		||||
    final ScheduledThreadPoolExecutor p = pool;
 | 
			
		||||
    if (p != null) {
 | 
			
		||||
      p.shutdown();
 | 
			
		||||
      pool = null;
 | 
			
		||||
      return p;
 | 
			
		||||
    }
 | 
			
		||||
    return null;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@@ -16,7 +16,7 @@ package com.google.gerrit.server;
 | 
			
		||||
 | 
			
		||||
import com.google.gerrit.client.rpc.NotSignedInException;
 | 
			
		||||
import com.google.gerrit.client.rpc.SignInRequired;
 | 
			
		||||
import com.google.gerrit.git.MergeQueue;
 | 
			
		||||
import com.google.gerrit.git.WorkQueue;
 | 
			
		||||
import com.google.gwtjsonrpc.server.JsonServlet;
 | 
			
		||||
import com.google.gwtjsonrpc.server.SignedToken;
 | 
			
		||||
import com.google.gwtjsonrpc.server.XsrfException;
 | 
			
		||||
@@ -53,7 +53,7 @@ public abstract class GerritJsonServlet extends JsonServlet<GerritCall> {
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  public void destroy() {
 | 
			
		||||
    MergeQueue.terminate();
 | 
			
		||||
    WorkQueue.terminate();
 | 
			
		||||
    super.destroy();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user