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

Re: [PATCH v2 6/8] refs: add update_refs for multiple simultaneous updates

From
Brad King <brad.king@kitware.com>
Date
Sep 2, 2013, 17:20 UTC
Message-ID
<5224C8E5.1080908@kitware.com>
In-Reply-To
<52223398.2080109@alum.mit.edu>
On 08/31/2013 02:19 PM, Michael Haggerty wrote:
> s/themeselves/themselves/
Fixed.
Show 6 quoted lines
>> +	struct ref_update *u1 = (struct ref_update *)(r1);
>> +	struct ref_update *u2 = (struct ref_update *)(r2);
> 
> If you declare u1 and u2 to be "const struct ref_update *" (i.e., add
> "const"), then you have const correctness and don't need the explicit
> casts.  (And the parentheses around r1 and r2 are superfluous in any case.)
Fixed.
>> +	ret = strcmp(u1->ref_name, u2->ref_name);
> 
> Is there a need to compare more than ref_name?  If two entries are found
> with the same name, then ref_update_reject_duplicates() will error out

Junio mentioned possibility of auto-combining identical entries which would need full ordering. I think that can be added later so for now we can sort only by ref name. Thanks.

Show 5 quoted lines
>> +		if (!strcmp(updates[i - 1].ref_name, updates[i].ref_name))
>> +			break;
> 
> The error handling code could be right here instead of the "break"
> statement, removing the need for the "if" conditional.
Fixed.
Show 8 quoted lines
>> +	/* Allocate work space: */
>> +	updates = xmalloc(sizeof(struct ref_update) * n);
> 
> It seems preferred here to write
> 
> 	updates = xmalloc(sizeof(*updates) * n);
> 
> as this will continue to work if the type of updates is ever changed.
Yes, thanks.
Show 13 quoted lines
> Similarly for the next lines.
> 
>> +	types = xmalloc(sizeof(int) * n);
>> +	locks = xmalloc(sizeof(struct ref_lock *) * n);
>> +	delnames = xmalloc(sizeof(const char *) * n);
> 
> An alternative to managing separate arrays to hold types and locks would
> be to include the scratch space in struct ref_update and document it
> "for internal use only; need not be initialized by caller".  On the one
> hand it's ugly to cruft up the "interface" with internal implementation
> details; on the other hand there is precedent for this sort of thing
> (e.g., ref_lock::force_write or lock_file::on_list) and it would
> simplify the code.

I think the "goto cleanup" reorganization simplifies the code enough to not need this. After changing "updates" to an array of pointers it needs to be separate so we can sort. Also "delnames" needs to be a separate array to pass to repack_without_refs.

Show 10 quoted lines
>> +	/* Copy, sort, and reject duplicate refs: */
>> +	memcpy(updates, updates_orig, sizeof(struct ref_update) * n);
>> +	qsort(updates, n, sizeof(struct ref_update), ref_update_compare);
> 
> You could save some space and memory shuffling (during memcpy() and
> qsort()) if you would declare "updates" to be an array of pointers to
> "struct ref_update" rather than an array of structs.  Sorting could then
> be done by moving pointers around instead of moving the structs.  This
> would also make it easier for update_refs() to pass information about
> the references back to its caller, should that ever be needed.
Good idea.  Changed in next revision.
Show 10 quoted lines
>> +			ret |= update_ref_write(action,
>> +						updates[i].ref_name,
>> +						updates[i].new_sha1,
>> +						locks[i], onerr);
>> +			locks[i] = 0; /* freed by update_ref_write */
>> +		}
>> +
> 
> Hmmm, if one of the calls to update_ref_write() fails, would it be safer
> to abort the rest of the work (especially the reference deletions)?

Yes. Since we already have the lock at this point something must be going pretty wrong if this fails so it is best to abort altogether.

