{
struct kr_cache_txn txn;
int ret = 0;
+
+ /* If at/subdomain of parent zone cut, start top-down search */
+ struct kr_query *parent = qry->parent;
+ if (parent && knot_dname_in(parent->zone_cut.name, qry->sname)) {
+ return kr_zonecut_set_sbelt(req->ctx, &qry->zone_cut);
+ }
+ /* Find closest zone cut from cache */
if (kr_cache_txn_begin(&req->ctx->cache, &txn, NAMEDB_RDONLY) != 0) {
ret = kr_zonecut_set_sbelt(req->ctx, &qry->zone_cut);
} else {
- /* If at/subdomain of parent zone cut, start from 'one up' to avoid loops */
- struct kr_query *parent = qry->parent;
- const knot_dname_t *start_from = qry->sname;
- if (parent && knot_dname_in(parent->zone_cut.name, qry->sname)) {
- start_from = parent->zone_cut.name;
- }
- /* Find closest zone cut from cache */
- ret = kr_zonecut_find_cached(req->ctx, &qry->zone_cut, start_from, &txn, qry->timestamp.tv_sec);
+ ret = kr_zonecut_find_cached(req->ctx, &qry->zone_cut, qry->sname, &txn, qry->timestamp.tv_sec);
kr_cache_txn_abort(&txn);
}
return ret;