Re: [PATCH 1/2] upload-pack: avoid parsing objects during ref advertisement

2013-01-29 Thread Shawn Pearce
On Fri, Jan 6, 2012 at 11:17 AM, Jeff King p...@peff.net wrote:
 When we advertise a ref, the first thing we do is parse the
 pointed-to object. This gives us two things:
...
 The downside is that we are no longer verifying objects that
 we advertise by fully parsing them (however, we do still
 know we actually have them, because sha1_object_info must
 find them to get the type). While we might fail to detect a
 corrupt object here, if the client actually fetches the
 object, we will parse (and verify) it then.

As you explain, its not necessary to verify during the advertisement
phase. Its fine to delay verification to when a client actually
wants the object.

 On a repository with 120K refs, the advertisement portion of
 upload-pack goes from ~3.4s to 3.2s (the failure to speed up
 more is largely due to the fact that most of these refs are
 tags, which need dereferenced to find the tag destination
 anyway).

Why aren't we using the peeled information from the packed-refs file?
JGit does this and it saves a lot of time on advertisements from a
well packed repository.
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 1/2] upload-pack: avoid parsing objects during ref advertisement

2013-01-24 Thread Junio C Hamano
Jeff King p...@peff.net writes:

 And yeah, this should use lookup_unknown_object to extend the
 optimization to mark_our_ref (and avoid removing it for the
 ref-advertisement case, of course).

Thanks for sanity checking.  Here is what is queued at the bottom of
the hide-refs topic.

-- 8 --
Date: Fri, 18 Jan 2013 15:48:49 -0800
Subject: [PATCH] upload-pack: share more code

We mark the objects pointed at our refs with OUR_REF flag in two
functions (mark_our_ref() and send_ref()), but we can just use the
former as a helper for the latter.

Update the way mark_our_ref() prepares in-core object to use
lookup_unknown_object() to delay reading the actual object data,
just like we did in 435c833 (upload-pack: use peel_ref for ref
advertisements, 2012-10-04).

Signed-off-by: Junio C Hamano gits...@pobox.com
---
 upload-pack.c | 31 ++-
 1 file changed, 14 insertions(+), 17 deletions(-)

diff --git a/upload-pack.c b/upload-pack.c
index 95d8313..3dd220d 100644
--- a/upload-pack.c
+++ b/upload-pack.c
@@ -722,15 +722,28 @@ static void receive_needs(void)
free(shallows.objects);
 }
 
