Merge branch 'jh/rlimit-nofile-fallback'
When we figure out how many file descriptors to allocate for keeping packfiles open, a system with non-working getrlimit() could cause us to die(), but because we make this call only to get a rough estimate of how many is available and we do not even attempt to use up all file descriptors available ourselves, it is nicer to fall back to a reasonable low value rather than dying. * jh/rlimit-nofile-fallback: get_max_fd_limit(): fall back to OPEN_MAX upon getrlimit/sysconf failure
This commit is contained in:
commit
c4bccea2d5
35
sha1_file.c
35
sha1_file.c
@ -807,15 +807,38 @@ void free_pack_by_name(const char *pack_name)
|
||||
static unsigned int get_max_fd_limit(void)
|
||||
{
|
||||
#ifdef RLIMIT_NOFILE
|
||||
{
|
||||
struct rlimit lim;
|
||||
|
||||
if (getrlimit(RLIMIT_NOFILE, &lim))
|
||||
die_errno("cannot get RLIMIT_NOFILE");
|
||||
|
||||
if (!getrlimit(RLIMIT_NOFILE, &lim))
|
||||
return lim.rlim_cur;
|
||||
#elif defined(_SC_OPEN_MAX)
|
||||
return sysconf(_SC_OPEN_MAX);
|
||||
#elif defined(OPEN_MAX)
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef _SC_OPEN_MAX
|
||||
{
|
||||
long open_max = sysconf(_SC_OPEN_MAX);
|
||||
if (0 < open_max)
|
||||
return open_max;
|
||||
/*
|
||||
* Otherwise, we got -1 for one of the two
|
||||
* reasons:
|
||||
*
|
||||
* (1) sysconf() did not understand _SC_OPEN_MAX
|
||||
* and signaled an error with -1; or
|
||||
* (2) sysconf() said there is no limit.
|
||||
*
|
||||
* We _could_ clear errno before calling sysconf() to
|
||||
* tell these two cases apart and return a huge number
|
||||
* in the latter case to let the caller cap it to a
|
||||
* value that is not so selfish, but letting the
|
||||
* fallback OPEN_MAX codepath take care of these cases
|
||||
* is a lot simpler.
|
||||
*/
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef OPEN_MAX
|
||||
return OPEN_MAX;
|
||||
#else
|
||||
return 1; /* see the caller ;-) */
|
||||
|
Loading…
Reference in New Issue
Block a user