]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Add separate prefetch nmhandle to ns_client_t
authorOndřej Surý <ondrej@sury.org>
Tue, 15 Sep 2020 10:55:03 +0000 (12:55 +0200)
committerOndřej Surý <ondrej@sury.org>
Thu, 1 Oct 2020 16:09:35 +0000 (18:09 +0200)
As the query_prefetch() or query_rpzfetch() could be called during
"regular" fetch, we need to introduce separate storage for attaching
the nmhandle during prefetching the records.  The query_prefetch()
and query_rpzfetch() are guarded for re-entrance by .query.prefetch
member of ns_client_t, so we can reuse the same .prefetchhandle for
both.

(cherry picked from commit d4976e0ebeb6a29a6844d83bcd4be626fb9f8fbf)

lib/ns/include/ns/client.h
lib/ns/query.c

index 33eff5938eb515037d00eaf219fe4a55254d6ada..fb7b86ffbfb0ee5a7becdba2897899df2871a841 100644 (file)
@@ -183,12 +183,13 @@ struct ns_client {
        isc_task_t *     task;
        dns_view_t *     view;
        dns_dispatch_t * dispatch;
-       isc_nmhandle_t * handle;      /* Permanent pointer to handle */
-       isc_nmhandle_t * sendhandle;  /* Waiting for send callback */
-       isc_nmhandle_t * reqhandle;   /* Waiting for request callback
-                                        (query, update, notify) */
-       isc_nmhandle_t *fetchhandle;  /* Waiting for recursive fetch */
-       isc_nmhandle_t *updatehandle; /* Waiting for update callback */
+       isc_nmhandle_t * handle;        /* Permanent pointer to handle */
+       isc_nmhandle_t * sendhandle;    /* Waiting for send callback */
+       isc_nmhandle_t * reqhandle;     /* Waiting for request callback
+                                          (query, update, notify) */
+       isc_nmhandle_t *fetchhandle;    /* Waiting for recursive fetch */
+       isc_nmhandle_t *prefetchhandle; /* Waiting for prefetch / rpzfetch */
+       isc_nmhandle_t *updatehandle;   /* Waiting for update callback */
        unsigned char * tcpbuf;
        dns_message_t * message;
        unsigned char * sendbuf;
index b16cb527b814e5f359455b7f297826b37c823e0e..207ad9ddccfc033372505a2e8ad7a439b536829f 100644 (file)
@@ -2471,7 +2471,7 @@ prefetch_done(isc_task_t *task, isc_event_t *event) {
        }
 
        free_devent(client, &event, &devent);
-       isc_nmhandle_detach(&client->fetchhandle);
+       isc_nmhandle_detach(&client->prefetchhandle);
 }
 
 static void
@@ -2514,7 +2514,7 @@ query_prefetch(ns_client_t *client, dns_name_t *qname,
                peeraddr = NULL;
        }
 
-       isc_nmhandle_attach(client->handle, &client->fetchhandle);
+       isc_nmhandle_attach(client->handle, &client->prefetchhandle);
        options = client->query.fetchoptions | DNS_FETCHOPT_PREFETCH;
        result = dns_resolver_createfetch(
                client->view->resolver, qname, rdataset->type, NULL, NULL, NULL,
@@ -2523,7 +2523,7 @@ query_prefetch(ns_client_t *client, dns_name_t *qname,
                &client->query.prefetch);
        if (result != ISC_R_SUCCESS) {
                ns_client_putrdataset(client, &tmprdataset);
-               isc_nmhandle_detach(&client->fetchhandle);
+               isc_nmhandle_detach(&client->prefetchhandle);
        }
 
        dns_rdataset_clearprefetch(rdataset);
@@ -2728,7 +2728,7 @@ query_rpzfetch(ns_client_t *client, dns_name_t *qname, dns_rdatatype_t type) {
        }
 
        options = client->query.fetchoptions;
-       isc_nmhandle_attach(client->handle, &client->fetchhandle);
+       isc_nmhandle_attach(client->handle, &client->prefetchhandle);
        result = dns_resolver_createfetch(
                client->view->resolver, qname, type, NULL, NULL, NULL, peeraddr,
                client->message->id, options, 0, NULL, client->task,
@@ -2736,7 +2736,7 @@ query_rpzfetch(ns_client_t *client, dns_name_t *qname, dns_rdatatype_t type) {
                &client->query.prefetch);
        if (result != ISC_R_SUCCESS) {
                ns_client_putrdataset(client, &tmprdataset);
-               isc_nmhandle_detach(&client->fetchhandle);
+               isc_nmhandle_detach(&client->prefetchhandle);
        }
 }