All of lore.kernel.org
 help / color / mirror / Atom feed
From: "René Scharfe" <l.s.r@web.de>
To: Git List <git@vger.kernel.org>
Cc: Junio C Hamano <gitster@pobox.com>, Jeff King <peff@peff.net>
Subject: [PATCH v2 5/5] packfile: use oidset for bad objects
Date: Sat, 11 Sep 2021 22:43:26 +0200	[thread overview]
Message-ID: <fb64d00f-b44a-6a23-3ddd-027f1df83a22@web.de> (raw)
In-Reply-To: <e50c1465-59de-7fe1-de01-800404c7640e@web.de>

Store the object ID of broken pack entries in an oidset instead of
keeping only their hashes in an unsorted array.  The resulting code is
shorter and easier to read.  It also handles the (hopefully) very rare
case of having a high number of bad objects better.

Helped-by: Jeff King <peff@peff.net>
Signed-off-by: René Scharfe <l.s.r@web.de>
---
 midx.c         | 10 +++-------
 object-store.h |  4 ++--
 packfile.c     | 28 ++++++----------------------
 3 files changed, 11 insertions(+), 31 deletions(-)

diff --git a/midx.c b/midx.c
index 8cb063023c..76322b713c 100644
--- a/midx.c
+++ b/midx.c
@@ -307,13 +307,9 @@ int fill_midx_entry(struct repository * r,
 	if (!is_pack_valid(p))
 		return 0;

-	if (p->num_bad_objects) {
-		uint32_t i;
-		for (i = 0; i < p->num_bad_objects; i++)
-			if (hasheq(oid->hash,
-				   p->bad_object_sha1 + the_hash_algo->rawsz * i))
-				return 0;
-	}
+	if (oidset_size(&p->bad_objects) &&
+	    oidset_contains(&p->bad_objects, oid))
+		return 0;

 	e->offset = nth_midxed_offset(m, pos);
 	e->p = p;
diff --git a/object-store.h b/object-store.h
index b4dc6668aa..c7bead66f6 100644
--- a/object-store.h
+++ b/object-store.h
@@ -10,6 +10,7 @@
 #include "khash.h"
 #include "dir.h"
 #include "oidtree.h"
+#include "oidset.h"

 struct object_directory {
 	struct object_directory *next;
@@ -75,9 +76,8 @@ struct packed_git {
 	const void *index_data;
 	size_t index_size;
 	uint32_t num_objects;
-	uint32_t num_bad_objects;
 	uint32_t crc_offset;
-	unsigned char *bad_object_sha1;
+	struct oidset bad_objects;
 	int index_version;
 	time_t mtime;
 	int pack_fd;
diff --git a/packfile.c b/packfile.c
index 04080a558b..caba29c624 100644
--- a/packfile.c
+++ b/packfile.c
@@ -1163,29 +1163,17 @@ int unpack_object_header(struct packed_git *p,

 void mark_bad_packed_object(struct packed_git *p, const struct object_id *oid)
 {
-	unsigned i;
-	const unsigned hashsz = the_hash_algo->rawsz;
-	for (i = 0; i < p->num_bad_objects; i++)
-		if (hasheq(oid->hash, p->bad_object_sha1 + hashsz * i))
-			return;
-	p->bad_object_sha1 = xrealloc(p->bad_object_sha1,
-				      st_mult(GIT_MAX_RAWSZ,
-					      st_add(p->num_bad_objects, 1)));
-	hashcpy(p->bad_object_sha1 + hashsz * p->num_bad_objects, oid->hash);
-	p->num_bad_objects++;
+	oidset_insert(&p->bad_objects, oid);
 }

 const struct packed_git *has_packed_and_bad(struct repository *r,
 					    const struct object_id *oid)
 {
 	struct packed_git *p;
-	unsigned i;

 	for (p = r->objects->packed_git; p; p = p->next)
-		for (i = 0; i < p->num_bad_objects; i++)
-			if (hasheq(oid->hash,
-				   p->bad_object_sha1 + the_hash_algo->rawsz * i))
-				return p;
+		if (oidset_contains(&p->bad_objects, oid))
+			return p;
 	return NULL;
 }

@@ -2016,13 +2004,9 @@ static int fill_pack_entry(const struct object_id *oid,
 {
 	off_t offset;

-	if (p->num_bad_objects) {
-		unsigned i;
-		for (i = 0; i < p->num_bad_objects; i++)
-			if (hasheq(oid->hash,
-				   p->bad_object_sha1 + the_hash_algo->rawsz * i))
-				return 0;
-	}
+	if (oidset_size(&p->bad_objects) &&
+	    oidset_contains(&p->bad_objects, oid))
+		return 0;

 	offset = find_pack_entry_one(oid->hash, p);
 	if (!offset)
--
2.33.0

  parent reply	other threads:[~2021-09-11 20:43 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-09-11  7:50 [PATCH 0/3] packfile: use oidset for bad objects René Scharfe
2021-09-11  7:59 ` [PATCH 1/3] packfile: convert mark_bad_packed_object() to object_id René Scharfe
2021-09-11  8:00 ` [PATCH 2/3] packfile: convert has_packed_and_bad() " René Scharfe
2021-09-11  8:01 ` [PATCH 3/3] packfile: use oidset for bad objects René Scharfe
2021-09-11 14:26   ` Jeff King
2021-09-11 16:08     ` René Scharfe
2021-09-11 17:03       ` Jeff King
2021-09-11 17:16         ` René Scharfe
2021-09-11 14:27 ` [PATCH 0/3] " Jeff King
2021-09-11 16:08 ` [PATCH 4/3] midx: inline nth_midxed_pack_entry() René Scharfe
2021-09-11 17:03   ` René Scharfe
2021-09-11 17:07   ` Jeff King
2021-09-11 20:31     ` René Scharfe
2021-09-11 21:20       ` Jeff King
2021-09-11 23:39         ` René Scharfe
2021-09-11 20:31 ` [PATCH v2 0/5] packfile: use oidset for bad objects René Scharfe
2021-09-11 20:36   ` [PATCH 1/5] oidset: make oidset_size() an inline function René Scharfe
2021-09-11 20:39   ` [PATCH 2/5] midx: inline nth_midxed_pack_entry() René Scharfe
2021-09-11 20:40   ` [PATCH 3/5] packfile: convert mark_bad_packed_object() to object_id René Scharfe
2021-09-11 20:42   ` [PATCH v2 4/5] packfile: convert has_packed_and_bad() " René Scharfe
2021-09-11 20:43   ` René Scharfe [this message]
2021-09-11 20:45   ` [PATCH v2 0/5] packfile: use oidset for bad objects René Scharfe
2021-09-11 21:22   ` Jeff King
2021-09-11 23:59   ` Derrick Stolee
2021-09-12  1:51     ` Taylor Blau
2021-09-12  2:29       ` Taylor Blau
2021-09-12  3:51         ` Derrick Stolee
2021-09-12  4:01           ` Taylor Blau

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

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=fb64d00f-b44a-6a23-3ddd-027f1df83a22@web.de \
    --to=l.s.r@web.de \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=peff@peff.net \
    /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.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.