REORG: fd: move raise_rlim_nofile to limits

Let's move raise_rlim_nofile() from 'fd' compilation unit to 'limits', as it
wraps setrlimit to change process RLIMIT_NOFILE.
This commit is contained in:
Valentine Krasnobaeva 2024-07-10 12:33:39 +02:00 committed by Willy Tarreau
parent 1517bcb5e3
commit 3759674047
4 changed files with 31 additions and 27 deletions

View File

@ -82,7 +82,6 @@ ssize_t fd_write_frag_line(int fd, size_t maxlen, const struct ist pfx[], size_t
void my_closefrom(int start);
struct rlimit;
int raise_rlim_nofile(struct rlimit *old_limit, struct rlimit *new_limit);
int compute_poll_timeout(int next);
void fd_leaving_poll(int wait_time, int status);

View File

@ -9,4 +9,9 @@
#define _HAPROXY_LIMITS_H
#include <sys/resource.h>
/* handlers to manipulate system resources limits granted by OS to process and
* to tie them up with the internal process limits
*/
int raise_rlim_nofile(struct rlimit *old_limit, struct rlimit *new_limit);
#endif /* _HAPROXY_LIMITS_H */

View File

@ -1019,32 +1019,6 @@ void my_closefrom(int start)
}
#endif // defined(USE_POLL)
/* Sets the RLIMIT_NOFILE setting to <new_limit> and returns the previous one
* in <old_limit> if the pointer is not NULL, even if set_rlimit() fails. The
* two pointers may point to the same variable as the copy happens after
* setting the new value. The value is only changed if at least one of the new
* limits is strictly higher than the current one, otherwise returns 0 without
* changing anything. The getrlimit() or setrlimit() syscall return value is
* returned and errno is preserved.
*/
int raise_rlim_nofile(struct rlimit *old_limit, struct rlimit *new_limit)
{
struct rlimit limit = { };
int ret = 0;
ret = getrlimit(RLIMIT_NOFILE, &limit);
if (ret == 0 &&
(limit.rlim_max < new_limit->rlim_max ||
limit.rlim_cur < new_limit->rlim_cur)) {
ret = setrlimit(RLIMIT_NOFILE, new_limit);
}
if (old_limit)
*old_limit = limit;
return ret;
}
/* Computes the bounded poll() timeout based on the next expiration timer <next>
* by bounding it to MAX_DELAY_MS. <next> may equal TICK_ETERNITY. The pollers

View File

@ -11,3 +11,29 @@
#include <haproxy/proxy.h>
/* Sets the RLIMIT_NOFILE setting to <new_limit> and returns the previous one
* in <old_limit> if the pointer is not NULL, even if set_rlimit() fails. The
* two pointers may point to the same variable as the copy happens after
* setting the new value. The value is only changed if at least one of the new
* limits is strictly higher than the current one, otherwise returns 0 without
* changing anything. The getrlimit() or setrlimit() syscall return value is
* returned and errno is preserved.
*/
int raise_rlim_nofile(struct rlimit *old_limit, struct rlimit *new_limit)
{
struct rlimit limit = { };
int ret = 0;
ret = getrlimit(RLIMIT_NOFILE, &limit);
if (ret == 0 &&
(limit.rlim_max < new_limit->rlim_max ||
limit.rlim_cur < new_limit->rlim_cur)) {
ret = setrlimit(RLIMIT_NOFILE, new_limit);
}
if (old_limit)
*old_limit = limit;
return ret;
}