Provide more details in exceptions thrown when packfile is invalid

Mention packfile path in exceptions thrown when we detect that a
packfile is invalid and make excplicit that corrupt packs are removed
from the pack list.

Change-Id: I454ada5f8e69307d3f34d1c1b8f3cb87607ddf35
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
This commit is contained in:
Matthias Sohn 2015-02-10 18:23:14 +01:00
parent a8743df19c
commit 57644f23a1
8 changed files with 25 additions and 14 deletions

View File

@ -162,7 +162,7 @@ public void testPush_UnpackError_TruncatedPack() throws Exception {
try { try {
PacketLineIn pckin = new PacketLineIn(rawin); PacketLineIn pckin = new PacketLineIn(rawin);
assertEquals("unpack error " assertEquals("unpack error "
+ JGitText.get().packfileIsTruncated, + JGitText.get().packfileIsTruncatedNoParam,
pckin.readString()); pckin.readString());
assertEquals("ng refs/objects/A n/a (unpacker error)", assertEquals("ng refs/objects/A n/a (unpacker error)",
pckin.readString()); pckin.readString());

View File

@ -146,7 +146,7 @@ couldNotRenameTemporaryIndexFileToIndex=Could not rename temporary index file to
couldNotURLEncodeToUTF8=Could not URL encode to UTF-8 couldNotURLEncodeToUTF8=Could not URL encode to UTF-8
couldNotWriteFile=Could not write file {0} couldNotWriteFile=Could not write file {0}
countingObjects=Counting objects countingObjects=Counting objects
corruptPack=Pack file {0} is corrupt corruptPack=Pack file {0} is corrupt, removing it from pack list
createBranchFailedUnknownReason=Create branch failed for unknown reason createBranchFailedUnknownReason=Create branch failed for unknown reason
createBranchUnexpectedResult=Create branch returned unexpected result {0} createBranchUnexpectedResult=Create branch returned unexpected result {0}
createNewFileFailed=Could not create new file {0} createNewFileFailed=Could not create new file {0}
@ -381,14 +381,15 @@ openFilesMustBeAtLeast1=Open files must be >= 1
openingConnection=Opening connection openingConnection=Opening connection
operationCanceled=Operation {0} was canceled operationCanceled=Operation {0} was canceled
outputHasAlreadyBeenStarted=Output has already been started. outputHasAlreadyBeenStarted=Output has already been started.
packChecksumMismatch=Pack checksum mismatch packChecksumMismatch=Pack checksum mismatch detected for pack file {0}
packCorruptedWhileWritingToFilesystem=Pack corrupted while writing to filesystem packCorruptedWhileWritingToFilesystem=Pack corrupted while writing to filesystem
packDoesNotMatchIndex=Pack {0} does not match index packDoesNotMatchIndex=Pack {0} does not match index
packetSizeMustBeAtLeast=packet size {0} must be >= {1} packetSizeMustBeAtLeast=packet size {0} must be >= {1}
packetSizeMustBeAtMost=packet size {0} must be <= {1} packetSizeMustBeAtMost=packet size {0} must be <= {1}
packfileCorruptionDetected=Packfile corruption detected: {0} packfileCorruptionDetected=Packfile corruption detected: {0}
packFileInvalid=Pack file invalid: {0} packFileInvalid=Pack file invalid: {0}
packfileIsTruncated=Packfile is truncated. packfileIsTruncated=Packfile {0} is truncated.
packfileIsTruncatedNoParam=Packfile is truncated.
packHasUnresolvedDeltas=pack has unresolved deltas packHasUnresolvedDeltas=pack has unresolved deltas
packingCancelledDuringObjectsWriting=Packing cancelled during objects writing packingCancelledDuringObjectsWriting=Packing cancelled during objects writing
packObjectCountMismatch=Pack object count mismatch: pack {0} index {1}: {2} packObjectCountMismatch=Pack object count mismatch: pack {0} index {1}: {2}

View File

@ -448,6 +448,7 @@ public static JGitText get() {
/***/ public String packfileCorruptionDetected; /***/ public String packfileCorruptionDetected;
/***/ public String packFileInvalid; /***/ public String packFileInvalid;
/***/ public String packfileIsTruncated; /***/ public String packfileIsTruncated;
/***/ public String packfileIsTruncatedNoParam;
/***/ public String packHasUnresolvedDeltas; /***/ public String packHasUnresolvedDeltas;
/***/ public String packingCancelledDuringObjectsWriting; /***/ public String packingCancelledDuringObjectsWriting;
/***/ public String packObjectCountMismatch; /***/ public String packObjectCountMismatch;

View File

@ -199,7 +199,7 @@ public long getCachedSize() {
return key.cachedSize.get(); return key.cachedSize.get();
} }
private String getPackName() { String getPackName() {
return packDesc.getFileName(PACK); return packDesc.getFileName(PACK);
} }

View File

@ -556,7 +556,8 @@ void copyPackAsIs(DfsPackFile pack, long length, boolean validate,
pin(pack, 0); pin(pack, 0);
if (block.copy(0, buf, 0, 12) != 12) { if (block.copy(0, buf, 0, 12) != 12) {
pack.setInvalid(); pack.setInvalid();
throw new IOException(JGitText.get().packfileIsTruncated); throw new IOException(MessageFormat.format(
JGitText.get().packfileIsTruncated, pack.getPackName()));
} }
md.update(buf, 0, 12); md.update(buf, 0, 12);
} }
@ -580,7 +581,8 @@ void copyPackAsIs(DfsPackFile pack, long length, boolean validate,
pin(pack, position); pin(pack, position);
if (block.copy(position, buf, 0, 20) != 20) { if (block.copy(position, buf, 0, 20) != 20) {
pack.setInvalid(); pack.setInvalid();
throw new IOException(JGitText.get().packfileIsTruncated); throw new IOException(MessageFormat.format(
JGitText.get().packfileIsTruncated, pack.getPackName()));
} }
if (!Arrays.equals(actHash, buf)) { if (!Arrays.equals(actHash, buf)) {
pack.setInvalid(); pack.setInvalid();

View File

@ -169,11 +169,13 @@ private synchronized PackIndex idx() throws IOException {
try { try {
final PackIndex idx = PackIndex.open(extFile(INDEX)); final PackIndex idx = PackIndex.open(extFile(INDEX));
if (packChecksum == null) if (packChecksum == null) {
packChecksum = idx.packChecksum; packChecksum = idx.packChecksum;
else if (!Arrays.equals(packChecksum, idx.packChecksum)) } else if (!Arrays.equals(packChecksum, idx.packChecksum)) {
throw new PackMismatchException(JGitText.get().packChecksumMismatch); throw new PackMismatchException(MessageFormat.format(
JGitText.get().packChecksumMismatch,
packFile.getPath()));
}
loadedIdx = idx; loadedIdx = idx;
} catch (IOException e) { } catch (IOException e) {
invalid = true; invalid = true;

View File

@ -246,7 +246,9 @@ void copyPackAsIs(final PackFile pack, final long length, boolean validate,
pin(pack, 0); pin(pack, 0);
if (window.copy(0, buf, 0, 12) != 12) { if (window.copy(0, buf, 0, 12) != 12) {
pack.setInvalid(); pack.setInvalid();
throw new IOException(JGitText.get().packfileIsTruncated); throw new IOException(MessageFormat.format(
JGitText.get().packfileIsTruncated, pack.getPackFile()
.getPath()));
} }
md.update(buf, 0, 12); md.update(buf, 0, 12);
} }
@ -270,7 +272,9 @@ void copyPackAsIs(final PackFile pack, final long length, boolean validate,
pin(pack, position); pin(pack, position);
if (window.copy(position, buf, 0, 20) != 20) { if (window.copy(position, buf, 0, 20) != 20) {
pack.setInvalid(); pack.setInvalid();
throw new IOException(JGitText.get().packfileIsTruncated); throw new IOException(MessageFormat.format(
JGitText.get().packfileIsTruncated, pack.getPackFile()
.getPath()));
} }
if (!Arrays.equals(actHash, buf)) { if (!Arrays.equals(actHash, buf)) {
pack.setInvalid(); pack.setInvalid();

View File

@ -1135,7 +1135,8 @@ private int fill(final Source src, final int need) throws IOException {
break; break;
} }
if (next <= 0) if (next <= 0)
throw new EOFException(JGitText.get().packfileIsTruncated); throw new EOFException(
JGitText.get().packfileIsTruncatedNoParam);
bAvail += next; bAvail += next;
} }
return bOffset; return bOffset;