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:
Junio C Hamano 2014-01-10 10:32:28 -08:00
commit c4bccea2d5

View File

@ -807,15 +807,38 @@ void free_pack_by_name(const char *pack_name)
static unsigned int get_max_fd_limit(void) static unsigned int get_max_fd_limit(void)
{ {
#ifdef RLIMIT_NOFILE #ifdef RLIMIT_NOFILE
{
struct rlimit lim; struct rlimit lim;
if (getrlimit(RLIMIT_NOFILE, &lim)) if (!getrlimit(RLIMIT_NOFILE, &lim))
die_errno("cannot get RLIMIT_NOFILE");
return lim.rlim_cur; return lim.rlim_cur;
#elif defined(_SC_OPEN_MAX) }
return sysconf(_SC_OPEN_MAX); #endif
#elif defined(OPEN_MAX)
#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; return OPEN_MAX;
#else #else
return 1; /* see the caller ;-) */ return 1; /* see the caller ;-) */