Skip to content
  • Michael Haggerty's avatar
    ref_transaction_prepare(): new optional step for reference updates · 30173b88
    Michael Haggerty authored and Junio C Hamano's avatar Junio C Hamano committed
    
    
    In the future, compound reference stores will sometimes need to modify
    references in two different reference stores at the same time, meaning
    that a single logical reference transaction might have to be
    implemented as two internal sub-transactions. They won't want to call
    `ref_transaction_commit()` for the two sub-transactions one after the
    other, because that wouldn't be atomic (the first commit could succeed
    and the second one fail). Instead, they will want to prepare both
    sub-transactions (i.e., obtain any necessary locks and do any
    pre-checks), and only if both prepare steps succeed, then commit both
    sub-transactions.
    
    Start preparing for that day by adding a new, optional
    `ref_transaction_prepare()` step to the reference transaction
    sequence, which obtains the locks and does any prechecks, reporting
    any errors that occur. Also add a `ref_transaction_abort()` function
    that can be used to abort a sub-transaction even if it has already
    been prepared.
    
    That is on the side of the public-facing API. On the side of the
    `ref_store` VTABLE, get rid of `transaction_commit` and instead add
    methods `transaction_prepare`, `transaction_finish`, and
    `transaction_abort`. A `ref_transaction_commit()` now basically calls
    methods `transaction_prepare` then `transaction_finish`.
    
    Signed-off-by: default avatarMichael Haggerty <mhagger@alum.mit.edu>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    30173b88