mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-08-29 13:38:26 +00:00
Replace rbt_addnode with qp_insert
Replace dns_rbt_addnode calls with dns_qp_insert. With QP, it sometimes makes more sense to first lookup the name and see if there is an existing node (rather than create new data, insert, find out a node already exists, and destroy the data again). This is done with dns_qp_getname(), which is more lightweight than dns_qp_lookup(), and we are only interested in if there is already a leaf node for this name or not.
This commit is contained in:
parent
bb4464181a
commit
c53b95e134
@ -1608,14 +1608,17 @@ delegating_type(dns_qpdb_t *qpdb, dns_rbtnode_t *node, dns_typepair_t type) {
|
|||||||
static isc_result_t
|
static isc_result_t
|
||||||
loadnode(dns_qpdb_t *qpdb, const dns_name_t *name, dns_rbtnode_t **nodep,
|
loadnode(dns_qpdb_t *qpdb, const dns_name_t *name, dns_rbtnode_t **nodep,
|
||||||
bool hasnsec) {
|
bool hasnsec) {
|
||||||
isc_result_t noderesult, nsecresult, tmpresult;
|
isc_result_t noderesult, nsecresult;
|
||||||
dns_rbtnode_t *nsecnode = NULL, *node = NULL;
|
dns_rbtnode_t *nsecnode = NULL, *node = NULL;
|
||||||
|
|
||||||
noderesult = dns_rbt_addnode(qpdb->tree, name, &node);
|
noderesult = dns_qp_getname(qpdb->tree, name, (void **)&node, NULL);
|
||||||
if (!hasnsec) {
|
if (noderesult != ISC_R_SUCCESS) {
|
||||||
goto done;
|
INSIST(node == NULL);
|
||||||
}
|
node = dns_qpdata_create(qpdb, name);
|
||||||
if (noderesult == ISC_R_EXISTS) {
|
noderesult = dns_qp_insert(qpdb->tree, node, 0);
|
||||||
|
INSIST(noderesult == ISC_R_SUCCESS);
|
||||||
|
dns_qpdata_unref(node);
|
||||||
|
} else if (noderesult == ISC_R_SUCCESS) {
|
||||||
/*
|
/*
|
||||||
* Add a node to the auxiliary NSEC tree for an old node
|
* Add a node to the auxiliary NSEC tree for an old node
|
||||||
* just now getting an NSEC record.
|
* just now getting an NSEC record.
|
||||||
@ -1623,7 +1626,11 @@ loadnode(dns_qpdb_t *qpdb, const dns_name_t *name, dns_rbtnode_t **nodep,
|
|||||||
if (node->nsec == DNS_DB_NSEC_HAS_NSEC) {
|
if (node->nsec == DNS_DB_NSEC_HAS_NSEC) {
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
} else if (noderesult != ISC_R_SUCCESS) {
|
} else {
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!hasnsec) {
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1635,14 +1642,8 @@ loadnode(dns_qpdb_t *qpdb, const dns_name_t *name, dns_rbtnode_t **nodep,
|
|||||||
* Add nodes to the auxiliary tree after corresponding nodes have
|
* Add nodes to the auxiliary tree after corresponding nodes have
|
||||||
* been added to the main tree.
|
* been added to the main tree.
|
||||||
*/
|
*/
|
||||||
nsecresult = dns_rbt_addnode(qpdb->nsec, name, &nsecnode);
|
nsecresult = dns_qp_getname(qpdb->nsec, name, (void **)&nsecnode, NULL);
|
||||||
if (nsecresult == ISC_R_SUCCESS) {
|
if (nsecresult == ISC_R_SUCCESS) {
|
||||||
nsecnode->nsec = DNS_DB_NSEC_NSEC;
|
|
||||||
node->nsec = DNS_DB_NSEC_HAS_NSEC;
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (nsecresult == ISC_R_EXISTS) {
|
|
||||||
#if 1 /* 0 */
|
#if 1 /* 0 */
|
||||||
isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,
|
isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,
|
||||||
DNS_LOGMODULE_CACHE, ISC_LOG_WARNING,
|
DNS_LOGMODULE_CACHE, ISC_LOG_WARNING,
|
||||||
@ -1650,28 +1651,14 @@ loadnode(dns_qpdb_t *qpdb, const dns_name_t *name, dns_rbtnode_t **nodep,
|
|||||||
#endif /* if 1 */
|
#endif /* if 1 */
|
||||||
node->nsec = DNS_DB_NSEC_HAS_NSEC;
|
node->nsec = DNS_DB_NSEC_HAS_NSEC;
|
||||||
goto done;
|
goto done;
|
||||||
|
} else {
|
||||||
|
INSIST(nsecnode == NULL);
|
||||||
|
nsecnode = dns_qpdata_create(qpdb, name);
|
||||||
|
nsecresult = dns_qp_insert(qpdb->nsec, nsecnode, 0);
|
||||||
|
INSIST(nsecresult == ISC_R_SUCCESS);
|
||||||
}
|
}
|
||||||
|
nsecnode->nsec = DNS_DB_NSEC_NSEC;
|
||||||
if (noderesult == ISC_R_SUCCESS) {
|
node->nsec = DNS_DB_NSEC_HAS_NSEC;
|
||||||
/*
|
|
||||||
* Remove the node we just added above.
|
|
||||||
*/
|
|
||||||
tmpresult = dns_rbt_deletenode(qpdb->tree, node, false);
|
|
||||||
if (tmpresult != ISC_R_SUCCESS) {
|
|
||||||
isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,
|
|
||||||
DNS_LOGMODULE_CACHE, ISC_LOG_WARNING,
|
|
||||||
"loading_addrdataset: "
|
|
||||||
"dns_rbt_deletenode: %s after "
|
|
||||||
"dns_rbt_addnode(NSEC): %s",
|
|
||||||
isc_result_totext(tmpresult),
|
|
||||||
isc_result_totext(noderesult));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Set the error condition to be returned.
|
|
||||||
*/
|
|
||||||
noderesult = nsecresult;
|
|
||||||
|
|
||||||
done:
|
done:
|
||||||
if (noderesult == ISC_R_SUCCESS || noderesult == ISC_R_EXISTS) {
|
if (noderesult == ISC_R_SUCCESS || noderesult == ISC_R_EXISTS) {
|
||||||
@ -1731,10 +1718,15 @@ loading_addrdataset(void *arg, const dns_name_t *name,
|
|||||||
if (rdataset->type == dns_rdatatype_nsec3 ||
|
if (rdataset->type == dns_rdatatype_nsec3 ||
|
||||||
rdataset->covers == dns_rdatatype_nsec3)
|
rdataset->covers == dns_rdatatype_nsec3)
|
||||||
{
|
{
|
||||||
result = dns_rbt_addnode(qpdb->nsec3, name, &node);
|
result = dns_qp_getname(qpdb->nsec3, name, (void **)&node,
|
||||||
if (result == ISC_R_SUCCESS) {
|
NULL);
|
||||||
node->nsec = DNS_DB_NSEC_NSEC3;
|
if (result != ISC_R_SUCCESS) {
|
||||||
|
INSIST(node == NULL);
|
||||||
|
node = dns_qpdata_create(qpdb, name);
|
||||||
|
result = dns_qp_insert(qpdb->nsec3, node, 0);
|
||||||
|
INSIST(result == ISC_R_SUCCESS);
|
||||||
}
|
}
|
||||||
|
node->nsec = DNS_DB_NSEC_NSEC3;
|
||||||
} else if (rdataset->type == dns_rdatatype_nsec) {
|
} else if (rdataset->type == dns_rdatatype_nsec) {
|
||||||
result = loadnode(qpdb, name, &node, true);
|
result = loadnode(qpdb, name, &node, true);
|
||||||
} else {
|
} else {
|
||||||
@ -2462,13 +2454,17 @@ dns__qpzone_wildcardmagic(dns_qpdb_t *qpdb, const dns_name_t *name, bool lock) {
|
|||||||
INSIST(n >= 2);
|
INSIST(n >= 2);
|
||||||
n--;
|
n--;
|
||||||
dns_name_getlabelsequence(name, 1, n, &foundname);
|
dns_name_getlabelsequence(name, 1, n, &foundname);
|
||||||
result = dns_rbt_addnode(qpdb->tree, &foundname, &node);
|
|
||||||
if (result != ISC_R_SUCCESS && result != ISC_R_EXISTS) {
|
result = dns_qp_getname(qpdb->tree, &foundname, (void **)&node, NULL);
|
||||||
return (result);
|
if (result != ISC_R_SUCCESS) {
|
||||||
}
|
INSIST(node == NULL);
|
||||||
if (result == ISC_R_SUCCESS) {
|
node = dns_qpdata_create(qpdb, &foundname);
|
||||||
node->nsec = DNS_DB_NSEC_NORMAL;
|
result = dns_qp_insert(qpdb->tree, node, 0);
|
||||||
|
INSIST(result == ISC_R_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
INSIST(result == ISC_R_SUCCESS);
|
||||||
|
node->nsec = DNS_DB_NSEC_NORMAL;
|
||||||
node->find_callback = 1;
|
node->find_callback = 1;
|
||||||
if (lock) {
|
if (lock) {
|
||||||
NODE_WRLOCK(&qpdb->node_locks[node->locknum].lock, &nlocktype);
|
NODE_WRLOCK(&qpdb->node_locks[node->locknum].lock, &nlocktype);
|
||||||
@ -2500,9 +2496,14 @@ dns__qpzone_addwildcards(dns_qpdb_t *qpdb, const dns_name_t *name, bool lock) {
|
|||||||
if (result != ISC_R_SUCCESS) {
|
if (result != ISC_R_SUCCESS) {
|
||||||
return (result);
|
return (result);
|
||||||
}
|
}
|
||||||
result = dns_rbt_addnode(qpdb->tree, &foundname, &node);
|
|
||||||
if (result != ISC_R_SUCCESS && result != ISC_R_EXISTS) {
|
result = dns_qp_getname(qpdb->tree, name,
|
||||||
return (result);
|
(void **)&node, NULL);
|
||||||
|
if (result != ISC_R_SUCCESS) {
|
||||||
|
INSIST(node == NULL);
|
||||||
|
node = dns_qpdata_create(qpdb, name);
|
||||||
|
result = dns_qp_insert(qpdb->tree, node, 0);
|
||||||
|
INSIST(result == ISC_R_SUCCESS);
|
||||||
}
|
}
|
||||||
if (result == ISC_R_SUCCESS) {
|
if (result == ISC_R_SUCCESS) {
|
||||||
node->nsec = DNS_DB_NSEC_NORMAL;
|
node->nsec = DNS_DB_NSEC_NORMAL;
|
||||||
|
@ -2013,29 +2013,23 @@ dns__qpdb_findnodeintree(dns_qpdb_t *qpdb, dns_qp_t *tree,
|
|||||||
* Try to upgrade the lock and if that fails unlock then relock.
|
* Try to upgrade the lock and if that fails unlock then relock.
|
||||||
*/
|
*/
|
||||||
TREE_FORCEUPGRADE(&qpdb->tree_lock, &tlocktype);
|
TREE_FORCEUPGRADE(&qpdb->tree_lock, &tlocktype);
|
||||||
node = NULL;
|
node = dns_qpdata_create(qpdb, name);
|
||||||
result = dns_rbt_addnode(tree, name, &node);
|
result = dns_qp_insert(tree, node, 0);
|
||||||
if (result == ISC_R_SUCCESS) {
|
INSIST(result == ISC_R_SUCCESS);
|
||||||
dns_rbt_namefromnode(node, &nodename);
|
|
||||||
node->locknum = node->hashval % qpdb->node_lock_count;
|
|
||||||
if (tree == qpdb->tree) {
|
|
||||||
dns__qpzone_addwildcards(qpdb, name, true);
|
|
||||||
|
|
||||||
if (dns_name_iswildcard(name)) {
|
if (tree == qpdb->tree) {
|
||||||
result = dns__qpzone_wildcardmagic(
|
dns__qpzone_addwildcards(qpdb, name, true);
|
||||||
qpdb, name, true);
|
|
||||||
if (result != ISC_R_SUCCESS) {
|
if (dns_name_iswildcard(name)) {
|
||||||
goto unlock;
|
result = dns__qpzone_wildcardmagic(qpdb, name,
|
||||||
}
|
true);
|
||||||
|
if (result != ISC_R_SUCCESS) {
|
||||||
|
goto unlock;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (tree == qpdb->nsec3) {
|
}
|
||||||
node->nsec = DNS_DB_NSEC_NSEC3;
|
if (tree == qpdb->nsec3) {
|
||||||
}
|
node->nsec = DNS_DB_NSEC_NSEC3;
|
||||||
} else if (result == ISC_R_EXISTS) {
|
|
||||||
result = ISC_R_SUCCESS;
|
|
||||||
} else {
|
|
||||||
goto unlock;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3337,14 +3331,18 @@ dns__qpdb_addrdataset(dns_db_t *db, dns_dbnode_t *node,
|
|||||||
if (newnsec) {
|
if (newnsec) {
|
||||||
dns_rbtnode_t *nsecnode = NULL;
|
dns_rbtnode_t *nsecnode = NULL;
|
||||||
|
|
||||||
result = dns_rbt_addnode(qpdb->nsec, name, &nsecnode);
|
result = dns_qp_getname(qpdb->nsec, name, (void **)&nsecnode,
|
||||||
|
NULL);
|
||||||
if (result == ISC_R_SUCCESS) {
|
if (result == ISC_R_SUCCESS) {
|
||||||
nsecnode->nsec = DNS_DB_NSEC_NSEC;
|
|
||||||
rbtnode->nsec = DNS_DB_NSEC_HAS_NSEC;
|
|
||||||
} else if (result == ISC_R_EXISTS) {
|
|
||||||
rbtnode->nsec = DNS_DB_NSEC_HAS_NSEC;
|
|
||||||
result = ISC_R_SUCCESS;
|
result = ISC_R_SUCCESS;
|
||||||
|
} else {
|
||||||
|
INSIST(nsecnode == NULL);
|
||||||
|
nsecnode = dns_qpdata_create(qpdb, name);
|
||||||
|
nsecnode->nsec = DNS_DB_NSEC_NSEC;
|
||||||
|
result = dns_qp_insert(qpdb->nsec, nsecnode, 0);
|
||||||
|
INSIST(result == ISC_R_SUCCESS);
|
||||||
}
|
}
|
||||||
|
rbtnode->nsec = DNS_DB_NSEC_HAS_NSEC;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (result == ISC_R_SUCCESS) {
|
if (result == ISC_R_SUCCESS) {
|
||||||
@ -3889,27 +3887,21 @@ dns__qpdb_create(isc_mem_t *mctx, const dns_name_t *origin, dns_dbtype_t type,
|
|||||||
* change.
|
* change.
|
||||||
*/
|
*/
|
||||||
if (!IS_CACHE(qpdb)) {
|
if (!IS_CACHE(qpdb)) {
|
||||||
result = dns_rbt_addnode(qpdb->tree, &qpdb->common.origin,
|
qpdb->origin_node = dns_qpdata_create(qpdb,
|
||||||
&qpdb->origin_node);
|
&qpdb->common.origin);
|
||||||
if (result != ISC_R_SUCCESS) {
|
result = dns_qp_insert(qpdb->tree, qpdb->origin_node, 0);
|
||||||
INSIST(result != ISC_R_EXISTS);
|
INSIST(result == ISC_R_SUCCESS);
|
||||||
free_qpdb(qpdb, false);
|
|
||||||
return (result);
|
|
||||||
}
|
|
||||||
INSIST(qpdb->origin_node != NULL);
|
INSIST(qpdb->origin_node != NULL);
|
||||||
qpdb->origin_node->nsec = DNS_DB_NSEC_NORMAL;
|
qpdb->origin_node->nsec = DNS_DB_NSEC_NORMAL;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Add an apex node to the NSEC3 tree so that NSEC3 searches
|
* Add an apex node to the NSEC3 tree so that NSEC3 searches
|
||||||
* return partial matches when there is only a single NSEC3
|
* return partial matches when there is only a single NSEC3
|
||||||
* record in the tree.
|
* record in the tree.
|
||||||
*/
|
*/
|
||||||
result = dns_rbt_addnode(qpdb->nsec3, &qpdb->common.origin,
|
qpdb->nsec3_origin_node =
|
||||||
&qpdb->nsec3_origin_node);
|
dns_qpdata_create(qpdb, &qpdb->common.origin);
|
||||||
if (result != ISC_R_SUCCESS) {
|
result = dns_qp_insert(qpdb->nsec3, qpdb->nsec3_origin_node, 0);
|
||||||
INSIST(result != ISC_R_EXISTS);
|
|
||||||
free_qpdb(qpdb, false);
|
|
||||||
return (result);
|
|
||||||
}
|
|
||||||
INSIST(result == ISC_R_SUCCESS);
|
INSIST(result == ISC_R_SUCCESS);
|
||||||
INSIST(qpdb->nsec3_origin_node != NULL);
|
INSIST(qpdb->nsec3_origin_node != NULL);
|
||||||
qpdb->nsec3_origin_node->nsec = DNS_DB_NSEC_NSEC3;
|
qpdb->nsec3_origin_node->nsec = DNS_DB_NSEC_NSEC3;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user