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