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.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 {
|
||||||
|
|||||||
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.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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user