}
}
-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;
}
* \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);
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;
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;
}
* \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);
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();
}