]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
2420. [func] Add new command line option '-S' for named to specify
authorTatuya JINMEI 神明達哉 <jinmei@isc.org>
Thu, 21 Aug 2008 00:13:49 +0000 (00:13 +0000)
committerTatuya JINMEI 神明達哉 <jinmei@isc.org>
Thu, 21 Aug 2008 00:13:49 +0000 (00:13 +0000)
the max number of sockets. [RT #18493]
Use caution: this option may not work for some
operating systems without rebuilding named.

CHANGES
bin/named/main.c
bin/named/named.docbook
lib/isc/include/isc/socket.h
lib/isc/unix/socket.c
lib/isc/win32/libisc.def
lib/isc/win32/socket.c

diff --git a/CHANGES b/CHANGES
index d4e02f418c0d5d7eceb36fc83dfe2fd0227151ce..be1e282c19c8b1609af04bb82a82b8bc0df662f3 100644 (file)
--- a/CHANGES
+++ b/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.
+
 2417.  [bug]           Connecting UDP sockets for outgoing queries could
                        unexpectedly fail with an 'address already in use'
                        error. [RT #18411]
index 960de2a34bb11ebdc98f889cafd685e0aeb4a700..51e8d37291dff563e9cf5ac8d0f4110dd26b6330 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: main.c,v 1.119.2.3.2.25 2006/11/10 18:51:06 marka Exp $ */
+/* $Id: main.c,v 1.119.2.3.2.26 2008/08/21 00:13:49 jinmei Exp $ */
 
 #include <config.h>
 
@@ -76,6 +76,7 @@ static char           program_name[ISC_DIR_NAMEMAX] = "named";
 static char            absolute_conffile[ISC_DIR_PATHMAX];
 static char            saved_command_line[512];
 static char            version[512];
+static unsigned int    maxsocks = 0;
 
 void
 ns_main_earlywarning(const char *format, ...) {
@@ -345,7 +346,8 @@ parse_command_line(int argc, char *argv[]) {
 
        isc_commandline_errprint = ISC_FALSE;
        while ((ch = isc_commandline_parse(argc, argv,
-                                  "46c:C:d:fgi:lm:n:N:p:P:st:u:vx:")) != -1) {
+                                          "46c:C:d:fgi:lm:n:N:p:P:"
+                                          "sS:t:u:vx:")) != -1) {
                switch (ch) {
                case '4':
                        if (disable4)
@@ -424,6 +426,10 @@ parse_command_line(int argc, char *argv[]) {
                        /* XXXRTH temporary syntax */
                        want_stats = ISC_TRUE;
                        break;
+               case 'S':
+                       maxsocks = parse_int(isc_commandline_argument,
+                                            "max number of sockets");
+                       break;
                case 't':
                        /* XXXJAB should we make a copy? */
                        ns_g_chrootdir = isc_commandline_argument;
@@ -455,6 +461,7 @@ parse_command_line(int argc, char *argv[]) {
 static isc_result_t
 create_managers(void) {
        isc_result_t result;
+       unsigned int socks;
 #ifdef ISC_PLATFORM_USETHREADS
        unsigned int cpus_detected;
 #endif
@@ -486,13 +493,19 @@ create_managers(void) {
                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) {
                UNEXPECTED_ERROR(__FILE__, __LINE__,
                                 "isc_socketmgr_create() failed: %s",
                                 isc_result_totext(result));
                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);
        if (result != ISC_R_SUCCESS) {
index 43401d02744745c34f85f676af371010b62a9f5c..351e361371a3483ed99eb94d78408ea575ae8d88 100644 (file)
@@ -18,7 +18,7 @@
  - PERFORMANCE OF THIS SOFTWARE.
 -->
 
-<!-- $Id: named.docbook,v 1.5.98.13 2007/08/28 07:19:08 tbox Exp $ -->
+<!-- $Id: named.docbook,v 1.5.98.14 2008/08/21 00:13:49 jinmei Exp $ -->
 
 <refentry>
   <refentryinfo>
@@ -65,6 +65,7 @@
       <arg><option>-n <replaceable class="parameter">#cpus</replaceable></option></arg>
       <arg><option>-p <replaceable class="parameter">port</replaceable></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>-u <replaceable class="parameter">user</replaceable></option></arg>
       <arg><option>-v</option></arg>
        </listitem>
       </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>
        <term>-t <replaceable class="parameter">directory</replaceable></term>
        <listitem>
index 7f35a46c8fc9783595703daf0a32afd0330d5ae4..b185e8c66e926b30cedba33fe6b23515803fb804 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: socket.h,v 1.54.12.13 2008/08/01 02:12:46 jinmei Exp $ */
+/* $Id: socket.h,v 1.54.12.14 2008/08/21 00:13:49 jinmei Exp $ */
 
 #ifndef ISC_SOCKET_H
 #define ISC_SOCKET_H 1
@@ -669,6 +669,7 @@ isc_socket_sendto2(isc_socket_t *sock, isc_region_t *region,
  *     ISC_R_INPROGRESS
  *     ISC_R_NOMEMORY
  *     ISC_R_UNEXPECTED
+ *     ISC_R_NOTIMPLEMENTED
  *
  * Event results:
  *
@@ -679,8 +680,14 @@ isc_socket_sendto2(isc_socket_t *sock, isc_region_t *region,
 
 isc_result_t
 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
  *
  * Notes:
  *
index c4e6cc21754280fba62af390811fabe3ec4540a1..cc0301cb864d01aa34dfe737fcbd39fbc70f7fc2 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: socket.c,v 1.207.2.19.2.53 2008/08/13 23:46:58 jinmei Exp $ */
+/* $Id: socket.c,v 1.207.2.19.2.54 2008/08/21 00:13:49 jinmei Exp $ */
 
 #include <config.h>
 
@@ -132,16 +132,14 @@ struct isc_socketwait {
 
 #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__
 #define _DARWIN_UNLIMITED_SELECT
 #endif /* __APPLE__ */
-#endif /* ISC_SOCKET_MAXSOCKETS > FD_SETSIZE */
 #endif /* USE_SELECT */
 
-
 /*
  * Size of per-FD lock buckets.
  */
@@ -3235,6 +3233,13 @@ cleanup_watcher(isc_mem_t *mctx, isc_socketmgr_t *manager) {
 
 isc_result_t
 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;
        isc_socketmgr_t *manager;
 #ifdef ISC_PLATFORM_USETHREADS
@@ -3246,19 +3251,26 @@ isc_socketmgr_create(isc_mem_t *mctx, isc_socketmgr_t **managerp) {
 
 #ifndef ISC_PLATFORM_USETHREADS
        if (socketmgr != NULL) {
+               /* Don't allow maxsocks to be updated */
+               if (maxsocks > 0 && socketmgr->maxsocks != maxsocks)
+                       return (ISC_R_EXISTS);
+
                socketmgr->refs++;
                *managerp = socketmgr;
                return (ISC_R_SUCCESS);
        }
 #endif /* ISC_PLATFORM_USETHREADS */
 
+       if (maxsocks == 0)
+               maxsocks = ISC_SOCKET_MAXSOCKETS;
+
        manager = isc_mem_get(mctx, sizeof(*manager));
        if (manager == NULL)
                return (ISC_R_NOMEMORY);
 
        /* zero-clear so that necessary cleanup on failure will be easy */
        memset(manager, 0, sizeof(*manager));
-       manager->maxsocks = ISC_SOCKET_MAXSOCKETS;
+       manager->maxsocks = maxsocks;
        manager->fds = isc_mem_get(mctx,
                                   manager->maxsocks * sizeof(isc_socket_t *));
        if (manager->fds == NULL) {
index 257d0b6db11515f451cbd83eb35ec77d972bd4ee..44103e69863793e9ca56f90efa9a1b6abd493d72 100644 (file)
@@ -362,6 +362,7 @@ isc_socket_sendto2
 isc_socket_sendtov
 isc_socket_sendv
 isc_socketmgr_create
+isc_socketmgr_create2
 isc_socketmgr_destroy
 isc_socketmgr_getmaxsockets
 isc_stdio_close
index 80bce28fafb63f073c860cc47c23e5a1d291ca6a..00937ee56c6927c64fce1409bc1b03be536084db 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: socket.c,v 1.5.2.13.2.36 2008/08/08 06:27:25 tbox Exp $ */
+/* $Id: socket.c,v 1.5.2.13.2.37 2008/08/21 00:13:49 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
@@ -2872,12 +2872,22 @@ event_wait(void *uap) {
  */
 isc_result_t
 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;
        events_thread_t *evthread = NULL;
        isc_result_t result;
 
        REQUIRE(managerp != NULL && *managerp == NULL);
 
+       if (maxsocks != 0)
+               return (ISC_R_NOTIMPLEMENTED);
+
        manager = isc_mem_get(mctx, sizeof(*manager));
        if (manager == NULL)
                return (ISC_R_NOMEMORY);