/* Follow canonical name as next SNAME. */
if (cname != query->sname) {
DEBUG_MSG("<= cname chain, following\n");
- (void) kr_rplan_push(&req->rplan, query->parent, cname, query->sclass, query->stype);
+ struct kr_query *next = kr_rplan_push(&req->rplan, query->parent, cname, query->sclass, query->stype);
+ kr_zonecut_set_sbelt(&next->zone_cut);
} else {
if (query->parent == NULL) {
finalize_answer(pkt, query, req);
return KNOT_STATE_PRODUCE;
}
- (void) kr_rplan_push(rplan, qry, qry->ns.name, KNOT_CLASS_IN, KNOT_RRTYPE_AAAA);
- (void) kr_rplan_push(rplan, qry, qry->ns.name, KNOT_CLASS_IN, KNOT_RRTYPE_A);
+ /* Start NS queries from root, to avoid certain cases
+ * where a NS drops out of cache and the rest is unavailable,
+ * this would lead to dependency loop in current zone cut.
+ */
+ struct kr_query *next = kr_rplan_push(rplan, qry, qry->ns.name, KNOT_CLASS_IN, KNOT_RRTYPE_AAAA);
+ kr_zonecut_set_sbelt(&next->zone_cut);
+ next = kr_rplan_push(rplan, qry, qry->ns.name, KNOT_CLASS_IN, KNOT_RRTYPE_A);
+ kr_zonecut_set_sbelt(&next->zone_cut);
qry->flags |= QUERY_AWAIT_ADDR;
return KNOT_STATE_PRODUCE;
}
return KNOT_STATE_FAIL;
}
+ /* Find closest zone cut for this query. */
+ namedb_txn_t txn;
+ if (kr_cache_txn_begin(rplan->context->cache, &txn, NAMEDB_RDONLY) != 0) {
+ kr_zonecut_set_sbelt(&qry->zone_cut);
+ } else {
+ kr_zonecut_find_cached(&qry->zone_cut, &txn, qry->timestamp.tv_sec);
+ kr_cache_txn_abort(&txn);
+ }
+
/* Initialize answer packet */
knot_pkt_t *answer = request->answer;
knot_wire_set_qr(answer->wire);
qry->parent = parent;
gettimeofday(&qry->timestamp, NULL);
add_tail(&rplan->pending, &qry->node);
-
- /* Find closest zone cut for this query. */
- namedb_txn_t txn;
kr_zonecut_init(&qry->zone_cut, name, rplan->pool);
- if (kr_cache_txn_begin(rplan->context->cache, &txn, NAMEDB_RDONLY) != 0) {
- kr_zonecut_set_sbelt(&qry->zone_cut);
- } else {
- kr_zonecut_find_cached(&qry->zone_cut, &txn, qry->timestamp.tv_sec);
- kr_cache_txn_abort(&txn);
- }
#ifndef NDEBUG
char name_str[KNOT_DNAME_MAXLEN], type_str[16];