]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Add new recursion type for refreshing stale RRset
authorMatthijs Mekking <matthijs@isc.org>
Wed, 28 Sep 2022 13:13:11 +0000 (15:13 +0200)
committerMatthijs Mekking <matthijs@isc.org>
Wed, 5 Oct 2022 06:20:48 +0000 (08:20 +0200)
Refreshing a stale RRset is similar to a prefetch query, so we can
refactor this code to use the new recursion types introduced in !5883.

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

index c1c7b5e430d2839aec3f1029841e8fd9ad1ffa48..6413326bad8397deec08627bd3d6360d340d8f1b 100644 (file)
@@ -46,6 +46,7 @@ typedef enum {
        RECTYPE_NORMAL,
        RECTYPE_PREFETCH,
        RECTYPE_RPZ,
+       RECTYPE_STALE_REFRESH,
        RECTYPE_HOOK,
        RECTYPE_COUNT,
 } ns_query_rectype_t;
@@ -60,6 +61,8 @@ typedef enum {
        ((client)->query.recursions[RECTYPE_PREFETCH].handle)
 #define HANDLE_RECTYPE_RPZ(client) \
        ((client)->query.recursions[RECTYPE_RPZ].handle)
+#define HANDLE_RECTYPE_STALE_REFRESH(client) \
+       ((client)->query.recursions[RECTYPE_STALE_REFRESH].handle)
 #define HANDLE_RECTYPE_HOOK(client) \
        ((client)->query.recursions[RECTYPE_HOOK].handle)
 
@@ -73,6 +76,8 @@ typedef enum {
        ((client)->query.recursions[RECTYPE_PREFETCH].fetch)
 #define FETCH_RECTYPE_RPZ(client) \
        ((client)->query.recursions[RECTYPE_RPZ].fetch)
+#define FETCH_RECTYPE_STALE_REFRESH(client) \
+       ((client)->query.recursions[RECTYPE_STALE_REFRESH].fetch)
 #define FETCH_RECTYPE_HOOK(client) \
        ((client)->query.recursions[RECTYPE_HOOK].fetch)
 
@@ -86,6 +91,8 @@ typedef enum {
        ((client)->query.recursions[RECTYPE_PREFETCH].quota)
 #define QUOTA_RECTYPE_RPZ(client) \
        ((client)->query.recursions[RECTYPE_RPZ].quota)
+#define QUOTA_RECTYPE_STALE_REFRESH(client) \
+       ((client)->query.recursions[RECTYPE_STALE_REFRESH].quota)
 #define QUOTA_RECTYPE_HOOK(client) \
        ((client)->query.recursions[RECTYPE_HOOK].quota)
 
index ebdd73ee3183ba8e9ef69f49be061fe38fd81aa2..8039d0f439a61b51e43790b3b3f7cd5c78839312 100644 (file)
@@ -2523,7 +2523,7 @@ recursionquotatype_detach(ns_client_t *client,
 }
 
 static void
-cleanup_after_fetch(isc_task_t *task, isc_event_t *event,
+cleanup_after_fetch(isc_task_t *task, isc_event_t *event, const char *ctracestr,
                    ns_query_rectype_t recursion_type) {
        dns_fetchevent_t *devent = (dns_fetchevent_t *)event;
        isc_nmhandle_t **handlep;
@@ -2537,7 +2537,7 @@ cleanup_after_fetch(isc_task_t *task, isc_event_t *event,
        REQUIRE(NS_CLIENT_VALID(client));
        REQUIRE(task == client->manager->task);
 
-       CTRACE(ISC_LOG_DEBUG(3), "prefetch_done");
+       CTRACE(ISC_LOG_DEBUG(3), ctracestr);
 
        handlep = &client->query.recursions[recursion_type].handle;
        fetchp = &client->query.recursions[recursion_type].fetch;
@@ -2557,12 +2557,17 @@ cleanup_after_fetch(isc_task_t *task, isc_event_t *event,
 
 static void
 prefetch_done(isc_task_t *task, isc_event_t *event) {
-       cleanup_after_fetch(task, event, RECTYPE_PREFETCH);
+       cleanup_after_fetch(task, event, "prefetch_done", RECTYPE_PREFETCH);
 }
 
 static void
 rpzfetch_done(isc_task_t *task, isc_event_t *event) {
-       cleanup_after_fetch(task, event, RECTYPE_RPZ);
+       cleanup_after_fetch(task, event, "rpzfetch_done", RECTYPE_RPZ);
+}
+
+static void
+refresh_done(isc_task_t *task, isc_event_t *event) {
+       cleanup_after_fetch(task, event, "refresh_done", RECTYPE_REFRESH);
 }
 
 /*
@@ -2606,6 +2611,10 @@ fetch_and_forget(ns_client_t *client, dns_name_t *qname, dns_rdatatype_t qtype,
                options = client->query.fetchoptions;
                action = rpzfetch_done;
                break;
+       case RECTYPE_REFRESH:
+               options = client->query.fetchoptions;
+               action = refresh_done;
+               break;
        default:
                UNREACHABLE();
        }
@@ -2646,6 +2655,20 @@ query_prefetch(ns_client_t *client, dns_name_t *qname,
                           ns_statscounter_prefetch);
 }
 
+/*
+static void
+query_refresh(ns_client_t *client, dns_name_t *qname,
+              dns_rdataset_t *rdataset) {
+       CTRACE(ISC_LOG_DEBUG(3), "query_refresh");
+
+       if (FETCH_RECTYPE_REFRESH(client) != NULL) {
+               return;
+       }
+
+       fetch_and_forget(client, qname, rdataset->type, RECTYPE_REFRESH);
+}
+*/
+
 static void
 rpz_clean(dns_zone_t **zonep, dns_db_t **dbp, dns_dbnode_t **nodep,
          dns_rdataset_t **rdatasetp) {