]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
minor view refactoring
authorEvan Hunt <each@isc.org>
Tue, 10 May 2022 19:48:31 +0000 (12:48 -0700)
committerEvan Hunt <each@isc.org>
Fri, 13 May 2022 20:36:10 +0000 (13:36 -0700)
- eliminate dns_view_flushanddetach(), which was only called from
  one place; instead, we now call a function dns_view_flushonshutdown()
  which sets the view up to flush zones when it is detached normally
  with dns_view_detach().
- cleaned up code in dns_view_create().

bin/named/server.c
lib/dns/include/dns/request.h
lib/dns/include/dns/view.h
lib/dns/view.c

index b5a2118e20dde9114f210022ecace2a323b56d37..043205b4faaac2cf9c5f84b34b028246156203a1 100644 (file)
@@ -9917,11 +9917,8 @@ shutdown_server(isc_task_t *task, isc_event_t *event) {
             view = view_next) {
                view_next = ISC_LIST_NEXT(view, link);
                ISC_LIST_UNLINK(server->viewlist, view, link);
-               if (flush) {
-                       dns_view_flushanddetach(&view);
-               } else {
-                       dns_view_detach(&view);
-               }
+               dns_view_flushonshutdown(view, flush);
+               dns_view_detach(&view);
        }
 
        /*
index bf17171edd00baf0ad3992e94e9422e985809cbe..8dbee8c9ffa4a425845072b0c72680279800ee3a 100644 (file)
@@ -65,8 +65,6 @@ dns_requestmgr_create(isc_mem_t *mctx, isc_taskmgr_t *taskmgr,
  *
  *\li  'mctx' is a valid memory context.
  *
- *\li  'socketmgr' is a valid socket manager.
- *
  *\li  'taskmgr' is a valid task manager.
  *
  *\li  'dispatchv4' is a valid dispatcher with an IPv4 UDP socket, or is NULL.
index 69edc415345a99ade8078fa7e0c4f96237ca5c7b..caa921ee8cacc8c0e33ac30c16dcb58aa891a5ce 100644 (file)
@@ -298,7 +298,8 @@ dns_view_create(isc_mem_t *mctx, dns_rdataclass_t rdclass, const char *name,
 void
 dns_view_attach(dns_view_t *source, dns_view_t **targetp);
 /*%<
- * Attach '*targetp' to 'source'.
+ * Attach '*targetp' to 'source', incrementing the view's reference
+ * counter.
  *
  * Requires:
  *
@@ -316,22 +317,12 @@ dns_view_attach(dns_view_t *source, dns_view_t **targetp);
 void
 dns_view_detach(dns_view_t **viewp);
 /*%<
- * Detach '*viewp' from its view.
- *
- * Requires:
- *
- *\li  'viewp' points to a valid dns_view_t *
- *
- * Ensures:
- *
- *\li  *viewp is NULL.
- */
-
-void
-dns_view_flushanddetach(dns_view_t **viewp);
-/*%<
- * Detach '*viewp' from its view.  If this was the last reference
- * uncommitted changed in zones will be flushed to disk.
+ * Detach '*viewp' and decrement the view's reference counter.  If this was
+ * the last reference, then the associated resolver, requestmgr, ADB and
+ * zones will be shut down; if dns_view_flushonshutdown() has been called
+ * with 'true', uncommitted changed in zones will also be flushed to disk.
+ * The view will not be fully destroyed, however, until the weak references
+ * (see below) reach zero as well.
  *
  * Requires:
  *
@@ -345,7 +336,13 @@ dns_view_flushanddetach(dns_view_t **viewp);
 void
 dns_view_weakattach(dns_view_t *source, dns_view_t **targetp);
 /*%<
- * Weakly attach '*targetp' to 'source'.
+ * Attach '*targetp' to 'source', incrementing the view's weak reference
+ * counter.
+ *
+ * Weak references are used by objects such as the resolver, requestmgr,
+ * ADB, and zones, which are subsidiary to the view; they need the view
+ * object to remain in existence as long as they persist, but they do
+ * not need to prevent it from being shut down.
  *
  * Requires:
  *
@@ -363,7 +360,8 @@ dns_view_weakattach(dns_view_t *source, dns_view_t **targetp);
 void
 dns_view_weakdetach(dns_view_t **targetp);
 /*%<
- * Detach '*viewp' from its view.
+ * Detach '*viewp' from its view. If this is the last weak reference,
+ * the view will be destroyed.
  *
  * Requires:
  *
@@ -1359,4 +1357,13 @@ dns_view_staleanswerenabled(dns_view_t *view);
  *\li  'view' to be valid.
  */
 
