Skip to content
  • Taylor Blau's avatar
    midx: traverse the local MIDX first · 59552fb3
    Taylor Blau authored and Junio C Hamano's avatar Junio C Hamano committed
    
    
    When a repository has an alternate object directory configured, callers
    can traverse through each alternate's MIDX by walking the '->next'
    pointer.
    
    But, when 'prepare_multi_pack_index_one()' loads multiple MIDXs, it
    places the new ones at the front of this pointer chain, not at the end.
    This can be confusing for callers such as 'git repack -ad', causing test
    failures like in t7700.6 with 'GIT_TEST_MULTI_PACK_INDEX=1'.
    
    The occurs when dropping a pack known to the local MIDX with alternates
    configured that have their own MIDX. Since the alternate's MIDX is
    returned via 'get_multi_pack_index()', 'midx_contains_pack()' returns
    true (which is correct, since it traverses through the '->next' pointer
    to find the MIDX in the chain that does contain the requested object).
    But, we call 'clear_midx_file()' on 'the_repository', which drops the
    MIDX at the path of the first MIDX in the chain, which (in the case of
    t7700.6 is the one in the alternate).
    
    This patch addresses that by:
    
      - placing the local MIDX first in the chain when calling
        'prepare_multi_pack_index_one()', and
    
      - introducing a new 'get_local_multi_pack_index()', which explicitly
        returns the repository-local MIDX, if any.
    
    Don't impose an additional order on the MIDX's '->next' pointer beyond
    that the first item in the chain must be local if one exists so that we
    avoid a quadratic insertion.
    
    Likewise, use 'get_local_multi_pack_index()' in
    'remove_redundant_pack()' to fix the formerly broken t7700.6 when run
    with 'GIT_TEST_MULTI_PACK_INDEX=1'.
    
    Finally, note that the MIDX ordering invariant is only preserved by the
    insertion order in 'prepare_packed_git()', which traverses through the
    ODB's '->next' pointer, meaning we visit the local object store first.
    This fragility makes this an undesirable long-term solution if more
    callers are added, but it is acceptable for now since this is the only
    caller.
    
    Helped-by: default avatarJeff King <peff@peff.net>
    Signed-off-by: default avatarJeff King <peff@peff.net>
    Signed-off-by: default avatarTaylor Blau <me@ttaylorr.com>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    59552fb3