return zone;
}
-static void replan_events(conf_t *conf, zone_t *zone, zone_t *old_zone)
+static void replan_events(conf_t *conf, zone_t *zone, zone_t *old_zone, bool conf_updated)
{
- bool conf_updated = false;
- conf_val_t digest = conf_zone_get(conf, C_ZONEMD_GENERATE, zone->name);
- if (zone->contents != NULL && !zone_contents_digest_exists(zone->contents, conf_opt(&digest), true)) {
- conf_updated = true;
+ if (!conf_updated) {
+ conf_val_t digest = conf_zone_get(conf, C_ZONEMD_GENERATE, zone->name);
+ if (zone->contents != NULL && !zone_contents_digest_exists(zone->contents, conf_opt(&digest), true)) {
+ conf_updated = true;
+ }
}
zone->events.ufrozen = old_zone->events.ufrozen;
} else if (!reload_zones && (type & CONF_IO_TRELOAD)) {
int ret = zone_reload_modules(conf, server, name);
if (ret != KNOT_EOK) {
- log_zone_error(name, "failed to reload modules (%s)",
+ log_zone_error(name, "failed to reload (%s)",
knot_strerror(ret));
}
- zone_t *zone = knot_zonedb_find(db_new, name);
- zone_events_schedule_now(zone, ZONE_EVENT_LOAD);
}
}
trie_it_free(trie_it);
}
int ret = zone_reload_modules(conf, server, name);
if (ret != KNOT_EOK) {
- log_zone_error(name, "failed to reload modules (%s)",
+ log_zone_error(name, "failed to reload (%s)",
knot_strerror(ret));
}
- zone_t *zone = knot_zonedb_find(db_new, name);
- zone_events_schedule_now(zone, ZONE_EVENT_LOAD);
}
knot_zonedb_iter_free(db_it);
}
case CAT_UPD_PROP:
; int ret = zone_reload_modules(conf, server, upd->member);
if (ret != KNOT_EOK) {
- log_zone_error(upd->member, "failed to reload modules (%s)",
+ log_zone_error(upd->member, "failed to reload (%s)",
knot_strerror(ret));
}
- zone = knot_zonedb_find(db_new, upd->member);
- zone_events_schedule_now(zone, ZONE_EVENT_LOAD);
break;
default:
break;
zone_t *new_zone = knot_zonedb_find(db_new, zone->name);
if (new_zone != NULL) {
/* Reload reused zone. */
- replan_events(conf, new_zone, zone);
+ replan_events(conf, new_zone, zone, false);
zone->contents = NULL;
}
}
zone_t *oldzone = rcu_xchg_pointer(zone, newzone);
synchronize_rcu();
- replan_events(conf, newzone, oldzone);
+ replan_events(conf, newzone, oldzone, true);
assert(newzone->contents == oldzone->contents);
oldzone->contents = NULL; // contents have been re-used by newzone