Browse Source

Merge branch 'stable-4.9' into stable-4.10

* stable-4.9:
  Prepare 4.9.11-SNAPSHOT builds
  JGit v4.9.10.201904181027-r
  Prepare 4.7.10-SNAPSHOT builds
  JGit v4.7.9.201904161809-r
  Prepare 4.5.8-SNAPSHOT builds
  JGit v4.5.7.201904151645-r
  Remember the cause for invalidating a packfile
  Fix API problem filters
  Fix pack files scan when filesnapshot isn't modified

Change-Id: I94c9e6300b5f77b185ec6661fa76f0c74a5fc2a9
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
tags/v4.11.8.201904181247-r
Matthias Sohn 5 years ago
parent
commit
53014c0804

+ 14
- 0
org.eclipse.jgit/.settings/.api_filters View File

@@ -8,6 +8,20 @@
</message_arguments>
</filter>
</resource>
<resource path="src/org/eclipse/jgit/errors/PackInvalidException.java" type="org.eclipse.jgit.errors.PackInvalidException">
<filter id="1142947843">
<message_arguments>
<message_argument value="4.5.7"/>
<message_argument value="PackInvalidException(File, Throwable)"/>
</message_arguments>
</filter>
<filter id="1142947843">
<message_arguments>
<message_argument value="4.5.7"/>
<message_argument value="PackInvalidException(String, Throwable)"/>
</message_arguments>
</filter>
</resource>
<resource path="src/org/eclipse/jgit/lib/Constants.java" type="org.eclipse.jgit.lib.Constants">
<filter id="1141899266">
<message_arguments>

+ 32
- 2
org.eclipse.jgit/src/org/eclipse/jgit/errors/PackInvalidException.java View File

