mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-09-02 07:35:26 +00:00
2420. [func] Add new command line option '-S' for named to specify
the max number of sockets. [RT #18493] Use caution: this option may not work for some operating systems without rebuilding named.
This commit is contained in:
9
CHANGES
9
CHANGES
@@ -1,3 +1,8 @@
|
|||||||
|
2420. [func] Add new command line option '-S' for named to specify
|
||||||
|
the max number of sockets. [RT #18493]
|
||||||
|
Use caution: this option may not work for some
|
||||||
|
operating systems without rebuilding named.
|
||||||
|
|
||||||
2419. [cleanup] Document that isc_socket_create() and isc_socket_open()
|
2419. [cleanup] Document that isc_socket_create() and isc_socket_open()
|
||||||
should not be used for isc_sockettype_fdwatch sockets.
|
should not be used for isc_sockettype_fdwatch sockets.
|
||||||
[RT #18521]
|
[RT #18521]
|
||||||
@@ -41,10 +46,6 @@
|
|||||||
2406. [bug] Sockets could be closed too early, leading to
|
2406. [bug] Sockets could be closed too early, leading to
|
||||||
inconsistent states in the socket module. [RT #18298]
|
inconsistent states in the socket module. [RT #18298]
|
||||||
|
|
||||||
xxxx. [bug] Connecting UDP sockets for outgoing queries could
|
|
||||||
unexpectedly fail with an 'address already in use'
|
|
||||||
error.
|
|
||||||
|
|
||||||
2405. [cleanup] The default value for dnssec-validation was changed to
|
2405. [cleanup] The default value for dnssec-validation was changed to
|
||||||
"yes" in 9.5.0-P1 and all subsequent releases; this
|
"yes" in 9.5.0-P1 and all subsequent releases; this
|
||||||
was inadvertently omitted from CHANGES at the time.
|
was inadvertently omitted from CHANGES at the time.
|
||||||
|
@@ -15,7 +15,7 @@
|
|||||||
* PERFORMANCE OF THIS SOFTWARE.
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* $Id: main.c,v 1.162 2008/04/03 23:14:52 jinmei Exp $ */
|
/* $Id: main.c,v 1.163 2008/08/20 23:57:59 jinmei Exp $ */
|
||||||
|
|
||||||
/*! \file */
|
/*! \file */
|
||||||
|
|
||||||
@@ -85,6 +85,7 @@ static char program_name[ISC_DIR_NAMEMAX] = "named";
|
|||||||
static char absolute_conffile[ISC_DIR_PATHMAX];
|
static char absolute_conffile[ISC_DIR_PATHMAX];
|
||||||
static char saved_command_line[512];
|
static char saved_command_line[512];
|
||||||
static char version[512];
|
static char version[512];
|
||||||
|
static unsigned int maxsocks = 0;
|
||||||
|
|
||||||
void
|
void
|
||||||
ns_main_earlywarning(const char *format, ...) {
|
ns_main_earlywarning(const char *format, ...) {
|
||||||
@@ -356,7 +357,8 @@ parse_command_line(int argc, char *argv[]) {
|
|||||||
|
|
||||||
isc_commandline_errprint = ISC_FALSE;
|
isc_commandline_errprint = ISC_FALSE;
|
||||||
while ((ch = isc_commandline_parse(argc, argv,
|
while ((ch = isc_commandline_parse(argc, argv,
|
||||||
"46c:C:d:fgi:lm:n:N:p:P:st:T:u:vx:")) != -1) {
|
"46c:C:d:fgi:lm:n:N:p:P:"
|
||||||
|
"sS:t:T:u:vx:")) != -1) {
|
||||||
switch (ch) {
|
switch (ch) {
|
||||||
case '4':
|
case '4':
|
||||||
if (disable4)
|
if (disable4)
|
||||||
@@ -435,6 +437,10 @@ parse_command_line(int argc, char *argv[]) {
|
|||||||
/* XXXRTH temporary syntax */
|
/* XXXRTH temporary syntax */
|
||||||
want_stats = ISC_TRUE;
|
want_stats = ISC_TRUE;
|
||||||
break;
|
break;
|
||||||
|
case 'S':
|
||||||
|
maxsocks = parse_int(isc_commandline_argument,
|
||||||
|
"max number of sockets");
|
||||||
|
break;
|
||||||
case 't':
|
case 't':
|
||||||
/* XXXJAB should we make a copy? */
|
/* XXXJAB should we make a copy? */
|
||||||
ns_g_chrootdir = isc_commandline_argument;
|
ns_g_chrootdir = isc_commandline_argument;
|
||||||
@@ -479,6 +485,7 @@ parse_command_line(int argc, char *argv[]) {
|
|||||||
static isc_result_t
|
static isc_result_t
|
||||||
create_managers(void) {
|
create_managers(void) {
|
||||||
isc_result_t result;
|
isc_result_t result;
|
||||||
|
unsigned int socks;
|
||||||
#ifdef ISC_PLATFORM_USETHREADS
|
#ifdef ISC_PLATFORM_USETHREADS
|
||||||
unsigned int cpus_detected;
|
unsigned int cpus_detected;
|
||||||
#endif
|
#endif
|
||||||
@@ -510,13 +517,19 @@ create_managers(void) {
|
|||||||
return (ISC_R_UNEXPECTED);
|
return (ISC_R_UNEXPECTED);
|
||||||
}
|
}
|
||||||
|
|
||||||
result = isc_socketmgr_create(ns_g_mctx, &ns_g_socketmgr);
|
result = isc_socketmgr_create2(ns_g_mctx, &ns_g_socketmgr, maxsocks);
|
||||||
if (result != ISC_R_SUCCESS) {
|
if (result != ISC_R_SUCCESS) {
|
||||||
UNEXPECTED_ERROR(__FILE__, __LINE__,
|
UNEXPECTED_ERROR(__FILE__, __LINE__,
|
||||||
"isc_socketmgr_create() failed: %s",
|
"isc_socketmgr_create() failed: %s",
|
||||||
isc_result_totext(result));
|
isc_result_totext(result));
|
||||||
return (ISC_R_UNEXPECTED);
|
return (ISC_R_UNEXPECTED);
|
||||||
}
|
}
|
||||||
|
result = isc_socketmgr_getmaxsockets(ns_g_socketmgr, &socks);
|
||||||
|
if (result == ISC_R_SUCCESS) {
|
||||||
|
isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
|
||||||
|
NS_LOGMODULE_SERVER,
|
||||||
|
ISC_LOG_INFO, "using up to %u sockets", socks);
|
||||||
|
}
|
||||||
|
|
||||||
result = isc_entropy_create(ns_g_mctx, &ns_g_entropy);
|
result = isc_entropy_create(ns_g_mctx, &ns_g_entropy);
|
||||||
if (result != ISC_R_SUCCESS) {
|
if (result != ISC_R_SUCCESS) {
|
||||||
|
@@ -18,7 +18,7 @@
|
|||||||
- PERFORMANCE OF THIS SOFTWARE.
|
- PERFORMANCE OF THIS SOFTWARE.
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<!-- $Id: named.docbook,v 1.19 2007/06/19 06:58:03 marka Exp $ -->
|
<!-- $Id: named.docbook,v 1.20 2008/08/20 23:57:59 jinmei Exp $ -->
|
||||||
<refentry id="man.named">
|
<refentry id="man.named">
|
||||||
<refentryinfo>
|
<refentryinfo>
|
||||||
<date>June 30, 2000</date>
|
<date>June 30, 2000</date>
|
||||||
@@ -64,6 +64,7 @@
|
|||||||
<arg><option>-n <replaceable class="parameter">#cpus</replaceable></option></arg>
|
<arg><option>-n <replaceable class="parameter">#cpus</replaceable></option></arg>
|
||||||
<arg><option>-p <replaceable class="parameter">port</replaceable></option></arg>
|
<arg><option>-p <replaceable class="parameter">port</replaceable></option></arg>
|
||||||
<arg><option>-s</option></arg>
|
<arg><option>-s</option></arg>
|
||||||
|
<arg><option>-S <replaceable class="parameter">#max-socks</replaceable></option></arg>
|
||||||
<arg><option>-t <replaceable class="parameter">directory</replaceable></option></arg>
|
<arg><option>-t <replaceable class="parameter">directory</replaceable></option></arg>
|
||||||
<arg><option>-u <replaceable class="parameter">user</replaceable></option></arg>
|
<arg><option>-u <replaceable class="parameter">user</replaceable></option></arg>
|
||||||
<arg><option>-v</option></arg>
|
<arg><option>-v</option></arg>
|
||||||
@@ -214,6 +215,33 @@
|
|||||||
</listitem>
|
</listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term>-S <replaceable class="parameter">#max-socks</replaceable></term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Allow <command>named</command> to use up to
|
||||||
|
<replaceable class="parameter">#max-socks</replaceable> sockets.
|
||||||
|
</para>
|
||||||
|
<warning>
|
||||||
|
<para>
|
||||||
|
This option should be unnecessary for the vast majority
|
||||||
|
of users.
|
||||||
|
The use of this option could even be harmful because the
|
||||||
|
specified value may exceed the limitation of the
|
||||||
|
underlying system API.
|
||||||
|
It is therefore set only when the default configuration
|
||||||
|
causes exhaustion of file descriptors and the
|
||||||
|
operational environment is known to support the
|
||||||
|
specified number of sockets.
|
||||||
|
Note also that the actual maximum number is normally a little
|
||||||
|
fewer than the specified value because
|
||||||
|
<command>named</command> reserves some file descriptors
|
||||||
|
for its internal use.
|
||||||
|
</para>
|
||||||
|
</warning>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term>-t <replaceable class="parameter">directory</replaceable></term>
|
<term>-t <replaceable class="parameter">directory</replaceable></term>
|
||||||
<listitem>
|
<listitem>
|
||||||
|
@@ -15,7 +15,7 @@
|
|||||||
* PERFORMANCE OF THIS SOFTWARE.
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* $Id: socket.h,v 1.82 2008/08/20 06:16:05 marka Exp $ */
|
/* $Id: socket.h,v 1.83 2008/08/20 23:57:59 jinmei Exp $ */
|
||||||
|
|
||||||
#ifndef ISC_SOCKET_H
|
#ifndef ISC_SOCKET_H
|
||||||
#define ISC_SOCKET_H 1
|
#define ISC_SOCKET_H 1
|
||||||
@@ -753,8 +753,15 @@ isc_socket_sendto2(isc_socket_t *sock, isc_region_t *region,
|
|||||||
|
|
||||||
isc_result_t
|
isc_result_t
|
||||||
isc_socketmgr_create(isc_mem_t *mctx, isc_socketmgr_t **managerp);
|
isc_socketmgr_create(isc_mem_t *mctx, isc_socketmgr_t **managerp);
|
||||||
|
|
||||||
|
isc_result_t
|
||||||
|
isc_socketmgr_create2(isc_mem_t *mctx, isc_socketmgr_t **managerp,
|
||||||
|
unsigned int maxsocks);
|
||||||
/*%<
|
/*%<
|
||||||
* Create a socket manager.
|
* Create a socket manager. If "maxsocks" is non-zero, it specifies the
|
||||||
|
* maximum number of sockets that the created manager should handle.
|
||||||
|
* isc_socketmgr_create() is equivalent of isc_socketmgr_create2() with
|
||||||
|
* "maxsocks" being zero.
|
||||||
*
|
*
|
||||||
* Notes:
|
* Notes:
|
||||||
*
|
*
|
||||||
@@ -775,6 +782,7 @@ isc_socketmgr_create(isc_mem_t *mctx, isc_socketmgr_t **managerp);
|
|||||||
*\li #ISC_R_SUCCESS
|
*\li #ISC_R_SUCCESS
|
||||||
*\li #ISC_R_NOMEMORY
|
*\li #ISC_R_NOMEMORY
|
||||||
*\li #ISC_R_UNEXPECTED
|
*\li #ISC_R_UNEXPECTED
|
||||||
|
*\li #ISC_R_NOTIMPLEMENTED
|
||||||
*/
|
*/
|
||||||
|
|
||||||
isc_result_t
|
isc_result_t
|
||||||
|
@@ -15,7 +15,7 @@
|
|||||||
* PERFORMANCE OF THIS SOFTWARE.
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* $Id: socket.c,v 1.300 2008/08/20 06:16:05 marka Exp $ */
|
/* $Id: socket.c,v 1.301 2008/08/20 23:57:59 jinmei Exp $ */
|
||||||
|
|
||||||
/*! \file */
|
/*! \file */
|
||||||
|
|
||||||
@@ -140,16 +140,14 @@ struct isc_socketwait {
|
|||||||
|
|
||||||
#ifdef USE_SELECT
|
#ifdef USE_SELECT
|
||||||
/*%
|
/*%
|
||||||
* Mac OS X needs a special definition to support larger values in select()
|
* Mac OS X needs a special definition to support larger values in select().
|
||||||
|
* We always define this because a larger value can be specified run-time.
|
||||||
*/
|
*/
|
||||||
#if ISC_SOCKET_MAXSOCKETS > FD_SETSIZE
|
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
#define _DARWIN_UNLIMITED_SELECT
|
#define _DARWIN_UNLIMITED_SELECT
|
||||||
#endif /* __APPLE__ */
|
#endif /* __APPLE__ */
|
||||||
#endif /* ISC_SOCKET_MAXSOCKETS > FD_SETSIZE */
|
|
||||||
#endif /* USE_SELECT */
|
#endif /* USE_SELECT */
|
||||||
|
|
||||||
|
|
||||||
/*%
|
/*%
|
||||||
* Size of per-FD lock buckets.
|
* Size of per-FD lock buckets.
|
||||||
*/
|
*/
|
||||||
@@ -3475,6 +3473,13 @@ cleanup_watcher(isc_mem_t *mctx, isc_socketmgr_t *manager) {
|
|||||||
|
|
||||||
isc_result_t
|
isc_result_t
|
||||||
isc_socketmgr_create(isc_mem_t *mctx, isc_socketmgr_t **managerp) {
|
isc_socketmgr_create(isc_mem_t *mctx, isc_socketmgr_t **managerp) {
|
||||||
|
return (isc_socketmgr_create2(mctx, managerp, 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
isc_result_t
|
||||||
|
isc_socketmgr_create2(isc_mem_t *mctx, isc_socketmgr_t **managerp,
|
||||||
|
unsigned int maxsocks)
|
||||||
|
{
|
||||||
int i;
|
int i;
|
||||||
isc_socketmgr_t *manager;
|
isc_socketmgr_t *manager;
|
||||||
#ifdef ISC_PLATFORM_USETHREADS
|
#ifdef ISC_PLATFORM_USETHREADS
|
||||||
@@ -3486,19 +3491,26 @@ isc_socketmgr_create(isc_mem_t *mctx, isc_socketmgr_t **managerp) {
|
|||||||
|
|
||||||
#ifndef ISC_PLATFORM_USETHREADS
|
#ifndef ISC_PLATFORM_USETHREADS
|
||||||
if (socketmgr != NULL) {
|
if (socketmgr != NULL) {
|
||||||
|
/* Don't allow maxsocks to be updated */
|
||||||
|
if (maxsocks > 0 && socketmgr->maxsocks != maxsocks)
|
||||||
|
return (ISC_R_EXISTS);
|
||||||
|
|
||||||
socketmgr->refs++;
|
socketmgr->refs++;
|
||||||
*managerp = socketmgr;
|
*managerp = socketmgr;
|
||||||
return (ISC_R_SUCCESS);
|
return (ISC_R_SUCCESS);
|
||||||
}
|
}
|
||||||
#endif /* ISC_PLATFORM_USETHREADS */
|
#endif /* ISC_PLATFORM_USETHREADS */
|
||||||
|
|
||||||
|
if (maxsocks == 0)
|
||||||
|
maxsocks = ISC_SOCKET_MAXSOCKETS;
|
||||||
|
|
||||||
manager = isc_mem_get(mctx, sizeof(*manager));
|
manager = isc_mem_get(mctx, sizeof(*manager));
|
||||||
if (manager == NULL)
|
if (manager == NULL)
|
||||||
return (ISC_R_NOMEMORY);
|
return (ISC_R_NOMEMORY);
|
||||||
|
|
||||||
/* zero-clear so that necessary cleanup on failure will be easy */
|
/* zero-clear so that necessary cleanup on failure will be easy */
|
||||||
memset(manager, 0, sizeof(*manager));
|
memset(manager, 0, sizeof(*manager));
|
||||||
manager->maxsocks = ISC_SOCKET_MAXSOCKETS;
|
manager->maxsocks = maxsocks;
|
||||||
manager->fds = isc_mem_get(mctx,
|
manager->fds = isc_mem_get(mctx,
|
||||||
manager->maxsocks * sizeof(isc_socket_t *));
|
manager->maxsocks * sizeof(isc_socket_t *));
|
||||||
if (manager->fds == NULL) {
|
if (manager->fds == NULL) {
|
||||||
|
@@ -420,6 +420,7 @@ isc_socket_sendtov
|
|||||||
isc_socket_sendv
|
isc_socket_sendv
|
||||||
isc_socket_setname
|
isc_socket_setname
|
||||||
isc_socketmgr_create
|
isc_socketmgr_create
|
||||||
|
isc_socketmgr_create2
|
||||||
isc_socketmgr_destroy
|
isc_socketmgr_destroy
|
||||||
isc_socketmgr_getmaxsockets
|
isc_socketmgr_getmaxsockets
|
||||||
isc_stdio_close
|
isc_stdio_close
|
||||||
|
@@ -15,7 +15,7 @@
|
|||||||
* PERFORMANCE OF THIS SOFTWARE.
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* $Id: socket.c,v 1.65 2008/08/20 06:16:05 marka Exp $ */
|
/* $Id: socket.c,v 1.66 2008/08/20 23:57:59 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
|
||||||
@@ -2906,12 +2906,22 @@ event_wait(void *uap) {
|
|||||||
*/
|
*/
|
||||||
isc_result_t
|
isc_result_t
|
||||||
isc_socketmgr_create(isc_mem_t *mctx, isc_socketmgr_t **managerp) {
|
isc_socketmgr_create(isc_mem_t *mctx, isc_socketmgr_t **managerp) {
|
||||||
|
return (isc_socketmgr_create2(mctx, managerp, maxsocks));
|
||||||
|
}
|
||||||
|
|
||||||
|
isc_result_t
|
||||||
|
isc_socketmgr_create2(isc_mem_t *mctx, isc_socketmgr_t **managerp,
|
||||||
|
unsigned int maxsocks)
|
||||||
|
{
|
||||||
isc_socketmgr_t *manager;
|
isc_socketmgr_t *manager;
|
||||||
events_thread_t *evthread = NULL;
|
events_thread_t *evthread = NULL;
|
||||||
isc_result_t result;
|
isc_result_t result;
|
||||||
|
|
||||||
REQUIRE(managerp != NULL && *managerp == NULL);
|
REQUIRE(managerp != NULL && *managerp == NULL);
|
||||||
|
|
||||||
|
if (maxsocks != 0)
|
||||||
|
return (ISC_R_NOTIMPLEMENTED);
|
||||||
|
|
||||||
manager = isc_mem_get(mctx, sizeof(*manager));
|
manager = isc_mem_get(mctx, sizeof(*manager));
|
||||||
if (manager == NULL)
|
if (manager == NULL)
|
||||||
return (ISC_R_NOMEMORY);
|
return (ISC_R_NOMEMORY);
|
||||||
|
Reference in New Issue
Block a user