mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-09-02 07:35:26 +00:00
Add new recursion type for refreshing stale RRset
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.
This commit is contained in:
@@ -46,6 +46,7 @@ typedef enum {
|
|||||||
RECTYPE_NORMAL,
|
RECTYPE_NORMAL,
|
||||||
RECTYPE_PREFETCH,
|
RECTYPE_PREFETCH,
|
||||||
RECTYPE_RPZ,
|
RECTYPE_RPZ,
|
||||||
|
RECTYPE_STALE_REFRESH,
|
||||||
RECTYPE_HOOK,
|
RECTYPE_HOOK,
|
||||||
RECTYPE_COUNT,
|
RECTYPE_COUNT,
|
||||||
} ns_query_rectype_t;
|
} ns_query_rectype_t;
|
||||||
@@ -60,6 +61,8 @@ typedef enum {
|
|||||||
((client)->query.recursions[RECTYPE_PREFETCH].handle)
|
((client)->query.recursions[RECTYPE_PREFETCH].handle)
|
||||||
#define HANDLE_RECTYPE_RPZ(client) \
|
#define HANDLE_RECTYPE_RPZ(client) \
|
||||||
((client)->query.recursions[RECTYPE_RPZ].handle)
|
((client)->query.recursions[RECTYPE_RPZ].handle)
|
||||||
|
#define HANDLE_RECTYPE_STALE_REFRESH(client) \
|
||||||
|
((client)->query.recursions[RECTYPE_STALE_REFRESH].handle)
|
||||||
#define HANDLE_RECTYPE_HOOK(client) \
|
#define HANDLE_RECTYPE_HOOK(client) \
|
||||||
((client)->query.recursions[RECTYPE_HOOK].handle)
|
((client)->query.recursions[RECTYPE_HOOK].handle)
|
||||||
|
|
||||||
@@ -73,6 +76,8 @@ typedef enum {
|
|||||||
((client)->query.recursions[RECTYPE_PREFETCH].fetch)
|
((client)->query.recursions[RECTYPE_PREFETCH].fetch)
|
||||||
#define FETCH_RECTYPE_RPZ(client) \
|
#define FETCH_RECTYPE_RPZ(client) \
|
||||||
((client)->query.recursions[RECTYPE_RPZ].fetch)
|
((client)->query.recursions[RECTYPE_RPZ].fetch)
|
||||||
|
#define FETCH_RECTYPE_STALE_REFRESH(client) \
|
||||||
|
((client)->query.recursions[RECTYPE_STALE_REFRESH].fetch)
|
||||||
#define FETCH_RECTYPE_HOOK(client) \
|
#define FETCH_RECTYPE_HOOK(client) \
|
||||||
((client)->query.recursions[RECTYPE_HOOK].fetch)
|
((client)->query.recursions[RECTYPE_HOOK].fetch)
|
||||||
|
|
||||||
@@ -86,6 +91,8 @@ typedef enum {
|
|||||||
((client)->query.recursions[RECTYPE_PREFETCH].quota)
|
((client)->query.recursions[RECTYPE_PREFETCH].quota)
|
||||||
#define QUOTA_RECTYPE_RPZ(client) \
|
#define QUOTA_RECTYPE_RPZ(client) \
|
||||||
((client)->query.recursions[RECTYPE_RPZ].quota)
|
((client)->query.recursions[RECTYPE_RPZ].quota)
|
||||||
|
#define QUOTA_RECTYPE_STALE_REFRESH(client) \
|
||||||
|
((client)->query.recursions[RECTYPE_STALE_REFRESH].quota)
|
||||||
#define QUOTA_RECTYPE_HOOK(client) \
|
#define QUOTA_RECTYPE_HOOK(client) \
|
||||||
((client)->query.recursions[RECTYPE_HOOK].quota)
|
((client)->query.recursions[RECTYPE_HOOK].quota)
|
||||||
|
|
||||||
|
@@ -2523,7 +2523,7 @@ recursionquotatype_detach(ns_client_t *client,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
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) {
|
ns_query_rectype_t recursion_type) {
|
||||||
dns_fetchevent_t *devent = (dns_fetchevent_t *)event;
|
dns_fetchevent_t *devent = (dns_fetchevent_t *)event;
|
||||||
isc_nmhandle_t **handlep;
|
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(NS_CLIENT_VALID(client));
|
||||||
REQUIRE(task == client->manager->task);
|
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;
|
handlep = &client->query.recursions[recursion_type].handle;
|
||||||
fetchp = &client->query.recursions[recursion_type].fetch;
|
fetchp = &client->query.recursions[recursion_type].fetch;
|
||||||
@@ -2557,12 +2557,17 @@ cleanup_after_fetch(isc_task_t *task, isc_event_t *event,
|
|||||||
|
|
||||||
static void
|
static void
|
||||||
prefetch_done(isc_task_t *task, isc_event_t *event) {
|
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
|
static void
|
||||||
rpzfetch_done(isc_task_t *task, isc_event_t *event) {
|
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;
|
options = client->query.fetchoptions;
|
||||||
action = rpzfetch_done;
|
action = rpzfetch_done;
|
||||||
break;
|
break;
|
||||||
|
case RECTYPE_REFRESH:
|
||||||
|
options = client->query.fetchoptions;
|
||||||
|
action = refresh_done;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
UNREACHABLE();
|
UNREACHABLE();
|
||||||
}
|
}
|
||||||
@@ -2646,6 +2655,20 @@ query_prefetch(ns_client_t *client, dns_name_t *qname,
|
|||||||
ns_statscounter_prefetch);
|
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
|
static void
|
||||||
rpz_clean(dns_zone_t **zonep, dns_db_t **dbp, dns_dbnode_t **nodep,
|
rpz_clean(dns_zone_t **zonep, dns_db_t **dbp, dns_dbnode_t **nodep,
|
||||||
dns_rdataset_t **rdatasetp) {
|
dns_rdataset_t **rdatasetp) {
|
||||||
|
Reference in New Issue
Block a user