mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-09-01 23:25:38 +00:00
2386. [bug] Add warning about too small 'open files' limit
[RT #18269].
This commit is contained in:
3
CHANGES
3
CHANGES
@@ -1,3 +1,6 @@
|
|||||||
|
2386. [bug] Add warning about too small 'open files' limit
|
||||||
|
[RT #18269].
|
||||||
|
|
||||||
2385. [bug] A condition variable in socket.c could leak in
|
2385. [bug] A condition variable in socket.c could leak in
|
||||||
rare error handling [RT #17968].
|
rare error handling [RT #17968].
|
||||||
|
|
||||||
|
@@ -15,7 +15,7 @@
|
|||||||
* PERFORMANCE OF THIS SOFTWARE.
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* $Id: server.c,v 1.510 2008/06/23 23:15:59 jinmei Exp $ */
|
/* $Id: server.c,v 1.511 2008/07/11 23:05:45 jinmei Exp $ */
|
||||||
|
|
||||||
/*! \file */
|
/*! \file */
|
||||||
|
|
||||||
@@ -2905,6 +2905,7 @@ load_configuration(const char *filename, ns_server_t *server,
|
|||||||
in_port_t listen_port, udpport_low, udpport_high;
|
in_port_t listen_port, udpport_low, udpport_high;
|
||||||
isc_portset_t *v4portset = NULL;
|
isc_portset_t *v4portset = NULL;
|
||||||
isc_portset_t *v6portset = NULL;
|
isc_portset_t *v6portset = NULL;
|
||||||
|
isc_resourcevalue_t nfiles;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
cfg_aclconfctx_init(&aclconfctx);
|
cfg_aclconfctx_init(&aclconfctx);
|
||||||
@@ -2994,6 +2995,28 @@ load_configuration(const char *filename, ns_server_t *server,
|
|||||||
*/
|
*/
|
||||||
set_limits(maps);
|
set_limits(maps);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check if max number of open sockets that the system allows is
|
||||||
|
* sufficiently large. Failing this condition is not necessarily fatal,
|
||||||
|
* but may cause subsequent runtime failures for a busy recursive
|
||||||
|
* server.
|
||||||
|
*/
|
||||||
|
result = isc_resource_getcurlimit(isc_resource_openfiles, &nfiles);
|
||||||
|
if (result == ISC_R_SUCCESS) {
|
||||||
|
unsigned int maxsocks;
|
||||||
|
|
||||||
|
result = isc_socketmgr_getmaxsockets(ns_g_socketmgr, &maxsocks);
|
||||||
|
if (result == ISC_R_SUCCESS &&
|
||||||
|
((isc_resourcevalue_t)maxsocks > nfiles) {
|
||||||
|
isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
|
||||||
|
NS_LOGMODULE_SERVER, ISC_LOG_WARNING,
|
||||||
|
"max open files "
|
||||||
|
"(%" ISC_PRINT_QUADFORMAT "u)"
|
||||||
|
" is smaller than max sockets (%u)",
|
||||||
|
nfiles, maxsocks);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Configure various server options.
|
* Configure various server options.
|
||||||
*/
|
*/
|
||||||
|
@@ -15,7 +15,7 @@
|
|||||||
* PERFORMANCE OF THIS SOFTWARE.
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* $Id: resource.h,v 1.11 2007/06/19 23:47:18 tbox Exp $ */
|
/* $Id: resource.h,v 1.12 2008/07/11 23:05:46 jinmei Exp $ */
|
||||||
|
|
||||||
#ifndef ISC_RESOURCE_H
|
#ifndef ISC_RESOURCE_H
|
||||||
#define ISC_RESOURCE_H 1
|
#define ISC_RESOURCE_H 1
|
||||||
@@ -81,6 +81,16 @@ isc_resource_getlimit(isc_resource_t resource, isc_resourcevalue_t *value);
|
|||||||
*\li #ISC_R_NOTIMPLEMENTED 'resource' is not a type known by the OS.
|
*\li #ISC_R_NOTIMPLEMENTED 'resource' is not a type known by the OS.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
isc_result_t
|
||||||
|
isc_resource_getcurlimit(isc_resource_t resource, isc_resourcevalue_t *value);
|
||||||
|
/*%<
|
||||||
|
* Same as isc_resource_getlimit(), but returns the current (soft) limit.
|
||||||
|
*
|
||||||
|
* Returns:
|
||||||
|
*\li #ISC_R_SUCCESS Success.
|
||||||
|
*\li #ISC_R_NOTIMPLEMENTED 'resource' is not a type known by the OS.
|
||||||
|
*/
|
||||||
|
|
||||||
ISC_LANG_ENDDECLS
|
ISC_LANG_ENDDECLS
|
||||||
|
|
||||||
#endif /* ISC_RESOURCE_H */
|
#endif /* ISC_RESOURCE_H */
|
||||||
|
@@ -15,7 +15,7 @@
|
|||||||
* PERFORMANCE OF THIS SOFTWARE.
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* $Id: socket.h,v 1.77 2008/07/03 00:13:25 each Exp $ */
|
/* $Id: socket.h,v 1.78 2008/07/11 23:05:46 jinmei Exp $ */
|
||||||
|
|
||||||
#ifndef ISC_SOCKET_H
|
#ifndef ISC_SOCKET_H
|
||||||
#define ISC_SOCKET_H 1
|
#define ISC_SOCKET_H 1
|
||||||
@@ -755,6 +755,22 @@ isc_socketmgr_create(isc_mem_t *mctx, isc_socketmgr_t **managerp);
|
|||||||
*\li #ISC_R_UNEXPECTED
|
*\li #ISC_R_UNEXPECTED
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
isc_result_t
|
||||||
|
isc_socketmgr_getmaxsockets(isc_socketmgr_t *manager, unsigned int *nsockp);
|
||||||
|
/*%<
|
||||||
|
* Returns in "*nsockp" the maximum number of sockets this manager may open.
|
||||||
|
*
|
||||||
|
* Requires:
|
||||||
|
*
|
||||||
|
*\li '*manager' is a valid isc_socketmgr_t.
|
||||||
|
*\li 'nsockp' is not NULL.
|
||||||
|
*
|
||||||
|
* Returns:
|
||||||
|
*
|
||||||
|
*\li #ISC_R_SUCCESS
|
||||||
|
*\li #ISC_R_NOTIMPLEMENTED
|
||||||
|
*/
|
||||||
|
|
||||||
void
|
void
|
||||||
isc_socketmgr_destroy(isc_socketmgr_t **managerp);
|
isc_socketmgr_destroy(isc_socketmgr_t **managerp);
|
||||||
/*%<
|
/*%<
|
||||||
|
@@ -15,7 +15,7 @@
|
|||||||
* PERFORMANCE OF THIS SOFTWARE.
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* $Id: resource.c,v 1.17 2008/01/25 23:50:38 jinmei Exp $ */
|
/* $Id: resource.c,v 1.18 2008/07/11 23:05:46 jinmei Exp $ */
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
||||||
@@ -171,3 +171,20 @@ isc_resource_getlimit(isc_resource_t resource, isc_resourcevalue_t *value) {
|
|||||||
|
|
||||||
return (result);
|
return (result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
isc_result_t
|
||||||
|
isc_resource_getcurlimit(isc_resource_t resource, isc_resourcevalue_t *value) {
|
||||||
|
int unixresult;
|
||||||
|
int unixresource;
|
||||||
|
struct rlimit rl;
|
||||||
|
isc_result_t result;
|
||||||
|
|
||||||
|
result = resource2rlim(resource, &unixresource);
|
||||||
|
if (result == ISC_R_SUCCESS) {
|
||||||
|
unixresult = getrlimit(unixresource, &rl);
|
||||||
|
INSIST(unixresult == 0);
|
||||||
|
*value = rl.rlim_cur;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
@@ -15,7 +15,7 @@
|
|||||||
* PERFORMANCE OF THIS SOFTWARE.
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* $Id: socket.c,v 1.286 2008/07/03 00:13:25 each Exp $ */
|
/* $Id: socket.c,v 1.287 2008/07/11 23:05:46 jinmei Exp $ */
|
||||||
|
|
||||||
/*! \file */
|
/*! \file */
|
||||||
|
|
||||||
@@ -3489,6 +3489,16 @@ free_manager:
|
|||||||
return (result);
|
return (result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
isc_result_t
|
||||||
|
isc_socketmgr_getmaxsockets(isc_socketmgr_t *manager, unsigned int *nsockp) {
|
||||||
|
REQUIRE(VALID_MANAGER(manager));
|
||||||
|
REQUIRE(nsockp != NULL);
|
||||||
|
|
||||||
|
*nsockp = manager->maxsocks;
|
||||||
|
|
||||||
|
return (ISC_R_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
isc_socketmgr_destroy(isc_socketmgr_t **managerp) {
|
isc_socketmgr_destroy(isc_socketmgr_t **managerp) {
|
||||||
isc_socketmgr_t *manager;
|
isc_socketmgr_t *manager;
|
||||||
|
@@ -336,6 +336,7 @@ isc_ratelimiter_shutdown
|
|||||||
isc_refcount_init
|
isc_refcount_init
|
||||||
isc_region_compare
|
isc_region_compare
|
||||||
isc_resource_getlimit
|
isc_resource_getlimit
|
||||||
|
isc_resource_getcurlimit
|
||||||
isc_resource_setlimit
|
isc_resource_setlimit
|
||||||
isc_result_register
|
isc_result_register
|
||||||
isc_result_totext
|
isc_result_totext
|
||||||
@@ -417,6 +418,7 @@ isc_socket_sendv
|
|||||||
isc_socket_setname
|
isc_socket_setname
|
||||||
isc_socketmgr_create
|
isc_socketmgr_create
|
||||||
isc_socketmgr_destroy
|
isc_socketmgr_destroy
|
||||||
|
isc_socketmgr_getmaxsockets
|
||||||
isc_stdio_close
|
isc_stdio_close
|
||||||
isc_stdio_flush
|
isc_stdio_flush
|
||||||
isc_stdio_open
|
isc_stdio_open
|
||||||
|
@@ -15,7 +15,7 @@
|
|||||||
* PERFORMANCE OF THIS SOFTWARE.
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* $Id: resource.c,v 1.8 2007/06/19 23:47:19 tbox Exp $ */
|
/* $Id: resource.c,v 1.9 2008/07/11 23:05:46 jinmei Exp $ */
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
||||||
@@ -65,3 +65,8 @@ isc_resource_getlimit(isc_resource_t resource, isc_resourcevalue_t *value) {
|
|||||||
*value = WIN32_MAX_OPEN_FILES;
|
*value = WIN32_MAX_OPEN_FILES;
|
||||||
return (ISC_R_SUCCESS);
|
return (ISC_R_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
isc_result_t
|
||||||
|
isc_resource_getcurlimit(isc_resource_t resource, isc_resourcevalue_t *value) {
|
||||||
|
return (isc_resource_getlimit(resource, value));
|
||||||
|
}
|
||||||
|
@@ -15,7 +15,7 @@
|
|||||||
* PERFORMANCE OF THIS SOFTWARE.
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* $Id: socket.c,v 1.57 2008/07/03 00:13:25 each Exp $ */
|
/* $Id: socket.c,v 1.58 2008/07/11 23:05:46 jinmei Exp $ */
|
||||||
|
|
||||||
/* This code has been rewritten to take advantage of Windows Sockets
|
/* This code has been rewritten to take advantage of Windows Sockets
|
||||||
* I/O Completion Ports and Events. I/O Completion Ports is ONLY
|
* I/O Completion Ports and Events. I/O Completion Ports is ONLY
|
||||||
@@ -2873,6 +2873,14 @@ isc_socketmgr_create(isc_mem_t *mctx, isc_socketmgr_t **managerp) {
|
|||||||
return (ISC_R_SUCCESS);
|
return (ISC_R_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
isc_result_t
|
||||||
|
isc_socketmgr_getmaxsockets(isc_socketmgr_t *manager, unsigned int *nsockp) {
|
||||||
|
REQUIRE(VALID_MANAGER(manager));
|
||||||
|
REQUIRE(nsockp != NULL);
|
||||||
|
|
||||||
|
return (ISC_R_NOTIMPLEMENTED);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
isc_socketmgr_destroy(isc_socketmgr_t **managerp) {
|
isc_socketmgr_destroy(isc_socketmgr_t **managerp) {
|
||||||
isc_socketmgr_t *manager;
|
isc_socketmgr_t *manager;
|
||||||
|
Reference in New Issue
Block a user