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

[PATCH v4 0/6] refs: excessive hook execution with packed refs

From
Patrick Steinhardt <ps@pks.im>
Date
Jan 17, 2022, 08:12 UTC
Message-ID
<cover.1642406989.git.ps@pks.im>
In-Reply-To
<cover.1641556319.git.ps@pks.im>
Hi,

this is the fourth version of this patch series, which addresses an issue where the reference-transaction hook is being invoked twice when deleting refs both in the packed-refs and loose-refs file.

The following things changed in comparison to v3:
    - Fixed a memory leak in `files_delete_refs()`.
    - Refactored the `packed_downcast()` invocation such that we don't
      have to mark its unused returned variable as used.
    - Removed a spurious whitespace change.
Patrick
Patrick Steinhardt (6):
  refs: extract packed_refs_delete_refs() to allow control of
    transaction
  refs: allow passing flags when beginning transactions
  refs: allow skipping the reference-transaction hook
  refs: demonstrate excessive execution of the reference-transaction
    hook
  refs: do not execute reference-transaction hook on packing refs
  refs: skip hooks when deleting uncovered packed refs
 refs.c                           | 11 +++++--
 refs.h                           |  8 ++++-
 refs/files-backend.c             | 26 ++++++++++++-----
 refs/packed-backend.c            | 28 +++++++++++++-----
 refs/packed-backend.h            |  7 +++++
 refs/refs-internal.h             |  1 +
 sequencer.c                      |  2 +-
 t/t1416-ref-transaction-hooks.sh | 50 ++++++++++++++++++++++++++++++++
 8 files changed, 114 insertions(+), 19 deletions(-)
