]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
[master] accept >4g max-{,a}cache-size
authorEvan Hunt <each@isc.org>
Thu, 28 Feb 2013 17:29:12 +0000 (09:29 -0800)
committerEvan Hunt <each@isc.org>
Thu, 28 Feb 2013 17:29:12 +0000 (09:29 -0800)
3506. [func] When setting "max-cache-size" and "max-acache-size",
the keyword "unlimited" is no longer defined as equal
to 4 gigabytes (except on 32-bit platforms); it
means literally unlimited. [RT #32358]

3505. [bug] When setting "max-cache-size" and "max-acache-size",
larger values than 4 gigabytes could not be set
explicitly, though larger sizes were available
when setting cache size to 0. This has been
corrected; the full range is now available.
[RT #32358]

CHANGES
bin/named/server.c
bin/tests/system/checkconf/good.conf
doc/arm/Bv9ARM-book.xml
lib/dns/acache.c
lib/dns/adb.c
lib/dns/cache.c
lib/dns/include/dns/acache.h
lib/dns/include/dns/adb.h
lib/dns/include/dns/cache.h

diff --git a/CHANGES b/CHANGES
index 4107d6f5044a3020918d61cf516acefc25d3e7d2..27169665dd99bc12294d73301a800c04950e1d15 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,15 @@
+3506.  [func]          When setting "max-cache-size" and "max-acache-size",
+                       the keyword "unlimited" is no longer defined as equal
+                       to 4 gigabytes (except on 32-bit platforms); it
+                       means literally unlimited. [RT #32358]
+
+3505.  [bug]           When setting "max-cache-size" and "max-acache-size",
+                       larger values than 4 gigabytes could not be set
+                       explicitly, though larger sizes were available
+                       when setting cache size to 0. This has been
+                       corrected; the full range is now available.
+                       [RT #32358]
+
 3504.  [func]          Add support for ACLs based on geographic location,
                        using MaxMind GeoIP databases. Based on code
                        contributed by Ken Brownfield <kb@slide.com>.
index 9807487926e5872276e082ff39585665fa4c9040..df26db401ace981546583b9d554a3420b5518707 100644 (file)
@@ -1446,7 +1446,7 @@ static isc_boolean_t
 cache_sharable(dns_view_t *originview, dns_view_t *view,
               isc_boolean_t new_zero_no_soattl,
               unsigned int new_cleaning_interval,
-              isc_uint32_t new_max_cache_size)
+              isc_uint64_t new_max_cache_size)
 {
        /*
         * If the cache cannot even reused for the same view, it cannot be
@@ -2042,10 +2042,10 @@ configure_view(dns_view_t *view, cfg_obj_t *config, cfg_obj_t *vconfig,
        in_port_t port;
        dns_cache_t *cache = NULL;
        isc_result_t result;
-       isc_uint32_t max_adb_size;
        unsigned int cleaning_interval;
-       isc_uint32_t max_cache_size;
-       isc_uint32_t max_acache_size;
+       size_t max_cache_size;
+       size_t max_acache_size;
+       size_t max_adb_size;
        isc_uint32_t lame_ttl;
        dns_tsig_keyring_t *ring = NULL;
        dns_view_t *pview = NULL;       /* Production view */
@@ -2148,21 +2148,21 @@ configure_view(dns_view_t *view, cfg_obj_t *config, cfg_obj_t *vconfig,
                if (cfg_obj_isstring(obj)) {
                        str = cfg_obj_asstring(obj);
                        INSIST(strcasecmp(str, "unlimited") == 0);
-                       max_acache_size = ISC_UINT32_MAX;
+                       max_acache_size = 0;
                } else {
                        isc_resourcevalue_t value;
-
                        value = cfg_obj_asuint64(obj);
-                       if (value > ISC_UINT32_MAX) {
-                               cfg_obj_log(obj, ns_g_lctx, ISC_LOG_ERROR,
+                       if (value > SIZE_MAX) {
+                               cfg_obj_log(obj, ns_g_lctx,
+                                           ISC_LOG_WARNING,
                                            "'max-acache-size "
-                                           "%" ISC_PRINT_QUADFORMAT
-                                           "d' is too large",
-                                           value);
-                               result = ISC_R_RANGE;
-                               goto cleanup;
+                                           "%" ISC_PRINT_QUADFORMAT "u' "
+                                           "is too large for this "
+                                           "system; reducing to %lu",
+                                           value, SIZE_MAX);
+                               value = SIZE_MAX;
                        }
-                       max_acache_size = (isc_uint32_t)value;
+                       max_cache_size = (size_t) value;
                }
                dns_acache_setcachesize(view->acache, max_acache_size);
        }
@@ -2338,19 +2338,21 @@ configure_view(dns_view_t *view, cfg_obj_t *config, cfg_obj_t *vconfig,
        if (cfg_obj_isstring(obj)) {
                str = cfg_obj_asstring(obj);
                INSIST(strcasecmp(str, "unlimited") == 0);
-               max_cache_size = ISC_UINT32_MAX;
+               max_cache_size = 0;
        } else {
                isc_resourcevalue_t value;
                value = cfg_obj_asuint64(obj);
-               if (value > ISC_UINT32_MAX) {
-                       cfg_obj_log(obj, ns_g_lctx, ISC_LOG_ERROR,
+               if (value > SIZE_MAX) {
+                       cfg_obj_log(obj, ns_g_lctx,
+                                   ISC_LOG_WARNING,
                                    "'max-cache-size "
-                                   "%" ISC_PRINT_QUADFORMAT "d' is too large",
-                                   value);
-                       result = ISC_R_RANGE;
-                       goto cleanup;
+                                   "%" ISC_PRINT_QUADFORMAT "u' "
+                                   "is too large for this "
+                                   "system; reducing to %lu",
+                                   value, SIZE_MAX);
+                       value = SIZE_MAX;
                }
-               max_cache_size = (isc_uint32_t)value;
+               max_cache_size = (size_t) value;
        }
 
        /* Check-names. */
index b4b439a9ca9757c13564b3bcd9e4c52c3c0113e3..5444fdde0a9e81dac72a01c8ea808d68de4c1510 100644 (file)
@@ -66,6 +66,7 @@ options {
        serial-queries 10;
        serial-query-rate 100;
        server-id none;
+       max-cache-size 20000000000000;
        zone-statistics none;
 };
 view "first" {
index ae05be870f4db64d033f25f05cadfd006703f489..393534233a97b2c798c80079d3b84e169ef3f66b 100644 (file)
@@ -3413,12 +3413,14 @@ $ORIGIN 0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa.
                 <para>
                   Integers may take values
                   0 &lt;= value &lt;= 18446744073709551615, though
-                  certain parameters may use a more limited range
-                  within these extremes.  In most cases, setting a
-                  value to 0 does not literally mean zero; it means
-                  "undefined" or "as big as psosible", depending on
-                  the context. See the expalantions of particular
-                  parameters that use <varname>size_spec</varname>
+                  certain parameters
+                  (such as <command>max-journal-size</command>) may
+                  use a more limited range within these extremes.
+                  In most cases, setting a value to 0 does not
+                  literally mean zero; it means "undefined" or
+                  "as big as possible", depending on the context.
+                  See the expalantions of particular parameters
+                  that use <varname>size_spec</varname>
                   for details on how they interpret its use. 
                 </para>
                 <para>
@@ -3434,13 +3436,8 @@ $ORIGIN 0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa.
                 </para>
                <para>
                   <varname>unlimited</varname> generally means
-                  "as big as possible", though in certain contexts,
-                  (including <option>max-cache-size</option>), it may
-                  mean the largest possible 32-bit unsigned integer
-                  (0xffffffff); this distinction can be important when
-                  dealing with larger quantities. 
-                  <varname>unlimited</varname> is usually the best way
-                  to safely set a very large number.
+                  "as big as possible", and is usually the best
+                  way to safely set a very large number.
                 </para>
                <para>
                   <varname>default</varname> 
@@ -8425,8 +8422,10 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };
                   approaches
                   the specified size, some of the oldest transactions in the
                   journal
-                  will be automatically removed.  The default is
-                  <literal>unlimited</literal>.
+                  will be automatically removed.  The largest permitted
+                  value is 2 gigabytes. The default is
+                  <literal>unlimited</literal>, which also
+                  means 2 gigabytes.
                   This may also be set on a per-zone basis.
                 </para>
               </listitem>
@@ -8498,22 +8497,18 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };
                   The maximum amount of memory to use for the
                   server's cache, in bytes.
                   When the amount of data in the cache
-                  reaches this limit, the server will cause records to expire
-                  prematurely based on an LRU based strategy so that
-                  the limit is not exceeded.
-                  A value of 0 is special, meaning that
-                  records are purged from the cache only when their
+                  reaches this limit, the server will cause records to
+                  expire prematurely based on an LRU based strategy so
+                  that the limit is not exceeded.
+                  The keyword <userinput>unlimited</userinput>,
+                  or the value 0, will place no limit on cache size;
+                  records will be purged from the cache only when their
                   TTLs expire.
-                  Another special keyword <userinput>unlimited</userinput>
-                  means the maximum value of 32-bit unsigned integers
-                  (0xffffffff), which may not have the same effect as
-                  0 on machines that support more than 32 bits of
-                  memory space.
-                  Any positive values less than 2MB will be ignored reset
-                  to 2MB.
+                  Any positive values less than 2MB will be ignored 
+                  and reset to 2MB.
                   In a server with multiple views, the limit applies
                   separately to the cache of each view.
-                  The default is 0.
+                  The default is <userinput>unlimited</userinput>.
                 </para>
               </listitem>
             </varlistentry>
index 702fb98457793656335ef536b962de322df0601b..433db2cbf5439c692a19d99b66f495f0cd65ca20 100644 (file)
@@ -1769,9 +1769,8 @@ dns_acache_setcleaninginterval(dns_acache_t *acache, unsigned int t) {
  * function for more details about the logic.
  */
 void
-dns_acache_setcachesize(dns_acache_t *acache, isc_uint32_t size) {
-       isc_uint32_t lowater;
-       isc_uint32_t hiwater;
+dns_acache_setcachesize(dns_acache_t *acache, size_t size) {
+       size_t hiwater, lowater;
 
        REQUIRE(DNS_ACACHE_VALID(acache));
 
index c5aa29d67a4af382bd55ec137d48828dca3ea710..a6fa50b89981df68b94a1d7d3863a32515e1e288 100644 (file)
@@ -4164,9 +4164,8 @@ water(void *arg, int mark) {
 }
 
 void
-dns_adb_setadbsize(dns_adb_t *adb, isc_uint32_t size) {
-       isc_uint32_t hiwater;
-       isc_uint32_t lowater;
+dns_adb_setadbsize(dns_adb_t *adb, size_t size) {
+       size_t hiwater, lowater;
 
        INSIST(DNS_ADB_VALID(adb));
 
index 3d05e48e60efb77158017e5887017ceb4ebf3a55..ba30760baa23843e5d06a965152839b4d8fd17ba 100644 (file)
@@ -139,7 +139,7 @@ struct dns_cache {
        char                    *db_type;
        int                     db_argc;
        char                    **db_argv;
-       isc_uint32_t            size;
+       size_t                  size;
        isc_stats_t             *stats;
 
        /* Locked by 'filelock'. */
@@ -1048,9 +1048,8 @@ water(void *arg, int mark) {
 }
 
 void
-dns_cache_setcachesize(dns_cache_t *cache, isc_uint32_t size) {
-       isc_uint32_t lowater;
-       isc_uint32_t hiwater;
+dns_cache_setcachesize(dns_cache_t *cache, size_t size) {
+       size_t hiwater, lowater;
 
        REQUIRE(VALID_CACHE(cache));
 
@@ -1088,9 +1087,9 @@ dns_cache_setcachesize(dns_cache_t *cache, isc_uint32_t size) {
                isc_mem_setwater(cache->mctx, water, cache, hiwater, lowater);
 }
 
-isc_uint32_t
+size_t
 dns_cache_getcachesize(dns_cache_t *cache) {
-       isc_uint32_t size;
+       size_t size;
 
        REQUIRE(VALID_CACHE(cache));
 
index 28990c2aab0c249d3c48154441e012d19d7a5240..754ef9f8a7f509c515e5a7c0ead2f92c5d20da85 100644 (file)
@@ -238,7 +238,7 @@ dns_acache_setcleaninginterval(dns_acache_t *acache, unsigned int t);
  */
 
 void
-dns_acache_setcachesize(dns_acache_t *acache, isc_uint32_t size);
+dns_acache_setcachesize(dns_acache_t *acache, size_t size);
 /*
  * Set the maximum additional cache size.  0 means unlimited.
  */
index d3a243b80fcab09f4526953a0458e17dfe68926c..267ae83d554b31701727527382ee02c75722d02a 100644 (file)
@@ -607,7 +607,7 @@ dns_adb_flush(dns_adb_t *adb);
  */
 
 void
-dns_adb_setadbsize(dns_adb_t *adb, isc_uint32_t size);
+dns_adb_setadbsize(dns_adb_t *adb, size_t size);
 /*%<
  * Set a target memory size.  If memory usage exceeds the target
  * size entries will be removed before they would have expired on
index e38b0abef324aeafd5f49d959169447b05d85d0e..bbab0e1bd7634f06864e8ced2ad5bfe0aaff88ec 100644 (file)
@@ -246,12 +246,6 @@ dns_cache_getcleaninginterval(dns_cache_t *cache);
  * Get the periodic cache cleaning interval to 'interval' seconds.
  */
 
-isc_uint32_t
-dns_cache_getcachesize(dns_cache_t *cache);
-/*%<
- * Get the maximum cache size.
- */
-
 const char *
 dns_cache_getname(dns_cache_t *cache);
 /*%<
@@ -259,12 +253,12 @@ dns_cache_getname(dns_cache_t *cache);
  */
 
 void
-dns_cache_setcachesize(dns_cache_t *cache, isc_uint32_t size);
+dns_cache_setcachesize(dns_cache_t *cache, size_t size);
 /*%<
  * Set the maximum cache size.  0 means unlimited.
  */
 
-isc_uint32_t
+size_t
 dns_cache_getcachesize(dns_cache_t *cache);
 /*%<
  * Get the maximum cache size.