refs/reftable: reload locked stack when preparing transaction
When starting a reftable transaction we lock all stacks we are about to modify. While it may happen that the stack is out-of-date at this point in time we don't really care: transactional updates encode the expected state of a certain reference, so all that we really want to verify is that the _current_ value matches that expected state. Pass `REFTABLE_STACK_NEW_ADDITION_RELOAD` when locking the stack such that an out-of-date stack will be reloaded after having been locked. This change is safe because all verifications of the expected state happen after this step anyway. Add a testcase that verifies that many writers are now able to write to the stack concurrently without failures and with a deterministic end result. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
80e7342ea8
commit
6241ce2170
@ -770,7 +770,8 @@ static int prepare_transaction_update(struct write_transaction_table_arg **out,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = reftable_stack_new_addition(&addition, stack, 0);
|
||||
ret = reftable_stack_new_addition(&addition, stack,
|
||||
REFTABLE_STACK_NEW_ADDITION_RELOAD);
|
||||
if (ret) {
|
||||
if (ret == REFTABLE_LOCK_ERROR)
|
||||
strbuf_addstr(err, "cannot lock references");
|
||||
|
Reference in New Issue
Block a user