Skip to content
Snippets Groups Projects
Commit 8294954f authored by Jan Kadlec's avatar Jan Kadlec
Browse files

Optimized zone loading (remembers last used node)

parent d1f0feb0
No related branches found
No related tags found
No related merge requests found
......@@ -84,41 +84,52 @@ static bool handle_err(zone_loader_t *zl,
if (ret == KNOT_EOUTOFZONE) {
log_zone_warning("Zone %s: Ignoring out-of-zone data for %s\n",
zname ? zname : "unknown", rrname ? rrname : "unknown");
free(zname);
free(rrname);
return true;
} else {
log_zone_error("Zone %s: Cannot process record %s, stopping.\n",
zname ? zname : "unknown", rrname ? rrname : "unknown");
free(zname);
free(rrname);
return false;
}
free(zname);
free(rrname);
}
int zone_loader_step(zone_loader_t *zl, knot_rrset_t *rr)
{
assert(zl && rr);
knot_node_t *n = NULL;
if (rr->type == KNOT_RRTYPE_SOA &&
knot_node_rrset(zl->z->apex, KNOT_RRTYPE_SOA)) {
// Ignore extra SOA
knot_rrset_deep_free(&rr, true, NULL);
return KNOT_EOK;
}
knot_node_t *n;
if (zl->last_node &&
knot_dname_is_equal(zl->last_node->owner, rr->owner)) {
// Reuse hint from last addition.
n = zl->last_node;
} else {
// Search for node or create a new one
n = NULL;
}
int ret = knot_zone_contents_add_rr(zl->z, rr, &n);
if (ret < 0) {
if (!handle_err(zl, rr, ret)) {
// Fatal error
return ret;
}
// Recoverable error, returning KNOT_EOK to caller
// Recoverable error, skip record
knot_rrset_deep_free(&rr, true, NULL);
return KNOT_EOK;
} else if (ret > 0) {
knot_rrset_deep_free(&rr, true, NULL);
}
assert(n);
ret = KNOT_EOK;
zl->last_node = n;
bool sem_fatal_error = false;
err_handler_t err_handler;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment