From: "Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>
To: git@vger.kernel.org
Cc: "Nicolas Pitre" <nico@fluxnic.net>,
"Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>
Subject: [PATCH 5/4] pack v4: convert v4 tree to canonical format if found in base cache
Date: Thu, 12 Sep 2013 20:29:10 +0700 [thread overview]
Message-ID: <1378992550-11771-1-git-send-email-pclouds@gmail.com> (raw)
In-Reply-To: <1378982284-7848-1-git-send-email-pclouds@gmail.com>
"git log --stat -10000 v1.4.8 >/dev/null" takes 13s with v4 (8s with
v2). Of course we could do better when v4-aware tree-diff interface is
in place..
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
Oops.. forgot this and broke git.
Another option is change cache_or_unpack_entry() to force
OBJ_PV4_TREE to go through unpack_entry(), then update pv4_get_tree() to
lookup the base cache at the first decode_entries() call. Right now
it does not (hdr == 0) so we need more processing.
packv4-parse.c | 22 ++++++++++++++++++++++
packv4-parse.h | 2 ++
sha1_file.c | 11 +++++++++++
3 files changed, 35 insertions(+)
diff --git a/packv4-parse.c b/packv4-parse.c
index b8855b0..448c91e 100644
--- a/packv4-parse.c
+++ b/packv4-parse.c
@@ -461,6 +461,10 @@ static int decode_entries(struct packed_git *p, struct pack_window **w_curs,
avail -= scp - src;
src = scp;
+ /* special case for pv4_cached_tree_to_canonical() */
+ if (!count && cached)
+ count = nb_entries;
+
while (count) {
unsigned int what;
@@ -648,3 +652,21 @@ unsigned long pv4_unpack_object_header_buffer(const unsigned char *base,
*sizep = val >> 4;
return cp - base;
}
+
+/* offset must already be cached! */
+void *pv4_cached_tree_to_canonical(struct packed_git *p, off_t offset,
+ unsigned long size)
+{
+ int ret;
+ unsigned char *dst, *dcp;
+ unsigned char *v4_dstp = NULL;
+ dst = xmallocz(size);
+ dcp = dst;
+ ret = decode_entries(p, NULL, offset, 0, 0,
+ &dcp, &size, &v4_dstp, NULL, NULL, 1);
+ if (ret < 0 || size != 0) {
+ free(dst);
+ return NULL;
+ }
+ return dst;
+}
diff --git a/packv4-parse.h b/packv4-parse.h
index f584c31..ad21e19 100644
--- a/packv4-parse.h
+++ b/packv4-parse.h
@@ -24,5 +24,7 @@ void *pv4_get_commit(struct packed_git *p, struct pack_window **w_curs,
void *pv4_get_tree(struct packed_git *p, struct pack_window **w_curs,
off_t offset, unsigned long size,
void **v4_data, unsigned long *v4_size);
+void *pv4_cached_tree_to_canonical(struct packed_git *p, off_t offset,
+ unsigned long size);
#endif
diff --git a/sha1_file.c b/sha1_file.c
index 82570be..0944ef6 100644
--- a/sha1_file.c
+++ b/sha1_file.c
@@ -2000,6 +2000,17 @@ static void *cache_or_unpack_entry(struct packed_git *p, off_t base_offset,
if (!eq_delta_base_cache_entry(ent, p, base_offset))
return unpack_entry(p, base_offset, type, base_size);
+ if (ent->type == OBJ_PV4_TREE) {
+ ret = pv4_cached_tree_to_canonical(p, base_offset, ent->size);
+ if (!ret)
+ return NULL;
+ if (!keep_cache)
+ clear_delta_base_cache_entry(ent);
+ *type = OBJ_TREE;
+ *base_size = ent->size;
+ return ret;
+ }
+
ret = ent->data;
if (!keep_cache)
--
1.8.2.83.gc99314b
prev parent reply other threads:[~2013-09-12 13:26 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-09-12 10:38 [PATCH 1/4] pack v4: avoid strlen() in tree_entry_prefix Nguyễn Thái Ngọc Duy
2013-09-12 10:38 ` [PATCH 2/4] pack v4: add v4_size to struct delta_base_cache_entry Nguyễn Thái Ngọc Duy
2013-09-13 13:27 ` Nicolas Pitre
2013-09-13 13:59 ` Duy Nguyen
2013-09-14 2:06 ` Nicolas Pitre
2013-09-14 4:22 ` Nicolas Pitre
2013-09-15 7:35 ` Duy Nguyen
2013-09-16 4:42 ` Nicolas Pitre
2013-09-16 5:24 ` Duy Nguyen
2013-09-12 10:38 ` [PATCH 3/4] pack v4: cache flattened v4 trees in delta base cache Nguyễn Thái Ngọc Duy
2013-09-12 10:38 ` [PATCH 4/4] pack v4: make use of cached v4 trees when unpacking Nguyễn Thái Ngọc Duy
2013-09-12 13:29 ` Nguyễn Thái Ngọc Duy [this message]
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=1378992550-11771-1-git-send-email-pclouds@gmail.com \
--to=pclouds@gmail.com \
--cc=git@vger.kernel.org \
--cc=nico@fluxnic.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 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 NNTP newsgroup(s).