[RT #18269].
+2386. [bug] Add warning about too small 'open files' limit
+ [RT #18269].
+
2385. [bug] A condition variable in socket.c could leak in
rare error handling [RT #17968].
* 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 */
in_port_t listen_port, udpport_low, udpport_high;
isc_portset_t *v4portset = NULL;
isc_portset_t *v6portset = NULL;
+ isc_resourcevalue_t nfiles;
int i;
cfg_aclconfctx_init(&aclconfctx);
*/
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.
*/
* 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
#define ISC_RESOURCE_H 1
*\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
#endif /* ISC_RESOURCE_H */
* 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
#define ISC_SOCKET_H 1
*\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
isc_socketmgr_destroy(isc_socketmgr_t **managerp);
/*%<
* 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>
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);
+}
* 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 */
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
isc_socketmgr_destroy(isc_socketmgr_t **managerp) {
isc_socketmgr_t *manager;
isc_refcount_init
isc_region_compare
isc_resource_getlimit
+isc_resource_getcurlimit
isc_resource_setlimit
isc_result_register
isc_result_totext
isc_socket_setname
isc_socketmgr_create
isc_socketmgr_destroy
+isc_socketmgr_getmaxsockets
isc_stdio_close
isc_stdio_flush
isc_stdio_open
* 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>
*value = WIN32_MAX_OPEN_FILES;
return (ISC_R_SUCCESS);
}
+
+isc_result_t
+isc_resource_getcurlimit(isc_resource_t resource, isc_resourcevalue_t *value) {
+ return (isc_resource_getlimit(resource, value));
+}
* 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
* I/O Completion Ports and Events. I/O Completion Ports is ONLY
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
isc_socketmgr_destroy(isc_socketmgr_t **managerp) {
isc_socketmgr_t *manager;