Don't remove pack from pack list for problems which could be transient
If we hit a corrupt object or invalid pack remove the pack from the pack list. Other IOException could be transient hence we should not remove the pack from the list to avoid the problem reported on the Gerrit list [1]. It looks like in the reported case the pack was removed from the pack list causing MissingObjectExceptions which disappear when the server is restarted. [1] https://groups.google.com/forum/#!topic/repo-discuss/Qdmbl-YZ4NU Change-Id: I331626110d54b190e46cddc2c40f29ddeb9613cd Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
This commit is contained in:
parent
9b86ebb4f6
commit
27ee334213
|
@ -145,6 +145,7 @@ couldNotRenameTemporaryIndexFileToIndex=Could not rename temporary index file to
|
|||
couldNotURLEncodeToUTF8=Could not URL encode to UTF-8
|
||||
couldNotWriteFile=Could not write file {0}
|
||||
countingObjects=Counting objects
|
||||
corruptPack=Pack file {0} is corrupt
|
||||
createBranchFailedUnknownReason=Create branch failed for unknown reason
|
||||
createBranchUnexpectedResult=Create branch returned unexpected result {0}
|
||||
createNewFileFailed=Could not create new file {0}
|
||||
|
|
|
@ -190,6 +190,7 @@ public static JGitText get() {
|
|||
/***/ public String corruptObjectNotree;
|
||||
/***/ public String corruptObjectNoType;
|
||||
/***/ public String corruptObjectPackfileChecksumIncorrect;
|
||||
/***/ public String corruptPack;
|
||||
/***/ public String couldNotCheckOutBecauseOfConflicts;
|
||||
/***/ public String couldNotDeleteLockFileShouldNotHappen;
|
||||
/***/ public String couldNotDeleteTemporaryIndexFileShouldNotHappen;
|
||||
|
|
|
@ -66,6 +66,8 @@
|
|||
import java.util.Set;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
|
||||
import org.eclipse.jgit.errors.CorruptObjectException;
|
||||
import org.eclipse.jgit.errors.PackInvalidException;
|
||||
import org.eclipse.jgit.errors.PackMismatchException;
|
||||
import org.eclipse.jgit.internal.JGitText;
|
||||
import org.eclipse.jgit.internal.storage.pack.ObjectToPack;
|
||||
|
@ -330,9 +332,7 @@ void resolve(Set<ObjectId> matches, AbbreviatedObjectId id)
|
|||
try {
|
||||
p.resolve(matches, id, RESOLVE_ABBREV_LIMIT);
|
||||
} catch (IOException e) {
|
||||
// Assume the pack is corrupted.
|
||||
logCorruptPackError(e, p);
|
||||
removePack(p);
|
||||
handlePackError(e, p);
|
||||
}
|
||||
if (matches.size() > RESOLVE_ABBREV_LIMIT)
|
||||
return;
|
||||
|
@ -419,9 +419,7 @@ ObjectLoader openPackedObject(WindowCursor curs, AnyObjectId objectId) {
|
|||
if (searchPacksAgain(pList))
|
||||
continue SEARCH;
|
||||
} catch (IOException e) {
|
||||
// Assume the pack is corrupted.
|
||||
logCorruptPackError(e, p);
|
||||
removePack(p);
|
||||
handlePackError(e, p);
|
||||
}
|
||||
}
|
||||
break SEARCH;
|
||||
|
@ -501,9 +499,7 @@ private long getPackedObjectSize(WindowCursor curs, AnyObjectId id) {
|
|||
if (searchPacksAgain(pList))
|
||||
continue SEARCH;
|
||||
} catch (IOException e) {
|
||||
// Assume the pack is corrupted.
|
||||
logCorruptPackError(e, p);
|
||||
removePack(p);
|
||||
handlePackError(e, p);
|
||||
}
|
||||
}
|
||||
break SEARCH;
|
||||
|
@ -544,9 +540,7 @@ void selectObjectRepresentation(PackWriter packer, ObjectToPack otp,
|
|||
pList = scanPacks(pList);
|
||||
continue SEARCH;
|
||||
} catch (IOException e) {
|
||||
// Assume the pack is corrupted.
|
||||
logCorruptPackError(e, p);
|
||||
removePack(p);
|
||||
handlePackError(e, p);
|
||||
}
|
||||
}
|
||||
break SEARCH;
|
||||
|
@ -556,9 +550,19 @@ void selectObjectRepresentation(PackWriter packer, ObjectToPack otp,
|
|||
h.db.selectObjectRepresentation(packer, otp, curs);
|
||||
}
|
||||
|
||||
private static void logCorruptPackError(IOException e, PackFile p) {
|
||||
StringBuilder buf = new StringBuilder(MessageFormat.format(
|
||||
JGitText.get().exceptionWhileReadingPack,
|
||||
private void handlePackError(IOException e, PackFile p) {
|
||||
String tmpl;
|
||||
if ((e instanceof CorruptObjectException)
|
||||
|| (e instanceof PackInvalidException)) {
|
||||
tmpl = JGitText.get().corruptPack;
|
||||
// Assume the pack is corrupted, and remove it from the list.
|
||||
removePack(p);
|
||||
} else {
|
||||
tmpl = JGitText.get().exceptionWhileReadingPack;
|
||||
// Don't remove the pack from the list, as the error may be
|
||||
// transient.
|
||||
}
|
||||
StringBuilder buf = new StringBuilder(MessageFormat.format(tmpl,
|
||||
p.getPackFile().getAbsolutePath()));
|
||||
StringWriter sw = new StringWriter();
|
||||
e.printStackTrace(new PrintWriter(sw));
|
||||
|
|
Loading…
Reference in New Issue