@@ -60,9 +60,24 @@ public class PackInvalidException extends IOException {
*
* @param path
* path of the invalid pack file.
* @deprecated Use {@link #PackInvalidException(File, Throwable)}.
*/
@Deprecated
public PackInvalidException(final File path) {
this(path.getAbsolutePath());
this(path, null);
}

/**
* Construct a pack invalid error with cause.
*
* @param path
* path of the invalid pack file.
* @param cause
* cause of the pack file becoming invalid.
* @since 4.5.7
*/
public PackInvalidException(final File path, Throwable cause) {
this(path.getAbsolutePath(), cause);
}

/**
@@ -70,8 +85,23 @@ public class PackInvalidException extends IOException {
*
* @param path
* path of the invalid pack file.
* @deprecated Use {@link #PackInvalidException(String, Throwable)}.
*/
@Deprecated
public PackInvalidException(final String path) {
super(MessageFormat.format(JGitText.get().packFileInvalid, path));
this(path, null);
}

/**
* Construct a pack invalid error with cause.
*
* @param path
* path of the invalid pack file.
* @param cause
* cause of the pack file becoming invalid.
* @since 4.5.7
*/
public PackInvalidException(final String path, Throwable cause) {
super(MessageFormat.format(JGitText.get().packFileInvalid, path), cause);
}
}

+ 6
- 2
org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/BlockBasedFile.java View File

@@ -84,6 +84,9 @@ abstract class BlockBasedFile {
/** True once corruption has been detected that cannot be worked around. */
volatile boolean invalid;

/** Exception that caused the packfile to be flagged as invalid */
protected volatile Exception invalidatingCause;

BlockBasedFile(DfsBlockCache cache, DfsPackDescription desc, PackExt ext) {
this.cache = cache;
this.key = desc.getStreamKey(ext);
@@ -135,8 +138,9 @@ abstract class BlockBasedFile {

DfsBlock readOneBlock(long pos, DfsReader ctx,
@Nullable ReadableChannel fileChannel) throws IOException {
if (invalid)
throw new PackInvalidException(getFileName());
if (invalid) {
throw new PackInvalidException(getFileName(), invalidatingCause);
}

ctx.stats.readBlock++;
long start = System.nanoTime();

+ 8
- 3
org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackFile.java View File

@@ -181,8 +181,9 @@ public final class DfsPackFile extends BlockBasedFile {
return idx;
}

if (invalid)
throw new PackInvalidException(getFileName());
if (invalid) {
throw new PackInvalidException(getFileName(), invalidatingCause);
}

Repository.getGlobalListenerList()
.dispatch(new BeforeDfsPackIndexLoadedEvent(this));
@@ -226,11 +227,13 @@ public final class DfsPackFile extends BlockBasedFile {
}
} catch (EOFException e) {
invalid = true;
invalidatingCause = e;
throw new IOException(MessageFormat.format(
DfsText.get().shortReadOfIndex,
desc.getFileName(INDEX)), e);
} catch (IOException e) {
invalid = true;
invalidatingCause = e;
throw new IOException(MessageFormat.format(
DfsText.get().cannotReadIndex,
desc.getFileName(INDEX)), e);
@@ -723,8 +726,10 @@ public final class DfsPackFile extends BlockBasedFile {

private IOException packfileIsTruncated() {
invalid = true;
return new IOException(MessageFormat.format(
IOException exc = new IOException(MessageFormat.format(
JGitText.get().packfileIsTruncated, getFileName()));
invalidatingCause = exc;
return exc;
}

private void readFully(long position, byte[] dstbuf, int dstoff, int cnt,

+ 8
- 12
org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectory.java View File

@@ -132,8 +132,6 @@ public class ObjectDirectory extends FileObjectDatabase {

private final File alternatesFile;

private final AtomicReference<PackList> packList;

private final FS fs;

private final AtomicReference<AlternateHandle[]> alternates;
@@ -146,6 +144,8 @@ public class ObjectDirectory extends FileObjectDatabase {

private Set<ObjectId> shallowCommitsIds;

final AtomicReference<PackList> packList;

/**
* Initialize a reference to an on-disk object directory.
*
@@ -674,13 +674,8 @@ public class ObjectDirectory extends FileObjectDatabase {
transientErrorCount = p.incrementTransientErrorCount();
}
if (warnTmpl != null) {
if (LOG.isDebugEnabled()) {
LOG.debug(MessageFormat.format(warnTmpl,
p.getPackFile().getAbsolutePath()), e);
} else {
LOG.warn(MessageFormat.format(warnTmpl,
p.getPackFile().getAbsolutePath()));
}
LOG.warn(MessageFormat.format(warnTmpl,
p.getPackFile().getAbsolutePath()), e);
} else {
if (doLogExponentialBackoff(transientErrorCount)) {
// Don't remove the pack from the list, as the error may be
@@ -767,7 +762,7 @@ public class ObjectDirectory extends FileObjectDatabase {
return InsertLooseObjectResult.FAILURE;
}

private boolean searchPacksAgain(PackList old) {
boolean searchPacksAgain(PackList old) {
// Whether to trust the pack folder's modification time. If set
// to false we will always scan the .git/objects/pack folder to
// check for new pack files. If set to true (default) we use the
@@ -920,7 +915,8 @@ public class ObjectDirectory extends FileObjectDatabase {
final String packName = base + PACK.getExtension();
final File packFile = new File(packDirectory, packName);
final PackFile oldPack = forReuse.remove(packName);
if (oldPack != null && oldPack.getFileSnapshot().isModified(packFile)) {
if (oldPack != null
&& !oldPack.getFileSnapshot().isModified(packFile)) {
list.add(oldPack);
continue;
}
@@ -1080,7 +1076,7 @@ public class ObjectDirectory extends FileObjectDatabase {
return new File(new File(getDirectory(), d), f);
}

private static final class PackList {
static final class PackList {
/** State just before reading the pack directory. */
final FileSnapshot snapshot;


+ 12
- 8
org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackFile.java View File

@@ -135,6 +135,8 @@ public class PackFile implements Iterable<PackIndex.MutableEntry> {

private volatile boolean invalid;

private volatile Exception invalidatingCause;

private boolean invalidBitmap;

private AtomicInteger transientErrorCount = new AtomicInteger();
@@ -184,7 +186,7 @@ public class PackFile implements Iterable<PackIndex.MutableEntry> {
idx = loadedIdx;
if (idx == null) {
if (invalid) {
throw new PackInvalidException(packFile);
throw new PackInvalidException(packFile, invalidatingCause);
}
try {
idx = PackIndex.open(extFile(INDEX));
@@ -208,6 +210,7 @@ public class PackFile implements Iterable<PackIndex.MutableEntry> {
throw e;
} catch (IOException e) {
invalid = true;
invalidatingCause = e;
throw e;
}
}
@@ -661,7 +664,7 @@ public class PackFile implements Iterable<PackIndex.MutableEntry> {

private void doOpen() throws IOException {
if (invalid) {
throw new PackInvalidException(packFile);
throw new PackInvalidException(packFile, invalidatingCause);
}
try {
synchronized (readLock) {
@@ -671,13 +674,13 @@ public class PackFile implements Iterable<PackIndex.MutableEntry> {
}
} catch (InterruptedIOException e) {
// don't invalidate the pack, we are interrupted from another thread
openFail(false);
openFail(false, e);
throw e;
} catch (FileNotFoundException fn) {
// don't invalidate the pack if opening an existing file failed
// since it may be related to a temporary lack of resources (e.g.
// max open files)
openFail(!packFile.exists());
openFail(!packFile.exists(), fn);
throw fn;
} catch (EOFException | AccessDeniedException | NoSuchFileException
| CorruptObjectException | NoPackSignatureException
@@ -685,20 +688,21 @@ public class PackFile implements Iterable<PackIndex.MutableEntry> {
| UnsupportedPackIndexVersionException
| UnsupportedPackVersionException pe) {
// exceptions signaling permanent problems with a pack
openFail(true);
openFail(true, pe);
throw pe;
} catch (IOException | RuntimeException ge) {
// generic exceptions could be transient so we should not mark the
// pack invalid to avoid false MissingObjectExceptions
openFail(false);
openFail(false, ge);
throw ge;
}
}

private void openFail(boolean invalidate) {
private void openFail(boolean invalidate, Exception cause) {
activeWindows = 0;
activeCopyRawData = 0;
invalid = invalidate;
invalidatingCause = cause;
doClose();
}

@@ -725,7 +729,7 @@ public class PackFile implements Iterable<PackIndex.MutableEntry> {
// Detect the situation and throw a proper exception so that can be properly
// managed by the main packfile search loop and the Git client won't receive
// any failures.
throw new PackInvalidException(packFile);
throw new PackInvalidException(packFile, invalidatingCause);
}
if (length < pos + size)
size = (int) (length - pos);

Loading…
Cancel
Save