Revision c7934306d1504325d26950f35759ad478772e9c3 authored by Shawn O. Pearce on 28 February 2011, 20:52:39 UTC, committed by Junio C Hamano on 28 February 2011, 21:08:31 UTC
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>
1 parent 62270f6
File | Mode | Size |
---|---|---|
.gitignore | -rw-r--r-- | 17 bytes |
analyze.sh | -rwxr-xr-x | 2.4 KB |
default.supp | -rw-r--r-- | 509 bytes |
valgrind.sh | -rwxr-xr-x | 594 bytes |
![swh spinner](/static/img/swh-spinner.gif)
Computing file changes ...