Re: [PATCH 21/23] midx: prevent duplicate packfile loads

2018-06-09 Thread Duy Nguyen
On Thu, Jun 7, 2018 at 4:07 PM Derrick Stolee  wrote:
>
> If the multi-pack-index contains a packfile, then we do not need to add
> that packfile to the packed_git linked list or the MRU list.

Because...?

I think I see the reason, but I'd like it spelled out to avoid any
misunderstanding.

>
> Signed-off-by: Derrick Stolee 
> ---
>  midx.c | 23 +++
>  midx.h |  1 +
>  packfile.c |  7 +++
>  3 files changed, 31 insertions(+)
>
> diff --git a/midx.c b/midx.c
> index 388d79b7d9..3242646fe0 100644
> --- a/midx.c
> +++ b/midx.c
> @@ -278,6 +278,29 @@ int fill_midx_entry(const struct object_id *oid, struct 
> pack_entry *e, struct mi
> return nth_midxed_pack_entry(m, e, pos);
>  }
>
> +int midx_contains_pack(struct midxed_git *m, const char *idx_name)
> +{
> +   uint32_t first = 0, last = m->num_packs;
> +
> +   while (first < last) {
> +   uint32_t mid = first + (last - first) / 2;
> +   const char *current;
> +   int cmp;
> +
> +   current = m->pack_names[mid];
> +   cmp = strcmp(idx_name, current);
> +   if (!cmp)
> +   return 1;
> +   if (cmp > 0) {
> +   first = mid + 1;
> +   continue;
> +   }
> +   last = mid;
> +   }
> +
> +   return 0;
> +}
> +
>  int prepare_midxed_git_one(struct repository *r, const char *object_dir)
>  {
> struct midxed_git *m = r->objects->midxed_git;
> diff --git a/midx.h b/midx.h
> index 497bdcc77c..c1db58d8c4 100644
> --- a/midx.h
> +++ b/midx.h
> @@ -13,6 +13,7 @@ struct object_id *nth_midxed_object_oid(struct object_id 
> *oid,
> struct midxed_git *m,
> uint32_t n);
>  int fill_midx_entry(const struct object_id *oid, struct pack_entry *e, 
> struct midxed_git *m);
> +int midx_contains_pack(struct midxed_git *m, const char *idx_name);
>  int prepare_midxed_git_one(struct repository *r, const char *object_dir);
>
>  int write_midx_file(const char *object_dir);
> diff --git a/packfile.c b/packfile.c
> index 059b2aa097..479cb69b9f 100644
> --- a/packfile.c
> +++ b/packfile.c
> @@ -746,6 +746,11 @@ static void prepare_packed_git_one(struct repository *r, 
> char *objdir, int local
> DIR *dir;
> struct dirent *de;
> struct string_list garbage = STRING_LIST_INIT_DUP;
> +   struct midxed_git *m = r->objects->midxed_git;
> +
> +   /* look for the multi-pack-index for this object directory */
> +   while (m && strcmp(m->object_dir, objdir))
> +   m = m->next;
>
> strbuf_addstr(&path, objdir);
> strbuf_addstr(&path, "/pack");
> @@ -772,6 +777,8 @@ static void prepare_packed_git_one(struct repository *r, 
> char *objdir, int local
> base_len = path.len;
> if (strip_suffix_mem(path.buf, &base_len, ".idx")) {
> /* Don't reopen a pack we already have. */
> +   if (m && midx_contains_pack(m, de->d_name))
> +   continue;
> for (p = r->objects->packed_git; p;
>  p = p->next) {
> size_t len;
> --
> 2.18.0.rc1
>


-- 
Duy


[PATCH 21/23] midx: prevent duplicate packfile loads

2018-06-07 Thread Derrick Stolee
If the multi-pack-index contains a packfile, then we do not need to add
that packfile to the packed_git linked list or the MRU list.

Signed-off-by: Derrick Stolee 
---
 midx.c | 23 +++
 midx.h |  1 +
 packfile.c |  7 +++
 3 files changed, 31 insertions(+)

diff --git a/midx.c b/midx.c
index 388d79b7d9..3242646fe0 100644
--- a/midx.c
+++ b/midx.c
@@ -278,6 +278,29 @@ int fill_midx_entry(const struct object_id *oid, struct 
pack_entry *e, struct mi
return nth_midxed_pack_entry(m, e, pos);
 }
 
+int midx_contains_pack(struct midxed_git *m, const char *idx_name)
+{
+   uint32_t first = 0, last = m->num_packs;
+
+   while (first < last) {
+   uint32_t mid = first + (last - first) / 2;
+   const char *current;
+   int cmp;
+
+   current = m->pack_names[mid];
+   cmp = strcmp(idx_name, current);
+   if (!cmp)
+   return 1;
+   if (cmp > 0) {
+   first = mid + 1;
+   continue;
+   }
+   last = mid;
+   }
+
+   return 0;
+}
+
 int prepare_midxed_git_one(struct repository *r, const char *object_dir)
 {
struct midxed_git *m = r->objects->midxed_git;
diff --git a/midx.h b/midx.h
index 497bdcc77c..c1db58d8c4 100644
--- a/midx.h
+++ b/midx.h
@@ -13,6 +13,7 @@ struct object_id *nth_midxed_object_oid(struct object_id *oid,
struct midxed_git *m,
uint32_t n);
 int fill_midx_entry(const struct object_id *oid, struct pack_entry *e, struct 
midxed_git *m);
+int midx_contains_pack(struct midxed_git *m, const char *idx_name);
 int prepare_midxed_git_one(struct repository *r, const char *object_dir);
 
 int write_midx_file(const char *object_dir);
diff --git a/packfile.c b/packfile.c
index 059b2aa097..479cb69b9f 100644
--- a/packfile.c
+++ b/packfile.c
@@ -746,6 +746,11 @@ static void prepare_packed_git_one(struct repository *r, 
char *objdir, int local
DIR *dir;
struct dirent *de;
struct string_list garbage = STRING_LIST_INIT_DUP;
+   struct midxed_git *m = r->objects->midxed_git;
+
+   /* look for the multi-pack-index for this object directory */
+   while (m && strcmp(m->object_dir, objdir))
+   m = m->next;
 
strbuf_addstr(&path, objdir);
strbuf_addstr(&path, "/pack");
@@ -772,6 +777,8 @@ static void prepare_packed_git_one(struct repository *r, 
char *objdir, int local
base_len = path.len;
if (strip_suffix_mem(path.buf, &base_len, ".idx")) {
/* Don't reopen a pack we already have. */
+   if (m && midx_contains_pack(m, de->d_name))
+   continue;
for (p = r->objects->packed_git; p;
 p = p->next) {
size_t len;
-- 
2.18.0.rc1