• S
    Limit file descriptors used by packs · c7934306
    Shawn O. Pearce 提交于
    Rather than using 'errno == EMFILE' after a failed open() call
    to indicate the process is out of file descriptors and an LRU
    pack window should be closed, place a hard upper limit on the
    number of open packs based on the actual rlimit of the process.
    
    By using a hard upper limit that is below the rlimit of the current
    process it is not necessary to check for EMFILE on every single
    fd-allocating system call.  Instead reserving 25 file descriptors
    makes it safe to assume the system call won't fail due to being over
    the filedescriptor limit.  Here 25 is chosen as a WAG, but considers
    3 for stdin/stdout/stderr, and at least a few for other Git code
    to operate on temporary files.  An additional 20 is reserved as it
    is not known what the C library needs to perform other services on
    Git's behalf, such as nsswitch or name resolution.
    
    This fixes a case where running `git gc --auto` in a repository
    with more than 1024 packs (but an rlimit of 1024 open fds) fails
    due to the temporary output file not being able to allocate a
    file descriptor.  The output file is opened by pack-objects after
    object enumeration and delta compression are done, both of which
    have already opened all of the packs and fully populated the file
    descriptor table.
    Signed-off-by: NShawn O. Pearce <spearce@spearce.org>
    Signed-off-by: NJunio C Hamano <gitster@pobox.com>
    c7934306
sha1_file.c 65.3 KB