return KNOT_EOK;
}
-static void zonedb_shutdown(server_t *server)
-{
- if (server->zone_db != NULL) {
- knot_zonedb_foreach(server->zone_db, zone_shutdown);
- }
-}
-
void server_wait(server_t *server)
{
if (server == NULL) {
/* Stop scheduler. */
evsched_stop(&server->sched);
- /* Shut down zones. */
- zonedb_shutdown(server);
+ /* Mark the server is shutting down. */
+ server->state |= ServerShutting;
/* Interrupt background workers. */
worker_pool_stop(server->workers);
/* Suspend adding events to worker pool queue, wait for queued events. */
log_debug("suspending zone events");
evsched_pause(&server->sched);
- zonedb_shutdown(server);
+ server->state |= ServerShutting;
worker_pool_wait(server->workers);
log_debug("suspended zone events");
if (server->zone_db) {
knot_zonedb_foreach(server->zone_db, zone_events_start);
}
+ server->state &= ~ServerShutting;
log_debug("resumed zone events");
}
ServerIdle = 0 << 0, /*!< Server is idle. */
ServerRunning = 1 << 0, /*!< Server is running. */
ServerAnswering = 1 << 1, /*!< Server is answering queries. */
+ ServerShutting = 1 << 2, /*!< Server is shutting down. */
} server_state_t;
/*!
assert(update->zone->control_update == NULL);
- if (zone_get_flag(update->zone, ZONE_SHUT_DOWN, false)) {
+ /* Don't start external validation if shutting down. */
+ if (update->zone->server->state & ServerShutting) {
pthread_mutex_unlock(&update->zone->cu_lock);
return KNOT_EEXTERNAL;
}
zone->control_update = NULL;
}
-void zone_shutdown(zone_t *zone)
-{
- pthread_mutex_lock(&zone->cu_lock);
- if (zone->control_update != NULL && (zone->control_update->flags & UPDATE_WFEV)) {
- knot_sem_post(&zone->control_update->external);
- }
- zone_set_flag(zone, ZONE_SHUT_DOWN);
- pthread_mutex_unlock(&zone->cu_lock);
-}
-
void zone_free(zone_t **zone_ptr)
{
if (zone_ptr == NULL || *zone_ptr == NULL) {
ZONE_XFR_FROZEN = 1 << 7, /*!< Outgoing AXFR/IXFR temporarily disabled. */
ZONE_USER_FLUSH = 1 << 8, /*!< User-triggered flush. */
ZONE_LAST_SIGN_OK = 1 << 9, /*!< Last full-sign event finished OK. */
- ZONE_SHUT_DOWN = 1 << 10, /*!< Zone events are shutting down. */
} zone_flag_t;
/*!
*/
zone_t* zone_new(const knot_dname_t *name);
-/*!
- * \brief Declare that zone is shutting down.
- *
- * \param zone Zone to be shut down.
- */
-void zone_shutdown(zone_t *zone);
-
/*!
* \brief Deallocates the zone structure.
*
it = knot_zonedb_iter_begin(db_new);
while (!knot_zonedb_iter_finished(it)) {
zone_t *z = knot_zonedb_iter_val(it);
- zone_unset_flag(z, ZONE_SHUT_DOWN);
-
conf_val_t val = conf_zone_get(conf, C_REVERSE_GEN, z->name);
while (val.code == KNOT_EOK) {
const knot_dname_t *forw_name = conf_dname(&val);