diff options
author | Matthias Sohn <matthias.sohn@sap.com> | 2023-02-22 21:04:31 +0100 |
---|---|---|
committer | Matthias Sohn <matthias.sohn@sap.com> | 2023-02-22 21:05:55 +0100 |
commit | f4eda3360a637beb3bc172810d9f9d3abec4360c (patch) | |
tree | 05bd53bcd50d9e897538408a91445663938d4bcd | |
parent | dcd6367391b02e6cf70fe73e1cb76a1d656e988a (diff) | |
parent | 636f377e4ebfb2e35d432b040a91b11083add923 (diff) | |
download | jgit-f4eda3360a637beb3bc172810d9f9d3abec4360c.tar.gz jgit-f4eda3360a637beb3bc172810d9f9d3abec4360c.zip |
Merge branch 'stable-6.3' into stable-6.4
* stable-6.3:
If tryLock fails to get the lock another gc has it
Fix GcConcurrentTest#testInterruptGc
Don't swallow IOException in GC.PidLock#lock
Check if FileLock is valid before using or releasing it
Change-Id: I5af34c92e423a651db53b4dc45ed844d5f39910d
-rw-r--r-- | org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcConcurrentTest.java | 8 | ||||
-rw-r--r-- | org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GC.java | 10 |
2 files changed, 8 insertions, 10 deletions
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcConcurrentTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcConcurrentTest.java index 2c5f1a8eba..5f52e6b220 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcConcurrentTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcConcurrentTest.java @@ -14,10 +14,10 @@ import static java.lang.Integer.valueOf; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.IOException; +import java.nio.channels.ClosedByInterruptException; import java.util.Collection; import java.util.Collections; import java.util.concurrent.BrokenBarrierException; @@ -226,10 +226,8 @@ public class GcConcurrentTest extends GcTestCase { if (cause instanceof CancelledException) { assertEquals(JGitText.get().operationCanceled, cause.getMessage()); - } else if (cause instanceof IOException) { - Throwable cause2 = cause.getCause(); - assertTrue(cause2 instanceof InterruptedException - || cause2 instanceof ExecutionException); + } else if (cause instanceof ClosedByInterruptException) { + // thread was interrupted } else { fail("unexpected exception " + e); } 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 080af97cbc..de01168195 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 @@ -1631,7 +1631,7 @@ public class GC { pidFile = repo.getDirectory().toPath().resolve(GC_PID); } - boolean lock() { + boolean lock() throws IOException { if (Files.exists(pidFile)) { Instant mtime = FS.DETECTED .lastModifiedInstant(pidFile.toFile()); @@ -1649,8 +1649,8 @@ public class GC { f = new RandomAccessFile(pidFile.toFile(), "rw"); //$NON-NLS-1$ channel = f.getChannel(); lock = channel.tryLock(); - if (lock == null) { - failedToLock(); + if (lock == null || !lock.isValid()) { + gcAlreadyRunning(); return false; } channel.write(ByteBuffer @@ -1670,7 +1670,7 @@ public class GC { JGitText.get().closePidLockFailed, pidFile), e1); } - return false; + throw e; } return true; } @@ -1728,7 +1728,7 @@ public class GC { public void close() { boolean wasLocked = false; try { - if (lock != null) { + if (lock != null && lock.isValid()) { lock.release(); wasLocked = true; } |