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

[PATCH v3 00/23] Delete directories left empty after ref deletion

From
Michael Haggerty <mhagger@alum.mit.edu>
Date
Dec 31, 2016, 03:12 UTC
Message-ID
<cover.1483153436.git.mhagger@alum.mit.edu>

This is a re-roll of an old patch series. v1 [1] got some feedback, which I think was all addressed in v2 [2]. But it seems that v2 fell on the floor, and I didn't bother following up because it was in the same area of code that was undergoing heavy changes due to the pluggable reference backend work. Sorry for the long delay before getting back to it.

It turns out that this patch series is still relevant and didn't even need all that must adjustment. While rebasing onto the current `master`, I tidied up a bit, tightened up some code, and improved some commit messages. But the spirit of the patch series and most of its code are unchanged.

This patch series is also available from my GitHub account [3] as branch delete-empty-refs-dirs.

Brief summary (see v1 [1] for more details):

Previously, we were pretty sloppy about leaving empty directories behind (under both $GIT_DIR/refs and $GIT_DIR/logs) when deleting references. Such directories could accumulate essentially forever. It's true that `pack-refs` deletes directories that it empties, but if a directory is *already* empty, then `pack-refs` doesn't remove it. It is also true that if an empty directory gets in the way of the creation of a *new* reference, then it is deleted. But otherwise there is no systematic cleanup of empty directories.

A reason for the old behavior was that the code paths *creating* new files in these hierarchies were not always robust against a race with another process that was cleaning up empty directories. So most of this patch series is dedicated to hardening up the creation code paths (via a new function, `raceproof_create_file()`). The last several patches teach `files_transaction_commit()` to delete empty directories when deleting references and reflogs.

Michael

[1] http://public-inbox.org/git/cover.1455626201.git.mhagger@alum.mit.edu/T/#u [2] http://public-inbox.org/git/cover.1456405698.git.mhagger@alum.mit.edu/T/#u [3] http://github.com/mhagger/git

Michael Haggerty (23):
  files_rename_ref(): tidy up whitespace
  t5505: use "for-each-ref" to test for the non-existence of references
  safe_create_leading_directories_const(): preserve errno
  safe_create_leading_directories(): set errno on SCLD_EXISTS
  raceproof_create_file(): new function
  lock_ref_sha1_basic(): inline constant
  lock_ref_sha1_basic(): use raceproof_create_file()
  rename_tmp_log(): use raceproof_create_file()
  rename_tmp_log(): improve error reporting
  log_ref_write(): inline function
  log_ref_setup(): separate code for create vs non-create
  log_ref_setup(): improve robustness against races
  log_ref_setup(): pass the open file descriptor back to the caller
  log_ref_write_1(): don't depend on logfile argument
  log_ref_setup(): manage the name of the reflog file internally
  log_ref_write_1(): inline function
  delete_ref_loose(): derive loose reference path from lock
  delete_ref_loose(): inline function
  try_remove_empty_parents(): rename parameter "name" -> "refname"
  try_remove_empty_parents(): don't trash argument contents
  try_remove_empty_parents(): don't accommodate consecutive slashes
  try_remove_empty_parents(): teach to remove parents of reflogs, too
  files_transaction_commit(): clean up empty directories
 cache.h               |  48 ++++++-
 refs/files-backend.c  | 375 +++++++++++++++++++++++++-------------------------
 refs/refs-internal.h  |  11 +-
 sha1_file.c           |  76 +++++++++-
 t/t1400-update-ref.sh |  27 ++++
 t/t5505-remote.sh     |   2 +-
 6 files changed, 346 insertions(+), 193 deletions(-)
