aboutsummaryrefslogtreecommitdiffstats
path: root/org.eclipse.jgit
diff options
context:
space:
mode:
authorHan-Wen Nienhuys <hanwen@google.com>2022-01-31 12:23:55 +0100
committerHan-Wen Nienhuys <hanwen@google.com>2022-02-02 14:12:15 +0100
commita650ae8ad3f459f02f5e362baef49316deed80bb (patch)
tree3027c61c27af3c62a4defdbfba00207fed6ba41a /org.eclipse.jgit
parent424c861477fbc48db38578d6f572c8d0cc2ba710 (diff)
downloadjgit-a650ae8ad3f459f02f5e362baef49316deed80bb.tar.gz
jgit-a650ae8ad3f459f02f5e362baef49316deed80bb.zip
reftable: tweaks for Windows
Reload the stack _before_ trying to delete the files. This ensures we don't trip over our own open file handles when deleting compacted tables. If there is another process reading the file, it may be impossible to delete the compacted tables. In this case, ignore the failure. For cleaning the garbage in this case, the protocol as described in https://www.git-scm.com/docs/reftable#_windows should be implemented. This is left for another commit. Bug: 578454 Change-Id: I7aa43508450041eb9376d9f67a0262ff7cc53c73
Diffstat (limited to 'org.eclipse.jgit')
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileReftableStack.java13
1 files changed, 11 insertions, 2 deletions
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileReftableStack.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileReftableStack.java
index f02c8613a0..5152367d23 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileReftableStack.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileReftableStack.java
@@ -40,6 +40,7 @@ import org.eclipse.jgit.internal.storage.reftable.ReftableReader;
import org.eclipse.jgit.internal.storage.reftable.ReftableWriter;
import org.eclipse.jgit.lib.Config;
import org.eclipse.jgit.util.FileUtils;
+import org.eclipse.jgit.util.SystemReader;
/**
* A mutable stack of reftables on local filesystem storage. Not thread-safe.
@@ -527,11 +528,19 @@ public class FileReftableStack implements AutoCloseable {
return false;
}
+ reload();
for (File f : deleteOnSuccess) {
- Files.delete(f.toPath());
+ try {
+ Files.delete(f.toPath());
+ } catch (IOException e) {
+ // Ignore: this can happen on Windows in case of concurrent processes.
+ // leave the garbage and continue.
+ if (!SystemReader.getInstance().isWindows()) {
+ throw e;
+ }
+ }
}
- reload();
return true;
} finally {
if (tmpTable != null) {