]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Revert "fix: dev: Delete dead nodes when committing a new version"
authorOndřej Surý <ondrej@isc.org>
Wed, 5 Mar 2025 16:36:53 +0000 (17:36 +0100)
committerOndřej Surý <ondrej@isc.org>
Wed, 5 Mar 2025 16:46:54 +0000 (17:46 +0100)
This reverts commit 67255da4b376f65138b299dcd5eb6a3b7f9735a9, reversing
changes made to 74c9ff384e695d1b27fa365d1fee84576f869d4c.

lib/dns/qpcache.c
lib/dns/qpzone.c

index 24f1ec70159ba3fb1cee420b61c3dac76f832a6e..5f8877867a9cf8a1a3917969a3b193f0889e5c07 100644 (file)
@@ -202,9 +202,10 @@ struct qpcnode {
        uint8_t       : 0;
 
        /*%
-        * Used for dead node cleaning. The deadnodes queue is used
-        * for nodes that have no data any longer, but we can't unlink
-        * yet because we don't have a tree lock.
+        * Used for dead nodes cleaning.  This linked list is used to mark nodes
+        * which have no data any longer, but we cannot unlink at that exact
+        * moment because we did not or could not obtain a write lock on the
+        * tree.
         */
        isc_queue_node_t deadlink;
 };
@@ -215,8 +216,9 @@ struct qpcnode {
  * to reduce contention between threads.
  */
 typedef struct qpcache_bucket {
-       /*
-        * Temporary storage for cache nodes that need to be deleted.
+       /*%
+        * Temporary storage for stale cache nodes and dynamically
+        * deleted nodes that await being cleaned up.
         */
        isc_queue_t deadnodes;
 
index 72050bf96b7baf49daeff01607444d36dcaa5242..58039bd52f974cdfe4b349221935c95003072ac9 100644 (file)
@@ -875,7 +875,6 @@ clean_zone_node(qpznode_t *node, uint32_t least_serial) {
                }
                top_prev = current;
        }
-
        if (!still_dirty) {
                node->dirty = false;
        }
@@ -1527,8 +1526,10 @@ closeversion(dns_db_t *db, dns_dbversion_t **versionp,
                NODE_UNLOCK(nlock, &nlocktype);
        }
 
-       dns_qp_t *tree = NULL, *nsec = NULL, *nsec3 = NULL;
-       bool need_tree = false, need_nsec = false, need_nsec3 = false;
+       if (ISC_LIST_EMPTY(cleanup_list)) {
+               *versionp = NULL;
+               return;
+       }
 
        for (changed = ISC_LIST_HEAD(cleanup_list); changed != NULL;
             changed = next_changed)
@@ -1544,100 +1545,14 @@ closeversion(dns_db_t *db, dns_dbversion_t **versionp,
                if (rollback) {
                        rollback_node(node, serial);
                }
-
-               qpznode_ref(node);
                qpznode_release(qpdb, node, least_serial,
                                &nlocktype DNS__DB_FILELINE);
 
-               /* If the node is now empty, we can delete it. */
-               if (commit && node->data == NULL) {
-                       switch ((int)node->nsec) {
-                       case DNS_DB_NSEC_HAS_NSEC:
-                               /*
-                                * Delete the matching node from the NSEC tree
-                                * first, then fall through to the main tree.
-                                */
-                               if (nsec == NULL) {
-                                       need_nsec = true;
-                                       next_changed = changed;
-                               } else {
-                                       dns_qp_deletename(nsec, &node->name,
-                                                         NULL, NULL);
-                               }
-                               FALLTHROUGH;
-                       case DNS_DB_NSEC_NORMAL:
-                               if (tree == NULL) {
-                                       need_tree = true;
-                                       next_changed = changed;
-                               } else {
-                                       dns_qp_deletename(tree, &node->name,
-                                                         NULL, NULL);
-                               }
-                               break;
-                       case DNS_DB_NSEC_NSEC:
-                               if (nsec == NULL) {
-                                       need_nsec = true;
-                                       next_changed = changed;
-                               } else {
-                                       dns_qp_deletename(nsec, &node->name,
-                                                         NULL, NULL);
-                               }
-                               break;
-                       case DNS_DB_NSEC_NSEC3:
-                               if (nsec3 == NULL) {
-                                       need_nsec3 = true;
-                                       next_changed = changed;
-                               } else {
-                                       dns_qp_deletename(nsec3, &node->name,
-                                                         NULL, NULL);
-                               }
-                               break;
-                       default:
-                               UNREACHABLE();
-                       }
-               }
-
-               qpznode_detach(&node);
-
                NODE_UNLOCK(nlock, &nlocktype);
 
-               if (next_changed == changed) {
-                       /*
-                        * We found a node to delete but didn't have a
-                        * QP writer open, so we open one now, then go
-                        * back to delete the node. If there's a next
-                        * time, we'll already have the writer open,
-                        * so we won't need this extra step.
-                        */
-                       if (need_tree && tree == NULL) {
-                               dns_qpmulti_write(qpdb->tree, &tree);
-                       }
-                       if (need_nsec && nsec == NULL) {
-                               dns_qpmulti_write(qpdb->nsec, &nsec);
-                       }
-                       if (need_nsec3 && nsec3 == NULL) {
-                               dns_qpmulti_write(qpdb->nsec3, &nsec3);
-                       }
-
-                       continue;
-               }
-
                isc_mem_put(qpdb->common.mctx, changed, sizeof(*changed));
        }
 
-       if (tree != NULL) {
-               dns_qp_compact(tree, DNS_QPGC_MAYBE);
-               dns_qpmulti_commit(qpdb->tree, &tree);
-       }
-       if (nsec != NULL) {
-               dns_qp_compact(nsec, DNS_QPGC_MAYBE);
-               dns_qpmulti_commit(qpdb->nsec, &nsec);
-       }
-       if (nsec3 != NULL) {
-               dns_qp_compact(nsec3, DNS_QPGC_MAYBE);
-               dns_qpmulti_commit(qpdb->nsec3, &nsec3);
-       }
-
        *versionp = NULL;
 }