From d5f677ea4712a53afcf5783a4e521a76c2b51535 Mon Sep 17 00:00:00 2001 From: Evan Hunt Date: Thu, 28 Feb 2013 09:36:50 -0800 Subject: [PATCH] [v9_9] accept >4g max-{,a}cache-size 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] (cherry picked from commit 2a184ff86544cc67c36e2ce6bb3ddb5ac44684b8) --- CHANGES | 7 +++++ bin/named/server.c | 42 +++++++++++++++------------- bin/tests/system/checkconf/good.conf | 1 + doc/arm/Bv9ARM-book.xml | 6 ++-- lib/dns/acache.c | 5 ++-- lib/dns/adb.c | 5 ++-- lib/dns/cache.c | 11 ++++---- lib/dns/include/dns/acache.h | 2 +- lib/dns/include/dns/adb.h | 2 +- lib/dns/include/dns/cache.h | 10 ++----- 10 files changed, 47 insertions(+), 44 deletions(-) diff --git a/CHANGES b/CHANGES index bebe0cd913..7aaf1acae2 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,10 @@ +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] + 3503. [doc] Clarify size_spec syntax. [RT #32449] 3501. [func] zone-statistics now takes three options: full, diff --git a/bin/named/server.c b/bin/named/server.c index 1688fb30f7..057f195625 100644 --- a/bin/named/server.c +++ b/bin/named/server.c @@ -1399,7 +1399,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 @@ -1666,10 +1666,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 */ @@ -1775,18 +1775,18 @@ configure_view(dns_view_t *view, cfg_obj_t *config, cfg_obj_t *vconfig, max_acache_size = ISC_UINT32_MAX; } 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); } @@ -1973,15 +1973,17 @@ configure_view(dns_view_t *view, cfg_obj_t *config, cfg_obj_t *vconfig, } 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 391c18eb99..e61aea936e 100644 --- a/doc/arm/Bv9ARM-book.xml +++ b/doc/arm/Bv9ARM-book.xml @@ -8259,8 +8259,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. 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 8028b692d4..da1d9a08c3 100644 --- a/lib/dns/adb.c +++ b/lib/dns/adb.c @@ -4128,9 +4128,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 7ba944b7bc..7b584c3a7d 100644 --- a/lib/dns/cache.c +++ b/lib/dns/cache.c @@ -136,7 +136,7 @@ struct dns_cache { char *db_type; int db_argc; char **db_argv; - isc_uint32_t size; + size_t size; /* Locked by 'filelock'. */ char *filename; @@ -1028,9 +1028,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)); @@ -1068,9 +1067,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 419111b930..6f8081d811 100644 --- a/lib/dns/include/dns/cache.h +++ b/lib/dns/include/dns/cache.h @@ -245,12 +245,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); /*%< @@ -258,12 +252,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.