All of lore.kernel.org
 help / color / mirror / Atom feed
From: Michael Haggerty <mhagger@alum.mit.edu>
To: Junio C Hamano <gitster@pobox.com>, Stefan Beller <sbeller@google.com>
Cc: "git@vger.kernel.org" <git@vger.kernel.org>
Subject: Re: [PATCH 0/3] Another approach to large transactions
Date: Tue, 21 Apr 2015 14:37:21 +0200	[thread overview]
Message-ID: <55364481.3020700@alum.mit.edu> (raw)
In-Reply-To: <xmqqzj62ifc9.fsf@gitster.dls.corp.google.com>

On 04/21/2015 12:51 AM, Junio C Hamano 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.
> 
> 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

      parent reply	other threads:[~2015-04-21 12:37 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-04-16 23:17 [PATCH 0/3] Another approach to large transactions Stefan Beller
2015-04-16 23:17 ` [PATCH 1/3] refs.c: remove lock_fd from struct ref_lock Stefan Beller
2015-04-16 23:17 ` [PATCH 2/3] Move get_max_fd_limit(void) to git_compat_util.h Stefan Beller
2015-04-16 23:17 ` [PATCH 3/3] refs.c: enable large transactions Stefan Beller
2015-04-17 17:09 ` [PATCH 0/3] Another approach to " Junio C Hamano
2015-04-17 22:12   ` Junio C Hamano
2015-04-17 22:17     ` Stefan Beller
2015-04-17 23:31       ` Stefan Beller
2015-04-20 22:26         ` Stefan Beller
2015-04-20 22:51           ` Junio C Hamano
2015-04-20 23:07             ` Stefan Beller
2015-04-21  0:31               ` Stefan Beller
2015-04-21  0:35                 ` [PATCH] refs.c: enable " Stefan Beller
2015-04-21 17:16                   ` Junio C Hamano
2015-04-21 17:24                     ` Stefan Beller
2015-04-21 18:00                       ` Junio C Hamano
2015-04-21 19:06                         ` [PATCHv2] " Stefan Beller
2015-04-21 19:56                           ` Stefan Beller
2015-04-22 14:11                           ` Michael Haggerty
2015-04-22 19:09                             ` Stefan Beller
2015-04-22 20:12                               ` Michael Haggerty
2015-04-21 17:22                   ` [PATCH] " Junio C Hamano
2015-04-21 23:21                 ` [PATCH 0/3] Another approach to " Jeff King
2015-04-22 19:14                   ` Stefan Beller
2015-04-22 20:11                     ` Jeff King
2015-04-21 17:19               ` Junio C Hamano
2015-04-21 17:31                 ` Stefan Beller
2015-04-21 12:37             ` Michael Haggerty [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=55364481.3020700@alum.mit.edu \
    --to=mhagger@alum.mit.edu \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=sbeller@google.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.