diff --git a/bin/named/include/named/server.h b/bin/named/include/named/server.h index 5dccbbca14..1628077677 100644 --- a/bin/named/include/named/server.h +++ b/bin/named/include/named/server.h @@ -82,7 +82,7 @@ struct named_server { uint32_t interface_interval; uint32_t heartbeat_interval; - named_reload_t reload_status; + atomic_int reload_status; bool flushonshutdown; diff --git a/bin/named/server.c b/bin/named/server.c index 28ba813ab3..3a9e9ed58e 100644 --- a/bin/named/server.c +++ b/bin/named/server.c @@ -9676,7 +9676,7 @@ view_loaded(void *arg) { "FIPS mode is %s", FIPS_mode() ? "enabled" : "disabled"); #endif /* ifdef HAVE_FIPS_MODE */ - server->reload_status = NAMED_RELOAD_DONE; + atomic_store(&server->reload_status, NAMED_RELOAD_DONE); isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL, NAMED_LOGMODULE_SERVER, ISC_LOG_NOTICE, @@ -10005,7 +10005,7 @@ named_server_create(isc_mem_t *mctx, named_server_t **serverp) { &server->in_roothints), "setting up root hints"); - server->reload_status = NAMED_RELOAD_IN_PROGRESS; + atomic_store(&server->reload_status, NAMED_RELOAD_IN_PROGRESS); /* * Setup the server task, which is responsible for coordinating @@ -10318,7 +10318,7 @@ loadconfig(named_server_t *server) { NAMED_LOGMODULE_SERVER, ISC_LOG_ERROR, "reloading configuration failed: %s", isc_result_totext(result)); - server->reload_status = NAMED_RELOAD_FAILED; + atomic_store(&server->reload_status, NAMED_RELOAD_FAILED); } return (result); @@ -10327,7 +10327,9 @@ loadconfig(named_server_t *server) { static isc_result_t reload(named_server_t *server) { isc_result_t result; - server->reload_status = NAMED_RELOAD_IN_PROGRESS; + + atomic_store(&server->reload_status, NAMED_RELOAD_IN_PROGRESS); + CHECK(loadconfig(server)); result = load_zones(server, false, false); @@ -10340,7 +10342,7 @@ reload(named_server_t *server) { NAMED_LOGMODULE_SERVER, ISC_LOG_ERROR, "reloading zones failed: %s", isc_result_totext(result)); - server->reload_status = NAMED_RELOAD_FAILED; + atomic_store(&server->reload_status, NAMED_RELOAD_FAILED); } cleanup: return (result); @@ -10686,7 +10688,7 @@ named_server_reloadcommand(named_server_t *server, isc_lex_t *lex, isc_result_t named_server_reconfigcommand(named_server_t *server) { isc_result_t result; - server->reload_status = NAMED_RELOAD_IN_PROGRESS; + atomic_store(&server->reload_status, NAMED_RELOAD_IN_PROGRESS); CHECK(loadconfig(server)); @@ -10700,7 +10702,7 @@ named_server_reconfigcommand(named_server_t *server) { NAMED_LOGMODULE_SERVER, ISC_LOG_ERROR, "loading new zones failed: %s", isc_result_totext(result)); - server->reload_status = NAMED_RELOAD_FAILED; + atomic_store(&server->reload_status, NAMED_RELOAD_FAILED); } cleanup: return (result); @@ -11808,6 +11810,7 @@ named_server_status(named_server_t *server, isc_buffer_t **text) { char boottime[ISC_FORMATHTTPTIMESTAMP_SIZE]; char configtime[ISC_FORMATHTTPTIMESTAMP_SIZE]; char line[1024], hostname[256]; + named_reload_t reload_status; if (named_g_server->version_set) { ob = " ("; @@ -11910,9 +11913,10 @@ named_server_status(named_server_t *server, isc_buffer_t **text) { ns_statscounter_tcphighwater)); CHECK(putstr(text, line)); - if (server->reload_status != NAMED_RELOAD_DONE) { + reload_status = atomic_load(&server->reload_status); + if (reload_status != NAMED_RELOAD_DONE) { snprintf(line, sizeof(line), "reload/reconfig %s\n", - (server->reload_status == NAMED_RELOAD_FAILED + (reload_status == NAMED_RELOAD_FAILED ? "failed" : "in progress")); CHECK(putstr(text, line));