+void
+dns_view_flushonshutdown(dns_view_t *view, bool flush);
+/*%<
+ * Inform the view that the zones should (or should not) be flushed to
+ * disk on shutdown.
+ *
+ * Requires:
+ *\li  'view' to be valid.
+ */
 ISC_LANG_ENDDECLS
index 3a08d42367665758526af52212a6933803c36995..f7a3ac040010734760967952c329445f5775f43e 100644 (file)
@@ -61,6 +61,7 @@
 #include <dns/time.h>
 #include <dns/transport.h>
 #include <dns/tsig.h>
+#include <dns/view.h>
 #include <dns/zone.h>
 #include <dns/zt.h>
 
@@ -91,30 +92,66 @@ req_shutdown(isc_task_t *task, isc_event_t *event);
 isc_result_t
 dns_view_create(isc_mem_t *mctx, dns_rdataclass_t rdclass, const char *name,
                dns_view_t **viewp) {
-       dns_view_t *view;
+       dns_view_t *view = NULL;
        isc_result_t result;
        char buffer[1024];
 
-       /*
-        * Create a view.
-        */
-
        REQUIRE(name != NULL);
        REQUIRE(viewp != NULL && *viewp == NULL);
 
+       result = isc_file_sanitize(NULL, name, "nta", buffer, sizeof(buffer));
+       if (result != ISC_R_SUCCESS) {
+               return (result);
+       }
+
        view = isc_mem_get(mctx, sizeof(*view));
+       *view = (dns_view_t){
+               .rdclass = rdclass,
+               .name = isc_mem_strdup(mctx, name),
+               .nta_file = isc_mem_strdup(mctx, buffer),
+               .recursion = true,
+               .enablevalidation = true,
+               .minimalresponses = dns_minimal_no,
+               .transfer_format = dns_one_answer,
+               .msgcompression = true,
+               .provideixfr = true,
+               .maxcachettl = 7 * 24 * 3600,
+               .maxncachettl = 3 * 3600,
+               .dstport = 53,
+               .staleanswerttl = 1,
+               .staleanswersok = dns_stale_answer_conf,
+               .sendcookie = true,
+               .synthfromdnssec = true,
+               .trust_anchor_telemetry = true,
+               .root_key_sentinel = true,
+       };
 
-       view->nta_file = NULL;
-       view->mctx = NULL;
-       isc_mem_attach(mctx, &view->mctx);
-       view->name = isc_mem_strdup(mctx, name);
+       isc_refcount_init(&view->references, 1);
+       isc_refcount_init(&view->weakrefs, 1);
 
-       result = isc_file_sanitize(NULL, view->name, "nta", buffer,
-                                  sizeof(buffer));
-       if (result != ISC_R_SUCCESS) {
-               goto cleanup_name;
-       }
-       view->nta_file = isc_mem_strdup(mctx, buffer);
+       dns_fixedname_init(&view->redirectfixed);
+
+       ISC_LIST_INIT(view->dlz_searched);
+       ISC_LIST_INIT(view->dlz_unsearched);
+       ISC_LIST_INIT(view->dns64);
+
+       ISC_LINK_INIT(view, link);
+
+       ISC_EVENT_INIT(&view->resevent, sizeof(view->resevent), 0, NULL,
+                      DNS_EVENT_VIEWRESSHUTDOWN, resolver_shutdown, view, NULL,
+                      NULL, NULL);
+       ISC_EVENT_INIT(&view->adbevent, sizeof(view->adbevent), 0, NULL,
+                      DNS_EVENT_VIEWADBSHUTDOWN, adb_shutdown, view, NULL,
+                      NULL, NULL);
+       ISC_EVENT_INIT(&view->reqevent, sizeof(view->reqevent), 0, NULL,
+                      DNS_EVENT_VIEWREQSHUTDOWN, req_shutdown, view, NULL,
+                      NULL, NULL);
+
+       atomic_init(&view->attributes,
+                   (DNS_VIEWATTR_RESSHUTDOWN | DNS_VIEWATTR_ADBSHUTDOWN |
+                    DNS_VIEWATTR_REQSHUTDOWN));
+
+       isc_mem_attach(mctx, &view->mctx);
 
        isc_mutex_init(&view->lock);
 
@@ -128,9 +165,6 @@ dns_view_create(isc_mem_t *mctx, dns_rdataclass_t rdclass, const char *name,
                goto cleanup_mutex;
        }
 
-       view->secroots_priv = NULL;
-       view->ntatable_priv = NULL;
-       view->fwdtable = NULL;
        result = dns_fwdtable_create(mctx, &view->fwdtable);
        if (result != ISC_R_SUCCESS) {
                UNEXPECTED_ERROR(__FILE__, __LINE__,
@@ -140,130 +174,16 @@ dns_view_create(isc_mem_t *mctx, dns_rdataclass_t rdclass, const char *name,
                goto cleanup_zt;
        }
 
-       view->cache = NULL;
-       view->cachedb = NULL;
-       ISC_LIST_INIT(view->dlz_searched);
-       ISC_LIST_INIT(view->dlz_unsearched);
-       view->hints = NULL;
-       view->resolver = NULL;
-       view->adb = NULL;
-       view->requestmgr = NULL;
-       view->rdclass = rdclass;
-       view->frozen = false;
-       view->task = NULL;
-       isc_refcount_init(&view->references, 1);
-       isc_refcount_init(&view->weakrefs, 1);
-       atomic_init(&view->attributes,
-                   (DNS_VIEWATTR_RESSHUTDOWN | DNS_VIEWATTR_ADBSHUTDOWN |
-                    DNS_VIEWATTR_REQSHUTDOWN));
-       view->transports = NULL;
-       view->statickeys = NULL;
-       view->dynamickeys = NULL;
-       view->matchclients = NULL;
-       view->matchdestinations = NULL;
-       view->matchrecursiveonly = false;
        result = dns_tsigkeyring_create(view->mctx, &view->dynamickeys);
        if (result != ISC_R_SUCCESS) {
                goto cleanup_weakrefs;
        }
-       view->peers = NULL;
-       view->order = NULL;
-       view->delonly = NULL;
-       view->rootdelonly = false;
-       view->rootexclude = NULL;
-       view->adbstats = NULL;
-       view->resstats = NULL;
-       view->resquerystats = NULL;
-       view->cacheshared = false;
-       ISC_LIST_INIT(view->dns64);
-       view->dns64cnt = 0;
 
-       /*
-        * Initialize configuration data with default values.
-        */
-       view->recursion = true;
-       view->qminimization = false;
-       view->qmin_strict = false;
-       view->auth_nxdomain = false; /* Was true in BIND 8 */
-       view->enablevalidation = true;
-       view->acceptexpired = false;
-       view->use_glue_cache = false;
-       view->minimal_any = false;
-       view->minimalresponses = dns_minimal_no;
-       view->transfer_format = dns_one_answer;
-       view->cacheacl = NULL;
-       view->cacheonacl = NULL;
-       view->checknames = false;
-       view->queryacl = NULL;
-       view->queryonacl = NULL;
-       view->recursionacl = NULL;
-       view->recursiononacl = NULL;
-       view->sortlist = NULL;
-       view->transferacl = NULL;
-       view->notifyacl = NULL;
-       view->updateacl = NULL;
-       view->upfwdacl = NULL;
-       view->denyansweracl = NULL;
-       view->nocasecompress = NULL;
-       view->msgcompression = true;
-       view->answeracl_exclude = NULL;
-       view->denyanswernames = NULL;
-       view->answernames_exclude = NULL;
-       view->rrl = NULL;
-       view->provideixfr = true;
-       view->maxcachettl = 7 * 24 * 3600;
-       view->maxncachettl = 3 * 3600;
-       view->mincachettl = 0;
-       view->minncachettl = 0;
-       view->nta_lifetime = 0;
-       view->nta_recheck = 0;
-       view->prefetch_eligible = 0;
-       view->prefetch_trigger = 0;
-       view->dstport = 53;
-       view->preferred_glue = 0;
-       view->flush = false;
-       view->maxudp = 0;
-       view->staleanswerttl = 1;
-       view->staleanswersok = dns_stale_answer_conf;
-       view->staleanswersenable = false;
-       view->nocookieudp = 0;
-       view->padding = 0;
-       view->pad_acl = NULL;
-       view->maxbits = 0;
-       view->rpzs = NULL;
-       view->catzs = NULL;
-       view->managed_keys = NULL;
-       view->redirect = NULL;
-       view->redirectzone = NULL;
-       dns_fixedname_init(&view->redirectfixed);
-       view->requestnsid = false;
-       view->sendcookie = true;
-       view->requireservercookie = false;
-       view->synthfromdnssec = true;
-       view->trust_anchor_telemetry = true;
-       view->root_key_sentinel = true;
-       view->new_zone_dir = NULL;
-       view->new_zone_file = NULL;
-       view->new_zone_db = NULL;
-       view->new_zone_dbenv = NULL;
-       view->new_zone_mapsize = 0ULL;
-       view->new_zone_config = NULL;
-       view->cfg_destroy = NULL;
-       view->fail_ttl = 0;
-       view->failcache = NULL;
        result = dns_badcache_init(view->mctx, DNS_VIEW_FAILCACHESIZE,
                                   &view->failcache);
        if (result != ISC_R_SUCCESS) {
                goto cleanup_dynkeys;
        }
-       view->v6bias = 0;
-       view->dtenv = NULL;
-       view->dttypes = 0;
-
-       view->plugins = NULL;
-       view->plugins_free = NULL;
-       view->hooktable = NULL;
-       view->hooktable_free = NULL;
 
        isc_mutex_init(&view->new_zone_lock);
 
@@ -282,19 +202,7 @@ dns_view_create(isc_mem_t *mctx, dns_rdataclass_t rdclass, const char *name,
                goto cleanup_peerlist;
        }
 
-       ISC_LINK_INIT(view, link);
-       ISC_EVENT_INIT(&view->resevent, sizeof(view->resevent), 0, NULL,
-                      DNS_EVENT_VIEWRESSHUTDOWN, resolver_shutdown, view, NULL,
-                      NULL, NULL);
-       ISC_EVENT_INIT(&view->adbevent, sizeof(view->adbevent), 0, NULL,
-                      DNS_EVENT_VIEWADBSHUTDOWN, adb_shutdown, view, NULL,
-                      NULL, NULL);
-       ISC_EVENT_INIT(&view->reqevent, sizeof(view->reqevent), 0, NULL,
-                      DNS_EVENT_VIEWREQSHUTDOWN, req_shutdown, view, NULL,
-                      NULL, NULL);
-       view->viewlist = NULL;
        view->magic = DNS_VIEW_MAGIC;
-
        *viewp = view;
 
        return (ISC_R_SUCCESS);
@@ -311,7 +219,6 @@ cleanup_order:
 
 cleanup_new_zone_lock:
        isc_mutex_destroy(&view->new_zone_lock);
-
        dns_badcache_destroy(&view->failcache);
 
 cleanup_dynkeys:
@@ -342,7 +249,6 @@ cleanup_mutex:
                isc_mem_free(mctx, view->nta_file);
        }
 
-cleanup_name:
        isc_mem_free(mctx, view->name);
        isc_mem_putanddetach(&view->mctx, view, sizeof(*view));
 
@@ -622,15 +528,14 @@ dns_view_attach(dns_view_t *source, dns_view_t **targetp) {
        *targetp = source;
 }
 
-static void
-view_flushanddetach(dns_view_t **viewp, bool flush) {
+void
+dns_view_detach(dns_view_t **viewp) {
+       dns_view_t *view = NULL;
+
        REQUIRE(viewp != NULL && DNS_VIEW_VALID(*viewp));
-       dns_view_t *view = *viewp;
-       *viewp = NULL;
 
-       if (flush) {
-               view->flush = flush;
-       }
+       view = *viewp;
+       *viewp = NULL;
 
        if (isc_refcount_decrement(&view->references) == 1) {
                dns_zone_t *mkzone = NULL, *rdzone = NULL;
@@ -697,16 +602,6 @@ view_flushanddetach(dns_view_t **viewp, bool flush) {
        }
 }
 
-void
-dns_view_flushanddetach(dns_view_t **viewp) {
-       view_flushanddetach(viewp, true);
-}
-
-void
-dns_view_detach(dns_view_t **viewp) {
-       view_flushanddetach(viewp, false);
-}
-
 static isc_result_t
 dialup(dns_zone_t *zone, void *dummy) {
        UNUSED(dummy);
@@ -734,11 +629,13 @@ dns_view_weakattach(dns_view_t *source, dns_view_t **targetp) {
 
 void
 dns_view_weakdetach(dns_view_t **viewp) {
-       dns_view_t *view;
+       dns_view_t *view = NULL;
 
        REQUIRE(viewp != NULL);
+
        view = *viewp;
        *viewp = NULL;
+
        REQUIRE(DNS_VIEW_VALID(view));
 
        if (isc_refcount_decrement(&view->weakrefs) == 1) {
@@ -813,7 +710,7 @@ dns_view_createresolver(dns_view_t *view, isc_taskmgr_t *taskmgr,
                        dns_dispatch_t *dispatchv4,
                        dns_dispatch_t *dispatchv6) {
        isc_result_t result;
-       isc_event_t *event;
+       isc_event_t *event = NULL;
        isc_mem_t *mctx = NULL;
 
        REQUIRE(DNS_VIEW_VALID(view));
@@ -2581,3 +2478,10 @@ dns_view_staleanswerenabled(dns_view_t *view) {
 
        return (result);
 }
+
+void
+dns_view_flushonshutdown(dns_view_t *view, bool flush) {
+       REQUIRE(DNS_VIEW_VALID(view));
+
+       view->flush = flush;
+}