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

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

From
Stefan Beller <sbeller@google.com>
Date
Apr 21, 2015, 00:31 UTC
Message-ID
<CAGZ79kY842JXB37++nwYjkX1WK9ja5m-G1aDj=QgLN-qKLo9Lg@mail.gmail.com>
In-Reply-To
<CAGZ79kYk_3E1RMdNvA_OrCj6EdaJ2Xdps9pUxEkWwvDNazb6Gg@mail.gmail.com>
On Mon, Apr 20, 2015 at 4:07 PM, Stefan Beller <sbeller@google.com> wrote:
Show 53 quoted lines
> On Mon, Apr 20, 2015 at 3:51 PM, Junio C Hamano <gitster@pobox.com> wrote:
>> 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.
>
> You put my concerns in a better wording.
>
>>
>> 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?
>
> But then we'd need to think about which fds can be 'garbage collected'.
> The lock files certainly can be closed and reopened. The first 3 fd not so.
> So we'd need to maintain a data structure of file descriptors good/bad
> for this reclaiming.
>
>>
>> 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?
>
> I thought about any ref about goes through transaction nowadays.
> Having the current patches the first n locks are creat-write-close,
> while the remaining locks have the  creat-close-open-write-close
> pattern, so it slows only the large transactions.
>
> My plan is to strace all open calls and check if the aforementioned
> 9 open files are just a constant.

When running the test locally, i.e. not in the test suite, but typing the commands myself into the shell, Git is fine with having just 5 file descriptors left. The additional 4 required fds come from beign run inside the test suite.

When strace-ing git, I cannot see any possible other fds which would require having some left over space required. So I'd propose we'd just take a reasonable number not too small for various test setups like 32 and then go with the proposed patches.

I'll just resend the patches to have a new basis for discussion.
Show 5 quoted lines
>
>>
>> Michael?
>>
>>
Previous: Stefan BellerNext: Stefan Beller
Message 12 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.