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

[PATCH 00/22] Lockfile refactoring and pre-activation

From
Michael Haggerty <mhagger@alum.mit.edu>
Date
Apr 1, 2014, 15:58 UTC
Message-ID
<1396367910-7299-1-git-send-email-mhagger@alum.mit.edu>

I've had this patch series kicking around for a long time, along with some followup patches to fix a race in reference deletion. I haven't had the time to get everything done and tested, but let me at least push this first series out there. I especially want to submit it in case we accept a GSoC student for the project "Refactor tempfile handling", because (1) I don't want me and the student to be stepping on each others' toes, and (2) there are some cleanups and documentation improvements here that will hopefully be useful to the student.

The first patch actually demonstrates the race condition that I hope to fix someday. The last patch introduces the lockfile feature that I think is needed to fix it: the ability to activate a packed-refs file while still holding the lock to prevent another process from overwriting it before the accompanying loose reference updates are all finished. But the fix itself is not included here, so you might want to keep the last patch on hold until there is a concrete user of the feature.

The rest of the patches hopefully make the lockfile API more consistent and better documented. There were a lot of situations when a failure in one step of the lock/commit procedure left a lock in an ill-defined state. That's probably not a problem very often in practice, because we tend to die() soon after any locking problems. But it is still helpful for lockfile objects to have a well-defined state diagram (especially if your goal is to add a new feature to them!)

Several patches are also devoted to making lock filename handling use strbufs (for the usual reasons), and reducing the need for callers to reach into the "filename" field and especially for them to use that field as temporary scratch space.

Michael
Michael Haggerty (22):
  t3204: test deleting references when lock files already exist
  try_merge_strategy(): remove redundant lock_file allocation
  rollback_lock_file(): do not clear filename redundantly
  rollback_lock_file(): set fd to -1
  lockfile: unlock file if lockfile permissions cannot be adjusted
  hold_lock_file_for_append(): release lock on errors
  lock_file(): always add lock_file object to lock_file_list
  struct lock_file: replace on_list field with flags field
  api-lockfile: expand the documentation
  lockfile.c: document the various states of lock_file objects
  lockfile: define a constant LOCK_SUFFIX_LEN
  delete_ref_loose(): don't muck around in the lock_file's filename
  config: change write_error() to take a (struct lock_file *) argument
  lockfile: use strbufs when handling (most) paths
  resolve_symlink(): use a strbuf internally
  commit_lock_file(): don't work with a fixed-length buffer
  lock_file(): exit early if lockfile cannot be opened
  lockfile: also keep track of the filename of the file being locked
  struct lock_file: rename lock_filename field to staging_filename
  remove_lock_file(): call rollback_lock_file()
  lockfile: extract a function reset_lock_file()
  lockfile: allow new file contents to be written while retaining lock
 Documentation/technical/api-lockfile.txt |  90 +++++--
 builtin/commit.c                         |  12 +-
 builtin/merge.c                          |   1 -
 builtin/reflog.c                         |   2 +-
 cache.h                                  |   9 +-
 config.c                                 |  11 +-
 lockfile.c                               | 389 +++++++++++++++++++++----------
 refs.c                                   |   8 +-
 shallow.c                                |   6 +-
 t/t3204-branch-locks.sh                  |  40 ++++
 10 files changed, 403 insertions(+), 165 deletions(-)
 create mode 100755 t/t3204-branch-locks.sh
-- 
1.9.0
Next: Michael Haggerty
Message 1 of 62 in “Lockfile refactoring and pre-activation”
  1. 00/22 Lockfile refactoring and pre-activationMichael Haggerty, Apr 1, 2014
  2. 01/22 t3204: test deleting references when lock files already existMichael Haggerty, Apr 1, 2014
  3. Jeff KingApr 1, 2014
  4. Michael HaggertyApr 2, 2014
  5. 02/22 try_merge_strategy(): remove redundant lock_file allocationMichael Haggerty, Apr 1, 2014
  6. Jeff KingApr 1, 2014
  7. Michael HaggertyApr 2, 2014
  8. Junio C HamanoApr 2, 2014
  9. Michael HaggertyApr 3, 2014
  10. 03/22 rollback_lock_file(): do not clear filename redundantlyMichael Haggerty, Apr 1, 2014
  11. 04/22 rollback_lock_file(): set fd to -1Michael Haggerty, Apr 1, 2014
  12. Jeff KingApr 1, 2014
  13. Junio C HamanoApr 2, 2014
  14. Michael HaggertyApr 6, 2014
  15. Junio C HamanoApr 7, 2014
  16. 05/22 lockfile: unlock file if lockfile permissions cannot be adjustedMichael Haggerty, Apr 1, 2014
  17. Jeff KingApr 1, 2014
  18. Jeff KingApr 1, 2014
  19. Torsten BögershausenApr 2, 2014
  20. Michael HaggertyApr 6, 2014
  21. 06/22 hold_lock_file_for_append(): release lock on errorsMichael Haggerty, Apr 1, 2014
  22. 07/22 lock_file(): always add lock_file object to lock_file_listMichael Haggerty, Apr 1, 2014
  23. Jeff KingApr 1, 2014
  24. Junio C HamanoApr 2, 2014
  25. Michael HaggertyApr 6, 2014
  26. Jeff KingApr 7, 2014
  27. 08/22 struct lock_file: replace on_list field with flags fieldMichael Haggerty, Apr 1, 2014
  28. 09/22 api-lockfile: expand the documentationMichael Haggerty, Apr 1, 2014
  29. Jeff KingApr 1, 2014
  30. Michael HaggertyApr 2, 2014
  31. 10/22 lockfile.c: document the various states of lock_file objectsMichael Haggerty, Apr 1, 2014
  32. 11/22 lockfile: define a constant LOCK_SUFFIX_LENMichael Haggerty, Apr 1, 2014
  33. Junio C HamanoApr 2, 2014
  34. 12/22 delete_ref_loose(): don't muck around in the lock_file's filenameMichael Haggerty, Apr 1, 2014
  35. Jeff KingApr 1, 2014
  36. Michael HaggertyApr 2, 2014
  37. Torsten BögershausenApr 2, 2014
  38. Jeff KingApr 2, 2014
  39. 13/22 config: change write_error() to take a (struct lock_file *) argumentMichael Haggerty, Apr 1, 2014
  40. Torsten BögershausenApr 2, 2014
  41. Michael HaggertyApr 6, 2014
  42. Junio C HamanoApr 2, 2014
  43. 14/22 lockfile: use strbufs when handling (most) pathsMichael Haggerty, Apr 1, 2014
  44. Jeff KingApr 1, 2014
  45. Junio C HamanoApr 2, 2014
  46. 15/22 resolve_symlink(): use a strbuf internallyMichael Haggerty, Apr 1, 2014
  47. 16/22 commit_lock_file(): don't work with a fixed-length bufferMichael Haggerty, Apr 1, 2014
  48. 17/22 lock_file(): exit early if lockfile cannot be openedMichael Haggerty, Apr 1, 2014
  49. 18/22 lockfile: also keep track of the filename of the file being lockedMichael Haggerty, Apr 1, 2014
  50. Junio C HamanoApr 2, 2014
  51. Michael HaggertyApr 6, 2014
  52. 19/22 struct lock_file: rename lock_filename field to staging_filenameMichael Haggerty, Apr 1, 2014
  53. 20/22 remove_lock_file(): call rollback_lock_file()Michael Haggerty, Apr 1, 2014
  54. 21/22 lockfile: extract a function reset_lock_file()Michael Haggerty, Apr 1, 2014
  55. Eric SunshineApr 2, 2014
  56. Michael HaggertyApr 2, 2014
  57. 22/22 lockfile: allow new file contents to be written while retaining lockMichael Haggerty, Apr 1, 2014
  58. Jeff KingApr 1, 2014
  59. Eric SunshineApr 2, 2014
  60. Junio C HamanoApr 2, 2014
  61. Jeff KingApr 1, 2014
  62. Michael HaggertyApr 3, 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.