Re: [PATCH v2 08/24] midx: respect 'core.multiPackIndex' when writing
From: Jeff King <hidden>
Date: 2021-07-27 17:17:04
On Mon, Jul 26, 2021 at 02:59:02PM -0400, Taylor Blau wrote:
quoted
Hmm, after staring at this for a bit, I've unconfused and re-confused myself several times. Here are some interesting bits: - calling load_multi_pack_index() directly creates a new midx object. None of its m->packs[] array will be filled in. Nor is it reachable as r->objects->multi_pack_index. - in using that midx, we end up calling prepare_midx_pack() for various packs, which creates a new packed_git struct and adds it to r->objects->packed_git (via install_packed_git()). So that's a bit weird already, because we have packed_git structs in r->objects that came from a midx that isn't r->objects->multi_pack_index. And then if we later call prepare_multi_pack_index(), for example as part of a pack reprepare, then we'd end up with duplicates.Ah, this jogged my memory: this is a relic from when we generated MIDX bitmaps in-process with the rest of the `repack` code. And when we did that, we did have to call `reprepare_packed_git()` after writing the new packs but before moving them into place. So that's where the `reprepare_packed_git()` came from, but we don't have any of that code anymore, since we now generate MIDX bitmaps by invoking: git multi-pack-index write --bitmap --stdin-packs --refs-snapshot as a sub-process of `git repack`; no need for any reprepare which is what was triggering this bug.
OK, that makes sense, especially given the "close_midx() leaves the pointer bogus" stuff discussed elsewhere.
To be sure, I reverted this patch out of GitHub's fork, and reran the
tests both in normal mode (just `make test`) and then once more with the
`GIT_TEST_MULTI_PACK_INDEX{,_WRITE_BITMAP}` environment variables set.
Unsurprisingly, it passed both times.
I'm happy to keep digging further, but I think that I'm 99% satisfied
here. Digging further involves resurrecting a much older version of this
series (and others adjacent to it), and there are probably other bugs
lurking that would be annoying to tease out.
In any case, let's drop this patch from the series. It's disappointing
that we can't run:
git -c core.multiPackIndex= multi-pack-index write
anymore, but I guess that's no worse than the state we were in before
this patch, so I'm content to let it live on.Great. If we can drop it, I think that is the best path forward. I think that may simplify things for the writing patch, too, then. It should not matter if we move close_midx() anymore, because we will not be closing the main r->objects->multi_pack_index struct. I do suspect we could be skipping the load _and_ close of the midx entirely in write_midx_internal(), and just using whatever the caller has passed in (and arguably just having most callers pass in the regular midx struct if they want us to reuse parts of it). That might be a cleanup we can leave for later, but it might be necessary to touch these bits anyway (if there is still some kind of close_midx() ordering gotcha in the function). -Peff