Show 11 quoted lines
>> +	free(updates);
>> +	free(types);
>> +	free(locks);
>> +	free(delnames);
>> +	return ret;
>> +}
> 
> There's a lot of duplicated cleanup code in the function.  If you put a
> label before the final for loop, and if you initialize the locks array
> to zeros (e.g., by using xcalloc()), then the three exits could all
> share the same code "ret = 1; goto cleanup;".
Done, thanks.
>> +struct ref_update {
> 
> Please document this structure, especially the relationship between
> have_old and old_sha1.

Done. I also moved it to the top of the header just under ref_lock so it can be used by other APIs later.

Thanks, -Brad

Previous: Michael HaggertyNext: Junio C Hamano
Message 42 of 106 in “Multiple simultaneously locked ref updates”
  1. 0/7 Multiple simultaneously locked ref updatesBrad King, Aug 29, 2013
  2. 1/7 reset: rename update_refs to reset_refsBrad King, Aug 29, 2013
  3. Junio C HamanoAug 29, 2013
  4. Brad KingAug 29, 2013
  5. 2/7 refs: report ref type from lock_any_ref_for_updateBrad King, Aug 29, 2013
  6. Junio C HamanoAug 29, 2013
  7. Brad KingAug 29, 2013
  8. 3/7 refs: factor update_ref steps into helpersBrad King, Aug 29, 2013
  9. 4/7 refs: factor delete_ref loose ref step into a helperBrad King, Aug 29, 2013
  10. Junio C HamanoAug 29, 2013
  11. Brad KingAug 29, 2013
  12. 5/7 refs: add function to repack without multiple refsBrad King, Aug 29, 2013
  13. Junio C HamanoAug 29, 2013
  14. Brad KingAug 29, 2013
  15. 6/7 refs: add update_refs for multiple simultaneous updatesBrad King, Aug 29, 2013
  16. Junio C HamanoAug 29, 2013
  17. Brad KingAug 29, 2013
  18. Junio C HamanoAug 29, 2013
  19. Brad KingAug 29, 2013
  20. Brad KingAug 29, 2013
  21. 7/7 update-ref: support multiple simultaneous updatesBrad King, Aug 29, 2013
  22. Junio C HamanoAug 29, 2013
  23. Brad KingAug 29, 2013
  24. Martin FickAug 29, 2013
  25. Brad KingAug 29, 2013
  26. Junio C HamanoAug 29, 2013
  27. Brad KingAug 29, 2013
  28. Junio C HamanoAug 29, 2013
  29. Brad KingAug 29, 2013
  30. 0/8 Multiple simultaneously locked ref updatesBrad King, Aug 30, 2013
  31. 1/8 reset: rename update_refs to reset_refsBrad King, Aug 30, 2013
  32. 2/8 refs: report ref type from lock_any_ref_for_updateBrad King, Aug 30, 2013
  33. 3/8 refs: factor update_ref steps into helpersBrad King, Aug 30, 2013
  34. Junio C HamanoSep 1, 2013
  35. Brad KingSep 2, 2013
  36. 4/8 refs: factor delete_ref loose ref step into a helperBrad King, Aug 30, 2013
  37. Michael HaggertyAug 31, 2013
  38. Brad KingSep 2, 2013
  39. 5/8 refs: add function to repack without multiple refsBrad King, Aug 30, 2013
  40. 6/8 refs: add update_refs for multiple simultaneous updatesBrad King, Aug 30, 2013
  41. Michael HaggertyAug 31, 2013
  42. Brad KingSep 2, 2013
  43. Junio C HamanoSep 1, 2013
  44. Brad KingSep 2, 2013
  45. Michael HaggertySep 3, 2013
  46. Brad KingSep 3, 2013
  47. 7/8 update-ref: support multiple simultaneous updatesBrad King, Aug 30, 2013
  48. Junio C HamanoAug 30, 2013
  49. Brad KingSep 2, 2013
  50. Michael HaggertyAug 31, 2013
  51. Brad KingSep 2, 2013
  52. 8/8 update-ref: add test cases covering --stdin signatureBrad King, Aug 30, 2013
  53. Eric SunshineSep 1, 2013
  54. Brad KingSep 2, 2013
  55. Michael HaggertyAug 31, 2013
  56. 0/8 Multiple simultaneously locked ref updatesBrad King, Sep 2, 2013
  57. 1/8 reset: rename update_refs to reset_refsBrad King, Sep 2, 2013
  58. 2/8 refs: report ref type from lock_any_ref_for_updateBrad King, Sep 2, 2013
  59. 3/8 refs: factor update_ref steps into helpersBrad King, Sep 2, 2013
  60. 4/8 refs: factor delete_ref loose ref step into a helperBrad King, Sep 2, 2013
  61. 5/8 refs: add function to repack without multiple refsBrad King, Sep 2, 2013
  62. 6/8 refs: add update_refs for multiple simultaneous updatesBrad King, Sep 2, 2013
  63. 7/8 update-ref: support multiple simultaneous updatesBrad King, Sep 2, 2013
  64. Brad KingSep 2, 2013
  65. 8/8 update-ref: add test cases covering --stdin signatureBrad King, Sep 2, 2013
  66. Eric SunshineSep 3, 2013
  67. Brad KingSep 3, 2013
  68. 0/8 Multiple simultaneously locked ref updatesBrad King, Sep 4, 2013
  69. 1/8 reset: rename update_refs to reset_refsBrad King, Sep 4, 2013
  70. 2/8 refs: report ref type from lock_any_ref_for_updateBrad King, Sep 4, 2013
  71. 3/8 refs: factor update_ref steps into helpersBrad King, Sep 4, 2013
  72. 4/8 refs: factor delete_ref loose ref step into a helperBrad King, Sep 4, 2013
  73. 5/8 refs: add function to repack without multiple refsBrad King, Sep 4, 2013
  74. 6/8 refs: add update_refs for multiple simultaneous updatesBrad King, Sep 4, 2013
  75. 7/8 update-ref: support multiple simultaneous updatesBrad King, Sep 4, 2013
  76. Junio C HamanoSep 4, 2013
  77. Brad KingSep 4, 2013
  78. Junio C HamanoSep 4, 2013
  79. Brad KingSep 5, 2013
  80. Junio C HamanoSep 5, 2013
  81. Brad KingSep 5, 2013
  82. Junio C HamanoSep 4, 2013
  83. Brad KingSep 4, 2013
  84. 8/8 update-ref: add test cases covering --stdin signatureBrad King, Sep 4, 2013
  85. 0/8 Multiple simultaneously locked ref updatesBrad King, Sep 9, 2013
  86. 7/8 update-ref: support multiple simultaneous updatesBrad King, Sep 9, 2013
  87. 8/8 update-ref: add test cases covering --stdin signatureBrad King, Sep 9, 2013
  88. 0/8 Multiple simultaneously locked ref updatesBrad King, Sep 10, 2013
  89. 1/8 reset: rename update_refs to reset_refsBrad King, Sep 10, 2013
  90. Ramkumar RamachandraSep 10, 2013
  91. 2/8 refs: report ref type from lock_any_ref_for_updateBrad King, Sep 10, 2013
  92. 3/8 refs: factor update_ref steps into helpersBrad King, Sep 10, 2013
  93. 4/8 refs: factor delete_ref loose ref step into a helperBrad King, Sep 10, 2013
  94. 5/8 refs: add function to repack without multiple refsBrad King, Sep 10, 2013
  95. 6/8 refs: add update_refs for multiple simultaneous updatesBrad King, Sep 10, 2013
  96. 7/8 update-ref: support multiple simultaneous updatesBrad King, Sep 10, 2013
  97. Eric SunshineSep 10, 2013
  98. Brad KingSep 11, 2013
  99. Eric SunshineSep 11, 2013
  100. 8/8 update-ref: add test cases covering --stdin signatureBrad King, Sep 10, 2013
  101. Eric SunshineSep 10, 2013
  102. Junio C HamanoSep 10, 2013
  103. 8/8 update-ref: add test cases covering --stdin signatureBrad King, Sep 11, 2013
  104. Junio C HamanoSep 10, 2013
  105. Brad KingSep 10, 2013
  106. Junio C HamanoSep 10, 2013

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.