summaryrefslogtreecommitdiffstats
path: root/org.eclipse.jgit
diff options
context:
space:
mode:
authorShawn O. Pearce <spearce@spearce.org>2010-05-15 17:37:14 -0700
committerShawn O. Pearce <spearce@spearce.org>2010-05-15 17:37:18 -0700
commitcb5bc195406aaead0de6fa563b4b8aaacb8d20b8 (patch)
tree1530e315e73443da4d932ae997812f12fd1e1b71 /org.eclipse.jgit
parent9c4d42e94dbf199a9cef46a4b9286552c8633f4f (diff)
downloadjgit-cb5bc195406aaead0de6fa563b4b8aaacb8d20b8.tar.gz
jgit-cb5bc195406aaead0de6fa563b4b8aaacb8d20b8.zip
Reduce size of PackedObjectLoader by dropping long to int
Rather than keep track of both the position of the object, and the position of its data, just keep track of the number of bytes used by the object's header in the pack. This shaves 4 bytes out of the size of the PackedObjectLoader instances. We also can defer the addition instruction to the materialize() operation, avoiding it entirely if the caller never actually uses the loader. This may be relevant for PackWriter invocations, where only 1 loader gets chosen for a given object, even though the object may appear on disk in more than one pack file. Error reporting is now simplified, as we can rely on the object offset rather than its data offset. This is the value displayed by pack debugging tools like `git verify-pack -v`, so its better to use that in our own errors. Because nobody needs getDataOffset() now, we can drop that from the public API. Change-Id: Ic639c0d5a722315f4f5c8ffda6e26643d90e5f42 Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
Diffstat (limited to 'org.eclipse.jgit')
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/lib/DeltaOfsPackedObjectLoader.java7
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/lib/DeltaPackedObjectLoader.java18
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/lib/DeltaRefPackedObjectLoader.java7
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/lib/PackFile.java20
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/lib/PackedObjectLoader.java19
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/lib/WholePackedObjectLoader.java17
6 files changed, 41 insertions, 47 deletions
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/DeltaOfsPackedObjectLoader.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/DeltaOfsPackedObjectLoader.java
index 9e1b3da198..0b7c6c45f8 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/DeltaOfsPackedObjectLoader.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/DeltaOfsPackedObjectLoader.java
@@ -54,10 +54,9 @@ import org.eclipse.jgit.errors.CorruptObjectException;
class DeltaOfsPackedObjectLoader extends DeltaPackedObjectLoader {
private final long deltaBase;
- DeltaOfsPackedObjectLoader(final PackFile pr,
- final long dataOffset, final long objectOffset, final int deltaSz,
- final long base) {
- super(pr, dataOffset, objectOffset, deltaSz);
+ DeltaOfsPackedObjectLoader(final PackFile pr, final long objectOffset,
+ final int headerSz, final int deltaSz, final long base) {
+ super(pr, objectOffset, headerSz, deltaSz);
deltaBase = base;
}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/DeltaPackedObjectLoader.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/DeltaPackedObjectLoader.java
index 867aadfb29..b42549943a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/DeltaPackedObjectLoader.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/DeltaPackedObjectLoader.java
@@ -57,9 +57,9 @@ abstract class DeltaPackedObjectLoader extends PackedObjectLoader {
private final int deltaSize;
- DeltaPackedObjectLoader(final PackFile pr, final long dataOffset,
- final long objectOffset, final int deltaSz) {
- super(pr, dataOffset, objectOffset);
+ DeltaPackedObjectLoader(final PackFile pr, final long objectOffset,
+ final int headerSize, final int deltaSz) {
+ super(pr, objectOffset, headerSize);
objectType = -1;
deltaSize = deltaSz;
}
@@ -71,7 +71,7 @@ abstract class DeltaPackedObjectLoader extends PackedObjectLoader {
}
if (objectType != OBJ_COMMIT) {
- final UnpackedObjectCache.Entry cache = pack.readCache(dataOffset);
+ UnpackedObjectCache.Entry cache = pack.readCache(objectOffset);
if (cache != null) {
curs.release();
objectType = cache.type;
@@ -84,17 +84,17 @@ abstract class DeltaPackedObjectLoader extends PackedObjectLoader {
try {
final PackedObjectLoader baseLoader = getBaseLoader(curs);
baseLoader.materialize(curs);
- cachedBytes = BinaryDelta.apply(baseLoader.getCachedBytes(),
- pack.decompress(dataOffset, deltaSize, curs));
+ cachedBytes = BinaryDelta.apply(baseLoader.getCachedBytes(), pack
+ .decompress(objectOffset + headerSize, deltaSize, curs));
curs.release();
objectType = baseLoader.getType();
objectSize = cachedBytes.length;
if (objectType != OBJ_COMMIT)
- pack.saveCache(dataOffset, cachedBytes, objectType);
+ pack.saveCache(objectOffset, cachedBytes, objectType);
} catch (DataFormatException dfe) {
final CorruptObjectException coe;
- coe = new CorruptObjectException("Object at " + dataOffset + " in "
- + pack.getPackFile() + " has bad zlib stream");
+ coe = new CorruptObjectException("Object at " + objectOffset
+ + " in " + pack.getPackFile() + " has bad zlib stream");
coe.initCause(dfe);
throw coe;
}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/DeltaRefPackedObjectLoader.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/DeltaRefPackedObjectLoader.java
index 3616c41072..9f7589c291 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/DeltaRefPackedObjectLoader.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/DeltaRefPackedObjectLoader.java
@@ -54,10 +54,9 @@ import org.eclipse.jgit.errors.MissingObjectException;
class DeltaRefPackedObjectLoader extends DeltaPackedObjectLoader {
private final ObjectId deltaBase;
- DeltaRefPackedObjectLoader(final PackFile pr,
- final long dataOffset, final long objectOffset, final int deltaSz,
- final ObjectId base) {
- super(pr, dataOffset, objectOffset, deltaSz);
+ DeltaRefPackedObjectLoader(final PackFile pr, final long objectOffset,
+ final int headerSz, final int deltaSz, final ObjectId base) {
+ super(pr, objectOffset, headerSz, deltaSz);
deltaBase = base;
}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/PackFile.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/PackFile.java
index b1d3886671..28edf30cd3 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/PackFile.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/PackFile.java
@@ -269,13 +269,13 @@ public class PackFile implements Iterable<PackIndex.MutableEntry> {
final OutputStream out, final byte buf[], final WindowCursor curs)
throws IOException {
final long objectOffset = loader.objectOffset;
- final long dataOffset = loader.dataOffset;
+ final long dataOffset = objectOffset + loader.headerSize;
final int cnt = (int) (findEndOffset(objectOffset) - dataOffset);
final PackIndex idx = idx();
if (idx.hasCRC32Support()) {
final CRC32 crc = new CRC32();
- int headerCnt = (int) (dataOffset - objectOffset);
+ int headerCnt = loader.headerSize;
while (headerCnt > 0) {
final int toRead = Math.min(headerCnt, buf.length);
readFully(objectOffset, buf, 0, toRead, curs);
@@ -289,14 +289,14 @@ public class PackFile implements Iterable<PackIndex.MutableEntry> {
final ObjectId id = findObjectForOffset(objectOffset);
final long expected = idx.findCRC32(id);
if (computed != expected)
- throw new CorruptObjectException("Object at " + dataOffset
+ throw new CorruptObjectException("Object at " + objectOffset
+ " in " + getPackFile() + " has bad zlib stream");
} else {
try {
curs.inflateVerify(this, dataOffset);
} catch (DataFormatException dfe) {
final CorruptObjectException coe;
- coe = new CorruptObjectException("Object at " + dataOffset
+ coe = new CorruptObjectException("Object at " + objectOffset
+ " in " + getPackFile() + " has bad zlib stream");
coe.initCause(dfe);
throw coe;
@@ -473,8 +473,8 @@ public class PackFile implements Iterable<PackIndex.MutableEntry> {
case Constants.OBJ_TREE:
case Constants.OBJ_BLOB:
case Constants.OBJ_TAG:
- return new WholePackedObjectLoader(this, objOffset + p, objOffset,
- typeCode, (int) dataSize);
+ return new WholePackedObjectLoader(this, objOffset, p, typeCode,
+ (int) dataSize);
case Constants.OBJ_OFS_DELTA: {
c = ib[p++] & 0xff;
@@ -485,13 +485,13 @@ public class PackFile implements Iterable<PackIndex.MutableEntry> {
ofs <<= 7;
ofs += (c & 127);
}
- return new DeltaOfsPackedObjectLoader(this, objOffset + p,
- objOffset, (int) dataSize, objOffset - ofs);
+ return new DeltaOfsPackedObjectLoader(this, objOffset, p,
+ (int) dataSize, objOffset - ofs);
}
case Constants.OBJ_REF_DELTA: {
readFully(objOffset + p, ib, 0, 20, curs);
- return new DeltaRefPackedObjectLoader(this, objOffset + p + 20,
- objOffset, (int) dataSize, ObjectId.fromRaw(ib));
+ return new DeltaRefPackedObjectLoader(this, objOffset, p + 20,
+ (int) dataSize, ObjectId.fromRaw(ib));
}
default:
throw new IOException("Unknown object type " + typeCode + ".");
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/PackedObjectLoader.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/PackedObjectLoader.java
index 4125579b22..026b008f1a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/PackedObjectLoader.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/PackedObjectLoader.java
@@ -55,21 +55,23 @@ import java.io.OutputStream;
abstract class PackedObjectLoader extends ObjectLoader {
protected final PackFile pack;
- protected final long dataOffset;
-
+ /** Position of the first byte of the object's header. */
protected final long objectOffset;
+ /** Bytes used to express the object header, including delta reference. */
+ protected final int headerSize;
+
protected int objectType;
protected int objectSize;
protected byte[] cachedBytes;
- PackedObjectLoader(final PackFile pr, final long dataOffset,
- final long objectOffset) {
+ PackedObjectLoader(final PackFile pr, final long objectOffset,
+ final int headerSize) {
pack = pr;
- this.dataOffset = dataOffset;
this.objectOffset = objectOffset;
+ this.headerSize = headerSize;
}
/**
@@ -114,13 +116,6 @@ abstract class PackedObjectLoader extends ObjectLoader {
}
/**
- * @return offset of object data within pack file
- */
- public final long getDataOffset() {
- return dataOffset;
- }
-
- /**
* Peg the pack file open to support data copying.
* <p>
* Applications trying to copy raw pack data should ensure the pack stays
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/WholePackedObjectLoader.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/WholePackedObjectLoader.java
index 31439d4891..5005d37f18 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/WholePackedObjectLoader.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/WholePackedObjectLoader.java
@@ -54,9 +54,9 @@ import org.eclipse.jgit.errors.CorruptObjectException;
class WholePackedObjectLoader extends PackedObjectLoader {
private static final int OBJ_COMMIT = Constants.OBJ_COMMIT;
- WholePackedObjectLoader(final PackFile pr, final long dataOffset,
- final long objectOffset, final int type, final int size) {
- super(pr, dataOffset, objectOffset);
+ WholePackedObjectLoader(final PackFile pr, final long objectOffset,
+ final int headerSize, final int type, final int size) {
+ super(pr, objectOffset, headerSize);
objectType = type;
objectSize = size;
}
@@ -68,7 +68,7 @@ class WholePackedObjectLoader extends PackedObjectLoader {
}
if (objectType != OBJ_COMMIT) {
- final UnpackedObjectCache.Entry cache = pack.readCache(dataOffset);
+ UnpackedObjectCache.Entry cache = pack.readCache(objectOffset);
if (cache != null) {
curs.release();
cachedBytes = cache.data;
@@ -77,14 +77,15 @@ class WholePackedObjectLoader extends PackedObjectLoader {
}
try {
- cachedBytes = pack.decompress(dataOffset, objectSize, curs);
+ cachedBytes = pack.decompress(objectOffset + headerSize,
+ objectSize, curs);
curs.release();
if (objectType != OBJ_COMMIT)
- pack.saveCache(dataOffset, cachedBytes, objectType);
+ pack.saveCache(objectOffset, cachedBytes, objectType);
} catch (DataFormatException dfe) {
final CorruptObjectException coe;
- coe = new CorruptObjectException("Object at " + dataOffset + " in "
- + pack.getPackFile() + " has bad zlib stream");
+ coe = new CorruptObjectException("Object at " + objectOffset
+ + " in " + pack.getPackFile() + " has bad zlib stream");
coe.initCause(dfe);
throw coe;
}