summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSaša Živkov <sasa.zivkov@sap.com>2015-05-20 16:57:24 +0200
committerMatthias Sohn <matthias.sohn@sap.com>2015-05-26 10:28:59 +0200
commitd9062145b8cf7ca3c275e1f8b17eeb4973c55d28 (patch)
tree8d9cc17219e8960994e3685ae8c595372aa38652
parent39a29fba500a9d691a911a4e55edf29d67d81e8e (diff)
downloadjgit-d9062145b8cf7ca3c275e1f8b17eeb4973c55d28.tar.gz
jgit-d9062145b8cf7ca3c275e1f8b17eeb4973c55d28.zip
Don't invalidate pack file on InterruptedIOException
If the thread reading a pack file is interrupted don't invalidate that pack file. This could happen when Gerrit invoked JGit for computing a diff in one thread and waited for the call to finish from another thread, with a timeout. When the timeout was reached the "diff" thread was interrupted. If it happened to be in an IO operation, reading a pack file, an InterruptedIOException was thrown and the pack file was marked as invalid and removed from the pack list. Invalidating the pack in that case could cause the project disappearing in Gerrit as discussed in [1] and [2]. [1] https://groups.google.com/forum/#!topic/repo-discuss/CYYoHfDxCfA [2] https://groups.google.com/forum/#!topic/repo-discuss/ZeGWPyyJlrM Change-Id: I2eb1f98370936b5be541d96d70c3973cbfc39238 Signed-off-by: Matthias Sohn <matthias.sohn@sap.com> Signed-off-by: Sasa Zivkov <sasa.zivkov@sap.com>
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackFile.java18
1 files changed, 13 insertions, 5 deletions
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackFile.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackFile.java
index 75c361e10b..b29966eace 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackFile.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackFile.java
@@ -51,6 +51,7 @@ import static org.eclipse.jgit.internal.storage.pack.PackExt.INDEX;
import java.io.EOFException;
import java.io.File;
import java.io.IOException;
+import java.io.InterruptedIOException;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel.MapMode;
@@ -177,6 +178,9 @@ public class PackFile implements Iterable<PackIndex.MutableEntry> {
packFile.getPath()));
}
loadedIdx = idx;
+ } catch (InterruptedIOException e) {
+ // don't invalidate the pack, we are interrupted from another thread
+ throw e;
} catch (IOException e) {
invalid = true;
throw e;
@@ -605,22 +609,26 @@ public class PackFile implements Iterable<PackIndex.MutableEntry> {
length = fd.length();
onOpenPack();
}
+ } catch (InterruptedIOException e) {
+ // don't invalidate the pack, we are interrupted from another thread
+ openFail(false);
+ throw e;
} catch (IOException ioe) {
- openFail();
+ openFail(true);
throw ioe;
} catch (RuntimeException re) {
- openFail();
+ openFail(true);
throw re;
} catch (Error re) {
- openFail();
+ openFail(true);
throw re;
}
}
- private void openFail() {
+ private void openFail(boolean invalidate) {
activeWindows = 0;
activeCopyRawData = 0;
- invalid = true;
+ invalid = invalidate;
doClose();
}