-- 
2.9.3
Next: Michael Haggerty
Message 1 of 55 in “Delete directories left empty after ref deletion”
  1. 00/23 Delete directories left empty after ref deletionMichael Haggerty, Dec 31, 2016
  2. 01/23 files_rename_ref(): tidy up whitespaceMichael Haggerty, Dec 31, 2016
  3. 02/23 t5505: use "for-each-ref" to test for the non-existence of referencesMichael Haggerty, Dec 31, 2016
  4. 03/23 safe_create_leading_directories_const(): preserve errnoMichael Haggerty, Dec 31, 2016
  5. 05/23 raceproof_create_file(): new functionMichael Haggerty, Dec 31, 2016
  6. Jeff KingDec 31, 2016
  7. Michael HaggertyDec 31, 2016
  8. Junio C HamanoJan 1, 2017
  9. 06/23 lock_ref_sha1_basic(): inline constantMichael Haggerty, Dec 31, 2016
  10. 07/23 lock_ref_sha1_basic(): use raceproof_create_file()Michael Haggerty, Dec 31, 2016
  11. 13/23 log_ref_setup(): pass the open file descriptor back to the callerMichael Haggerty, Dec 31, 2016
  12. Jeff KingDec 31, 2016
  13. Michael HaggertyDec 31, 2016
  14. Jeff KingDec 31, 2016
  15. Junio C HamanoJan 1, 2017
  16. 12/23 log_ref_setup(): improve robustness against racesMichael Haggerty, Dec 31, 2016
  17. 11/23 log_ref_setup(): separate code for create vs non-createMichael Haggerty, Dec 31, 2016
  18. Jeff KingDec 31, 2016
  19. Michael HaggertyDec 31, 2016
  20. Junio C HamanoJan 1, 2017
  21. Michael HaggertyJan 1, 2017
  22. 15/23 log_ref_setup(): manage the name of the reflog file internallyMichael Haggerty, Dec 31, 2016
  23. 16/23 log_ref_write_1(): inline functionMichael Haggerty, Dec 31, 2016
  24. 19/23 try_remove_empty_parents(): rename parameter "name" -> "refname"Michael Haggerty, Dec 31, 2016
  25. 20/23 try_remove_empty_parents(): don't trash argument contentsMichael Haggerty, Dec 31, 2016
  26. Jeff KingDec 31, 2016
  27. Michael HaggertyJan 2, 2017
  28. Jeff KingJan 2, 2017
  29. 22/23 try_remove_empty_parents(): teach to remove parents of reflogs, tooMichael Haggerty, Dec 31, 2016
  30. 21/23 try_remove_empty_parents(): don't accommodate consecutive slashesMichael Haggerty, Dec 31, 2016
  31. Junio C HamanoJan 1, 2017
  32. Jeff KingJan 1, 2017
  33. Michael HaggertyJan 2, 2017
  34. Jeff KingJan 2, 2017
  35. 23/23 files_transaction_commit(): clean up empty directoriesMichael Haggerty, Dec 31, 2016
  36. 04/23 safe_create_leading_directories(): set errno on SCLD_EXISTSMichael Haggerty, Dec 31, 2016
  37. 08/23 rename_tmp_log(): use raceproof_create_file()Michael Haggerty, Dec 31, 2016
  38. 14/23 log_ref_write_1(): don't depend on logfile argumentMichael Haggerty, Dec 31, 2016
  39. Jeff KingDec 31, 2016
  40. Michael HaggertyDec 31, 2016
  41. 17/23 delete_ref_loose(): derive loose reference path from lockMichael Haggerty, Dec 31, 2016
  42. 18/23 delete_ref_loose(): inline functionMichael Haggerty, Dec 31, 2016
  43. 09/23 rename_tmp_log(): improve error reportingMichael Haggerty, Dec 31, 2016
  44. 10/23 log_ref_write(): inline functionMichael Haggerty, Dec 31, 2016
  45. Junio C HamanoJan 1, 2017
  46. Michael HaggertyJan 1, 2017
  47. Jeff KingDec 31, 2016
  48. Junio C HamanoJan 1, 2017
  49. Jacob KellerJan 1, 2017
  50. Jacob KellerJan 1, 2017
  51. Philip OakleyJan 1, 2017
  52. Jacob KellerJan 1, 2017
  53. Jeff KingJan 2, 2017
  54. Michael HaggertyJan 2, 2017
  55. Jacob KellerJan 2, 2017

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.