2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-08-22 10:10:06 +00:00

attempt to start txn only at event beginning

This commit is contained in:
Colin Vidal 2025-08-21 16:17:15 +02:00
parent bb2d490ae3
commit 57eede62b9
8 changed files with 76 additions and 21 deletions

View File

@ -148,6 +148,7 @@ named_control_docommand(isccc_sexpr_t *message, bool readonly,
log_level, "received control channel command '%s'", log_level, "received control channel command '%s'",
cmdline); cmdline);
dns_cfgmgr_rwtxn();
/* /*
* After the lengthy "halt" and "stop", the commands are * After the lengthy "halt" and "stop", the commands are
* handled in alphabetical order of the NAMED_COMMAND_ macros. * handled in alphabetical order of the NAMED_COMMAND_ macros.
@ -305,6 +306,7 @@ named_control_docommand(isccc_sexpr_t *message, bool readonly,
result = DNS_R_UNKNOWNCOMMAND; result = DNS_R_UNKNOWNCOMMAND;
} }
INSIST(dns_cfgmgr_commit() == ISC_R_SUCCESS);
cleanup: cleanup:
if (lex != NULL) { if (lex != NULL) {
isc_lex_destroy(&lex); isc_lex_destroy(&lex);

View File

@ -7959,14 +7959,15 @@ apply_configuration(cfg_parser_t *configparser, cfg_obj_t *config,
dns_cfgmgr_mode(DNS_CFGMGR_MODEUSER); dns_cfgmgr_mode(DNS_CFGMGR_MODEUSER);
dns_cfgmgr_rwtxn(); dns_cfgmgr_rwtxn();
REQUIRE(dns_cfgmgr_commit() == ISC_R_SUCCESS); REQUIRE(dns_cfgmgr_commit() == ISC_R_SUCCESS);
}
/* /*
* This is false as it should still be on USER mode as we're loading * This is false as it should still be on USER mode as we're
* user configuration. This is just a workaround until there is a clear * loading user configuration. This is just a workaround until
* lifecycle model. * there is a clear lifecycle model.
*/ */
dns_cfgmgr_mode(DNS_CFGMGR_MODERUNNING); dns_cfgmgr_mode(DNS_CFGMGR_MODERUNNING);
dns_cfgmgr_rwtxn();
}
/* Let's recreate the TLS context cache */ /* Let's recreate the TLS context cache */
if (server->tlsctx_server_cache != NULL) { if (server->tlsctx_server_cache != NULL) {
@ -9287,6 +9288,9 @@ cleanup_exclusive:
ISC_LOG_DEBUG(1), "apply_configuration: %s", ISC_LOG_DEBUG(1), "apply_configuration: %s",
isc_result_totext(result)); isc_result_totext(result));
if (first_time) {
INSIST(dns_cfgmgr_commit() == ISC_R_SUCCESS);
}
return result; return result;
} }
@ -9509,7 +9513,9 @@ run_server(void *arg) {
CHECKFATAL(load_configuration(server, true), "loading configuration"); CHECKFATAL(load_configuration(server, true), "loading configuration");
dns_cfgmgr_txn();
CHECKFATAL(load_zones(server, false), "loading zones"); CHECKFATAL(load_zones(server, false), "loading zones");
dns_cfgmgr_closetxn();
#ifdef ENABLE_AFL #ifdef ENABLE_AFL
named_g_run_done = true; named_g_run_done = true;
#endif /* ifdef ENABLE_AFL */ #endif /* ifdef ENABLE_AFL */
@ -9527,6 +9533,8 @@ shutdown_server(void *arg) {
named_server_t *server = (named_server_t *)arg; named_server_t *server = (named_server_t *)arg;
bool flush = server->flushonshutdown; bool flush = server->flushonshutdown;
dns_cfgmgr_rwtxn();
named_os_notify_systemd("STOPPING=1\n"); named_os_notify_systemd("STOPPING=1\n");
named_os_notify_close(); named_os_notify_close();
@ -9609,6 +9617,7 @@ shutdown_server(void *arg) {
dns_db_detach(&server->in_roothints); dns_db_detach(&server->in_roothints);
isc_loopmgr_resume(named_g_loopmgr); isc_loopmgr_resume(named_g_loopmgr);
INSIST(dns_cfgmgr_commit() == ISC_R_SUCCESS);
} }
static isc_result_t static isc_result_t

View File

@ -803,27 +803,14 @@ void
dns_acl_set(const void *owner, const char *path, const dns_acl_t *acl) { dns_acl_set(const void *owner, const char *path, const dns_acl_t *acl) {
REQUIRE(acl == NULL || DNS_ACL_VALID(acl)); REQUIRE(acl == NULL || DNS_ACL_VALID(acl));
/*
* Temporary work around until there is a clear life-cycle model of the
* transaction
*/
dns_cfgmgr_rwtxn();
dns_cfgmgr_setref(owner, path, (void *)acl, acl_cfgmgrattach, dns_cfgmgr_setref(owner, path, (void *)acl, acl_cfgmgrattach,
acl_cfgmgrdetach); acl_cfgmgrdetach);
REQUIRE(dns_cfgmgr_commit() == ISC_R_SUCCESS);
} }
dns_acl_t * dns_acl_t *
dns_acl_get(const void *owner, const char *path) { dns_acl_get(const void *owner, const char *path) {
dns_acl_t *acl = NULL; dns_acl_t *acl = NULL;
/*
* Temporary work around until there is a clear life-cycle model of the
* transaction
*/
dns_cfgmgr_txn();
(void)dns_cfgmgr_getref(owner, path, (void **)&acl); (void)dns_cfgmgr_getref(owner, path, (void **)&acl);
dns_cfgmgr_closetxn();
return acl; return acl;
} }

View File

@ -7360,6 +7360,8 @@ resquery_response(isc_result_t eresult, isc_region_t *region, void *arg) {
return; return;
} }
dns_cfgmgr_txn();
REQUIRE(VALID_QUERY(query)); REQUIRE(VALID_QUERY(query));
fctx = query->fctx; fctx = query->fctx;
REQUIRE(VALID_FCTX(fctx)); REQUIRE(VALID_FCTX(fctx));
@ -7535,6 +7537,8 @@ resquery_response(isc_result_t eresult, isc_region_t *region, void *arg) {
cleanup: cleanup:
isc_mem_putanddetach(&rctx->mctx, rctx, sizeof(*rctx)); isc_mem_putanddetach(&rctx->mctx, rctx, sizeof(*rctx));
dns_cfgmgr_closetxn();
} }
static void static void

View File

@ -2540,6 +2540,7 @@ zone_asyncload(void *arg) {
dns_zone_t *zone = asl->zone; dns_zone_t *zone = asl->zone;
isc_result_t result; isc_result_t result;
dns_cfgmgr_txn();
REQUIRE(DNS_ZONE_VALID(zone)); REQUIRE(DNS_ZONE_VALID(zone));
LOCK_ZONE(zone); LOCK_ZONE(zone);
@ -2556,6 +2557,7 @@ zone_asyncload(void *arg) {
isc_mem_put(zone->mctx, asl, sizeof(*asl)); isc_mem_put(zone->mctx, asl, sizeof(*asl));
dns_zone_idetach(&zone); dns_zone_idetach(&zone);
dns_cfgmgr_closetxn();
} }
isc_result_t isc_result_t
@ -5906,6 +5908,13 @@ closeversion:
return answer; return answer;
} }
static void
zone_shutdown_inloop(void *zone) {
dns_cfgmgr_rwtxn();
zone_shutdown(zone);
INSIST(dns_cfgmgr_commit() == ISC_R_SUCCESS);
}
static void static void
zone_destroy(dns_zone_t *zone) { zone_destroy(dns_zone_t *zone) {
/* /*
@ -5926,7 +5935,7 @@ zone_destroy(dns_zone_t *zone) {
* This zone has a loop; it can clean * This zone has a loop; it can clean
* itself up asynchronously. * itself up asynchronously.
*/ */
isc_async_run(zone->loop, zone_shutdown, zone); isc_async_run(zone->loop, zone_shutdown_inloop, zone);
} }
} }
@ -10410,6 +10419,8 @@ keyfetch_done(void *arg) {
dns_rdataset_t *dnskeys = NULL, *dnskeysigs = NULL; dns_rdataset_t *dnskeys = NULL, *dnskeysigs = NULL;
dns_rdataset_t *keydataset = NULL, dsset; dns_rdataset_t *keydataset = NULL, dsset;
dns_cfgmgr_rwtxn();
INSIST(resp != NULL); INSIST(resp != NULL);
kfetch = resp->arg; kfetch = resp->arg;
@ -11025,6 +11036,8 @@ cleanup:
} }
INSIST(ver == NULL); INSIST(ver == NULL);
INSIST(dns_cfgmgr_commit() == ISC_R_SUCCESS);
} }
static void static void
@ -15162,7 +15175,9 @@ zone_timer(void *arg) {
REQUIRE(DNS_ZONE_VALID(zone)); REQUIRE(DNS_ZONE_VALID(zone));
dns_cfgmgr_txn();
zone_maintenance(zone); zone_maintenance(zone);
dns_cfgmgr_closetxn();
} }
static void static void
@ -16795,6 +16810,7 @@ receive_secure_serial(void *arg) {
isc_time_t timenow; isc_time_t timenow;
int level = ISC_LOG_ERROR; int level = ISC_LOG_ERROR;
dns_cfgmgr_txn();
ENTER; ENTER;
LOCK_ZONE(zone); LOCK_ZONE(zone);
@ -16930,6 +16946,7 @@ receive_secure_serial(void *arg) {
dns_journal_destroy(&rjournal); dns_journal_destroy(&rjournal);
} }
isc_async_run(zone->loop, receive_secure_serial, rss); isc_async_run(zone->loop, receive_secure_serial, rss);
dns_cfgmgr_closetxn();
return; return;
} }
@ -17024,6 +17041,7 @@ failure:
dns_diff_clear(&zone->rss_diff); dns_diff_clear(&zone->rss_diff);
dns_zone_idetach(&zone); dns_zone_idetach(&zone);
dns_cfgmgr_closetxn();
} }
static isc_result_t static isc_result_t
@ -17367,6 +17385,7 @@ receive_secure_db(void *arg) {
unsigned int oldserial = 0, *oldserialp = NULL; unsigned int oldserial = 0, *oldserialp = NULL;
nsec3paramlist_t nsec3list; nsec3paramlist_t nsec3list;
dns_cfgmgr_txn();
ISC_LIST_INIT(nsec3list); ISC_LIST_INIT(nsec3list);
LOCK_ZONE(zone); LOCK_ZONE(zone);
@ -17482,6 +17501,7 @@ failure:
dns_zone_idetach(&zone); dns_zone_idetach(&zone);
INSIST(version == NULL); INSIST(version == NULL);
dns_cfgmgr_closetxn();
} }
static isc_result_t static isc_result_t
@ -18057,6 +18077,7 @@ zone_loaddone(void *arg, isc_result_t result) {
zone = load->zone; zone = load->zone;
dns_cfgmgr_txn();
ENTER; ENTER;
/* /*
@ -18119,6 +18140,8 @@ again:
isc_mem_put(zone->mctx, load, sizeof(*load)); isc_mem_put(zone->mctx, load, sizeof(*load));
dns_zone_idetach(&zone); dns_zone_idetach(&zone);
dns_cfgmgr_closetxn();
} }
void void

View File

@ -1861,6 +1861,8 @@ ns_client_request(isc_nmhandle_t *handle, isc_result_t eresult,
return; return;
} }
dns_cfgmgr_txn();
client = isc_nmhandle_getdata(handle); client = isc_nmhandle_getdata(handle);
if (client == NULL) { if (client == NULL) {
ns_interface_t *ifp = (ns_interface_t *)arg; ns_interface_t *ifp = (ns_interface_t *)arg;
@ -1922,6 +1924,7 @@ ns_client_request(isc_nmhandle_t *handle, isc_result_t eresult,
NS_LOGMODULE_CLIENT, ISC_LOG_DEBUG(10), NS_LOGMODULE_CLIENT, ISC_LOG_DEBUG(10),
"dropped request: suspicious port"); "dropped request: suspicious port");
isc_nm_bad_request(handle); isc_nm_bad_request(handle);
dns_cfgmgr_closetxn();
return; return;
} }
#endif /* if NS_CLIENT_DROPPORT */ #endif /* if NS_CLIENT_DROPPORT */
@ -1936,6 +1939,7 @@ ns_client_request(isc_nmhandle_t *handle, isc_result_t eresult,
NS_LOGMODULE_CLIENT, ISC_LOG_DEBUG(10), NS_LOGMODULE_CLIENT, ISC_LOG_DEBUG(10),
"dropped request: blackholed peer"); "dropped request: blackholed peer");
isc_nm_bad_request(handle); isc_nm_bad_request(handle);
dns_cfgmgr_closetxn();
return; return;
} }
@ -1953,6 +1957,7 @@ ns_client_request(isc_nmhandle_t *handle, isc_result_t eresult,
NS_LOGMODULE_CLIENT, ISC_LOG_DEBUG(10), NS_LOGMODULE_CLIENT, ISC_LOG_DEBUG(10),
"dropped request: invalid message header"); "dropped request: invalid message header");
isc_nm_bad_request(handle); isc_nm_bad_request(handle);
dns_cfgmgr_closetxn();
return; return;
} }
@ -1972,6 +1977,7 @@ ns_client_request(isc_nmhandle_t *handle, isc_result_t eresult,
NS_LOGMODULE_CLIENT, ISC_LOG_DEBUG(10), NS_LOGMODULE_CLIENT, ISC_LOG_DEBUG(10),
"dropped request: unexpected response"); "dropped request: unexpected response");
isc_nm_bad_request(handle); isc_nm_bad_request(handle);
dns_cfgmgr_closetxn();
return; return;
} }
@ -2037,6 +2043,7 @@ ns_client_request(isc_nmhandle_t *handle, isc_result_t eresult,
result = DNS_R_FORMERR; result = DNS_R_FORMERR;
} }
ns_client_error(client, result); ns_client_error(client, result);
dns_cfgmgr_closetxn();
return; return;
} }
@ -2077,6 +2084,7 @@ ns_client_request(isc_nmhandle_t *handle, isc_result_t eresult,
0) 0)
{ {
ns_client_error(client, DNS_R_FORMERR); ns_client_error(client, DNS_R_FORMERR);
dns_cfgmgr_closetxn();
return; return;
} }
@ -2087,6 +2095,7 @@ ns_client_request(isc_nmhandle_t *handle, isc_result_t eresult,
0) 0)
{ {
ns_client_error(client, DNS_R_NOTIMP); ns_client_error(client, DNS_R_NOTIMP);
dns_cfgmgr_closetxn();
return; return;
} }
@ -2097,6 +2106,7 @@ ns_client_request(isc_nmhandle_t *handle, isc_result_t eresult,
0) 0)
{ {
ns_client_error(client, DNS_R_REFUSED); ns_client_error(client, DNS_R_REFUSED);
dns_cfgmgr_closetxn();
return; return;
} }
@ -2106,11 +2116,13 @@ ns_client_request(isc_nmhandle_t *handle, isc_result_t eresult,
if ((client->manager->sctx->options & NS_SERVER_DROPEDNS) != 0) if ((client->manager->sctx->options & NS_SERVER_DROPEDNS) != 0)
{ {
ns_client_drop(client, ISC_R_SUCCESS); ns_client_drop(client, ISC_R_SUCCESS);
dns_cfgmgr_closetxn();
return; return;
} }
result = process_opt(client, opt); result = process_opt(client, opt);
if (result != ISC_R_SUCCESS) { if (result != ISC_R_SUCCESS) {
dns_cfgmgr_closetxn();
return; return;
} }
} }
@ -2123,6 +2135,7 @@ ns_client_request(isc_nmhandle_t *handle, isc_result_t eresult,
result = dns_message_reply(client->message, true); result = dns_message_reply(client->message, true);
if (result != ISC_R_SUCCESS) { if (result != ISC_R_SUCCESS) {
ns_client_error(client, result); ns_client_error(client, result);
dns_cfgmgr_closetxn();
return; return;
} }
@ -2131,6 +2144,7 @@ ns_client_request(isc_nmhandle_t *handle, isc_result_t eresult,
} }
ns_client_send(client); ns_client_send(client);
dns_cfgmgr_closetxn();
return; return;
} }
@ -2140,6 +2154,7 @@ ns_client_request(isc_nmhandle_t *handle, isc_result_t eresult,
ns_client_dumpmessage(client, "message class could not be " ns_client_dumpmessage(client, "message class could not be "
"determined"); "determined");
ns_client_error(client, notimp ? DNS_R_NOTIMP : DNS_R_FORMERR); ns_client_error(client, notimp ? DNS_R_NOTIMP : DNS_R_FORMERR);
dns_cfgmgr_closetxn();
return; return;
} }
@ -2156,10 +2171,12 @@ ns_client_request(isc_nmhandle_t *handle, isc_result_t eresult,
result = ns_client_setup_view(client, &netaddr); result = ns_client_setup_view(client, &netaddr);
if (result == DNS_R_WAIT) { if (result == DNS_R_WAIT) {
dns_cfgmgr_closetxn();
return; return;
} }
ns_client_request_continue(client); ns_client_request_continue(client);
dns_cfgmgr_closetxn();
} }
static void static void

