From: Marek Zawirski <marek.zawirski@gmail.com>
To: robin.rosenberg@dewire.com, spearce@spearce.org
Cc: git@vger.kernel.org, Marek Zawirski <marek.zawirski@gmail.com>
Subject: [EGIT PATCH 08/20] CRC32 support for PackIndex
Date: Sun, 15 Jun 2008 23:45:37 +0200 [thread overview]
Message-ID: <1213566349-25395-9-git-send-email-marek.zawirski@gmail.com> (raw)
In-Reply-To: <1213566349-25395-8-git-send-email-marek.zawirski@gmail.com>
Add findCRC32() and hasCRC32Support() methods in PackIndex with
implementation for index v2.
Signed-off-by: Marek Zawirski <marek.zawirski@gmail.com>
---
.../src/org/spearce/jgit/lib/PackIndex.java | 23 ++++++++++++
.../src/org/spearce/jgit/lib/PackIndexV1.java | 10 +++++
.../src/org/spearce/jgit/lib/PackIndexV2.java | 38 ++++++++++++-------
3 files changed, 57 insertions(+), 14 deletions(-)
diff --git a/org.spearce.jgit/src/org/spearce/jgit/lib/PackIndex.java b/org.spearce.jgit/src/org/spearce/jgit/lib/PackIndex.java
index 3935d4f..e34cd36 100644
--- a/org.spearce.jgit/src/org/spearce/jgit/lib/PackIndex.java
+++ b/org.spearce.jgit/src/org/spearce/jgit/lib/PackIndex.java
@@ -44,6 +44,7 @@ import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Iterator;
+import org.spearce.jgit.errors.MissingObjectException;
import org.spearce.jgit.util.NB;
/**
@@ -151,6 +152,28 @@ public abstract class PackIndex implements Iterable<PackIndex.MutableEntry> {
abstract long findOffset(AnyObjectId objId);
/**
+ * Retrieve stored CRC32 checksum of the requested object raw-data
+ * (including header).
+ *
+ * @param objId
+ * id of object to look for
+ * @return CRC32 checksum of specified object (at 32 less significant bits)
+ * @throws MissingObjectException
+ * when requested ObjectId was not found in this index
+ * @throws UnsupportedOperationException
+ * when this index doesn't support CRC32 checksum
+ */
+ abstract long findCRC32(AnyObjectId objId) throws MissingObjectException,
+ UnsupportedOperationException;
+
+ /**
+ * Check whether this index supports (has) CRC32 checksums for objects.
+ *
+ * @return true if CRC32 is stored, false otherwise
+ */
+ abstract boolean hasCRC32Support();
+
+ /**
* Represent mutable entry of pack index consisting of object id and offset
* in pack (both mutable).
*
diff --git a/org.spearce.jgit/src/org/spearce/jgit/lib/PackIndexV1.java b/org.spearce.jgit/src/org/spearce/jgit/lib/PackIndexV1.java
index b8d9de3..86b939a 100644
--- a/org.spearce.jgit/src/org/spearce/jgit/lib/PackIndexV1.java
+++ b/org.spearce.jgit/src/org/spearce/jgit/lib/PackIndexV1.java
@@ -107,6 +107,16 @@ class PackIndexV1 extends PackIndex {
return -1;
}
+ @Override
+ long findCRC32(AnyObjectId objId) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ boolean hasCRC32Support() {
+ return false;
+ }
+
public Iterator<MutableEntry> iterator() {
return new IndexV1Iterator();
}
diff --git a/org.spearce.jgit/src/org/spearce/jgit/lib/PackIndexV2.java b/org.spearce.jgit/src/org/spearce/jgit/lib/PackIndexV2.java
index a0b9827..fc1f08b 100644
--- a/org.spearce.jgit/src/org/spearce/jgit/lib/PackIndexV2.java
+++ b/org.spearce.jgit/src/org/spearce/jgit/lib/PackIndexV2.java
@@ -37,12 +37,12 @@
package org.spearce.jgit.lib;
-import java.io.EOFException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import java.util.NoSuchElementException;
+import org.spearce.jgit.errors.MissingObjectException;
import org.spearce.jgit.util.NB;
/** Support for the pack index v2 format. */
@@ -63,6 +63,9 @@ class PackIndexV2 extends PackIndex {
/** 256 arrays of the 32 bit offset data, matching {@link #names}. */
private byte[][] offset32;
+ /** 256 arrays of the CRC-32 of objects, matching {@link #names}. */
+ private byte[][] crc32;
+
/** 64 bit offset table. */
private byte[] offset64;
@@ -76,6 +79,7 @@ class PackIndexV2 extends PackIndex {
names = new int[FANOUT][];
offset32 = new byte[FANOUT][];
+ crc32 = new byte[FANOUT][];
// Object name table. The size we can permit per fan-out bucket
// is limited to Java's 2 GB per byte array limitation. That is
@@ -91,6 +95,7 @@ class PackIndexV2 extends PackIndex {
if (bucketCnt == 0) {
names[k] = NO_INTS;
offset32[k] = NO_BYTES;
+ crc32[k] = NO_BYTES;
continue;
}
@@ -107,11 +112,12 @@ class PackIndexV2 extends PackIndex {
names[k] = bin;
offset32[k] = new byte[(int) (bucketCnt * 4)];
+ crc32[k] = new byte[(int) (bucketCnt * 4)];
}
- // CRC32 table. Currently unused.
- //
- skipFully(fd, objectCnt * 4);
+ // CRC32 table.
+ for (int k = 0; k < FANOUT; k++)
+ NB.readFully(fd, crc32[k], 0, crc32[k].length);
// 32 bit offset table. Any entries with the most significant bit
// set require a 64 bit offset entry in another table.
@@ -135,16 +141,6 @@ class PackIndexV2 extends PackIndex {
}
}
- private static void skipFully(final InputStream fd, long toSkip)
- throws IOException {
- while (toSkip > 0) {
- final long r = fd.skip(toSkip);
- if (r <= 0)
- throw new EOFException("Cannot skip index section.");
- toSkip -= r;
- }
- }
-
@Override
long getObjectCount() {
return objectCnt;
@@ -162,6 +158,20 @@ class PackIndexV2 extends PackIndex {
return p;
}
+ @Override
+ long findCRC32(AnyObjectId objId) throws MissingObjectException {
+ final int levelOne = objId.getFirstByte();
+ final int levelTwo = binarySearchLevelTwo(objId, levelOne);
+ if (levelTwo == -1)
+ throw new MissingObjectException(objId.copy(), "unknown");
+ return NB.decodeUInt32(crc32[levelOne], levelTwo << 2);
+ }
+
+ @Override
+ boolean hasCRC32Support() {
+ return true;
+ }
+
public Iterator<MutableEntry> iterator() {
return new EntriesIteratorV2();
}
--
1.5.5.1
next prev parent reply other threads:[~2008-06-15 21:47 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-06-15 21:45 [EGIT PATCH 00/20] PackWriter, first usable attempt Marek Zawirski
2008-06-15 21:45 ` [EGIT PATCH 01/20] Fix typo in PackIndexV2 Marek Zawirski
2008-06-15 21:45 ` [EGIT PATCH 02/20] Integer versions of copyRawTo() and fromRaw() in ObjectId Marek Zawirski
2008-06-15 21:45 ` [EGIT PATCH 03/20] Add openObjectInAllPacks() to Repository, exposing packed objects storage Marek Zawirski
2008-06-15 21:45 ` [EGIT PATCH 04/20] WindowedFile fragments copying: copyToStream() Marek Zawirski
2008-06-15 21:45 ` [EGIT PATCH 05/20] Reverse pack index implementation: PackReverseIndex Marek Zawirski
2008-06-15 21:45 ` [EGIT PATCH 06/20] Tests for PackReverseIndex Marek Zawirski
2008-06-15 21:45 ` [EGIT PATCH 07/20] Refactor PackIndexV2 - extract binarySearchLevelTwo() Marek Zawirski
2008-06-15 21:45 ` Marek Zawirski [this message]
2008-06-15 21:45 ` [EGIT PATCH 09/20] CRC32 PackIndex tests Marek Zawirski
2008-06-15 21:45 ` [EGIT PATCH 10/20] Format PackedObjectLoader class Marek Zawirski
2008-06-15 21:45 ` [EGIT PATCH 11/20] Format UnpackedObjectLoader class Marek Zawirski
2008-06-15 21:45 ` [EGIT PATCH 12/20] Format DeltaOfsPackedObjectLoader class Marek Zawirski
2008-06-15 21:45 ` [EGIT PATCH 13/20] Raw-data operations in ObjectLoaders and PackFile Marek Zawirski
2008-06-15 21:45 ` [EGIT PATCH 14/20] Add hasRevSort() in RevWalk for faster sorting strategy checking Marek Zawirski
2008-06-15 21:45 ` [EGIT PATCH 15/20] Refactor getRevSort() calls to hasRevSort() Marek Zawirski
2008-06-15 21:45 ` [EGIT PATCH 16/20] Support for RevSort.BOUNDARY in ObjectWalk Marek Zawirski
2008-06-15 21:45 ` [EGIT PATCH 17/20] Rename confusing objects field " Marek Zawirski
2008-06-15 21:45 ` [EGIT PATCH 18/20] New CountingOutputStream class - stream decorator Marek Zawirski
2008-06-15 21:45 ` [EGIT PATCH 19/20] Simplified implementation of pack creation: PackWriter Marek Zawirski
2008-06-15 21:45 ` [EGIT PATCH 20/20] PackWriter test suite Marek Zawirski
2008-06-17 21:28 ` [EGIT PATCH 21/20] Make isBetterDeltaReuseLoader() static in PackWriter Marek Zawirski
2008-06-17 22:07 ` Robin Rosenberg
2008-06-19 16:26 ` Marek Zawirski
2008-06-16 4:06 ` [EGIT PATCH 05/20] Reverse pack index implementation: PackReverseIndex Shawn O. Pearce
2008-06-16 16:27 ` Marek Zawirski
2008-06-17 2:02 ` Shawn O. Pearce
2008-06-16 5:19 ` [EGIT PATCH 00/20] PackWriter, first usable attempt Shawn O. Pearce
2008-06-16 16:37 ` Marek Zawirski
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1213566349-25395-9-git-send-email-marek.zawirski@gmail.com \
--to=marek.zawirski@gmail.com \
--cc=git@vger.kernel.org \
--cc=robin.rosenberg@dewire.com \
--cc=spearce@spearce.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).