]> git.ipfire.org Git - thirdparty/knot-dns.git/commitdiff
catalog: bugfix: count update count correctly
authorLibor Peltan <libor.peltan@nic.cz>
Mon, 9 Aug 2021 09:56:15 +0000 (11:56 +0200)
committerLibor Peltan <libor.peltan@nic.cz>
Mon, 9 Aug 2021 09:56:15 +0000 (11:56 +0200)
src/knot/catalog/catalog_update.c
src/knot/catalog/catalog_update.h
src/knot/catalog/interpret.c
src/knot/catalog/interpret.h
src/knot/updates/zone-update.c

index 1f2f259bc8d7da38ee011ad21738e480f32cd360..b52d748f1361befe72a9ea698160ef27c37ed82d 100644 (file)
@@ -348,11 +348,13 @@ static int del_all_cb(const knot_dname_t *member, const knot_dname_t *owner,
        }
 }
 
-int catalog_update_del_all(catalog_update_t *u, catalog_t *cat, const knot_dname_t *zone)
+int catalog_update_del_all(catalog_update_t *u, catalog_t *cat, const knot_dname_t *zone, ssize_t *upd_count)
 {
        pthread_mutex_lock(&u->mutex);
        del_all_ctx_t ctx = { zone, u };
+       *upd_count -= trie_weight(u->upd);
        int ret = catalog_apply(cat, NULL, del_all_cb, &ctx, false);
+       *upd_count += trie_weight(u->upd);
        pthread_mutex_unlock(&u->mutex);
        return ret;
 }
index 949fbd730774519a2e1f9f6aa58b3db110352fca..de47075a68b1db5c6fb5fcc05162f61597a53912 100644 (file)
@@ -151,7 +151,8 @@ int catalog_update_commit(catalog_update_t *u, catalog_t *cat);
  * \param u      Catalog update to be updated.
  * \param cat    Catalog database to be iterated.
  * \param zone   Name of catalog zone whose members gonna be removed.
+ * \param upd_count          Output: number of resulting updates to catalog database.
  *
  * \return KNOT_E*
  */
-int catalog_update_del_all(catalog_update_t *u, catalog_t *cat, const knot_dname_t *zone);
+int catalog_update_del_all(catalog_update_t *u, catalog_t *cat, const knot_dname_t *zone, ssize_t *upd_count);
index d9db2ae4bd502ad9fdc998ba6a625e9461b1e4ae..b70bd65fc51210989021c2150170891110aedb3c 100644 (file)
@@ -137,7 +137,8 @@ static int cat_update_add_node(zone_node_t *node, void *data)
 
 int catalog_update_from_zone(catalog_update_t *u, struct zone_contents *zone,
                              const struct zone_contents *complete_contents,
-                             bool remove, bool check_ver, catalog_t *check)
+                             bool remove, bool check_ver, catalog_t *check,
+                             ssize_t *upd_count)
 {
        if (check_ver && !check_zone_version(zone)) {
                return KNOT_EZONEINVAL;
@@ -156,7 +157,9 @@ int catalog_update_from_zone(catalog_update_t *u, struct zone_contents *zone,
        cat_upd_ctx_t ctx = { u, complete_contents, knot_dname_labels(zone->apex->owner, NULL),
                              remove, check };
        pthread_mutex_lock(&u->mutex);
+       *upd_count -= trie_weight(u->upd);
        int ret = zone_tree_sub_apply(zone->nodes, sub, true, cat_update_add_node, &ctx);
+       *upd_count += trie_weight(u->upd);
        pthread_mutex_unlock(&u->mutex);
        return ret;
 }
index b1dbfb72eca40a56ab18b387269a1b056e5f81bb..6d640312f823f37decb9d4a3ca5f45cd76802979 100644 (file)
@@ -30,9 +30,11 @@ struct zone_contents;
  * \param check_ver          Do check catalog zone version record first.
  * \param check              Optional: existing catalog database to be checked for existence
  *                           of such record (useful for removals).
+ * \param upd_count          Output: number of resulting updates to catalog database.
  *
  * \return KNOT_E*
  */
 int catalog_update_from_zone(catalog_update_t *u, struct zone_contents *zone,
                              const struct zone_contents *complete_contents,
-                             bool remove, bool check_ver, catalog_t *check);
+                             bool remove, bool check_ver, catalog_t *check,
+                             ssize_t *upd_count);
index d3c25fd5e734a3cbfef4b005b8098e3f7fb7b3fe..4636b1bcd794eda77110551d77983c309f517760 100644 (file)
@@ -720,29 +720,29 @@ static int update_catalog(conf_t *conf, zone_update_t *update)
        zone_set_flag(update->zone, ZONE_IS_CATALOG);
 
        int ret = KNOT_EOK;
+       ssize_t upd_count = 0;
        if ((update->flags & UPDATE_INCREMENTAL)) {
                ret = catalog_update_from_zone(update->zone->catalog_upd,
                                               update->change.remove, update->new_cont,
-                                              true, false, update->zone->catalog);
+                                              true, false, update->zone->catalog, &upd_count);
                if (ret == KNOT_EOK) {
                        ret = catalog_update_from_zone(update->zone->catalog_upd,
                                                       update->change.add, update->new_cont,
-                                                      false, false, NULL);
+                                                      false, false, NULL, &upd_count);
                }
        } else {
                ret = catalog_update_del_all(update->zone->catalog_upd,
                                             update->zone->catalog,
-                                            update->zone->name);
+                                            update->zone->name, &upd_count);
                if (ret == KNOT_EOK) {
                        ret = catalog_update_from_zone(update->zone->catalog_upd,
                                                       update->new_cont, update->new_cont,
-                                                      false, true, NULL);
+                                                      false, true, NULL, &upd_count);
                }
        }
 
        if (ret == KNOT_EOK) {
-               log_zone_info(update->zone->name, "catalog reloaded, %zu updates",
-                             trie_weight(update->zone->catalog_upd->upd));
+               log_zone_info(update->zone->name, "catalog reloaded, %zd updates", upd_count);
                if (kill(getpid(), SIGUSR1) != 0) {
                        ret = knot_map_errno();
                }