Range-diff against v3:
1:  abbc28822b ! 1:  14775046e1 refs: extract packed_refs_delete_refs() to allow control of transaction
    @@ refs/files-backend.c: static int files_delete_refs(struct ref_store *ref_store,
      
      	packed_refs_unlock(refs->packed_ref_store);
      
    +@@ refs/files-backend.c: static int files_delete_refs(struct ref_store *ref_store, const char *msg,
    + 			result |= error(_("could not remove reference %s"), refname);
    + 	}
    + 
    ++	ref_transaction_free(transaction);
    + 	strbuf_release(&err);
    + 	return result;
    + 
     @@ refs/files-backend.c: static int files_delete_refs(struct ref_store *ref_store, const char *msg,
      	else
      		error(_("could not delete references: %s"), err.buf);
    @@ refs/packed-backend.c: static int packed_delete_refs(struct ref_store *ref_store
     +			    struct string_list *refnames,
     +			    unsigned int flags)
     +{
    -+	struct packed_ref_store *refs =
    -+		packed_downcast(ref_store, REF_STORE_WRITE, "delete_refs");
     +	struct strbuf err = STRBUF_INIT;
     +	struct string_list_item *item;
     +	int ret;
     +
    -+	(void)(refs); /* We need the check above, but don't use the variable */
    ++	/* Assert that the ref store refers to a packed backend. */
    ++	packed_downcast(ref_store, REF_STORE_WRITE, "delete_refs");
     +
      	for_each_string_list_item(item, refnames) {
      		if (ref_transaction_delete(transaction, item->string, NULL,
      					   flags, msg, &err)) {
    -@@ refs/packed-backend.c: static int packed_delete_refs(struct ref_store *ref_store, const char *msg,
    - 	}
    - 
    - 	ret = ref_transaction_commit(transaction, &err);
    --
    - 	if (ret) {
    - 		if (refnames->nr == 1)
    - 			error(_("could not delete reference %s: %s"),
     @@ refs/packed-backend.c: static int packed_delete_refs(struct ref_store *ref_store, const char *msg,
      			error(_("could not delete references: %s"), err.buf);
      	}
2:  9dd172a757 = 2:  d4ac24c8b8 refs: allow passing flags when beginning transactions
3:  be826bae3b = 3:  f4a07fe9a8 refs: allow skipping the reference-transaction hook
4:  662a6e6244 = 4:  a8981baef7 refs: demonstrate excessive execution of the reference-transaction hook
5:  d83f309b9c = 5:  23c344854e refs: do not execute reference-transaction hook on packing refs
6:  279eadc41c = 6:  d6c7d765af refs: skip hooks when deleting uncovered packed refs
-- 
2.34.1
Previous: Patrick SteinhardtNext: Patrick Steinhardt
Message 45 of 51 in “refs: excessive hook execution with packed refs”
  1. 0/6 refs: excessive hook execution with packed refsPatrick Steinhardt, Dec 7, 2021
  2. 1/6 refs: open-code deletion of packed refsPatrick Steinhardt, Dec 7, 2021
  3. 2/6 refs: allow passing flags when beginning transactionsPatrick Steinhardt, Dec 7, 2021
  4. 3/6 refs: allow skipping the reference-transaction hookPatrick Steinhardt, Dec 7, 2021
  5. 4/6 refs: demonstrate excessive execution of the reference-transaction hookPatrick Steinhardt, Dec 7, 2021
  6. 5/6 refs: do not execute reference-transaction hook on packing refsPatrick Steinhardt, Dec 7, 2021
  7. 6/6 refs: skip hooks when deleting uncovered packed refsPatrick Steinhardt, Dec 7, 2021
  8. 0/6 refs: excessive hook execution with packed refsPatrick Steinhardt, Jan 7, 2022
  9. 1/6 refs: open-code deletion of packed refsPatrick Steinhardt, Jan 7, 2022
  10. Junio C HamanoJan 8, 2022
  11. Junio C HamanoJan 8, 2022
  12. Junio C HamanoJan 13, 2022
  13. 2/6 refs: allow passing flags when beginning transactionsPatrick Steinhardt, Jan 7, 2022
  14. Junio C HamanoJan 8, 2022
  15. 3/6 refs: allow skipping the reference-transaction hookPatrick Steinhardt, Jan 7, 2022
  16. 4/6 refs: demonstrate excessive execution of the reference-transaction hookPatrick Steinhardt, Jan 7, 2022
  17. Junio C HamanoJan 8, 2022
  18. Patrick SteinhardtJan 10, 2022
  19. Eric SunshineJan 8, 2022
  20. 6/6 refs: skip hooks when deleting uncovered packed refsPatrick Steinhardt, Jan 7, 2022
  21. Junio C HamanoJan 8, 2022
  22. Patrick SteinhardtJan 10, 2022
  23. Junio C HamanoJan 10, 2022
  24. 5/6 refs: do not execute reference-transaction hook on packing refsPatrick Steinhardt, Jan 7, 2022
  25. Junio C HamanoJan 7, 2022
  26. Han-Wen NienhuysJan 13, 2022
  27. Patrick SteinhardtJan 17, 2022
  28. Han-Wen NienhuysJan 17, 2022
  29. Patrick SteinhardtJan 24, 2022
  30. 0/6 refs: excessive hook execution with packed refsPatrick Steinhardt, Jan 13, 2022
  31. 1/6 refs: extract packed_refs_delete_refs() to allow control of transactionPatrick Steinhardt, Jan 13, 2022
  32. Ævar Arnfjörð BjarmasonJan 13, 2022
  33. Patrick SteinhardtJan 17, 2022
  34. 2/6 refs: allow passing flags when beginning transactionsPatrick Steinhardt, Jan 13, 2022
  35. 3/6 refs: allow skipping the reference-transaction hookPatrick Steinhardt, Jan 13, 2022
  36. Ævar Arnfjörð BjarmasonJan 13, 2022
  37. Patrick SteinhardtJan 17, 2022
  38. 4/6 refs: demonstrate excessive execution of the reference-transaction hookPatrick Steinhardt, Jan 13, 2022
  39. 5/6 refs: do not execute reference-transaction hook on packing refsPatrick Steinhardt, Jan 13, 2022
  40. Ævar Arnfjörð BjarmasonJan 13, 2022
  41. Patrick SteinhardtJan 17, 2022
  42. 6/6 refs: skip hooks when deleting uncovered packed refsPatrick Steinhardt, Jan 13, 2022
  43. Ævar Arnfjörð BjarmasonJan 13, 2022
  44. Patrick SteinhardtJan 17, 2022
  45. 0/6 refs: excessive hook execution with packed refsPatrick Steinhardt, Jan 17, 2022
  46. 1/6 refs: extract packed_refs_delete_refs() to allow control of transactionPatrick Steinhardt, Jan 17, 2022
  47. 2/6 refs: allow passing flags when beginning transactionsPatrick Steinhardt, Jan 17, 2022
  48. 3/6 refs: allow skipping the reference-transaction hookPatrick Steinhardt, Jan 17, 2022
  49. 4/6 refs: demonstrate excessive execution of the reference-transaction hookPatrick Steinhardt, Jan 17, 2022
  50. 5/6 refs: do not execute reference-transaction hook on packing refsPatrick Steinhardt, Jan 17, 2022
  51. 6/6 refs: skip hooks when deleting uncovered packed refsPatrick Steinhardt, Jan 17, 2022

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.