git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[JGIT PATCH 05/10] Introduce a new exception type for an in-place pack modification

From
Shawn O. Pearce <spearce@spearce.org>
Date
Apr 21, 2009, 01:21 UTC
Message-ID
<1240276872-17893-6-git-send-email-spearce@spearce.org>
In-Reply-To
<1240276872-17893-5-git-send-email-spearce@spearce.org>

If a pack file is modified in place by "git gc" or "git repack" it means that the list of objects contained within the pack has not changed, but it is possible for the layout of the pack to be modified.

The layout can change when the compressed version of any object is changed, and usually happens because the packer has found a smaller way to represent a contained object. It also can change if an object's delta base encoding format is switched, such as from OBJ_REF to OBJ_OFS.

This new exception type can be caught by callers to recognize that the object contents of the pack is quite likely the same, but that any offsets and cached windows are wrong and need to be computed or loaded again.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
---
 .../spearce/jgit/errors/PackMismatchException.java |   55 ++++++++++++++++++++
 .../src/org/spearce/jgit/lib/PackFile.java         |   15 +++--
 2 files changed, 64 insertions(+), 6 deletions(-)
 create mode 100644 org.spearce.jgit/src/org/spearce/jgit/errors/PackMismatchException.java
diff --git a/org.spearce.jgit/src/org/spearce/jgit/errors/PackMismatchException.java b/org.spearce.jgit/src/org/spearce/jgit/errors/PackMismatchException.java
new file mode 100644
index 0000000..b96f9e8
--- /dev/null
+++ b/org.spearce.jgit/src/org/spearce/jgit/errors/PackMismatchException.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2009, Google Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above
+ *   copyright notice, this list of conditions and the following
+ *   disclaimer in the documentation and/or other materials provided
+ *   with the distribution.
+ *
+ * - Neither the name of the Git Development Community nor the
+ *   names of its contributors may be used to endorse or promote
+ *   products derived from this software without specific prior
+ *   written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.spearce.jgit.errors;
+
+import java.io.IOException;
+
+/** Thrown when a PackFile no longer matches the PackIndex. */
+public class PackMismatchException extends IOException {
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * Construct a pack modification error.
+	 *
+	 * @param why
+	 *            description of the type of error.
+	 */
+	public PackMismatchException(final String why) {
+		super(why);
+	}
+}
diff --git a/org.spearce.jgit/src/org/spearce/jgit/lib/PackFile.java b/org.spearce.jgit/src/org/spearce/jgit/lib/PackFile.java
index b525a82..bda4843 100644
--- a/org.spearce.jgit/src/org/spearce/jgit/lib/PackFile.java
+++ b/org.spearce.jgit/src/org/spearce/jgit/lib/PackFile.java
@@ -51,6 +51,7 @@
 import java.util.zip.DataFormatException;
 
 import org.spearce.jgit.errors.CorruptObjectException;
+import org.spearce.jgit.errors.PackMismatchException;
 import org.spearce.jgit.util.NB;
 
 /**
@@ -292,16 +293,18 @@ private void onOpenPack() throws IOException {
 		final long packCnt = NB.decodeUInt32(intbuf, 0);
 		final long idxCnt = idx.getObjectCount();
 		if (idxCnt != packCnt)
-			throw new IOException("Pack index"
-					+ " object count mismatch; expected " + packCnt
-					+ " found " + idxCnt + ": " + pack.getName());
+			throw new PackMismatchException("Pack object count mismatch:"
+					+ " pack " + packCnt
+					+ " index " + idxCnt
+					+ ": " + pack.getName());
 
 		final byte[] csumbuf = new byte[20];
 		pack.readFully(pack.length() - 20, csumbuf, curs);
 		if (!Arrays.equals(csumbuf, idx.packChecksum))
-			throw new IOException("Pack index mismatch; pack SHA-1 is "
-					+ ObjectId.fromRaw(csumbuf).name() + ", index expects "
-					+ ObjectId.fromRaw(idx.packChecksum).name());
+			throw new PackMismatchException("Pack checksum mismatch:"
+					+ " pack " + ObjectId.fromRaw(csumbuf).name()
+					+ " index " + ObjectId.fromRaw(idx.packChecksum).name()
+					+ ": " + pack.getName());
 	}
 
 	private PackedObjectLoader reader(final WindowCursor curs,
-- 
1.6.3.rc1.188.ga02b
Previous: Shawn O. PearceNext: Shawn O. Pearce
Message 6 of 17 in “Object access improvements”
  1. 00/10 Object access improvementsShawn O. Pearce, Apr 21, 2009
  2. 01/10 Safely handle closing an already closed WindowedFileShawn O. Pearce, Apr 21, 2009
  3. 02/10 Change empty tree test case to use a temporary repositoryShawn O. Pearce, Apr 21, 2009
  4. 03/10 Replace hand-coded read fully loop with NB.readFullyShawn O. Pearce, Apr 21, 2009
  5. 04/10 Clear the reverse index when closing a PackFileShawn O. Pearce, Apr 21, 2009
  6. 05/10 Introduce a new exception type for an in-place pack modificationShawn O. Pearce, Apr 21, 2009
  7. 06/10 Refactor object database access with new abstractionShawn O. Pearce, Apr 21, 2009
  8. 07/10 Rescan packs if a pack is modified in-place (part 1)Shawn O. Pearce, Apr 21, 2009
  9. 08/10 Scan for new packs if GIT_DIR/objects/pack has been modifiedShawn O. Pearce, Apr 21, 2009
  10. 09/10 Add test cases for loading new (or replaced) pack filesShawn O. Pearce, Apr 21, 2009
  11. 10/10 BROKEN TEST: ObjectLoader stays valid across repacksShawn O. Pearce, Apr 21, 2009
  12. Robin RosenbergApr 21, 2009
  13. Shawn O. PearceApr 22, 2009
  14. Shawn O. PearceApr 22, 2009
  15. 09/10 Add test cases for loading new (or replaced) pack filesShawn O. Pearce, Apr 21, 2009
  16. Shawn O. PearceApr 21, 2009
  17. 08/10 Scan for new packs if GIT_DIR/objects/pack has been modifiedShawn O. Pearce, Apr 21, 2009

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.