]> git.ipfire.org Git - thirdparty/git.git/commit - object-file.c
speed up alt_odb_usable() with many alternates
authorEric Wong <e@80x24.org>
Wed, 7 Jul 2021 23:10:15 +0000 (23:10 +0000)
committerJunio C Hamano <gitster@pobox.com>
Thu, 8 Jul 2021 00:21:12 +0000 (17:21 -0700)
commitcf2dc1c238c6fd5f93c315a3045ccf95459701cd
treebd576b3137f6943082e9b49f1eb1cc6c86e321f5
parent670b81a890388c60b7032a4f5b879f2ece8c4558
speed up alt_odb_usable() with many alternates

With many alternates, the duplicate check in alt_odb_usable()
wastes many cycles doing repeated fspathcmp() on every existing
alternate.  Use a khash to speed up lookups by odb->path.

Since the kh_put_* API uses the supplied key without
duplicating it, we also take advantage of it to replace both
xstrdup() and strbuf_release() in link_alt_odb_entry() with
strbuf_detach() to avoid the allocation and copy.

In a test repository with 50K alternates and each of those 50K
alternates having one alternate each (for a total of 100K total
alternates); this speeds up lookup of a non-existent blob from
over 16 minutes to roughly 2.7 seconds on my busy workstation.

Note: all underlying git object directories were small and
unpacked with only loose objects and no packs.  Having to load
packs increases times significantly.

Signed-off-by: Eric Wong <e@80x24.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
dir.c
dir.h
object-file.c
object-store.h
object.c