Re: [PATCH v2 0/4] odb: eagerly load alternates

Karthik Nayak <[email protected]>
Newsgroups org.kernel.vger.git
Message-ID <CAOLa=ZTLq2xjkC12B=4wPJA9UJ1PWS4_iUAyqgcJ7GYnbM2YrQ@mail.gmail.com>
Patrick Steinhardt <[email protected]> writes:

> Hi,
>
> when initializing the object database we only eagerly initialize the
> primary object database source. If the primary source has alternates,
> those alternates are only initialized the first time we really access
> the object database.
>
> When introduced in ace1534d6f (Introduce SHA1_FILE_DIRECTORIES to
> support multiple object databases., 2005-05-07), alternates were
> originally only loaded when a given object wasn't found in the primary
> object database. This was also reinforced by later optimization, for
> example in 693d2bc625 (Attempt to delay prepare_alt_odb during get_sha1,
> 2007-05-26), where we tried to avoid loading alternates in even more
> cases. But as Git has evolved, we eventually started to eagerly parse
> alternates all over the codebase, including on every single object
> lookup, and consequently deferring this operation does not really buy us
> much anymore.
>
> The result of this is that we have calls to `odb_prepare_alternates()`
> cluttered all over the code base. This is somewhat awkward, and as
> almost every Git command ends up reading objects at it doesn't even buy
> us anything.
>
> This patch series thus gets rid of the lazy-loading. Besides simplifying
> the codebase a bit, it also prepares us for moving alternates into the
> "files" backend as discussed in [1].
>
> The series is built on top of 010afd3166 (The 12th batch, 2026-08-07)
> with ps/odb-make-creation-pluggable at e927cfeb21 (odb: make creation of
> on-disk structures pluggable, 2026-08-07) merged into it.
>
> Changes in v2:
>   - Add a missing word to a commit message.
>   - Explain why we don't have to handle GIT_ALTERNATE_OBJECT_DIRECTORIES
>     when re-preparing the object database.
>   - Link to v1: https://patch.msgid.link/20260810-pks-odb-eagerly-prepare-alternates-v1-0-f0fa4a4004e1@pks.im
>

V2 looks good, I have one nit, but it's not work re-rolling :)

> Thanks!
>
> Patrick
>
> [1]: <[email protected]>
>
> ---
> Patrick Steinhardt (4):
>       odb: decouple source path comparisons from `the_repository`
>       odb: eagerly initialize alternates
>       odb: drop `loaded_alternates` field
>       odb: drop `alternates_db` field
>
>  builtin/fsck.c         |   3 --
>  builtin/pack-objects.c |   3 --
>  commit-graph.c         |   4 --
>  loose.c                |   1 -
>  object-name.c          |   1 -
>  odb.c                  | 109 ++++++++++++++++++++++++-------------------------
>  odb.h                  |  22 +++++-----
>  odb/source.h           |   7 ++++
>  odb/streaming.c        |   1 -
>  pack-bitmap.c          |   2 -
>  packfile.c             |   1 -
>  packfile.h             |   2 -
>  12 files changed, 70 insertions(+), 86 deletions(-)
>
> Range-diff versus v1:
>
> 1:  25802adffa = 1:  721907c60d odb: decouple source path comparisons from `the_repository`
> 2:  1e73b730d8 ! 2:  3b2c23566c odb: eagerly initialize alternates
>     @@ Commit message
>          many calls to `odb_prepare_alternates()` cluttered around the code base
>          whenever we are about to iterate through the sources.
>
>     -    This lazy loading doesn't really add much value: the moment where read
>     -    any object we _have_ to load the alternates anyway. So given that most
>     -    of our commands would access the object database this optimization is
>     -    not really buying us much in the first place. Quite on the contrary, it
>     -    makes the code harder to understand and is a potential source of bugs in
>     -    case any callsite forgot to prepare alternates before we iterate through
>     -    the sources.
>     +    This lazy loading doesn't really add much value: the moment where we
>     +    read any object we _have_ to load the alternates anyway. So given that
>     +    most of our commands would access the object database this optimization
>     +    is not really buying us much in the first place. Quite on the contrary,
>     +    it makes the code harder to understand and is a potential source of bugs
>     +    in case any callsite forgot to prepare alternates before we iterate
>     +    through the sources.
>
>          Historically though there was a reason why we deferred lazy-loading: it
>          may happen that the repository has "core.ignoreCase" configured, and we
> 3:  2ca1aa2a37 = 3:  df5d7df91d odb: drop `loaded_alternates` field
> 4:  1e97c93bdf ! 4:  50a37ef385 odb: drop `alternates_db` field
>     @@ odb.c: void odb_free(struct object_database *o)
>       	pthread_mutex_destroy(&o->replace_mutex);
>
>      @@ odb.c: void odb_prepare(struct object_database *o, enum odb_prepare_flags flags)
>     - 	 * the lifetime of the process.
>     + 	 * Reprepare alt odbs, in case the alternates file was modified
>     + 	 * during the course of this process. This only _adds_ odbs to
>     + 	 * the linked list, so existing odbs will continue to exist for
>     +-	 * the lifetime of the process.
>     ++	 * the lifetime of the process. Consequently, we don't have to
>     ++	 * reprocess GIT_ALTERNATE_OBJECT_DIRECTORIES here.
>       	 */
>       	if (flags & ODB_PREPARE_FLUSH_CACHES) {
>      -		odb_prepare_alternates(o);
>
> ---
> base-commit: f6ad67a7977439ad8351d42e6ccfd11f714db765
> change-id: 20260804-pks-odb-eagerly-prepare-alternates-3efb0a38e0dd
signature.asc (application/pgp-signature, 690 B)
-----BEGIN PGP SIGNATURE-----

iQHKBAEBCgA0FiEEV85Mf2N1cQ/LZcYGPtWfJI5GjH8FAmp9uGAWHGthcnRoaWsu
MTg4QGdtYWlsLmNvbQAKCRA+1Z8kjkaMf847C/4xsL2DTXjoVkJLgMvETyVIuPZh
HYt1Z+Gel4ETAP5o8X3vvxL6zJS7tRXQ8UvKjS0Jzldck+awcvJG/ctECLTR7Pj0
p4ov40r5tLQjoERv3RCGD04TBuuTIsHu5QojURgQzApTZIxzGvQg1z8Bqwa95KJh
sXoyifMe6w/WFgyBcbK+x1KAq/K0K856elNg8CbQcV9l/MCY5yAv2UFgkNkvl1Dn
7maXDfYkMolwpqF2LAEREMH8pf5rV7MHT6sio+U9qZfEEeWCLppqt/JF6AR7q3/w
qQO1kkuG/GJfq3T41IuNnKLJ26J6WljkH4xC1N/69q+CKN0g+RjCoLv6m8d63vw7
T0uHNeWP1b5HDJNqJclE3cdecuHQ7nGa1R0w1xqC/0BdTAWZa9zNaRtCgaEq4N5y
0OLddKibZy8UJDYHB+zuEiHl38GUTLNDlqj0lKJkL16D80paitEI4b94dV0nzSyh
ijwrp2mvokia4lqBU+4aRol1TLeIKGetBPe9dm0=
=ljY5
-----END PGP SIGNATURE-----
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.