git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH 0/6] refs: introduce support for partial reference transactions

From
Karthik Nayak <karthik.188@gmail.com>
Date
Feb 21, 2025, 11:50 UTC
Message-ID
<CAOLa=ZQHMsZK0rmb2MuJYuaR-+1s6CdEQm86caKc_qXMSOKPTw@mail.gmail.com>
In-Reply-To
<282b132e-27b0-41b7-8556-cbbdc08081bc@gmail.com>
Phillip Wood <phillip.wood123@gmail.com> writes:
Show 45 quoted lines
> Hi Karthik
>
> On 12/02/2025 12:34, Karthik Nayak wrote:
>>> On 07/02/2025 07:34, Karthik Nayak wrote:
>>>> Git's reference updates are traditionally atomic
>>>
>>> I'm nitpicking but the updates aren't actually atomic, if a transaction
>>> updates two refs then it is possible for another process to see the one
>>> ref pointing to the new value and the other pointing to the old value.
>>>
>>
>> Good point. This is true in the case of the files backend, since updates
>> involve locking individual files and during the commit phase, there is a
>> possibility that one ref is updated while the other is yet to be
>> (committing of the lock is not global but rather per ref file).
>>
>> However this is not the case with the reftable backend, there, updates
>> are written to a new table and committed at the end after locking the
>> table. So in the reftable backend, this is indeed atomic.
>
> Ah, interesting. That explains why batching updates is so much more
> efficient when using the reftable backend.
>
>>>> This series introduces support for partial reference transactions,
>>>> allowing individual reference updates to fail while letting others
>>>> proceed.
>>>
>>> This sounds like it's abusing ref transactions to implement a
>>> performance optimization.
>>
>> I understand where you're coming from. This is definitely a stray from
>> the regular atomic behavior, that transactions promise. But I would say
>> this is more of an exception handling for the regular transaction
>> mechanism and AFAIK this is also something that some of the databases
>> support (see EXCEPTION in PostgreSQL).
>>
>> Overall, we're adding an exception handling support to the existing
>> transaction interface.
>
> My understanding of exception handling is that if an error occurs then
> an error handler is called (reading [1] that seems to be what PostgreSQL
> does as well). Is that what is being proposed here? I thought this
> series added a flag to ignore errors rather than provide a way to handle
> them.
>

That is correct, and while the current implementation is to ignore them. It does make way for building something like that in the future.

Show 21 quoted lines
> [1]
> https://www.postgresql.org/docs/current/plpgsql-control-structures.html#PLPGSQL-ERROR-TRAPPING
>
>>> I wonder if it would be better to provide that
>>> via a different interface than shares the same underling implementation
>>> as transactions. That would make it clear to someone reading the code
>>> that individual ref updates can fail without affecting the rest. Burying
>>> that detail in a flag makes it rather easy to miss.
>>>
>>
>> Thinking this out, having a different interface sound good, but I feel
>> we'd end up with the same structure as currently presented in this
>> series. Only other way is to really split the implementation to support
>> partial transactions as a entity of its own. In that case, we'd end up
>> with code duplication.
>>
>> Do you think you can expand a little more here?
>
> I was thinking of a function that took a list of refs to update and made
> a best effort to update them, ignoring any updates that fail.
>

Yes, this is what we want too, but in the context of transactions. Without transactions, this is already possible to build albeit on the user side with some simple scripts.

Show 9 quoted lines
> My concern with adding a flag to ignore errors in the transaction api is
> that a partial transaction is a contradiction in terms. I'm also
> concerned that it seems to be ignoring all errors. I'd be happier if
> there was someway for the caller to specify which errors to ignore or if
> the caller could provide a callback to handle any errors. That way a
> caller could ignore d/f conflicts but still cause the transaction to
> fail if there was an i/o or could create a reference if it did not exist
> but leave it unchanged if it did exist.
>

Yeah, I think this is also something that Patrick raised and something I will tackle in the next version of this patch series.

The next version will skip all user oriented errors (errors which can be fixed by changing the user input), while still catch system errors (I/O , memory ...). I also see how this can be extended to allow users to nit-pick which errors they don't care about. But that is something I don't plan to tackle for now.

> Best Wishes
>
> Phillip
Thanks for your inputs!
Previous: Patrick SteinhardtNext: Karthik Nayak
Message 23 of 49 in “refs: introduce support for partial reference transactions”
  1. 0/6 refs: introduce support for partial reference transactionsKarthik Nayak, Feb 7, 2025
  2. 1/6 refs/files: remove duplicate check in `split_symref_update()`Karthik Nayak, Feb 7, 2025
  3. Patrick SteinhardtFeb 7, 2025
  4. Karthik NayakFeb 11, 2025
  5. 2/6 refs: move duplicate refname update check to generic layerKarthik Nayak, Feb 7, 2025
  6. Patrick SteinhardtFeb 7, 2025
  7. Karthik NayakFeb 11, 2025
  8. 3/6 refs/files: remove duplicate duplicates checkKarthik Nayak, Feb 7, 2025
  9. Patrick SteinhardtFeb 7, 2025
  10. 4/6 refs/reftable: extract code from the transaction preparationKarthik Nayak, Feb 7, 2025
  11. 5/6 refs: implement partial reference transaction supportKarthik Nayak, Feb 7, 2025
  12. Patrick SteinhardtFeb 7, 2025
  13. Karthik NayakFeb 21, 2025
  14. 6/6 update-ref: add --allow-partial flag for stdin modeKarthik Nayak, Feb 7, 2025
  15. Patrick SteinhardtFeb 7, 2025
  16. Karthik NayakFeb 21, 2025
  17. Phillip WoodFeb 11, 2025
  18. Phillip WoodFeb 11, 2025
  19. Karthik NayakFeb 12, 2025
  20. Karthik NayakFeb 12, 2025
  21. Phillip WoodFeb 19, 2025
  22. Patrick SteinhardtFeb 19, 2025
  23. Karthik NayakFeb 21, 2025
  24. 0/8 refs: introduce support for batched reference updatesKarthik Nayak, Mar 27, 2025
  25. 1/8 refs/files: remove redundant check in split_symref_update()Karthik Nayak, Mar 27, 2025
  26. 2/8 refs: move duplicate refname update check to generic layerKarthik Nayak, Mar 27, 2025
  27. 3/8 refs/files: remove duplicate duplicates checkKarthik Nayak, Mar 27, 2025
  28. 4/8 refs/reftable: extract code from the transaction preparationKarthik Nayak, Mar 27, 2025
  29. 5/8 refs: introduce enum-based transaction error typesKarthik Nayak, Mar 27, 2025
  30. 6/8 refs: implement batch reference update supportKarthik Nayak, Mar 27, 2025
  31. 7/8 refs: support rejection in batch updates during F/D checksKarthik Nayak, Mar 27, 2025
  32. 8/8 update-ref: add --batch-updates flag for stdin modeKarthik Nayak, Mar 27, 2025
  33. Jean-Noël AVILAMar 28, 2025
  34. Junio C HamanoMar 29, 2025
  35. Karthik NayakMar 29, 2025
  36. Patrick SteinhardtMar 28, 2025
  37. 0/8 refs: introduce support for batched reference updatesKarthik Nayak, Apr 8, 2025
  38. 1/8 refs/files: remove redundant check in split_symref_update()Karthik Nayak, Apr 8, 2025
  39. 2/8 refs: move duplicate refname update check to generic layerKarthik Nayak, Apr 8, 2025
  40. 3/8 refs/files: remove duplicate duplicates checkKarthik Nayak, Apr 8, 2025
  41. 4/8 refs/reftable: extract code from the transaction preparationKarthik Nayak, Apr 8, 2025
  42. 5/8 refs: introduce enum-based transaction error typesKarthik Nayak, Apr 8, 2025
  43. 6/8 refs: implement batch reference update supportKarthik Nayak, Apr 8, 2025
  44. 7/8 refs: support rejection in batch updates during F/D checksKarthik Nayak, Apr 8, 2025
  45. 8/8 update-ref: add --batch-updates flag for stdin modeKarthik Nayak, Apr 8, 2025
  46. Junio C HamanoApr 8, 2025
  47. Karthik NayakApr 8, 2025
  48. Junio C HamanoApr 8, 2025
  49. Karthik NayakApr 10, 2025

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.