Merge branch '4501-defer-control-channel-message-invalidation' into 'main'

Defer control channel message invalidation

Closes #4501

See merge request isc-projects/bind9!8641
This commit is contained in:
Mark Andrews 2024-01-10 21:52:03 +00:00
commit 31b1f3c3bc
4 changed files with 31 additions and 14 deletions

View file

@ -419,10 +419,10 @@ conn_shutdown(controlconnection_t *conn) {
conn->shuttingdown = true;
/*
* Calling invalidate on ccmsg will shutdown the TCP connection, thus
* we are making sure that no read callback will be called ever again.
* Close the TCP connection to make sure that no read callback will be
* called for it ever again.
*/
isccc_ccmsg_invalidate(&conn->ccmsg);
isccc_ccmsg_disconnect(&conn->ccmsg);
/* Detach the reading reference */
controlconnection_detach(&conn);
@ -575,6 +575,8 @@ conn_free(controlconnection_t *conn) {
controllistener_t *listener = conn->listener;
isccc_ccmsg_invalidate(&conn->ccmsg);
conn_cleanup(conn);
if (conn->buffer != NULL) {

View file

@ -348,7 +348,7 @@ rndc_recvdone(isc_nmhandle_t *handle, isc_result_t result, void *arg) {
isccc_sexpr_free(&response);
isccc_ccmsg_invalidate(ccmsg);
isccc_ccmsg_disconnect(ccmsg);
isc_loopmgr_shutdown(loopmgr);
}
@ -1003,6 +1003,8 @@ main(int argc, char **argv) {
isc_loopmgr_run(loopmgr);
isccc_ccmsg_invalidate(&rndc_ccmsg);
isc_log_destroy(&log);
isc_log_setcontext(NULL);

View file

@ -179,6 +179,16 @@ isccc_ccmsg_sendmessage(isccc_ccmsg_t *ccmsg, isc_region_t *region,
isc_nm_send(ccmsg->handle, region, ccmsg_senddone, ccmsg);
}
void
isccc_ccmsg_disconnect(isccc_ccmsg_t *ccmsg) {
REQUIRE(VALID_CCMSG(ccmsg));
if (ccmsg->handle != NULL) {
isc_nmhandle_close(ccmsg->handle);
isc_nmhandle_detach(&ccmsg->handle);
}
}
void
isccc_ccmsg_invalidate(isccc_ccmsg_t *ccmsg) {
REQUIRE(VALID_CCMSG(ccmsg));
@ -188,10 +198,6 @@ isccc_ccmsg_invalidate(isccc_ccmsg_t *ccmsg) {
if (ccmsg->buffer != NULL) {
isc_buffer_free(&ccmsg->buffer);
}
if (ccmsg->handle != NULL) {
isc_nmhandle_close(ccmsg->handle);
isc_nmhandle_detach(&ccmsg->handle);
}
}
void

View file

@ -120,18 +120,25 @@ isccc_ccmsg_sendmessage(isccc_ccmsg_t *ccmsg, isc_region_t *region,
*/
void
isccc_ccmsg_invalidate(isccc_ccmsg_t *ccmsg);
isccc_ccmsg_disconnect(isccc_ccmsg_t *ccmsg);
/*%
* Clean up all allocated state, and invalidate the structure.
* Disconnect from the connected netmgr handle associated with a command
* channel message.
*
* Requires:
*
*\li "ccmsg" be valid.
*\li "ccmsg" to be valid.
*/
void
isccc_ccmsg_invalidate(isccc_ccmsg_t *ccmsg);
/*%
* Clean up the magic number and the dynamic buffer associated with a command
* channel message.
*
* Ensures:
* Requires:
*
*\li "ccmsg" is invalidated and disassociated with all memory contexts,
* sockets, etc.
*\li "ccmsg" to be valid.
*/
void