On Mon, Nov 12 2018, René Scharfe wrote: > Am 12.11.2018 um 15:55 schrieb Jeff King: >> Commit 024aa4696c (fetch-pack.c: use oidset to check existence of loose >> object, 2018-03-14) added a cache to avoid calling stat() for a bunch of >> loose objects we don't have. >> >> Now that OBJECT_INFO_QUICK handles this caching itself, we can drop the >> custom solution. >> >> Note that this might perform slightly differently, as the original code >> stopped calling readdir() when we saw more loose objects than there were >> refs. So: >> >> 1. The old code might have spent work on readdir() to fill the cache, >> but then decided there were too many loose objects, wasting that >> effort. >> >> 2. The new code might spend a lot of time on readdir() if you have a >> lot of loose objects, even though there are very few objects to >> ask about. > > Plus the old code used an oidset while the new one uses an oid_array. > >> In practice it probably won't matter either way; see the previous commit >> for some discussion of the tradeoff. >> >> Signed-off-by: Jeff King <peff@xxxxxxxx> >> --- >> fetch-pack.c | 39 ++------------------------------------- >> 1 file changed, 2 insertions(+), 37 deletions(-) >> >> diff --git a/fetch-pack.c b/fetch-pack.c >> index b3ed7121bc..25a88f4eb2 100644 >> --- a/fetch-pack.c >> +++ b/fetch-pack.c >> @@ -636,23 +636,6 @@ struct loose_object_iter { >> struct ref *refs; >> }; >> >> -/* >> - * If the number of refs is not larger than the number of loose objects, >> - * this function stops inserting. >> - */ >> -static int add_loose_objects_to_set(const struct object_id *oid, >> - const char *path, >> - void *data) >> -{ >> - struct loose_object_iter *iter = data; >> - oidset_insert(iter->loose_object_set, oid); >> - if (iter->refs == NULL) >> - return 1; >> - >> - iter->refs = iter->refs->next; >> - return 0; >> -} >> - >> /* >> * Mark recent commits available locally and reachable from a local ref as >> * COMPLETE. If args->no_dependents is false, also mark COMPLETE remote refs as >> @@ -670,30 +653,14 @@ static void mark_complete_and_common_ref(struct fetch_negotiator *negotiator, >> struct ref *ref; >> int old_save_commit_buffer = save_commit_buffer; >> timestamp_t cutoff = 0; >> - struct oidset loose_oid_set = OIDSET_INIT; >> - int use_oidset = 0; >> - struct loose_object_iter iter = {&loose_oid_set, *refs}; >> - >> - /* Enumerate all loose objects or know refs are not so many. */ >> - use_oidset = !for_each_loose_object(add_loose_objects_to_set, >> - &iter, 0); >> >> save_commit_buffer = 0; >> >> for (ref = *refs; ref; ref = ref->next) { >> struct object *o; >> - unsigned int flags = OBJECT_INFO_QUICK; >> >> - if (use_oidset && >> - !oidset_contains(&loose_oid_set, &ref->old_oid)) { >> - /* >> - * I know this does not exist in the loose form, >> - * so check if it exists in a non-loose form. >> - */ >> - flags |= OBJECT_INFO_IGNORE_LOOSE; > > This removes the only user of OBJECT_INFO_IGNORE_LOOSE. #leftoverbits With this series applied there's still a use of it left in oid_object_info_extended()