From ffe98a08e3867b3e567386ac991981e93d906b85 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Marek=20Vavru=C5=A1a?= <marek.vavrusa@nic.cz>
Date: Wed, 19 Mar 2014 16:58:21 +0100
Subject: [PATCH] zone_creator: do not cache last used node

This makes NSEC3 nodes disappear if it is preceded by a RR with the
same owner and any other record type.
---
 src/knot/updates/xfr-in.c   |  3 +--
 src/knot/zone/zone-create.c | 19 +++++--------------
 src/knot/zone/zone-create.h |  1 -
 3 files changed, 6 insertions(+), 17 deletions(-)

diff --git a/src/knot/updates/xfr-in.c b/src/knot/updates/xfr-in.c
index 705790997..584a77c75 100644
--- a/src/knot/updates/xfr-in.c
+++ b/src/knot/updates/xfr-in.c
@@ -311,8 +311,7 @@ int xfrin_process_axfr_packet(knot_ns_xfr_t *xfr, knot_zone_contents_t **zone)
 	}
 
 	// Init zone creator
-	zcreator_t zc = {.z = *zone,
-	                 .last_node = NULL, .ret = KNOT_EOK };
+	zcreator_t zc = {.z = *zone, .ret = KNOT_EOK };
 
 
 	while (ret == KNOT_EOK && rr) {
diff --git a/src/knot/zone/zone-create.c b/src/knot/zone/zone-create.c
index 9e11e0e7f..68d89c310 100644
--- a/src/knot/zone/zone-create.c
+++ b/src/knot/zone/zone-create.c
@@ -88,17 +88,9 @@ int zcreator_step(zcreator_t *zc, knot_rrset_t *rr)
 		return KNOT_EOK;
 	}
 
-	knot_node_t *n;
-	if (zc->last_node &&
-	    knot_dname_is_equal(zc->last_node->owner, rr->owner)) {
-		// Reuse hint from last addition.
-		n = zc->last_node;
-	} else {
-		// Search for node or create a new one
-		n = NULL;
-	}
+	knot_node_t *node = NULL;
 	knot_rrset_t *zone_rrset = NULL;
-	int ret = knot_zone_contents_add_rr(zc->z, rr, &n, &zone_rrset);
+	int ret = knot_zone_contents_add_rr(zc->z, rr, &node, &zone_rrset);
 	if (ret < 0) {
 		if (!handle_err(zc, rr, ret)) {
 			// Fatal error
@@ -110,19 +102,18 @@ int zcreator_step(zcreator_t *zc, knot_rrset_t *rr)
 	} else if (ret > 0) {
 		knot_rrset_free(&rr, NULL);
 	}
-	assert(n);
+	assert(node);
 	assert(zone_rrset);
-	zc->last_node = n;
 
 	// Do RRSet and node semantic checks
 	bool sem_fatal_error = false;
 	err_handler_t err_handler;
 	err_handler_init(&err_handler);
-	ret = sem_check_rrset(n, zone_rrset, &err_handler);
+	ret = sem_check_rrset(node, zone_rrset, &err_handler);
 	if (ret != KNOT_EOK) {
 		return ret;
 	}
-	ret = sem_check_node_plain(zc->z, n,
+	ret = sem_check_node_plain(zc->z, node,
 	                           &err_handler, true,
 	                           &sem_fatal_error);
 	if (ret != KNOT_EOK) {
diff --git a/src/knot/zone/zone-create.h b/src/knot/zone/zone-create.h
index 65d643658..c100b1a64 100644
--- a/src/knot/zone/zone-create.h
+++ b/src/knot/zone/zone-create.h
@@ -37,7 +37,6 @@
  */
 typedef struct zcreator {
 	knot_zone_contents_t *z;  /*!< Created zone. */
-	knot_node_t *last_node;   /*!< Last used node, use to save zone lookup. */
 	int ret;                  /*!< Return value. */
 } zcreator_t;
 
-- 
GitLab