View File

@ -5355,6 +5355,8 @@ ns__query_start(query_ctx_t *qctx) {
qctx->need_wildcardproof = false; qctx->need_wildcardproof = false;
qctx->rpz = false; qctx->rpz = false;
// dns_cfgmgr_txn();
CALL_HOOK(NS_QUERY_START_BEGIN, qctx); CALL_HOOK(NS_QUERY_START_BEGIN, qctx);
/* /*
@ -6056,6 +6058,8 @@ fetch_callback(void *arg) {
int errorloglevel; int errorloglevel;
query_ctx_t qctx; query_ctx_t qctx;
dns_cfgmgr_txn();
REQUIRE(NS_CLIENT_VALID(client)); REQUIRE(NS_CLIENT_VALID(client));
REQUIRE(RECURSING(client)); REQUIRE(RECURSING(client));
@ -6158,6 +6162,7 @@ fetch_callback(void *arg) {
} }
dns_resolver_destroyfetch(&fetch); dns_resolver_destroyfetch(&fetch);
dns_cfgmgr_closetxn();
} }
/*% /*%
@ -11242,6 +11247,7 @@ ns_query_done(query_ctx_t *qctx) {
const dns_namelist_t *secs = qctx->client->message->sections; const dns_namelist_t *secs = qctx->client->message->sections;
bool partial_result_with_servfail = false; bool partial_result_with_servfail = false;
//dns_cfgmgr_closetxn();
CCTRACE(ISC_LOG_DEBUG(3), "ns_query_done"); CCTRACE(ISC_LOG_DEBUG(3), "ns_query_done");
CALL_HOOK(NS_QUERY_DONE_BEGIN, qctx); CALL_HOOK(NS_QUERY_DONE_BEGIN, qctx);

View File

@ -2684,6 +2684,8 @@ update_action(void *arg) {
uint64_t records; uint64_t records;
bool is_inline, is_maintain, is_signing; bool is_inline, is_maintain, is_signing;
dns_cfgmgr_txn();
dns_diff_init(mctx, &diff); dns_diff_init(mctx, &diff);
dns_diff_init(mctx, &temp); dns_diff_init(mctx, &temp);
@ -3371,6 +3373,8 @@ common:
isc_async_run(client->manager->loop, updatedone_action, uev); isc_async_run(client->manager->loop, updatedone_action, uev);
INSIST(ver == NULL); INSIST(ver == NULL);
dns_cfgmgr_closetxn();
} }
static void static void
@ -3378,6 +3382,7 @@ updatedone_action(void *arg) {
update_t *uev = (update_t *)arg; update_t *uev = (update_t *)arg;
ns_client_t *client = uev->client; ns_client_t *client = uev->client;
dns_cfgmgr_txn();
REQUIRE(client->updatehandle == client->handle); REQUIRE(client->updatehandle == client->handle);
switch (uev->result) { switch (uev->result) {
@ -3400,6 +3405,8 @@ updatedone_action(void *arg) {
} }
isc_mem_put(client->manager->mctx, uev, sizeof(*uev)); isc_mem_put(client->manager->mctx, uev, sizeof(*uev));
isc_nmhandle_detach(&client->updatehandle); isc_nmhandle_detach(&client->updatehandle);
dns_cfgmgr_closetxn();
} }
/*% /*%