2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-09-01 23:25:38 +00:00

rbtdb: cleanup_dead_nodes should ignore alive nodes on the deadlist

This commit is contained in:
Witold Kręcicki
2020-06-30 14:24:12 +02:00
committed by Ondřej Surý
parent dbd03ce112
commit c8f2d55acf

View File

@@ -1914,15 +1914,16 @@ cleanup_dead_nodes(dns_rbtdb_t *rbtdb, int bucketnum) {
ISC_LIST_UNLINK(rbtdb->deadnodes[bucketnum], node, deadlink); ISC_LIST_UNLINK(rbtdb->deadnodes[bucketnum], node, deadlink);
/* /*
* Since we're holding a tree write lock, it should be * We might have reactivated this node without a tree write
* impossible for this node to be referenced by others. * lock, so we couldn't remove this node from deadnodes then
* * and we have to do it now.
* decrement_reference may not have tested node->down, as
* the tree_lock was not held, before adding the node to
* deadnodes so we test it here.
*/ */
INSIST(isc_refcount_current(&node->references) == 0 && if (isc_refcount_current(&node->references) != 0 ||
node->data == NULL); node->data != NULL) {
node = ISC_LIST_HEAD(rbtdb->deadnodes[bucketnum]);
count--;
continue;
}
if (is_leaf(node) && rbtdb->task != NULL) { if (is_leaf(node) && rbtdb->task != NULL) {
send_to_prune_tree(rbtdb, node, isc_rwlocktype_write); send_to_prune_tree(rbtdb, node, isc_rwlocktype_write);