]> git.ipfire.org Git - thirdparty/knot-dns.git/commitdiff
server: refactor catalogs_generate() to extract basic functionality
authorDaniel Salzman <daniel.salzman@nic.cz>
Wed, 23 Jul 2025 19:52:40 +0000 (21:52 +0200)
committerDaniel Salzman <daniel.salzman@nic.cz>
Mon, 4 Aug 2025 15:00:02 +0000 (17:00 +0200)
src/knot/catalog/generate.c
src/knot/catalog/generate.h
src/knot/zone/zonedb-load.c

index 1b93cbc1827cfd3b50cf78ee3ed53da1b2ae27fb..c406ffc96fc6b954b70d74a2f058bf390aa526da 100644 (file)
@@ -8,7 +8,6 @@
 #include "knot/catalog/generate.h"
 #include "knot/common/log.h"
 #include "knot/updates/zone-update.h"
-#include "knot/zone/zonedb.h"
 #include "contrib/openbsd/siphash.h"
 #include "contrib/wire_ctx.h"
 
@@ -53,94 +52,67 @@ static knot_dname_t *catalog_member_owner(const knot_dname_t *member,
        return out;
 }
 
-static bool same_group(zone_t *old_z, zone_t *new_z)
+void catalog_generate_rem(zone_t *zone, knot_zonedb_t *db_new)
 {
-       if (old_z->catalog_group == NULL || new_z->catalog_group == NULL) {
-               return (old_z->catalog_group == new_z->catalog_group);
+       if (zone == NULL) {
+               return;
+       }
+       knot_dname_t *cg = zone->catalog_gen;
+       if (cg == NULL) {
+               return;
+       }
+       zone_t *catz = knot_zonedb_find(db_new, cg);
+       if (catz == NULL || catz->contents == NULL) {
+               return;
+       }
+       assert(catz->cat_members != NULL); // if this failed to allocate, catz wasn't added to zonedb
+       knot_dname_t *owner = catalog_member_owner(zone->name, cg, zone->timers.catalog_member);
+       if (owner == NULL) {
+               catz->cat_members->error = KNOT_ENOENT;
+               return;
+       }
+       int ret = catalog_update_add(catz->cat_members, zone->name, owner, cg,
+                                    CAT_UPD_REM, NULL, 0, NULL);
+       if (ret != KNOT_EOK) {
+               catz->cat_members->error = ret;
        } else {
-               return (strcmp(old_z->catalog_group, new_z->catalog_group) == 0);
+               zone_events_schedule_now(catz, ZONE_EVENT_LOAD);
        }
+       free(owner);
 }
 
-void catalogs_generate(struct knot_zonedb *db_new, struct knot_zonedb *db_old)
+void catalog_generate_add(zone_t *zone, knot_zonedb_t *db_new, bool property)
 {
-       // general comment: catz->contents!=NULL means incremental update of catalog
-
-       if (db_old != NULL) {
-               knot_zonedb_iter_t *it = knot_zonedb_iter_begin(db_old);
-               while (!knot_zonedb_iter_finished(it)) {
-                       zone_t *zone = knot_zonedb_iter_val(it);
-                       knot_dname_t *cg = zone->catalog_gen;
-                       if (cg != NULL && knot_zonedb_find(db_new, zone->name) == NULL) {
-                               zone_t *catz = knot_zonedb_find(db_new, cg);
-                               if (catz != NULL && catz->contents != NULL) {
-                                       assert(catz->cat_members != NULL); // if this failed to allocate, catz wasn't added to zonedb
-                                       knot_dname_t *owner = catalog_member_owner(zone->name, cg, zone->timers.catalog_member);
-                                       if (owner == NULL) {
-                                               catz->cat_members->error = KNOT_ENOENT;
-                                               knot_zonedb_iter_next(it);
-                                               continue;
-                                       }
-                                       int ret = catalog_update_add(catz->cat_members, zone->name, owner,
-                                                                    cg, CAT_UPD_REM, NULL, 0, NULL);
-                                       free(owner);
-                                       if (ret != KNOT_EOK) {
-                                               catz->cat_members->error = ret;
-                                       } else {
-                                               zone_events_schedule_now(catz, ZONE_EVENT_LOAD);
-                                       }
-                               }
-                       }
-                       knot_zonedb_iter_next(it);
-               }
-               knot_zonedb_iter_free(it);
+       if (zone == NULL) {
+               return;
        }
-
-       knot_zonedb_iter_t *it = knot_zonedb_iter_begin(db_new);
-       while (!knot_zonedb_iter_finished(it)) {
-               zone_t *zone = knot_zonedb_iter_val(it);
-               knot_dname_t *cg = zone->catalog_gen;
-               if (cg == NULL) {
-                       knot_zonedb_iter_next(it);
-                       continue;
-               }
-               zone_t *catz = knot_zonedb_find(db_new, cg);
-               zone_t *old = knot_zonedb_find(db_old, zone->name);
-               knot_dname_t *owner = catalog_member_owner(zone->name, cg, zone->timers.catalog_member);
-               size_t cgroup_size = zone->catalog_group == NULL ? 0 : strlen(zone->catalog_group);
-               if (catz == NULL) {
-                       log_zone_error(zone->name, "member zone belongs to non-existing catalog zone");
-               } else if (catz->cat_members == NULL) {
-                       log_zone_error(zone->name, "member zone belongs to non-generated catalog zone");
-               } else if (catz->contents == NULL || old == NULL) {
-                       assert(catz->cat_members != NULL);
-                       if (owner == NULL) {
-                               catz->cat_members->error = KNOT_ENOENT;
-                               knot_zonedb_iter_next(it);
-                               continue;
-                       }
-                       int ret = catalog_update_add(catz->cat_members, zone->name, owner,
-                                                    cg, CAT_UPD_ADD, zone->catalog_group,
-                                                    cgroup_size, NULL);
-                       if (ret != KNOT_EOK) {
-                               catz->cat_members->error = ret;
-                       } else {
-                               zone_events_schedule_now(catz, ZONE_EVENT_LOAD);
-                       }
-               } else if (!same_group(zone, old)) {
-                       int ret = catalog_update_add(catz->cat_members, zone->name, owner,
-                                                    cg, CAT_UPD_PROP, zone->catalog_group,
-                                                    cgroup_size, NULL);
-                       if (ret != KNOT_EOK) {
-                               catz->cat_members->error = ret;
-                       } else {
-                               zone_events_schedule_now(catz, ZONE_EVENT_LOAD);
-                       }
-               }
-               free(owner);
-               knot_zonedb_iter_next(it);
+       knot_dname_t *cg = zone->catalog_gen;
+       if (cg == NULL) {
+               return;
+       }
+       zone_t *catz = knot_zonedb_find(db_new, cg);
+       if (catz == NULL) {
+               log_zone_error(zone->name, "member zone belongs to non-existing catalog zone");
+               return;
+       } else if (catz->cat_members == NULL) {
+               log_zone_error(zone->name, "member zone belongs to non-generated catalog zone");
+               return;
+       }
+       knot_dname_t *owner = catalog_member_owner(zone->name, cg, zone->timers.catalog_member);
+       if (owner == NULL) {
+               catz->cat_members->error = KNOT_ENOENT;
+               return;
+       }
+       size_t cgroup_size = zone->catalog_group == NULL ? 0 : strlen(zone->catalog_group);
+       int ret = catalog_update_add(catz->cat_members, zone->name, owner, cg,
+                                    (property ? CAT_UPD_PROP : CAT_UPD_ADD),
+                                    zone->catalog_group, cgroup_size, NULL);
+       if (ret != KNOT_EOK) {
+               catz->cat_members->error = ret;
+       } else {
+               zone_events_schedule_now(catz, ZONE_EVENT_LOAD);
        }
-       knot_zonedb_iter_free(it);
+       free(owner);
 }
 
 static void set_rdata(knot_rrset_t *rrset, uint8_t *data, uint16_t len)
index 3f3f5105015b1ebac0b2ad56249494dd12b4ee35..20dfe9033483eee926a9e6df777badd59edfc27f 100644 (file)
@@ -6,19 +6,28 @@
 #pragma once
 
 #include "knot/catalog/catalog_update.h"
+#include "knot/zone/zonedb.h"
 
 #define CATALOG_SOA_REFRESH    3600
 #define CATALOG_SOA_RETRY      600
 #define CATALOG_SOA_EXPIRE     (INT32_MAX - 1)
 
-struct knot_zonedb;
-
 /*!
- * \brief Compare old and new zonedb, create incremental catalog upd in each catz->cat_members
+ * \brief Add a member removal to corresponding catalog update.
+ *
+ * \param zone        Member zone.
+ * \param db_new      New zone database.
  */
-void catalogs_generate(struct knot_zonedb *db_new, struct knot_zonedb *db_old);
+void catalog_generate_rem(zone_t *zone, knot_zonedb_t *db_new);
 
-struct zone_contents;
+/*!
+ * \brief Add a member addition/prop to corresponding catalog update.
+ *
+ * \param zone        Member zone.
+ * \param db_new      New zone database.
+ * \param property    Property or addition indicator.
+ */
+void catalog_generate_add(zone_t *zone, knot_zonedb_t *db_new, bool property);
 
 /*!
  * \brief Generate catalog zone contents from (full) catalog update.
index 50a55ad6971f52e5385f7043240ef39bf5bcb086..a12b6fa0ccb799936791beba1d96d262397731f8 100644 (file)
@@ -514,6 +514,41 @@ static knot_zonedb_t *create_zonedb_catalog(conf_t *conf, server_t *server,
        return db_new;
 }
 
+static bool same_group(zone_t *old_z, zone_t *new_z)
+{
+       if (old_z->catalog_group == NULL || new_z->catalog_group == NULL) {
+               return (old_z->catalog_group == new_z->catalog_group);
+       } else {
+               return (strcmp(old_z->catalog_group, new_z->catalog_group) == 0);
+       }
+}
+
+static void catalogs_generate(struct knot_zonedb *db_new, struct knot_zonedb *db_old)
+{
+       if (db_old != NULL) {
+               knot_zonedb_iter_t *it = knot_zonedb_iter_begin(db_old);
+               for (; !knot_zonedb_iter_finished(it); knot_zonedb_iter_next(it)) {
+                       zone_t *zone = knot_zonedb_iter_val(it);
+                       if (knot_zonedb_find(db_new, zone->name) == NULL) {
+                               catalog_generate_rem(zone, db_new);
+                       }
+               }
+               knot_zonedb_iter_free(it);
+       }
+
+       knot_zonedb_iter_t *it = knot_zonedb_iter_begin(db_new);
+       for (; !knot_zonedb_iter_finished(it); knot_zonedb_iter_next(it)) {
+               zone_t *zone = knot_zonedb_iter_val(it);
+               zone_t *old = knot_zonedb_find(db_old, zone->name);
+               if (old == NULL) {
+                       catalog_generate_add(zone, db_new, false);
+               } else if (!same_group(zone, old)) {
+                       catalog_generate_add(zone, db_new, true);
+               }
+       }
+       knot_zonedb_iter_free(it);
+}
+
 static knot_zonedb_t *create_zonedb_full(conf_t *conf, server_t *server,
                                          list_t *expired_contents)
 {