Re: [PATCH 6/6] fetch: make `--atomic` flag cover pruning of refs
- From
Christian Couder <christian.couder@gmail.com>
- Date
- Feb 15, 2022, 09:12 UTC
- Message-ID
- <CAP8UFD3Fc9315jsbTFNzGunLyrm0P=zDLda2F=7O_5+B-ZtBOA@mail.gmail.com>
- In-Reply-To
- <682f16117b743bec59c533e15ae5a88d39250222.1644565025.git.ps@pks.im>
On Fri, Feb 11, 2022 at 9:25 AM Patrick Steinhardt <ps@pks.im> wrote:
Show 6 quoted lines
> > When fetching with the `--prune` flag we will delete any local > references matching the fetch refspec which have disappeared on the > remote. This step is not currently covered by the `--atomic` flag: we > delete branches even though updating of local references has failed, > which means that the fetch is not an all-or-nothing operation.
It could perhaps be seen as a regression by some users though, if updating of local references doesn't work anymore when deleting a local reference matching the fetch refspec fails.
Show 8 quoted lines
> Fix this bug by passing in the global transaction into `prune_refs()`: > if one is given, then we'll only queue up deletions and not commit them > right away. > > This change also improves performance when pruning many branches in a > repository with a big packed-refs file: every references is pruned in > its own transaction, which means that we potentially have to rewrite > the packed-refs files for every single reference we're about to prune.
Yeah, I wonder if there could be a performance improvement in the previous patch too as it looks like tag backfilling wasn't atomic too.
Show 17 quoted lines
> The following benchmark demonstrates this: it performs a pruning fetch > from a repository with a single reference into a repository with 100k > references, which causes us to prune all but one reference. This is of > course a very artificial setup, but serves to demonstrate the impact of > only having to write the packed-refs file once: > > Benchmark 1: git fetch --prune --atomic +refs/*:refs/* (HEAD~) > Time (mean ± σ): 2.366 s ± 0.021 s [User: 0.858 s, System: 1.508 s] > Range (min … max): 2.328 s … 2.407 s 10 runs > > Benchmark 2: git fetch --prune --atomic +refs/*:refs/* (HEAD) > Time (mean ± σ): 1.369 s ± 0.017 s [User: 0.715 s, System: 0.641 s] > Range (min … max): 1.346 s … 1.400 s 10 runs > > Summary > 'git fetch --prune --atomic +refs/*:refs/* (HEAD)' ran > 1.73 ± 0.03 times faster than 'git fetch --prune --atomic +refs/*:refs/* (HEAD~)'
Nice!