pr-1490/derrickstolee/stolee/reprepare-alternates-v1
tagged this
06 Mar 20:59
From: Derrick Stolee <derrickstolee@github.com> When an object is not found in a repository's object store, we sometimes call reprepare_packed_git() to see if the object was temporarily moved into a new pack-file (and its old pack-file or loose object was deleted). This process does a scan of each pack directory within each odb, but does not reevaluate if the odb list needs updating. Create a new reprepare_alt_odb() method that is a similar wrapper around prepare_alt_odb(). Call it from reprepare_packed_git() under the object read lock to avoid readers from interacting with a potentially incomplete odb being added to the odb list. prepare_alt_odb() already avoids adding duplicate odbs to the list during its progress, so it is safe to call it again from reprepare_alt_odb() without worrying about duplicate odbs. This change is specifically for concurrent changes to the repository, so it is difficult to create a test that guarantees this behavior is correct. I manually verified by introducing a reprepare_packed_git() call into get_revision() and stepped into that call in a debugger with a parent 'git log' process. Multiple runs of reprepare_alt_odb() kept the_repository->objects->odb as a single-item chain until I added a .git/objects/info/alternates file in a different process. The next run added the new odb to the chain and subsequent runs did not add to the chain. Signed-off-by: Derrick Stolee <derrickstolee@github.com> Submitted-As: https://lore.kernel.org/git/pull.1490.git.1678136369387.gitgitgadget@gmail.com
Assets 2
-
2023-03-06T20:59:29Z -
2023-03-06T20:59:29Z -