Limit file descriptors used by packs
commitc7934306d1504325d26950f35759ad478772e9c3
authorShawn O. Pearce <spearce@spearce.org>
Mon, 28 Feb 2011 20:52:39 +0000 (28 12:52 -0800)
committerJunio C Hamano <gitster@pobox.com>
Mon, 28 Feb 2011 21:08:31 +0000 (28 13:08 -0800)
treeae320f10ba4391206d3a2aaba7f706569e2ce5ce
parent62270f6b0a4e67e5044fb0d70d0e82ac6e553eb2
Limit file descriptors used by packs

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: Shawn O. Pearce <spearce@spearce.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
sha1_file.c