DirCacheEntry: Speed up creation by avoiding string cast
The checkPath function is available as a byte[] form, in fact the String form just converts to byte[] to run the algorithm. Having DirCacheEntry take a byte[] -> String -> byte[] to check if each path is valid is a huge waste of CPU time. On some systems it can double the time required to read 38,999 files from trees to the DirCache. This slows down any operation using a DirCache. Expose the byte[] form and use it for DirCacheEntry creation. Change-Id: I6db7bc793ece99ff3c356338d793c07c061aeac7
This commit is contained in:
parent
885879ffe9
commit
761814fe9c
|
@ -69,9 +69,9 @@ public void testIsValidPath() {
|
||||||
assertFalse(isValidPath("a\u0000b"));
|
assertFalse(isValidPath("a\u0000b"));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean isValidPath(final String path) {
|
private static boolean isValidPath(String path) {
|
||||||
try {
|
try {
|
||||||
DirCacheCheckout.checkValidPath(path);
|
new DirCacheEntry(path);
|
||||||
return true;
|
return true;
|
||||||
} catch (InvalidPathException e) {
|
} catch (InvalidPathException e) {
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -1342,24 +1342,6 @@ private static void checkValidPath(CanonicalTreeParser t)
|
||||||
checkValidPathSegment(chk, i);
|
checkValidPathSegment(chk, i);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if path is a valid path for a checked out file name or ref name.
|
|
||||||
*
|
|
||||||
* @param path
|
|
||||||
* @throws InvalidPathException
|
|
||||||
* if the path is invalid
|
|
||||||
* @since 3.3
|
|
||||||
*/
|
|
||||||
static void checkValidPath(String path) throws InvalidPathException {
|
|
||||||
try {
|
|
||||||
SystemReader.getInstance().checkPath(path);
|
|
||||||
} catch (CorruptObjectException e) {
|
|
||||||
InvalidPathException p = new InvalidPathException(path);
|
|
||||||
p.initCause(e);
|
|
||||||
throw p;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void checkValidPathSegment(ObjectChecker chk,
|
private static void checkValidPathSegment(ObjectChecker chk,
|
||||||
CanonicalTreeParser t) throws InvalidPathException {
|
CanonicalTreeParser t) throws InvalidPathException {
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -65,6 +65,7 @@
|
||||||
import org.eclipse.jgit.util.IO;
|
import org.eclipse.jgit.util.IO;
|
||||||
import org.eclipse.jgit.util.MutableInteger;
|
import org.eclipse.jgit.util.MutableInteger;
|
||||||
import org.eclipse.jgit.util.NB;
|
import org.eclipse.jgit.util.NB;
|
||||||
|
import org.eclipse.jgit.util.SystemReader;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A single file (or stage of a file) in a {@link DirCache}.
|
* A single file (or stage of a file) in a {@link DirCache}.
|
||||||
|
@ -191,7 +192,7 @@ public class DirCacheEntry {
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
DirCacheCheckout.checkValidPath(toString(path));
|
checkPath(path);
|
||||||
} catch (InvalidPathException e) {
|
} catch (InvalidPathException e) {
|
||||||
CorruptObjectException p =
|
CorruptObjectException p =
|
||||||
new CorruptObjectException(e.getMessage());
|
new CorruptObjectException(e.getMessage());
|
||||||
|
@ -263,7 +264,7 @@ public DirCacheEntry(final byte[] newPath) {
|
||||||
/**
|
/**
|
||||||
* Create an empty entry at the specified stage.
|
* Create an empty entry at the specified stage.
|
||||||
*
|
*
|
||||||
* @param newPath
|
* @param path
|
||||||
* name of the cache entry, in the standard encoding.
|
* name of the cache entry, in the standard encoding.
|
||||||
* @param stage
|
* @param stage
|
||||||
* the stage index of the new entry.
|
* the stage index of the new entry.
|
||||||
|
@ -274,16 +275,16 @@ public DirCacheEntry(final byte[] newPath) {
|
||||||
* range 0..3, inclusive.
|
* range 0..3, inclusive.
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("boxing")
|
@SuppressWarnings("boxing")
|
||||||
public DirCacheEntry(final byte[] newPath, final int stage) {
|
public DirCacheEntry(byte[] path, final int stage) {
|
||||||
DirCacheCheckout.checkValidPath(toString(newPath));
|
checkPath(path);
|
||||||
if (stage < 0 || 3 < stage)
|
if (stage < 0 || 3 < stage)
|
||||||
throw new IllegalArgumentException(MessageFormat.format(
|
throw new IllegalArgumentException(MessageFormat.format(
|
||||||
JGitText.get().invalidStageForPath,
|
JGitText.get().invalidStageForPath,
|
||||||
stage, toString(newPath)));
|
stage, toString(path)));
|
||||||
|
|
||||||
info = new byte[INFO_LEN];
|
info = new byte[INFO_LEN];
|
||||||
infoOffset = 0;
|
infoOffset = 0;
|
||||||
path = newPath;
|
this.path = path;
|
||||||
|
|
||||||
int flags = ((stage & 0x3) << 12);
|
int flags = ((stage & 0x3) << 12);
|
||||||
if (path.length < NAME_MASK)
|
if (path.length < NAME_MASK)
|
||||||
|
@ -730,6 +731,16 @@ private int getExtendedFlags() {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void checkPath(byte[] path) {
|
||||||
|
try {
|
||||||
|
SystemReader.getInstance().checkPath(path);
|
||||||
|
} catch (CorruptObjectException e) {
|
||||||
|
InvalidPathException p = new InvalidPathException(toString(path));
|
||||||
|
p.initCause(e);
|
||||||
|
throw p;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static String toString(final byte[] path) {
|
private static String toString(final byte[] path) {
|
||||||
return Constants.CHARSET.decode(ByteBuffer.wrap(path)).toString();
|
return Constants.CHARSET.decode(ByteBuffer.wrap(path)).toString();
|
||||||
}
|
}
|
||||||
|
|
|
@ -339,4 +339,19 @@ public String run() {
|
||||||
public void checkPath(String path) throws CorruptObjectException {
|
public void checkPath(String path) throws CorruptObjectException {
|
||||||
platformChecker.checkPath(path);
|
platformChecker.checkPath(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check tree path entry for validity.
|
||||||
|
* <p>
|
||||||
|
* Scans a multi-directory path string such as {@code "src/main.c"}.
|
||||||
|
*
|
||||||
|
* @param path
|
||||||
|
* path string to scan.
|
||||||
|
* @throws CorruptObjectException
|
||||||
|
* path is invalid.
|
||||||
|
* @since 4.2
|
||||||
|
*/
|
||||||
|
public void checkPath(byte[] path) throws CorruptObjectException {
|
||||||
|
platformChecker.checkPath(path, 0, path.length);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue