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

Re: [PATCH v3 17/19] refs.c: change update_ref to use a transaction

From
Ronnie Sahlberg <sahlberg@google.com>
Date
Apr 28, 2014, 18:33 UTC
Message-ID
<CAL=YDWkk9aqDmAA4OAYd-eFNkdKoEdp8gS=n4VyMqAFpknU3Bg@mail.gmail.com>
In-Reply-To
<535AEFAF.9000908@alum.mit.edu>
Thanks.
On Fri, Apr 25, 2014 at 4:28 PM, Michael Haggerty <mhagger@alum.mit.edu> wrote:
Show 27 quoted lines
> On 04/25/2014 06:14 PM, Ronnie Sahlberg wrote:
>> Change the update_ref helper function to use a ref transaction internally.
>>
>> Signed-off-by: Ronnie Sahlberg <sahlberg@google.com>
>> ---
>>  refs.c | 23 +++++++++++++++++++----
>>  1 file changed, 19 insertions(+), 4 deletions(-)
>>
>> diff --git a/refs.c b/refs.c
>> index 1557c3c..95df4a9 100644
>> --- a/refs.c
>> +++ b/refs.c
>> @@ -3397,11 +3397,26 @@ int update_ref(const char *action, const char *refname,
>>              const unsigned char *sha1, const unsigned char *oldval,
>>              int flags, enum action_on_err onerr)
>>  {
>> -     struct ref_lock *lock;
>> -     lock = update_ref_lock(refname, oldval, flags, NULL, onerr);
>> -     if (!lock)
>> +     struct ref_transaction *t;
>> +     char *err = NULL;
>> +
>> +     t = ref_transaction_begin();
>> +     if ((!t ||
>> +         ref_transaction_update(t, refname, sha1, oldval, flags,
>> +                                !!oldval)) ||
>> +         (ref_transaction_commit(t, action, &err) && !(t = NULL))) {

This is transient code to just show how ugly this pattern becomes when ref_transaction_commit() implicitly also frees the transaction.

Later patches toward the end of the series will replace this with something nicer. Currently in this patch series I pass a pointer to pointer for the transaction to _commit() but that is perhaps not optimal either. I will try and see how it would look if _commit would not free the transaction at all and the caller would always have to call ref_transaction_free() explicitely.

I am thinking of something like this :
   t = ref_transaction_begin();
   if ((!t ||
       ref_transaction_update(t, ...)) ||
       ref_transaction_commit(t, ...)) {
          ...something...
   }
   ref_transaction_free(t);
Show 13 quoted lines
>
> You seem to have extra parentheses around the first || subexpression.
>
> You also don't need the parentheses around the && expression because &&
> binds more tightly than ||.
>
> But using "!(t = NULL)" in the middle of a conditional expression is
> pretty obscure.  I think you will change this in a later patch, so I
> will defer my comments.
>
>> +          const char *str = "update_ref failed for ref '%s': %s";
>
> Indentation error.
Fixed.
Show 23 quoted lines
>
>> +
>> +             ref_transaction_rollback(t);
>> +             switch (onerr) {
>> +             case UPDATE_REFS_MSG_ON_ERR: error(str, refname, err); break;
>> +             case UPDATE_REFS_DIE_ON_ERR: die(str, refname, err); break;
>> +             case UPDATE_REFS_QUIET_ON_ERR: break;
>> +             free(err);
>> +             }
>>               return 1;
>> -     return update_ref_write(action, refname, sha1, lock, NULL, onerr);
>> +     }
>> +     return 0;
>>  }
>>
>>  static int ref_update_compare(const void *r1, const void *r2)
>>
>
>
> --
> Michael Haggerty
> mhagger@alum.mit.edu
> http://softwareswirl.blogspot.com/
Previous: Michael HaggertyNext: Ronnie Sahlberg
Message 39 of 48 in “Use ref transactions from most callers”
  1. 00/19 Use ref transactions from most callersRonnie Sahlberg, Apr 25, 2014
  2. 01/19 refs.c: constify the sha arguments for ref_transaction_create|delete|updateRonnie Sahlberg, Apr 25, 2014
  3. 02/19 refs.c: allow passing NULL to ref_transaction_freeRonnie Sahlberg, Apr 25, 2014
  4. 03/19 refs.c: make ref_transaction_commit return an error stringRonnie Sahlberg, Apr 25, 2014
  5. Jonathan NiederApr 25, 2014
  6. Ronnie SahlbergApr 28, 2014
  7. 04/19 refs.c: return error string from ref_update_reject_duplicates on failureRonnie Sahlberg, Apr 25, 2014
  8. Jonathan NiederApr 25, 2014
  9. Ronnie SahlbergApr 28, 2014
  10. 05/19 update-ref.c: use the error string from _commit to print better messageRonnie Sahlberg, Apr 25, 2014
  11. Jonathan NiederApr 25, 2014
  12. Ronnie SahlbergApr 28, 2014
  13. 06/19 refs.c: make update_ref_write to return error string on failureRonnie Sahlberg, Apr 25, 2014
  14. Jonathan NiederApr 25, 2014
  15. Ronnie SahlbergApr 28, 2014
  16. 07/19 refs.c: remove the onerr argument to ref_transaction_commitRonnie Sahlberg, Apr 25, 2014
  17. Jonathan NiederApr 25, 2014
  18. Ronnie SahlbergApr 28, 2014
  19. 08/19 refs.c: change ref_transaction_update() to do error checking and return statusRonnie Sahlberg, Apr 25, 2014
  20. 09/19 refs.c: change ref_transaction_create to do error checking and return statusRonnie Sahlberg, Apr 25, 2014
  21. 10/19 refs.c: ref_transaction_delete to check for error and return statusRonnie Sahlberg, Apr 25, 2014
  22. 11/19 tag.c: use ref transactions when doing updatesRonnie Sahlberg, Apr 25, 2014
  23. Michael HaggertyApr 25, 2014
  24. Ronnie SahlbergApr 28, 2014
  25. 12/19 replace.c: use the ref transaction functions for updatesRonnie Sahlberg, Apr 25, 2014
  26. Michael HaggertyApr 25, 2014
  27. Ronnie SahlbergApr 28, 2014
  28. 13/19 commit.c: use ref transactions for updatesRonnie Sahlberg, Apr 25, 2014
  29. 14/19 sequencer.c: use ref transactions for all ref updatesRonnie Sahlberg, Apr 25, 2014
  30. 15/19 fast-import.c: change update_branch to use ref transactionsRonnie Sahlberg, Apr 25, 2014
  31. 16/19 branch.c: use ref transaction for all ref updatesRonnie Sahlberg, Apr 25, 2014
  32. Michael HaggertyApr 25, 2014
  33. Ronnie SahlbergApr 28, 2014
  34. Michael HaggertyApr 29, 2014
  35. Ronnie SahlbergApr 29, 2014
  36. Junio C HamanoApr 29, 2014
  37. 17/19 refs.c: change update_ref to use a transactionRonnie Sahlberg, Apr 25, 2014
  38. Michael HaggertyApr 25, 2014
  39. Ronnie SahlbergApr 28, 2014
  40. 18/19 refs.c: free the transaction before returning when number of updates is 0Ronnie Sahlberg, Apr 25, 2014
  41. 19/19 refs.c: pass **transaction to commit and have it clear the pointerRonnie Sahlberg, Apr 25, 2014
  42. Michael HaggertyApr 26, 2014
  43. Ronnie SahlbergApr 28, 2014
  44. Michael HaggertyApr 29, 2014
  45. Ronnie SahlbergApr 29, 2014
  46. Michael HaggertyApr 30, 2014
  47. Jonathan NiederApr 25, 2014
  48. Ronnie SahlbergApr 25, 2014

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.