Loading changes/descriptor_limit 0 → 100644 +2 −0 Original line number Diff line number Diff line o Code simplification and refactoring: - Remove duplicate code for invoking getrlimit() from control.c. src/common/compat.c +13 −4 Original line number Diff line number Diff line Loading @@ -1258,13 +1258,16 @@ tor_socketpair(int family, int type, int protocol, tor_socket_t fd[2]) * tell Tor it's allowed to use. */ #define ULIMIT_BUFFER 32 /* keep 32 extra fd's beyond _ConnLimit */ /** Learn the maximum allowed number of file descriptors. (Some systems * have a low soft limit. /** Learn the maximum allowed number of file descriptors, and tell the system * we want to use up to that number. (Some systems have a low soft limit, and * let us set it higher.) * * We compute this by finding the largest number that we can use. * If we can't find a number greater than or equal to <b>limit</b>, * then we fail: return -1. * * If <b>limit</b> is 0, then do not adjust the current maximum. * * Otherwise, return 0 and store the maximum we found inside <b>max_out</b>.*/ int set_max_file_descriptors(rlim_t limit, int *max_out) Loading Loading @@ -1297,14 +1300,20 @@ set_max_file_descriptors(rlim_t limit, int *max_out) limit = MAX_CONNECTIONS; #else /* HAVE_GETRLIMIT */ struct rlimit rlim; tor_assert(limit > 0); if (getrlimit(RLIMIT_NOFILE, &rlim) != 0) { log_warn(LD_NET, "Could not get maximum number of file descriptors: %s", strerror(errno)); return -1; } if (limit == 0) { /* If limit == 0, return the maximum value without setting it. */ limit = rlim.rlim_max; if (limit > INT_MAX) limit = INT_MAX; *max_out = limit - ULIMIT_BUFFER; return 0; } if (rlim.rlim_max < limit) { log_warn(LD_CONFIG,"We need %lu file descriptors available, and we're " "limited to %lu. Please change your ulimit -n.", Loading src/or/control.c +3 −20 Original line number Diff line number Diff line Loading @@ -1466,26 +1466,9 @@ getinfo_helper_misc(control_connection_t *conn, const char *question, } #endif } else if (!strcmp(question, "process/descriptor-limit")) { /** platform specifc limits are from the set_max_file_descriptors function * of src/common/compat.c */ /* XXXX023 This is duplicated code from compat.c; it should turn into a * function. */ #ifdef HAVE_GETRLIMIT struct rlimit descriptorLimit; if (getrlimit(RLIMIT_NOFILE, &descriptorLimit) == 0) { tor_asprintf(answer, U64_FORMAT, U64_PRINTF_ARG(descriptorLimit.rlim_max)); } else { *answer = tor_strdup("-1"); } #elif defined(CYGWIN) || defined(__CYGWIN__) *answer = tor_strdup("3200"); #elif defined(_WIN32) *answer = tor_strdup("15000"); #else *answer = tor_strdup("15000"); #endif int max_fds=-1; set_max_file_descriptors(0, &max_fds); tor_asprintf(answer, "%d", max_fds); } else if (!strcmp(question, "dir-usage")) { *answer = directory_dump_request_log(); } else if (!strcmp(question, "fingerprint")) { Loading Loading
changes/descriptor_limit 0 → 100644 +2 −0 Original line number Diff line number Diff line o Code simplification and refactoring: - Remove duplicate code for invoking getrlimit() from control.c.
src/common/compat.c +13 −4 Original line number Diff line number Diff line Loading @@ -1258,13 +1258,16 @@ tor_socketpair(int family, int type, int protocol, tor_socket_t fd[2]) * tell Tor it's allowed to use. */ #define ULIMIT_BUFFER 32 /* keep 32 extra fd's beyond _ConnLimit */ /** Learn the maximum allowed number of file descriptors. (Some systems * have a low soft limit. /** Learn the maximum allowed number of file descriptors, and tell the system * we want to use up to that number. (Some systems have a low soft limit, and * let us set it higher.) * * We compute this by finding the largest number that we can use. * If we can't find a number greater than or equal to <b>limit</b>, * then we fail: return -1. * * If <b>limit</b> is 0, then do not adjust the current maximum. * * Otherwise, return 0 and store the maximum we found inside <b>max_out</b>.*/ int set_max_file_descriptors(rlim_t limit, int *max_out) Loading Loading @@ -1297,14 +1300,20 @@ set_max_file_descriptors(rlim_t limit, int *max_out) limit = MAX_CONNECTIONS; #else /* HAVE_GETRLIMIT */ struct rlimit rlim; tor_assert(limit > 0); if (getrlimit(RLIMIT_NOFILE, &rlim) != 0) { log_warn(LD_NET, "Could not get maximum number of file descriptors: %s", strerror(errno)); return -1; } if (limit == 0) { /* If limit == 0, return the maximum value without setting it. */ limit = rlim.rlim_max; if (limit > INT_MAX) limit = INT_MAX; *max_out = limit - ULIMIT_BUFFER; return 0; } if (rlim.rlim_max < limit) { log_warn(LD_CONFIG,"We need %lu file descriptors available, and we're " "limited to %lu. Please change your ulimit -n.", Loading
src/or/control.c +3 −20 Original line number Diff line number Diff line Loading @@ -1466,26 +1466,9 @@ getinfo_helper_misc(control_connection_t *conn, const char *question, } #endif } else if (!strcmp(question, "process/descriptor-limit")) { /** platform specifc limits are from the set_max_file_descriptors function * of src/common/compat.c */ /* XXXX023 This is duplicated code from compat.c; it should turn into a * function. */ #ifdef HAVE_GETRLIMIT struct rlimit descriptorLimit; if (getrlimit(RLIMIT_NOFILE, &descriptorLimit) == 0) { tor_asprintf(answer, U64_FORMAT, U64_PRINTF_ARG(descriptorLimit.rlim_max)); } else { *answer = tor_strdup("-1"); } #elif defined(CYGWIN) || defined(__CYGWIN__) *answer = tor_strdup("3200"); #elif defined(_WIN32) *answer = tor_strdup("15000"); #else *answer = tor_strdup("15000"); #endif int max_fds=-1; set_max_file_descriptors(0, &max_fds); tor_asprintf(answer, "%d", max_fds); } else if (!strcmp(question, "dir-usage")) { *answer = directory_dump_request_log(); } else if (!strcmp(question, "fingerprint")) { Loading