diff --git a/CHANGES b/CHANGES index 4107d6f504..27169665dd 100644 --- 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 . diff --git a/bin/named/server.c b/bin/named/server.c index 9807487926..df26db401a 100644 --- a/bin/named/server.c +++ b/bin/named/server.c @@ -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. */ diff --git a/bin/tests/system/checkconf/good.conf b/bin/tests/system/checkconf/good.conf index b4b439a9ca..5444fdde0a 100644 --- a/bin/tests/system/checkconf/good.conf +++ b/bin/tests/system/checkconf/good.conf @@ -66,6 +66,7 @@ options { serial-queries 10; serial-query-rate 100; server-id none; + max-cache-size 20000000000000; zone-statistics none; }; view "first" { diff --git a/doc/arm/Bv9ARM-book.xml b/doc/arm/Bv9ARM-book.xml index ae05be870f..393534233a 100644 --- a/doc/arm/Bv9ARM-book.xml +++ b/doc/arm/Bv9ARM-book.xml @@ -3413,12 +3413,14 @@ $ORIGIN 0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa. Integers may take values 0 <= value <= 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 size_spec + certain parameters + (such as max-journal-size) 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 size_spec for details on how they interpret its use. @@ -3434,13 +3436,8 @@ $ORIGIN 0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa. unlimited generally means - "as big as possible", though in certain contexts, - (including ), it may - mean the largest possible 32-bit unsigned integer - (0xffffffff); this distinction can be important when - dealing with larger quantities. - unlimited 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. default @@ -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 - unlimited. + will be automatically removed. The largest permitted + value is 2 gigabytes. The default is + unlimited, which also + means 2 gigabytes. This may also be set on a per-zone basis. @@ -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 unlimited, + 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 unlimited - 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 unlimited. diff --git a/lib/dns/acache.c b/lib/dns/acache.c index 702fb98457..433db2cbf5 100644 --- a/lib/dns/acache.c +++ b/lib/dns/acache.c @@ -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)); diff --git a/lib/dns/adb.c b/lib/dns/adb.c index c5aa29d67a..a6fa50b899 100644 --- a/lib/dns/adb.c +++ b/lib/dns/adb.c @@ -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)); diff --git a/lib/dns/cache.c b/lib/dns/cache.c index 3d05e48e60..ba30760baa 100644 --- a/lib/dns/cache.c +++ b/lib/dns/cache.c @@ -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)); diff --git a/lib/dns/include/dns/acache.h b/lib/dns/include/dns/acache.h index 28990c2aab..754ef9f8a7 100644 --- a/lib/dns/include/dns/acache.h +++ b/lib/dns/include/dns/acache.h @@ -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. */ diff --git a/lib/dns/include/dns/adb.h b/lib/dns/include/dns/adb.h index d3a243b80f..267ae83d55 100644 --- a/lib/dns/include/dns/adb.h +++ b/lib/dns/include/dns/adb.h @@ -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 diff --git a/lib/dns/include/dns/cache.h b/lib/dns/include/dns/cache.h index e38b0abef3..bbab0e1bd7 100644 --- a/lib/dns/include/dns/cache.h +++ b/lib/dns/include/dns/cache.h @@ -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.