+static int mark_our_ref(const char *refname, const unsigned char *sha1, int 
flag, void *cb_data)
+{
+   struct object *o = lookup_unknown_object(sha1);
+   if (!o)
+   die(git upload-pack: cannot find object %s:, 
sha1_to_hex(sha1));
+   if (!(o-flags  OUR_REF)) {
+   o-flags |= OUR_REF;
+   nr_our_refs++;
+   }
+   return 0;
+}
+
 static int send_ref(const char *refname, const unsigned char *sha1, int flag, 
void *cb_data)
 {
static const char *capabilities = multi_ack thin-pack side-band
 side-band-64k ofs-delta shallow no-progress
 include-tag multi_ack_detailed;
-   struct object *o = lookup_unknown_object(sha1);
const char *refname_nons = strip_namespace(refname);
unsigned char peeled[20];
 
+   mark_our_ref(refname, sha1, flag, cb_data);
+
if (capabilities)
packet_write(1, %s %s%c%s%s agent=%s\n,
 sha1_to_hex(sha1), refname_nons,
@@ -740,27 +753,11 @@ static int send_ref(const char *refname, const unsigned 
char *sha1, int flag, vo
else
packet_write(1, %s %s\n, sha1_to_hex(sha1), refname_nons);
capabilities = NULL;
-   if (!(o-flags  OUR_REF)) {
-   o-flags |= OUR_REF;
-   nr_our_refs++;
-   }
if (!peel_ref(refname, peeled))
packet_write(1, %s %s^{}\n, sha1_to_hex(peeled), 
refname_nons);
return 0;
 }
 
-static int mark_our_ref(const char *refname, const unsigned char *sha1, int 
flag, void *cb_data)
-{
-   struct object *o = parse_object(sha1);
-   if (!o)
-   die(git upload-pack: cannot find object %s:, 
sha1_to_hex(sha1));
-   if (!(o-flags  OUR_REF)) {
-   o-flags |= OUR_REF;
-   nr_our_refs++;
-   }
-   return 0;
-}
-
 static void upload_pack(void)
 {
if (advertise_refs || !stateless_rpc) {
-- 
1.8.1.1.525.gdace530



--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 1/2] upload-pack: avoid parsing objects during ref advertisement

2013-01-18 Thread Junio C Hamano
Jeff King p...@peff.net writes:

 When we advertise a ref, the first thing we do is parse the
 pointed-to object. This gives us two things:

   1. a struct object we can use to store flags

   2. the type of the object, so we know whether we need to
  dereference it as a tag

 Instead, we can just use lookup_unknown_object to get an
 object struct, and then fill in just the type field using
 sha1_object_info (which, in the case of packed files, can
 find the information without actually inflating the object
 data).

 This can save time if you have a large number of refs, and
 the client isn't actually going to request those refs (e.g.,
 because most of them are already up-to-date).

 The downside is that we are no longer verifying objects that
 we advertise by fully parsing them (however, we do still
 know we actually have them, because sha1_object_info must
 find them to get the type). While we might fail to detect a
 corrupt object here, if the client actually fetches the
 object, we will parse (and verify) it then.
...

This is an old news, but do you recall why this patch did not update
the code in mark_our_ref() that gets struct object *o from parse_object()
the same way and mark them with OUR_REF flag?

I was wondering about code consolidation like this.

 upload-pack.c | 11 +--
 1 file changed, 5 insertions(+), 6 deletions(-)

diff --git a/upload-pack.c b/upload-pack.c
index 95d8313..609cd6c 100644
--- a/upload-pack.c
+++ b/upload-pack.c
@@ -722,15 +722,18 @@ static void receive_needs(void)
free(shallows.objects);
 }
 
+static int mark_our_ref(const char *refname, const unsigned char *sha1, int 
flag, void *cb_data);
+
 static int send_ref(const char *refname, const unsigned char *sha1, int flag, 
void *cb_data)
 {
static const char *capabilities = multi_ack thin-pack side-band
 side-band-64k ofs-delta shallow no-progress
 include-tag multi_ack_detailed;
-   struct object *o = lookup_unknown_object(sha1);
const char *refname_nons = strip_namespace(refname);
unsigned char peeled[20];
 
+   mark_our_ref(refname, sha1, flag, cb_data);
+
if (capabilities)
packet_write(1, %s %s%c%s%s agent=%s\n,
 sha1_to_hex(sha1), refname_nons,
@@ -740,10 +743,6 @@ static int send_ref(const char *refname, const unsigned 
char *sha1, int flag, vo
else
packet_write(1, %s %s\n, sha1_to_hex(sha1), refname_nons);
capabilities = NULL;
-   if (!(o-flags  OUR_REF)) {
-   o-flags |= OUR_REF;
-   nr_our_refs++;
-   }
if (!peel_ref(refname, peeled))
packet_write(1, %s %s^{}\n, sha1_to_hex(peeled), 
refname_nons);
return 0;
@@ -751,7 +750,7 @@ static int send_ref(const char *refname, const unsigned 
char *sha1, int flag, vo
 
 static int mark_our_ref(const char *refname, const unsigned char *sha1, int 
flag, void *cb_data)
 {
-   struct object *o = parse_object(sha1);
+   struct object *o = parse_object(sha1); /* lookup-unknown??? */
if (!o)
die(git upload-pack: cannot find object %s:, 
sha1_to_hex(sha1));
if (!(o-flags  OUR_REF)) {
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html