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:
Shawn O. Pearce
2009-01-23 14:00:30 -08:00
parent b61d906495
commit d6f3afbd24
3 changed files with 59 additions and 33 deletions

View File

@@ -22,39 +22,13 @@ import org.slf4j.LoggerFactory;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
public class MergeQueue { public class MergeQueue {
private static final Logger log = LoggerFactory.getLogger(MergeQueue.class); private static final Logger log = LoggerFactory.getLogger(MergeQueue.class);
private static ScheduledThreadPoolExecutor pool;
private static final Map<Branch.NameKey, MergeEntry> active = private static final Map<Branch.NameKey, MergeEntry> active =
new HashMap<Branch.NameKey, MergeEntry>(); 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) { public static void merge(final Branch.NameKey branch) {
if (start(branch)) { if (start(branch)) {
try { try {
@@ -100,12 +74,8 @@ public class MergeQueue {
// No job has been scheduled to execute this branch, but it needs // No job has been scheduled to execute this branch, but it needs
// to run a merge again. // to run a merge again.
// //
if (pool == null) {
pool = new ScheduledThreadPoolExecutor(1);
}
e.jobScheduled = true; e.jobScheduled = true;
pool.schedule(new Runnable() { WorkQueue.schedule(new Runnable() {
public void run() { public void run() {
unschedule(e); unschedule(e);
try { try {

View 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;
}
}

View File

@@ -16,7 +16,7 @@ package com.google.gerrit.server;
import com.google.gerrit.client.rpc.NotSignedInException; import com.google.gerrit.client.rpc.NotSignedInException;
import com.google.gerrit.client.rpc.SignInRequired; 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.JsonServlet;
import com.google.gwtjsonrpc.server.SignedToken; import com.google.gwtjsonrpc.server.SignedToken;
import com.google.gwtjsonrpc.server.XsrfException; import com.google.gwtjsonrpc.server.XsrfException;
@@ -53,7 +53,7 @@ public abstract class GerritJsonServlet extends JsonServlet<GerritCall> {
@Override @Override
public void destroy() { public void destroy() {
MergeQueue.terminate(); WorkQueue.terminate();
super.destroy(); super.destroy();
} }