Re: Git is not scalable with too many refs/*
From: Junio C Hamano <hidden>
Date: 2016-06-15 22:52:07
Julian Phillips [off-list ref] writes:
Back when I made that change, I failed to notice that get_ref_dir was recursive for subdirectories ... sorry ...
Aha, I also was blind while I was watching this discussion from the sideline, and I thought I re-read the codepath involved X-<. Indeed we were sorting the list way too early and the patch looks correct. Thanks.
quoted hunk
Hopefully this should speed things up. My test repo went from ~17m user time, to ~2.5s. Packing still make things much faster of course.diff --git a/refs.c b/refs.c index a615043..212e7ec 100644 --- a/refs.c +++ b/refs.c@@ -319,7 +319,7 @@ static struct ref_list *get_ref_dir(const char*submodule, c free(ref); closedir(dir); } - return sort_ref_list(list); + return list; } struct warn_if_dangling_data {@@ -361,11 +361,13 @@ static struct ref_list *get_loose_refs(constchar *submodu if (submodule) { free_ref_list(submodule_refs.loose); submodule_refs.loose = get_ref_dir(submodule, "refs", NULL); + submodule_refs.loose = sort_refs_list(submodule_refs.loose); return submodule_refs.loose; } if (!cached_refs.did_loose) { cached_refs.loose = get_ref_dir(NULL, "refs", NULL); + cached_refs.loose = sort_refs_list(cached_refs.loose); cached_refs.did_loose = 1; } return cached_refs.loose;quoted
-Martin