diff options
author | Matthias Sohn <matthias.sohn@sap.com> | 2018-08-18 13:57:42 +0200 |
---|---|---|
committer | Matthias Sohn <matthias.sohn@sap.com> | 2018-08-18 13:57:42 +0200 |
commit | 60c77919189450c99315f9a1c693b66e416223e3 (patch) | |
tree | dcdecad3530eecd67c3f4d83a772fc704a67f400 /org.eclipse.jgit | |
parent | fb327145f09e1bcdc3c79d9a55df2d8dc7d9100e (diff) | |
parent | 78d7d9916cb84142f0ca03fbeb3a176c4223255e (diff) | |
download | jgit-60c77919189450c99315f9a1c693b66e416223e3.tar.gz jgit-60c77919189450c99315f9a1c693b66e416223e3.zip |
Merge branch 'stable-5.0'
* stable-5.0:
Fix GC run in foreground to not use executor
Change-Id: I484391e5589d70de136126d153f886f5afa12e88
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
Diffstat (limited to 'org.eclipse.jgit')
-rw-r--r-- | org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GC.java | 55 | ||||
-rw-r--r-- | org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GcLog.java | 22 |
2 files changed, 22 insertions, 55 deletions
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GC.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GC.java index 08f536d662..3fab484f29 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GC.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GC.java @@ -77,15 +77,12 @@ import java.util.Objects; import java.util.Set; import java.util.TreeMap; import java.util.concurrent.Callable; -import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; -import java.util.concurrent.Future; import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.stream.Stream; import org.eclipse.jgit.annotations.NonNull; -import org.eclipse.jgit.api.errors.JGitInternalException; import org.eclipse.jgit.dircache.DirCacheIterator; import org.eclipse.jgit.errors.CancelledException; import org.eclipse.jgit.errors.CorruptObjectException; @@ -248,8 +245,11 @@ public class GC { */ // TODO(ms): in 5.0 change signature and return Future<Collection<PackFile>> public Collection<PackFile> gc() throws IOException, ParseException { - final GcLog gcLog = background ? new GcLog(repo) : null; - if (gcLog != null && !gcLog.lock(background)) { + if (!background) { + return doGc(); + } + final GcLog gcLog = new GcLog(repo); + if (!gcLog.lock()) { // there is already a background gc running return Collections.emptyList(); } @@ -257,48 +257,31 @@ public class GC { Callable<Collection<PackFile>> gcTask = () -> { try { Collection<PackFile> newPacks = doGc(); - if (automatic && tooManyLooseObjects() && gcLog != null) { + if (automatic && tooManyLooseObjects()) { String message = JGitText.get().gcTooManyUnpruned; gcLog.write(message); gcLog.commit(); } return newPacks; } catch (IOException | ParseException e) { - if (background) { - if (gcLog == null) { - // Lacking a log, there's no way to report this. - return Collections.emptyList(); - } - try { - gcLog.write(e.getMessage()); - StringWriter sw = new StringWriter(); - e.printStackTrace(new PrintWriter(sw)); - gcLog.write(sw.toString()); - gcLog.commit(); - } catch (IOException e2) { - e2.addSuppressed(e); - LOG.error(e2.getMessage(), e2); - } - } else { - throw new JGitInternalException(e.getMessage(), e); + try { + gcLog.write(e.getMessage()); + StringWriter sw = new StringWriter(); + e.printStackTrace(new PrintWriter(sw)); + gcLog.write(sw.toString()); + gcLog.commit(); + } catch (IOException e2) { + e2.addSuppressed(e); + LOG.error(e2.getMessage(), e2); } } finally { - if (gcLog != null) { - gcLog.unlock(); - } + gcLog.unlock(); } return Collections.emptyList(); }; - Future<Collection<PackFile>> result = executor().submit(gcTask); - if (background) { - // TODO(ms): in 5.0 change signature and return the Future - return Collections.emptyList(); - } - try { - return result.get(); - } catch (InterruptedException | ExecutionException e) { - throw new IOException(e); - } + // TODO(ms): in 5.0 change signature and return the Future + executor().submit(gcTask); + return Collections.emptyList(); } private ExecutorService executor() { diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GcLog.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GcLog.java index c159a94705..0e587ce827 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GcLog.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GcLog.java @@ -45,18 +45,15 @@ package org.eclipse.jgit.internal.storage.file; import static org.eclipse.jgit.lib.Constants.CHARSET; -import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.NoSuchFileException; import java.nio.file.attribute.FileTime; -import java.text.MessageFormat; import java.text.ParseException; import java.time.Instant; import org.eclipse.jgit.api.errors.JGitInternalException; -import org.eclipse.jgit.internal.JGitText; import org.eclipse.jgit.lib.ConfigConstants; import org.eclipse.jgit.util.FileUtils; import org.eclipse.jgit.util.GitDateParser; @@ -104,22 +101,11 @@ class GcLog { return gcLogExpire; } - private boolean autoGcBlockedByOldLockFile(boolean background) { + private boolean autoGcBlockedByOldLockFile() { try { FileTime lastModified = Files.getLastModifiedTime(FileUtils.toPath(logFile)); if (lastModified.toInstant().compareTo(getLogExpiry()) > 0) { // There is an existing log file, which is too recent to ignore - if (!background) { - try (BufferedReader reader = Files - .newBufferedReader(FileUtils.toPath(logFile))) { - char[] buf = new char[1000]; - int len = reader.read(buf, 0, 1000); - String oldError = new String(buf, 0, len); - - throw new JGitInternalException(MessageFormat.format( - JGitText.get().gcLogExists, oldError, logFile)); - } - } return true; } } catch (NoSuchFileException e) { @@ -133,11 +119,9 @@ class GcLog { /** * Lock the GC log file for updates * - * @param background - * If true, and if gc.log already exists, unlock and return false * @return {@code true} if we hold the lock */ - boolean lock(boolean background) { + boolean lock() { try { if (!lock.lock()) { return false; @@ -145,7 +129,7 @@ class GcLog { } catch (IOException e) { throw new JGitInternalException(e.getMessage(), e); } - if (autoGcBlockedByOldLockFile(background)) { + if (autoGcBlockedByOldLockFile()) { lock.unlock(); return false; } |