]> source.dussan.org Git - jgit.git/commitdiff
Don't invalidate pack file on InterruptedIOException 88/48288/3
authorSaša Živkov <sasa.zivkov@sap.com>
Wed, 20 May 2015 14:57:24 +0000 (16:57 +0200)
committerMatthias Sohn <matthias.sohn@sap.com>
Tue, 26 May 2015 08:28:59 +0000 (10:28 +0200)
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>
org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackFile.java

index 75c361e10bff1e2cd7a1b904a11552ff5e7adb88..b29966eace3d01e92378dddad6e3e95b57e82712 100644 (file)
@@ -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();
        }