Skip to content

Commit c291293

Browse files
peffgitster
authored andcommitted
everything_local: use "quick" object existence check
In b495697 (fetch-pack: avoid repeatedly re-scanning pack directory, 2013-01-26), we noticed that everything_local() could waste time trying to find and parse objects which we _expect_ to be missing. The solution was to put has_sha1_file() in front of parse_object() to skip the more-expensive parse attempt. That optimization was negated later when has_sha1_file() learned to do the same re-scan in 45e8a74 (has_sha1_file: re-check pack directory before giving up, 2013-08-30). We can restore it by using the "quick" flag to tell has_sha1_file (actually has_object_file these days) that we prefer speed to thoroughness for this call. See also the fixes in 5827a03 and 0eeb077 for prior art and discussion on using the "quick" flag for these cases. The recently-added performance regression test in p5551 demonstrates the problem. You can see the original fix: Test b495697^ b495697 -------------------------------------------------------- 5551.4: fetch 1.68(1.33+0.35) 0.87(0.69+0.18) -48.2% and then the regression: Test 45e8a74^ 45e8a74 --------------------------------------------------------- 5551.4: fetch 0.96(0.77+0.19) 2.55(2.04+0.50) +165.6% and now our fix: Test HEAD^ HEAD -------------------------------------------------------- 5551.4: fetch 7.21(6.58+0.63) 5.47(5.04+0.43) -24.1% You can also see that other things have gotten a lot slower since 2013. We'll deal with those in separate patches. Signed-off-by: Jeff King <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 7893bf1 commit c291293

File tree

1 file changed

+2
-1
lines changed

1 file changed

+2
-1
lines changed

fetch-pack.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -715,7 +715,8 @@ static int everything_local(struct fetch_pack_args *args,
715715
for (ref = *refs; ref; ref = ref->next) {
716716
struct object *o;
717717

718-
if (!has_object_file(&ref->old_oid))
718+
if (!has_object_file_with_flags(&ref->old_oid,
719+
OBJECT_INFO_QUICK))
719720
continue;
720721

721722
o = parse_object(&ref->old_oid);

0 commit comments

Comments
 (0)