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

Re: [PATCH v6 27/39] try_merge_strategy(): use a statically-allocated lock_file object

From
Junio C Hamano <gitster@pobox.com>
Date
Sep 30, 2014, 18:08 UTC
Message-ID
<xmqqiok5rnf4.fsf@gitster.dls.corp.google.com>
In-Reply-To
<542AB853.5000303@alum.mit.edu>
Michael Haggerty <mhagger@alum.mit.edu> writes:
Show 30 quoted lines
> On 09/26/2014 09:00 PM, Junio C Hamano wrote:
>> Michael Haggerty <mhagger@alum.mit.edu> writes:
>> 
>>> Even the one lockfile object needn't be allocated each time the
>>> function is called.  Instead, define one statically-allocated
>>> lock_file object and reuse it for every call.
>>>
>>> Suggested-by: Jeff King <peff@peff.net>
>>> Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
>>> ---
>>> ...
>>> -	hold_locked_index(lock, 1);
>>> +	hold_locked_index(&lock, 1);
>>>  	refresh_cache(REFRESH_QUIET);
>>>  	if (active_cache_changed &&
>>> -	    write_locked_index(&the_index, lock, COMMIT_LOCK))
>>> +	    write_locked_index(&the_index, &lock, COMMIT_LOCK))
>> 
>> I wondered if the next step would be to lose the "lock" parameter
>> from {hold,write}_locked_index() and have them work on a
>> process-global lock, but that would not work well.
>> 
>> The reason why this patch works is because we are only working with
>> a single destination (i.e. $GIT_INDEX_FILE typically .git/index),
>> right?
>> 
>> Interesting.
>
> Ummm, this patch wasn't supposed to be interesting. If it is then maybe
> I made a mistake...
Well, Interesting is very different from Questionable.

This lock can never have multiple active instances, as you mentioned.

We didn't have to change this for so long since the function was written; that probably is because this sequence:

	lock = hold_lock();
        use(lock);
        commit(lock); /* or rollback(lock) */

is so obviously natural to callers of the API, and commit/rollback looks very much like a declaration that we are done with the object and its resource can be freed.

This change makes sense because the API does not actually allow us to free the resource held to use this lock, so reducing the number of "struct lock_file" ever used during the life of the program makes difference, especially when you use many, even when not many of them you need to hold at the same time.

Which was counter-intuitive to me, and the realization did not hit me until I thought about it, which made it an "Interesting" change.

It may at the same be suggesting that "once in the lockfile subsystem, the resource becomes reclaimable" may be something we would want to fix, though.

Previous: Michael HaggertyNext: Michael Haggerty
Message 40 of 55 in “Lockfile correctness and refactoring”
  1. 00/39 Lockfile correctness and refactoringMichael Haggerty, Sep 26, 2014
  2. 01/39 unable_to_lock_die(): rename function from unable_to_lock_index_die()Michael Haggerty, Sep 26, 2014
  3. 02/39 api-lockfile: revise and expand the documentationMichael Haggerty, Sep 26, 2014
  4. Junio C HamanoSep 26, 2014
  5. Michael HaggertySep 30, 2014
  6. Junio C HamanoSep 30, 2014
  7. Michael HaggertyOct 1, 2014
  8. Junio C HamanoSep 26, 2014
  9. Michael HaggertySep 30, 2014
  10. Jeff KingSep 30, 2014
  11. Junio C HamanoSep 30, 2014
  12. Michael HaggertyOct 1, 2014
  13. 03/39 close_lock_file(): exit (successfully) if file is already closedMichael Haggerty, Sep 26, 2014
  14. 04/39 rollback_lock_file(): do not clear filename redundantlyMichael Haggerty, Sep 26, 2014
  15. 05/39 rollback_lock_file(): exit early if lock is not activeMichael Haggerty, Sep 26, 2014
  16. 06/39 rollback_lock_file(): set fd to -1Michael Haggerty, Sep 26, 2014
  17. 07/39 lockfile: unlock file if lockfile permissions cannot be adjustedMichael Haggerty, Sep 26, 2014
  18. 08/39 hold_lock_file_for_append(): release lock on errorsMichael Haggerty, Sep 26, 2014
  19. 09/39 lock_file(): always initialize and register lock_file objectMichael Haggerty, Sep 26, 2014
  20. 10/39 lockfile.c: document the various states of lock_file objectsMichael Haggerty, Sep 26, 2014
  21. 11/39 cache.h: define constants LOCK_SUFFIX and LOCK_SUFFIX_LENMichael Haggerty, Sep 26, 2014
  22. 12/39 delete_ref_loose(): don't muck around in the lock_file's filenameMichael Haggerty, Sep 26, 2014
  23. 13/39 prepare_index(): declare return value to be (const char *)Michael Haggerty, Sep 26, 2014
  24. 14/39 write_packed_entry_fn(): convert cb_data into a (const int *)Michael Haggerty, Sep 26, 2014
  25. 15/39 lock_file(): exit early if lockfile cannot be openedMichael Haggerty, Sep 26, 2014
  26. 16/39 remove_lock_file(): call rollback_lock_file()Michael Haggerty, Sep 26, 2014
  27. 17/39 commit_lock_file(): inline temporary variableMichael Haggerty, Sep 26, 2014
  28. 18/39 commit_lock_file(): die() if called for unlocked lockfile objectMichael Haggerty, Sep 26, 2014
  29. 19/39 close_lock_file(): if close fails, roll backMichael Haggerty, Sep 26, 2014
  30. 20/39 commit_lock_file(): rollback lock file on failure to renameMichael Haggerty, Sep 26, 2014
  31. 21/39 api-lockfile: document edge casesMichael Haggerty, Sep 26, 2014
  32. 22/39 dump_marks(): remove a redundant call to rollback_lock_file()Michael Haggerty, Sep 26, 2014
  33. 23/39 git_config_set_multivar_in_file(): avoid call to rollback_lock_file()Michael Haggerty, Sep 26, 2014
  34. 24/39 lockfile: avoid transitory invalid statesMichael Haggerty, Sep 26, 2014
  35. 25/39 struct lock_file: declare some fields volatileMichael Haggerty, Sep 26, 2014
  36. 26/39 try_merge_strategy(): remove redundant lock_file allocationMichael Haggerty, Sep 26, 2014
  37. 27/39 try_merge_strategy(): use a statically-allocated lock_file objectMichael Haggerty, Sep 26, 2014
  38. Junio C HamanoSep 26, 2014
  39. Michael HaggertySep 30, 2014
  40. Junio C HamanoSep 30, 2014
  41. 28/39 commit_lock_file(): use a strbuf to manage temporary spaceMichael Haggerty, Sep 26, 2014
  42. 29/39 Change lock_file::filename into a strbufMichael Haggerty, Sep 26, 2014
  43. 30/39 resolve_symlink(): use a strbuf for internal scratch spaceMichael Haggerty, Sep 26, 2014
  44. 31/39 resolve_symlink(): take a strbuf parameterMichael Haggerty, Sep 26, 2014
  45. 32/39 trim_last_path_component(): replace last_path_elm()Michael Haggerty, Sep 26, 2014
  46. 33/39 Extract a function commit_lock_file_to()Michael Haggerty, Sep 26, 2014
  47. 34/39 Rename LOCK_NODEREF to LOCK_NO_DEREFMichael Haggerty, Sep 26, 2014
  48. 35/39 lockfile.c: rename static functionsMichael Haggerty, Sep 26, 2014
  49. 36/39 get_locked_file_path(): new functionMichael Haggerty, Sep 26, 2014
  50. 37/39 hold_lock_file_for_append(): restore errno before returningMichael Haggerty, Sep 26, 2014
  51. 38/39 Move read_index() definition to read-cache.cMichael Haggerty, Sep 26, 2014
  52. 39/39 lockfile.h: extract new header file for the functions in lockfile.cMichael Haggerty, Sep 26, 2014
  53. Junio C HamanoSep 26, 2014
  54. Michael HaggertySep 30, 2014
  55. Junio C HamanoSep 26, 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.