prlimit sets rlimits to currently running process and it children, but its linux specific. Does this ok for sheepdog? I don't want setrlimit because it sets values to global space.
2015-03-16 19:30 GMT+03:00 Vasiliy Tolstov <[email protected]>: > Signed-off-by: Vasiliy Tolstov <[email protected]> > --- > sheep/sheep.c | 63 > +++++++++++++++++++++++++++++++++++++++-------------------- > 1 file changed, 42 insertions(+), 21 deletions(-) > > diff --git a/sheep/sheep.c b/sheep/sheep.c > index a1028a2..13cc927 100644 > --- a/sheep/sheep.c > +++ b/sheep/sheep.c > @@ -561,26 +561,47 @@ static int create_work_queues(void) > > static void check_host_env(void) > { > - struct rlimit r; > + struct rlimit new; > + struct rlimit old; > + int ret; > + int fd; > + int len; > + char *buf = NULL; > + pid_t pid; > + > + pid = getpid(); > + > + new.rlim_cur = SD_RLIM_NOFILE; > + new.rlim_max = SD_RLIM_NOFILE; > + > + ret = prlimit(pid, RLIMIT_NOFILE, NULL, &old); > + if (old.rlim_cur < new.rlim_cur) { > + sd_info("Allowed open files %lu, suggested %lu", old.rlim_cur, > new.rlim_cur); > + > + len = asprintf(&buf, "%lu", new.rlim_max); > + if (len > 0) { > + fd = open("/proc/sys/fs/nr_open", O_WRONLY); > + if (fd > 0) { > + ret = xwrite(fd, buf, len); > + if (ret > 0) { > + if (prlimit(pid, RLIMIT_NOFILE, &new, NULL) != 0) { > + sd_warn("Failed to set open files limit to suggested %lu", > + new.rlim_cur); > + } else { > + sd_info("Allowed open files set to suggested %lu", new.rlim_cur); > + } > + } > + close(fd); > + } > + free(buf); > + } > + } > > - if (getrlimit(RLIMIT_NOFILE, &r) < 0) > - sd_err("failed to get nofile %m"); > - /* > - * 1024 is default for NOFILE on most distributions, which is very > - * dangerous to run Sheepdog cluster. > - */ > - else if (r.rlim_cur == 1024) > - sd_warn("Allowed open files 1024 too small, suggested %u", > - SD_RLIM_NOFILE); > - else if (r.rlim_cur < SD_RLIM_NOFILE) > - sd_info("Allowed open files %lu, suggested %u", r.rlim_cur, > - SD_RLIM_NOFILE); > - > - if (getrlimit(RLIMIT_CORE, &r) < 0) > + if (getrlimit(RLIMIT_CORE, &old) < 0) > sd_debug("failed to get core %m"); > - else if (r.rlim_cur < RLIM_INFINITY) > + else if (old.rlim_cur < RLIM_INFINITY) > sd_debug("Allowed core file size %lu, suggested unlimited", > - r.rlim_cur); > + old.rlim_cur); > > /* > * Disable glibc's dynamic mmap threshold and set it as 512k. > -- > 2.2.2 > -- Vasiliy Tolstov, e-mail: [email protected] jabber: [email protected] -- sheepdog mailing list [email protected] https://lists.wpkg.org/mailman/listinfo/sheepdog
