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

Re: [PATCH 0/3] Another approach to large transactions

From
Michael Haggerty <mhagger@alum.mit.edu>
Date
Apr 21, 2015, 12:37 UTC
Message-ID
<55364481.3020700@alum.mit.edu>
In-Reply-To
<xmqqzj62ifc9.fsf@gitster.dls.corp.google.com>
On 04/21/2015 12:51 AM, Junio C Hamano wrote:
Show 37 quoted lines
> Stefan Beller <sbeller@google.com> writes:
> 
>> The problem comes from guessing the number of fds we're allowed to use.
>> At first I thought it was a fundamental issue with the code being broken, but
>> it turns out we just need a larger offset as we apparently have 9 files open
>> already, before the transaction even starts.
>> I did not expect the number to be that high, which is why I came up with the
>> arbitrary number of 8 (3 for stdin/out/err, maybe packed refs and reflog so I
>> guessed, 8 would do fine).
>>
>> I am not sure if the 9 is a constant or if it scales to some unknown
>> property yet.
>> So to make the series work, all we need is:
>>
>> - int remaining_fds = get_max_fd_limit() - 8;
>> + int remaining_fds = get_max_fd_limit() - 9;
>>
>> I am going to try to understand where the 9 comes from and resend the patches.
> 
> I have a suspicion that the above is an indication that the approach
> is fundamentally not sound.  9 may be OK in your test repository,
> but that may fail in a repository with different resource usage
> patterns.
> 
> On the core management side, xmalloc() and friends retry upon
> failure, after attempting to free the resource.  I wonder if your
> codepath can do something similar to that, perhaps?
> 
> On the other hand, it may be that this "let's keep it open as long
> as possible, as creat-close-open-write-close is more expensive" may
> not be worth the complexity.  I wonder if it might not be a bad idea
> to start with a simpler rule, e.g. "use creat-write-close for ref
> updates outside transactions, and creat-close-open-write-close for
> inside transactions, as that is likely to be multi-ref updates" or
> something stupid and simple like that?
> 
> Michael?

Given that the release is so close, I think we should use the simplest thing that could work, which I think is Stefan's original N*(creat-close),N*(open-write-close),N*rename patch. I don't think there are many code paths that might build up a big transaction anyway (I guess only "git update-ref --stdin" and "git push --atomic"?) Neither of these has been around very long, so I don't think the small performance hit will bother anybody.

The correct solution is clearly N*(creat-write-close),N*rename, but that is too complicated for this release. So let's get the bug fixed for the release and try to get the better fix in the next release.

It would be possible to optimize the N=1 case (I guess it's by far the most common case) really stupidly using something like

        if (n > 1)
                close_lock_file(update->lock->lk);
but I doubt even that's worth it.
Michael
-- 
Michael Haggerty
mhagger@alum.mit.edu
Previous: Stefan Beller
Message 28 of 28 in “Another approach to large transactions”
  1. 0/3 Another approach to large transactionsStefan Beller, Apr 16, 2015
  2. 1/3 refs.c: remove lock_fd from struct ref_lockStefan Beller, Apr 16, 2015
  3. 2/3 Move get_max_fd_limit(void) to git_compat_util.hStefan Beller, Apr 16, 2015
  4. 3/3 refs.c: enable large transactionsStefan Beller, Apr 16, 2015
  5. Junio C HamanoApr 17, 2015
  6. Junio C HamanoApr 17, 2015
  7. Stefan BellerApr 17, 2015
  8. Stefan BellerApr 17, 2015
  9. Stefan BellerApr 20, 2015
  10. Junio C HamanoApr 20, 2015
  11. Stefan BellerApr 20, 2015
  12. Stefan BellerApr 21, 2015
  13. refs.c: enable large transactionsStefan Beller, Apr 21, 2015
  14. Junio C HamanoApr 21, 2015
  15. Stefan BellerApr 21, 2015
  16. Junio C HamanoApr 21, 2015
  17. [PATCHv2] refs.c: enable large transactionsStefan Beller, Apr 21, 2015
  18. Stefan BellerApr 21, 2015
  19. Michael HaggertyApr 22, 2015
  20. Stefan BellerApr 22, 2015
  21. Michael HaggertyApr 22, 2015
  22. Junio C HamanoApr 21, 2015
  23. Jeff KingApr 21, 2015
  24. Stefan BellerApr 22, 2015
  25. Jeff KingApr 22, 2015
  26. Junio C HamanoApr 21, 2015
  27. Stefan BellerApr 21, 2015
  28. Michael HaggertyApr 21, 2015

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.