Allow to use an external ExecutorService for background auto-gc
If set use the external executor, otherwise use JGit's own simple WorkQueue. Move WorkQueue to an internal package so we can reuse it without exposing it in the public API. Change-Id: I060d62ffd6692362a88b4bf13ee07b0dc857abe9 Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
This commit is contained in:
parent
b6f954ad42
commit
18ae9bb57d
|
@ -85,6 +85,7 @@ Export-Package: org.eclipse.jgit.annotations;version="4.8.0",
|
||||||
org.eclipse.jgit.treewalk,
|
org.eclipse.jgit.treewalk,
|
||||||
org.eclipse.jgit.transport,
|
org.eclipse.jgit.transport,
|
||||||
org.eclipse.jgit.submodule",
|
org.eclipse.jgit.submodule",
|
||||||
|
org.eclipse.jgit.lib.internal;version="4.8.0";x-internal:=true,
|
||||||
org.eclipse.jgit.merge;version="4.8.0";
|
org.eclipse.jgit.merge;version="4.8.0";
|
||||||
uses:="org.eclipse.jgit.lib,
|
uses:="org.eclipse.jgit.lib,
|
||||||
org.eclipse.jgit.treewalk,
|
org.eclipse.jgit.treewalk,
|
||||||
|
|
|
@ -78,7 +78,6 @@
|
||||||
import java.util.concurrent.Callable;
|
import java.util.concurrent.Callable;
|
||||||
import java.util.concurrent.ExecutionException;
|
import java.util.concurrent.ExecutionException;
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
import java.util.concurrent.Executors;
|
|
||||||
import java.util.concurrent.Future;
|
import java.util.concurrent.Future;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
@ -107,6 +106,7 @@
|
||||||
import org.eclipse.jgit.lib.ProgressMonitor;
|
import org.eclipse.jgit.lib.ProgressMonitor;
|
||||||
import org.eclipse.jgit.lib.Ref;
|
import org.eclipse.jgit.lib.Ref;
|
||||||
import org.eclipse.jgit.lib.Ref.Storage;
|
import org.eclipse.jgit.lib.Ref.Storage;
|
||||||
|
import org.eclipse.jgit.lib.internal.WorkQueue;
|
||||||
import org.eclipse.jgit.lib.RefDatabase;
|
import org.eclipse.jgit.lib.RefDatabase;
|
||||||
import org.eclipse.jgit.lib.ReflogEntry;
|
import org.eclipse.jgit.lib.ReflogEntry;
|
||||||
import org.eclipse.jgit.lib.ReflogReader;
|
import org.eclipse.jgit.lib.ReflogReader;
|
||||||
|
@ -151,7 +151,19 @@ public class GC {
|
||||||
|
|
||||||
private static final int DEFAULT_AUTOLIMIT = 6700;
|
private static final int DEFAULT_AUTOLIMIT = 6700;
|
||||||
|
|
||||||
private static ExecutorService executor = Executors.newFixedThreadPool(1);
|
private static volatile ExecutorService executor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the executor for running auto-gc in the background. If no executor is
|
||||||
|
* set JGit's own WorkQueue will be used.
|
||||||
|
*
|
||||||
|
* @param e
|
||||||
|
* the executor to be used for running auto-gc
|
||||||
|
* @since 4.8
|
||||||
|
*/
|
||||||
|
public static void setExecutor(ExecutorService e) {
|
||||||
|
executor = e;
|
||||||
|
}
|
||||||
|
|
||||||
private final FileRepository repo;
|
private final FileRepository repo;
|
||||||
|
|
||||||
|
@ -271,7 +283,7 @@ public Collection<PackFile> gc() throws IOException, ParseException {
|
||||||
}
|
}
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
};
|
};
|
||||||
Future<Collection<PackFile>> result = executor.submit(gcTask);
|
Future<Collection<PackFile>> result = executor().submit(gcTask);
|
||||||
if (background) {
|
if (background) {
|
||||||
// TODO(ms): in 5.0 change signature and return the Future
|
// TODO(ms): in 5.0 change signature and return the Future
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
|
@ -283,6 +295,10 @@ public Collection<PackFile> gc() throws IOException, ParseException {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private ExecutorService executor() {
|
||||||
|
return (executor != null) ? executor : WorkQueue.getExecutor();
|
||||||
|
}
|
||||||
|
|
||||||
private Collection<PackFile> doGc() throws IOException, ParseException {
|
private Collection<PackFile> doGc() throws IOException, ParseException {
|
||||||
if (automatic && !needGc()) {
|
if (automatic && !needGc()) {
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
|
|
|
@ -46,6 +46,8 @@
|
||||||
import java.util.concurrent.Future;
|
import java.util.concurrent.Future;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import org.eclipse.jgit.lib.internal.WorkQueue;
|
||||||
|
|
||||||
/** ProgressMonitor that batches update events. */
|
/** ProgressMonitor that batches update events. */
|
||||||
public abstract class BatchingProgressMonitor implements ProgressMonitor {
|
public abstract class BatchingProgressMonitor implements ProgressMonitor {
|
||||||
private long delayStartTime;
|
private long delayStartTime;
|
||||||
|
|
|
@ -55,6 +55,7 @@
|
||||||
import org.eclipse.jgit.annotations.NonNull;
|
import org.eclipse.jgit.annotations.NonNull;
|
||||||
import org.eclipse.jgit.errors.RepositoryNotFoundException;
|
import org.eclipse.jgit.errors.RepositoryNotFoundException;
|
||||||
import org.eclipse.jgit.internal.storage.file.FileRepository;
|
import org.eclipse.jgit.internal.storage.file.FileRepository;
|
||||||
|
import org.eclipse.jgit.lib.internal.WorkQueue;
|
||||||
import org.eclipse.jgit.util.FS;
|
import org.eclipse.jgit.util.FS;
|
||||||
import org.eclipse.jgit.util.IO;
|
import org.eclipse.jgit.util.IO;
|
||||||
import org.eclipse.jgit.util.RawParseUtils;
|
import org.eclipse.jgit.util.RawParseUtils;
|
||||||
|
|
|
@ -41,7 +41,7 @@
|
||||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.eclipse.jgit.lib;
|
package org.eclipse.jgit.lib.internal;
|
||||||
|
|
||||||
import java.util.concurrent.Executors;
|
import java.util.concurrent.Executors;
|
||||||
import java.util.concurrent.ScheduledThreadPoolExecutor;
|
import java.util.concurrent.ScheduledThreadPoolExecutor;
|
||||||
|
@ -50,7 +50,7 @@
|
||||||
/**
|
/**
|
||||||
* Simple work queue to run tasks in the background
|
* Simple work queue to run tasks in the background
|
||||||
*/
|
*/
|
||||||
class WorkQueue {
|
public class WorkQueue {
|
||||||
private static final ScheduledThreadPoolExecutor executor;
|
private static final ScheduledThreadPoolExecutor executor;
|
||||||
|
|
||||||
static final Object executorKiller;
|
static final Object executorKiller;
|
||||||
|
@ -94,7 +94,10 @@ protected void finalize() {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
static ScheduledThreadPoolExecutor getExecutor() {
|
/**
|
||||||
|
* @return the WorkQueue's executor
|
||||||
|
*/
|
||||||
|
public static ScheduledThreadPoolExecutor getExecutor() {
|
||||||
return executor;
|
return executor;
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue