Browse Source

Merge branch 'stable-4.5' into stable-4.6

* stable-4.5:
  Don't remove pack when FileNotFoundException is transient

Change-Id: Ic17c542d78a4cad48ff1ed77dcdc853a4ef2dc06
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
tags/v4.7.0.201704051617-r
Matthias Sohn 7 years ago
parent
commit
405fdf76d5

+ 2
- 2
org.eclipse.jgit/resources/org/eclipse/jgit/internal/JGitText.properties View File

exceptionHookExecutionInterrupted=Execution of "{0}" hook interrupted. exceptionHookExecutionInterrupted=Execution of "{0}" hook interrupted.
exceptionOccurredDuringAddingOfOptionToALogCommand=Exception occurred during adding of {0} as option to a Log command exceptionOccurredDuringAddingOfOptionToALogCommand=Exception occurred during adding of {0} as option to a Log command
exceptionOccurredDuringReadingOfGIT_DIR=Exception occurred during reading of $GIT_DIR/{0}. {1} exceptionOccurredDuringReadingOfGIT_DIR=Exception occurred during reading of $GIT_DIR/{0}. {1}
exceptionWhileReadingPack=ERROR: Exception caught while accessing pack file {0}, the pack file might be corrupt
exceptionWhileReadingPack=ERROR: Exception caught while accessing pack file {0}, the pack file might be corrupt, {1}. Caught {2} consecutive errors while trying to read this pack.
expectedACKNAKFoundEOF=Expected ACK/NAK, found EOF expectedACKNAKFoundEOF=Expected ACK/NAK, found EOF
expectedACKNAKGot=Expected ACK/NAK, got: {0} expectedACKNAKGot=Expected ACK/NAK, got: {0}
expectedBooleanStringValue=Expected boolean string value expectedBooleanStringValue=Expected boolean string value
packfileIsTruncatedNoParam=Packfile is truncated. packfileIsTruncatedNoParam=Packfile is truncated.
packHandleIsStale=Pack file {0} handle is stale, removing it from pack list packHandleIsStale=Pack file {0} handle is stale, removing it from pack list
packHasUnresolvedDeltas=pack has unresolved deltas packHasUnresolvedDeltas=pack has unresolved deltas
packInaccessible=Pack file {0} now inaccessible; removing it from pack list
packInaccessible=Failed to access pack file {0}, caught {2} consecutive errors while trying to access this pack.
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}
packRefs=Pack refs packRefs=Pack refs

+ 27
- 7
org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectory.java View File

for (PackFile p : pList.packs) { for (PackFile p : pList.packs) {
try { try {
p.resolve(matches, id, RESOLVE_ABBREV_LIMIT); p.resolve(matches, id, RESOLVE_ABBREV_LIMIT);
p.resetTransientErrorCount();
} catch (IOException e) { } catch (IOException e) {
handlePackError(e, p); handlePackError(e, p);
} }
for (PackFile p : pList.packs) { for (PackFile p : pList.packs) {
try { try {
ObjectLoader ldr = p.get(curs, objectId); ObjectLoader ldr = p.get(curs, objectId);
p.resetTransientErrorCount();
if (ldr != null) if (ldr != null)
return ldr; return ldr;
} catch (PackMismatchException e) { } catch (PackMismatchException e) {
for (PackFile p : pList.packs) { for (PackFile p : pList.packs) {
try { try {
long len = p.getObjectSize(curs, id); long len = p.getObjectSize(curs, id);
p.resetTransientErrorCount();
if (0 <= len) if (0 <= len)
return len; return len;
} catch (PackMismatchException e) { } catch (PackMismatchException e) {
for (final PackFile p : pList.packs) { for (final PackFile p : pList.packs) {
try { try {
LocalObjectRepresentation rep = p.representation(curs, otp); LocalObjectRepresentation rep = p.representation(curs, otp);
p.resetTransientErrorCount();
if (rep != null) if (rep != null)
packer.select(otp, rep); packer.select(otp, rep);
} catch (PackMismatchException e) { } catch (PackMismatchException e) {


private void handlePackError(IOException e, PackFile p) { private void handlePackError(IOException e, PackFile p) {
String warnTmpl = null; String warnTmpl = null;
int transientErrorCount = 0;
String errTmpl = JGitText.get().exceptionWhileReadingPack;
if ((e instanceof CorruptObjectException) if ((e instanceof CorruptObjectException)
|| (e instanceof PackInvalidException)) { || (e instanceof PackInvalidException)) {
warnTmpl = JGitText.get().corruptPack; warnTmpl = JGitText.get().corruptPack;
removePack(p); removePack(p);
} else if (e instanceof FileNotFoundException) { } else if (e instanceof FileNotFoundException) {
if (p.getPackFile().exists()) { if (p.getPackFile().exists()) {
warnTmpl = JGitText.get().packInaccessible;
errTmpl = JGitText.get().packInaccessible;
transientErrorCount = p.incrementTransientErrorCount();
} else { } else {
warnTmpl = JGitText.get().packWasDeleted; warnTmpl = JGitText.get().packWasDeleted;
removePack(p);
} }
removePack(p);
} else if (FileUtils.isStaleFileHandle(e)) { } else if (FileUtils.isStaleFileHandle(e)) {
warnTmpl = JGitText.get().packHandleIsStale; warnTmpl = JGitText.get().packHandleIsStale;
removePack(p); removePack(p);
} else {
transientErrorCount = p.incrementTransientErrorCount();
} }
if (warnTmpl != null) { if (warnTmpl != null) {
if (LOG.isDebugEnabled()) { if (LOG.isDebugEnabled()) {
p.getPackFile().getAbsolutePath())); p.getPackFile().getAbsolutePath()));
} }
} else { } else {
// Don't remove the pack from the list, as the error may be
// transient.
LOG.error(MessageFormat.format(
JGitText.get().exceptionWhileReadingPack, p.getPackFile()
.getAbsolutePath()), e);
if (doLogExponentialBackoff(transientErrorCount)) {
// Don't remove the pack from the list, as the error may be
// transient.
LOG.error(MessageFormat.format(errTmpl,
p.getPackFile().getAbsolutePath()),
Integer.valueOf(transientErrorCount), e);
}
} }
} }


/**
* @param n
* count of consecutive failures
* @return @{code true} if i is a power of 2
*/
private boolean doLogExponentialBackoff(int n) {
return (n & (n - 1)) == 0;
}

@Override @Override
InsertLooseObjectResult insertUnpackedObject(File tmp, ObjectId id, InsertLooseObjectResult insertUnpackedObject(File tmp, ObjectId id,
boolean createDuplicate) throws IOException { boolean createDuplicate) throws IOException {

+ 11
- 0
org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackFile.java View File

import java.util.Comparator; import java.util.Comparator;
import java.util.Iterator; import java.util.Iterator;
import java.util.Set; import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.zip.CRC32; import java.util.zip.CRC32;
import java.util.zip.DataFormatException; import java.util.zip.DataFormatException;
import java.util.zip.Inflater; import java.util.zip.Inflater;


private boolean invalidBitmap; private boolean invalidBitmap;


private AtomicInteger transientErrorCount = new AtomicInteger();

private byte[] packChecksum; private byte[] packChecksum;


private PackIndex loadedIdx; private PackIndex loadedIdx;
invalid = true; invalid = true;
} }


int incrementTransientErrorCount() {
return transientErrorCount.incrementAndGet();
}

void resetTransientErrorCount() {
transientErrorCount.set(0);
}

private void readFully(final long position, final byte[] dstbuf, private void readFully(final long position, final byte[] dstbuf,
int dstoff, final int cnt, final WindowCursor curs) int dstoff, final int cnt, final WindowCursor curs)
throws IOException { throws IOException {

Loading…
Cancel
Save