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)
|
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 ;-) */
|
||||||
|
Loading…
Reference in New Issue
Block a user