diff --git a/src/knot/ctl/commands.c b/src/knot/ctl/commands.c index 8cdf94d0a..35ce318c4 100644 --- a/src/knot/ctl/commands.c +++ b/src/knot/ctl/commands.c @@ -993,12 +993,14 @@ static int zone_txn_commit_l(zone_t *zone, _unused_ ctl_args_t *args) } if (ret != KNOT_EOK) { zone_control_clear(zone); + zone_update_error(conf(), zone); return ret; } ret = zone_update_commit(conf(), zone->control_update); if (ret != KNOT_EOK) { zone_control_clear(zone); + zone_update_error(conf(), zone); return ret; } diff --git a/src/knot/events/handlers/dnssec.c b/src/knot/events/handlers/dnssec.c index d0367a76a..2b722fd37 100644 --- a/src/knot/events/handlers/dnssec.c +++ b/src/knot/events/handlers/dnssec.c @@ -108,6 +108,7 @@ done: if (ret != KNOT_EOK) { zone_update_clear(&up); + zone_update_error(conf, zone); } return ret; } diff --git a/src/knot/events/handlers/load.c b/src/knot/events/handlers/load.c index 3c9112dc5..30a9f8b30 100644 --- a/src/knot/events/handlers/load.c +++ b/src/knot/events/handlers/load.c @@ -538,5 +538,12 @@ cleanup: zone_skip_free(&skip); zone->started = true; - return (dontcare_load_error(conf, zone) ? KNOT_EOK : ret); + if (dontcare_load_error(conf, zone)) { + ret = KNOT_EOK; + } + if (ret != KNOT_EOK) { + zone_update_error(conf, zone); + } + + return ret; } diff --git a/src/knot/events/handlers/refresh.c b/src/knot/events/handlers/refresh.c index 9ebda7fa2..3e78e7b32 100644 --- a/src/knot/events/handlers/refresh.c +++ b/src/knot/events/handlers/refresh.c @@ -1265,6 +1265,7 @@ static int transfer_consume(knot_layer_t *layer, knot_pkt_t *pkt) if (data->ret == KNOT_EOK) { data->updated = true; } else { + zone_update_error(data->conf, data->zone); next = KNOT_STATE_FAIL; } } diff --git a/src/knot/events/handlers/update.c b/src/knot/events/handlers/update.c index f038860d0..c1b0c99da 100644 --- a/src/knot/events/handlers/update.c +++ b/src/knot/events/handlers/update.c @@ -242,6 +242,7 @@ static void process_requests(conf_t *conf, zone_t *zone, list_t *requests) if (ret != KNOT_EOK) { log_zone_error(zone->name, "DDNS, processing failed (%s)", knot_strerror(ret)); + zone_update_error(conf, zone); return; } diff --git a/src/knot/updates/zone-update.c b/src/knot/updates/zone-update.c index c9ba288f0..f6dca3457 100644 --- a/src/knot/updates/zone-update.c +++ b/src/knot/updates/zone-update.c @@ -1150,7 +1150,7 @@ int zone_update_commit(conf_t *conf, zone_update_t *update) ret = commit_full(conf, update); } if (ret != KNOT_EOK) { - goto error; + return ret; } conf_val_t thr = conf_zone_get(conf, C_ADJUST_THR, update->zone->name); @@ -1161,7 +1161,7 @@ int zone_update_commit(conf_t *conf, zone_update_t *update) } if (ret != KNOT_EOK) { discard_adds_tree(update); - goto error; + return ret; } /* Check the zone size. */ @@ -1170,8 +1170,7 @@ int zone_update_commit(conf_t *conf, zone_update_t *update) if (update->new_cont->size > size_limit) { discard_adds_tree(update); - ret = KNOT_EZONESIZE; - goto error; + return KNOT_EZONESIZE; } val = conf_zone_get(conf, C_DNSSEC_VALIDATION, update->zone->name); @@ -1184,7 +1183,7 @@ int zone_update_commit(conf_t *conf, zone_update_t *update) ret = knot_dnssec_validate_zone(update, &val_conf); if (ret != KNOT_EOK) { discard_adds_tree(update); - goto error; + return ret; } } @@ -1193,7 +1192,7 @@ int zone_update_commit(conf_t *conf, zone_update_t *update) ret = zone_update_external(conf, update, &val); if (ret != KNOT_EOK) { discard_adds_tree(update); - goto error; + return ret; } } @@ -1201,21 +1200,21 @@ int zone_update_commit(conf_t *conf, zone_update_t *update) if (ret != KNOT_EOK) { log_zone_error(update->zone->name, "failed to process catalog zone (%s)", knot_strerror(ret)); discard_adds_tree(update); - goto error; + return ret; } ret = commit_redis(conf, update); if (ret != KNOT_EOK) { log_zone_error(update->zone->name, "zone database update failed (%s)", knot_strerror(ret)); discard_adds_tree(update); - goto error; + return ret; } ret = commit_journal(conf, update); if (ret != KNOT_EOK) { log_zone_error(update->zone->name, "journal update failed (%s)", knot_strerror(ret)); discard_adds_tree(update); - goto error; + return ret; } if (dnssec) { @@ -1268,13 +1267,6 @@ int zone_update_commit(conf_t *conf, zone_update_t *update) memset(update, 0, sizeof(*update)); return KNOT_EOK; -error: - ATOMIC_ADD(update->zone->server->stats.zone_update_error, 1); - if (conf->cache.srv_dbus_event & DBUS_EVENT_ZONE_UPDATED) { - dbus_emit_zone_updated(update->zone->name, false, 0); - } - - return ret; } bool zone_update_no_change(zone_update_t *update) diff --git a/src/knot/zone/zone.c b/src/knot/zone/zone.c index dac0dac1f..1f78d6607 100644 --- a/src/knot/zone/zone.c +++ b/src/knot/zone/zone.c @@ -9,6 +9,7 @@ #include #include +#include "knot/common/dbus.h" #include "knot/common/log.h" #include "knot/conf/module.h" #include "knot/dnssec/kasp/kasp_db.h" @@ -1034,3 +1035,13 @@ time_t zone_bootstrap_next(uint8_t *count) // Add a random delay to prevent burst refresh. return increment + dnssec_random_uint16_t() % MIN(30, (1 + *count) * 5); } + +void zone_update_error(conf_t *conf, zone_t *zone) +{ + if (conf != NULL && zone != NULL) { + ATOMIC_ADD(zone->server->stats.zone_update_error, 1); + if (conf->cache.srv_dbus_event & DBUS_EVENT_ZONE_UPDATED) { + dbus_emit_zone_updated(zone->name, false, 0); + } + } +} diff --git a/src/knot/zone/zone.h b/src/knot/zone/zone.h index 5753aae39..a624863a4 100644 --- a/src/knot/zone/zone.h +++ b/src/knot/zone/zone.h @@ -339,3 +339,5 @@ int zone_get_lastsigned_serial(zone_t *zone, uint32_t *serial); int slave_zone_serial(zone_t *zone, conf_t *conf, uint32_t *serial); time_t zone_bootstrap_next(uint8_t *count); + +void zone_update_error(conf_t *conf, zone_t *zone);