mbox series

[0/9] No more adding submodule ODB as alternate

Message ID cover.1632242495.git.jonathantanmy@google.com (mailing list archive)
Headers show
Series No more adding submodule ODB as alternate | expand

Message

Jonathan Tan Sept. 21, 2021, 4:51 p.m. UTC
This series is on jt/add-submodule-odb-clean-up.

After this series, the entire test suite runs without ever adding a
submodule ODB as an alternate (checked by running with
GIT_TEST_FATAL_REGISTER_SUBMODULE_ODB=1). The code to lazily add
submodule ODBs as alternates still remains (with a trace message printed
if it happens) just in case there is a rare interaction that the test
suite doesn't cover.

This is part of my effort to support partial clone in submodules, but
the results here are also beneficial for non-partial-clone submodule
users in that access to submodule objects are now quicker (because Git
no longer needs to linearly search through alternates when accessing
these objects). It also improves code health in that it is clearer at
the call site when a submodule object is being accessed.

This patch series contains the 2 patches from my previous work on
iterating over submodule refs [1], and 7 new patches.

[1] https://lore.kernel.org/git/cover.1629933380.git.jonathantanmy@google.com/

Jonathan Tan (9):
  refs: make _advance() check struct repo, not flag
  refs: add repo paramater to _iterator_peel()
  refs iterator: support non-the_repository advance
  refs: teach refs_for_each_ref() arbitrary repos
  merge-{ort,recursive}: remove add_submodule_odb()
  object-file: only register submodule ODB if needed
  submodule: pass repo to check_has_commit()
  refs: change refs_for_each_ref_in() to take repo
  submodule: trace adding submodule ODB as alternate

 builtin/submodule--helper.c            | 16 +++--
 merge-ort.c                            | 18 ++----
 merge-recursive.c                      | 41 ++++++------
 object-file.c                          |  3 +-
 object-name.c                          |  4 +-
 refs.c                                 | 87 ++++++++++++++------------
 refs.h                                 | 12 ++--
 refs/debug.c                           |  9 +--
 refs/files-backend.c                   | 28 ++++-----
 refs/iterator.c                        | 51 ++++++++++++---
 refs/packed-backend.c                  | 24 +++----
 refs/ref-cache.c                       |  7 ++-
 refs/refs-internal.h                   | 55 +++++++++++-----
 revision.c                             | 12 ++--
 strbuf.c                               | 12 +++-
 strbuf.h                               |  6 +-
 submodule.c                            | 28 +++++++--
 t/helper/test-ref-store.c              | 20 +++---
 t/t5526-fetch-submodules.sh            |  3 +
 t/t5531-deep-submodule-push.sh         |  3 +
 t/t5545-push-options.sh                |  3 +
 t/t5572-pull-submodule.sh              |  3 +
 t/t6437-submodule-merge.sh             |  3 +
 t/t7418-submodule-sparse-gitmodules.sh |  3 +
 24 files changed, 271 insertions(+), 180 deletions(-)

Comments

Junio C Hamano Sept. 23, 2021, 6:05 p.m. UTC | #1
Jonathan Tan <jonathantanmy@google.com> writes:

> This series is on jt/add-submodule-odb-clean-up.
>
> After this series, the entire test suite runs without ever adding a
> submodule ODB as an alternate (checked by running with
> GIT_TEST_FATAL_REGISTER_SUBMODULE_ODB=1). The code to lazily add
> submodule ODBs as alternates still remains (with a trace message printed
> if it happens) just in case there is a rare interaction that the test
> suite doesn't cover.
>
> This is part of my effort to support partial clone in submodules, but
> the results here are also beneficial for non-partial-clone submodule
> users in that access to submodule objects are now quicker (because Git
> no longer needs to linearly search through alternates when accessing
> these objects). It also improves code health in that it is clearer at
> the call site when a submodule object is being accessed.

Nice.  One specially bad thing about the alternate odb abuse is that
it is very hard to undo once you add an odb that is not really an
alternate as if it were an alternate.  Accessing the objects from
the repository the objects should be found, keeping clear separation
between the superproject and its submodule, which is done here, is
the right thing to do.

Unconfortably excited.