From 6c00e514e68e7bfff754ee6ef0652b730a3ef8f1 Mon Sep 17 00:00:00 2001
From: Marek Vavrusa <marek.vavrusa@nic.cz>
Date: Wed, 1 May 2013 13:47:15 +0200
Subject: [PATCH] Better knot_zonedb_find_zone_for_name() implementation.

Previous with full dname copy and chopping was really inefficient.
Yields approx. 20% lower relative cost, 6% throughput increase.

Change-Id: Icaa49572f75769739ae61f48d2ca958e38db6104
---
 src/libknot/zone/zonedb.c | 41 ++++++++++++++++++++-------------------
 1 file changed, 21 insertions(+), 20 deletions(-)

diff --git a/src/libknot/zone/zonedb.c b/src/libknot/zone/zonedb.c
index 684d4d6338..3650b24120 100644
--- a/src/libknot/zone/zonedb.c
+++ b/src/libknot/zone/zonedb.c
@@ -127,30 +127,31 @@ const knot_zone_t *knot_zonedb_find_zone_for_name(knot_zonedb_t *db,
 		return NULL;
 	}
 
-	knot_dname_t *cd = knot_dname_deep_copy(dname);
-	value_t *found = NULL;
-
-	found = hattrie_tryget(db->zone_tree, (const char*)cd->name, cd->size);
-	while (found == NULL && knot_dname_label_count(cd) > 0) {
-		knot_dname_left_chop_no_copy(cd);
-		found = hattrie_tryget(db->zone_tree, (const char*)cd->name, cd->size);
+	knot_zone_t *zone = NULL;
+	const char *name = (const char*)dname->name;
+	size_t len = dname->size;
+
+	while (len > 0) {
+		value_t *found = hattrie_tryget(db->zone_tree, name, len);
+		if (found) {
+			zone = (knot_zone_t *)*found;
+			break;
+		} else {
+			/* Take label len + 1 and skip it.
+			 * ..from \x04lake\x03com\x00
+			 * ..to           \x03com\x00
+			 */
+			uint8_t to_chop = name[0] + 1;
+			len -= to_chop;
+			name += to_chop;
+		}
 	}
 
-	knot_zone_t *zone = (found) ? (knot_zone_t *)*found : NULL;
-
 dbg_zonedb_exec(
-	char *name = knot_dname_to_str(dname);
-	dbg_zonedb("Found zone for name %s: %p\n", name, zone);
-	free(name);
+	char *zname = knot_dname_to_str(dname);
+	dbg_zonedb("Found zone for name %s: %p\n", zname, zone);
+	free(zname);
 );
-	if (zone != NULL && zone->contents != NULL
-	    && knot_dname_compare(zone->contents->apex->owner, dname) != 0
-	    && !knot_dname_is_subdomain(dname, zone->contents->apex->owner)) {
-		zone = NULL;
-	}
-
-	knot_dname_free(&cd);
-
 	return zone;
 }
 
-- 
GitLab