mirror of
https://github.com/isc-projects/bind9.git
synced 2026-06-11 04:30:00 -04:00
484. [bug] When the server was reloaded after removing addresses
from the named.conf "listen-on" statement, sockets
were still listening on the removed addresses due
to reference count loops. [RT #325]
Now there is one client manager object per interface instead of a single
global one; when an interface goes away, it simply destroys the associated
client manager, which will cause all its clients to be shut down in an
orderly fashion.
This commit is contained in:
parent
34fec86ca3
commit
d15f51c600
6 changed files with 51 additions and 51 deletions
5
CHANGES
5
CHANGES
|
|
@ -1,3 +1,8 @@
|
|||
484. [bug] When the server was reloaded after removing addresses
|
||||
from the named.conf "listen-on" statement, sockets
|
||||
were still listening on the removed addresses due
|
||||
to reference count loops. [RT #325]
|
||||
|
||||
483. [bug] nslookup: "set all" showed search but it was not
|
||||
settable.
|
||||
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@
|
|||
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: client.c,v 1.114 2000/09/18 22:54:08 gson Exp $ */
|
||||
/* $Id: client.c,v 1.115 2000/09/22 00:13:03 gson Exp $ */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
|
|
@ -1711,9 +1711,8 @@ ns_clientmgr_createclients(ns_clientmgr_t *manager, unsigned int n,
|
|||
break;
|
||||
}
|
||||
|
||||
client->state = NS_CLIENTSTATE_READY;
|
||||
|
||||
ns_interface_attach(ifp, &client->interface);
|
||||
client->state = NS_CLIENTSTATE_READY;
|
||||
|
||||
if (tcp) {
|
||||
client->attributes |= NS_CLIENTATTR_TCP;
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@
|
|||
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: interfacemgr.h,v 1.19 2000/08/01 01:12:05 tale Exp $ */
|
||||
/* $Id: interfacemgr.h,v 1.20 2000/09/22 00:13:07 gson Exp $ */
|
||||
|
||||
#ifndef NAMED_INTERFACEMGR_H
|
||||
#define NAMED_INTERFACEMGR_H 1
|
||||
|
|
@ -73,13 +73,13 @@ struct ns_interface {
|
|||
unsigned int generation; /* Generation number. */
|
||||
isc_sockaddr_t addr; /* Address and port. */
|
||||
char name[32]; /* Null terminated. */
|
||||
isc_socket_t * udpsocket; /* UDP socket. */
|
||||
dns_dispatch_t * udpdispatch; /* UDP dispatcher. */
|
||||
isc_socket_t * tcpsocket; /* TCP socket. */
|
||||
isc_task_t * task;
|
||||
int ntcptarget; /* Desired number of concurrent
|
||||
TCP accepts */
|
||||
int ntcpcurrent; /* Current ditto, locked */
|
||||
ns_clientmgr_t * clientmgr; /* Client manager. */
|
||||
ISC_LINK(ns_interface_t) link;
|
||||
};
|
||||
|
||||
|
|
@ -91,7 +91,7 @@ isc_result_t
|
|||
ns_interfacemgr_create(isc_mem_t *mctx, isc_taskmgr_t *taskmgr,
|
||||
isc_socketmgr_t *socketmgr,
|
||||
dns_dispatchmgr_t *dispatchmgr,
|
||||
ns_clientmgr_t *clientmgr, ns_interfacemgr_t **mgrp);
|
||||
ns_interfacemgr_t **mgrp);
|
||||
/*
|
||||
* Create a new interface manager.
|
||||
*
|
||||
|
|
@ -135,14 +135,6 @@ ns_interfacemgr_setlistenon6(ns_interfacemgr_t *mgr, ns_listenlist_t *value);
|
|||
* The previous IPv6 listen-on list is freed.
|
||||
*/
|
||||
|
||||
isc_result_t
|
||||
ns_interfacemgr_findudpdispatcher(ns_interfacemgr_t *mgr,
|
||||
isc_sockaddr_t *address,
|
||||
dns_dispatch_t **dispatchp);
|
||||
/*
|
||||
* Find a UDP dispatcher matching 'address', if it exists.
|
||||
*/
|
||||
|
||||
dns_aclenv_t *
|
||||
ns_interfacemgr_getaclenv(ns_interfacemgr_t *mgr);
|
||||
|
||||
|
|
@ -152,4 +144,11 @@ ns_interface_attach(ns_interface_t *source, ns_interface_t **target);
|
|||
void
|
||||
ns_interface_detach(ns_interface_t **targetp);
|
||||
|
||||
void
|
||||
ns_interface_shutdown(ns_interface_t *ifp);
|
||||
/*
|
||||
* Stop listening for queries on interface 'ifp'.
|
||||
* May safely be called multiple times.
|
||||
*/
|
||||
|
||||
#endif /* NAMED_INTERFACEMGR_H */
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@
|
|||
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: server.h,v 1.36 2000/09/05 03:35:16 marka Exp $ */
|
||||
/* $Id: server.h,v 1.37 2000/09/22 00:13:08 gson Exp $ */
|
||||
|
||||
#ifndef NAMED_SERVER_H
|
||||
#define NAMED_SERVER_H 1
|
||||
|
|
@ -55,7 +55,6 @@ struct ns_server {
|
|||
/* Server data structures. */
|
||||
dns_loadmgr_t * loadmgr;
|
||||
dns_zonemgr_t * zonemgr;
|
||||
ns_clientmgr_t * clientmgr;
|
||||
dns_viewlist_t viewlist;
|
||||
ns_interfacemgr_t * interfacemgr;
|
||||
dns_db_t * in_roothints;
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@
|
|||
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: interfacemgr.c,v 1.49 2000/08/26 01:42:26 bwelling Exp $ */
|
||||
/* $Id: interfacemgr.c,v 1.50 2000/09/22 00:13:04 gson Exp $ */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
|
|
@ -45,7 +45,6 @@ struct ns_interfacemgr {
|
|||
isc_taskmgr_t * taskmgr; /* Task manager. */
|
||||
isc_socketmgr_t * socketmgr; /* Socket manager. */
|
||||
dns_dispatchmgr_t * dispatchmgr;
|
||||
ns_clientmgr_t * clientmgr; /* Client manager. */
|
||||
unsigned int generation; /* Current generation no. */
|
||||
ns_listenlist_t * listenon4;
|
||||
ns_listenlist_t * listenon6;
|
||||
|
|
@ -60,7 +59,7 @@ isc_result_t
|
|||
ns_interfacemgr_create(isc_mem_t *mctx, isc_taskmgr_t *taskmgr,
|
||||
isc_socketmgr_t *socketmgr,
|
||||
dns_dispatchmgr_t *dispatchmgr,
|
||||
ns_clientmgr_t *clientmgr, ns_interfacemgr_t **mgrp)
|
||||
ns_interfacemgr_t **mgrp)
|
||||
{
|
||||
isc_result_t result;
|
||||
ns_interfacemgr_t *mgr;
|
||||
|
|
@ -81,10 +80,10 @@ ns_interfacemgr_create(isc_mem_t *mctx, isc_taskmgr_t *taskmgr,
|
|||
mgr->taskmgr = taskmgr;
|
||||
mgr->socketmgr = socketmgr;
|
||||
mgr->dispatchmgr = dispatchmgr;
|
||||
mgr->clientmgr = clientmgr;
|
||||
mgr->generation = 1;
|
||||
mgr->listenon4 = NULL;
|
||||
mgr->listenon6 = NULL;
|
||||
|
||||
ISC_LIST_INIT(mgr->interfaces);
|
||||
|
||||
/*
|
||||
|
|
@ -185,6 +184,7 @@ ns_interface_create(ns_interfacemgr_t *mgr, isc_sockaddr_t *addr,
|
|||
ifp->addr = *addr;
|
||||
strncpy(ifp->name, name, sizeof(ifp->name));
|
||||
ifp->name[sizeof(ifp->name)-1] = '\0';
|
||||
ifp->clientmgr = NULL;
|
||||
|
||||
result = isc_mutex_init(&ifp->lock);
|
||||
if (result != ISC_R_SUCCESS)
|
||||
|
|
@ -203,6 +203,16 @@ ns_interface_create(ns_interfacemgr_t *mgr, isc_sockaddr_t *addr,
|
|||
}
|
||||
isc_task_setname(ifp->task, "ifp", ifp);
|
||||
|
||||
result = ns_clientmgr_create(mgr->mctx, mgr->taskmgr,
|
||||
ns_g_timermgr,
|
||||
&ifp->clientmgr);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
isc_log_write(IFMGR_COMMON_LOGARGS, ISC_LOG_ERROR,
|
||||
"ns_clientmgr_create() failed: %s",
|
||||
isc_result_totext(result));
|
||||
goto clientmgr_create_failure;
|
||||
}
|
||||
|
||||
ifp->udpdispatch = NULL;
|
||||
|
||||
ifp->tcpsocket = NULL;
|
||||
|
|
@ -215,6 +225,8 @@ ns_interface_create(ns_interfacemgr_t *mgr, isc_sockaddr_t *addr,
|
|||
ifp->ntcptarget = 1;
|
||||
ifp->ntcpcurrent = 0;
|
||||
|
||||
ISC_LINK_INIT(ifp, link);
|
||||
|
||||
ns_interfacemgr_attach(mgr, &ifp->mgr);
|
||||
ISC_LIST_APPEND(mgr->interfaces, ifp, link);
|
||||
|
||||
|
|
@ -224,6 +236,8 @@ ns_interface_create(ns_interfacemgr_t *mgr, isc_sockaddr_t *addr,
|
|||
|
||||
return (ISC_R_SUCCESS);
|
||||
|
||||
clientmgr_create_failure:
|
||||
isc_task_destroy(&ifp->task);
|
||||
task_create_failure:
|
||||
DESTROYLOCK(&ifp->lock);
|
||||
lock_create_failure:
|
||||
|
|
@ -259,7 +273,7 @@ ns_interface_listenudp(ns_interface_t *ifp) {
|
|||
goto udp_dispatch_failure;
|
||||
}
|
||||
|
||||
result = ns_clientmgr_createclients(ifp->mgr->clientmgr, ns_g_cpus,
|
||||
result = ns_clientmgr_createclients(ifp->clientmgr, ns_g_cpus,
|
||||
ifp, ISC_FALSE);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
UNEXPECTED_ERROR(__FILE__, __LINE__,
|
||||
|
|
@ -307,7 +321,7 @@ ns_interface_accepttcp(ns_interface_t *ifp) {
|
|||
goto tcp_listen_failure;
|
||||
}
|
||||
|
||||
result = ns_clientmgr_createclients(ifp->mgr->clientmgr,
|
||||
result = ns_clientmgr_createclients(ifp->clientmgr,
|
||||
ifp->ntcptarget, ifp,
|
||||
ISC_TRUE);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
|
|
@ -361,18 +375,26 @@ ns_interface_setup(ns_interfacemgr_t *mgr, isc_sockaddr_t *addr,
|
|||
return (result);
|
||||
}
|
||||
|
||||
void
|
||||
ns_interface_shutdown(ns_interface_t *ifp) {
|
||||
if (ifp->clientmgr != NULL)
|
||||
ns_clientmgr_destroy(&ifp->clientmgr);
|
||||
}
|
||||
|
||||
static void
|
||||
ns_interface_destroy(ns_interface_t *ifp) {
|
||||
isc_mem_t *mctx = ifp->mgr->mctx;
|
||||
REQUIRE(NS_INTERFACE_VALID(ifp));
|
||||
|
||||
ns_interface_shutdown(ifp);
|
||||
|
||||
if (ifp->udpdispatch != NULL)
|
||||
dns_dispatch_detach(&ifp->udpdispatch);
|
||||
if (ifp->tcpsocket != NULL) {
|
||||
if (ifp->tcpsocket != NULL)
|
||||
isc_socket_detach(&ifp->tcpsocket);
|
||||
}
|
||||
if (ifp->task != NULL)
|
||||
isc_task_detach(&ifp->task);
|
||||
|
||||
isc_task_detach(&ifp->task);
|
||||
DESTROYLOCK(&ifp->lock);
|
||||
|
||||
ns_interfacemgr_detach(&ifp->mgr);
|
||||
|
|
@ -439,6 +461,7 @@ purge_old_interfaces(ns_interfacemgr_t *mgr) {
|
|||
isc_log_write(IFMGR_COMMON_LOGARGS,
|
||||
ISC_LOG_INFO,
|
||||
"no longer listening on %s", sabuf);
|
||||
ns_interface_shutdown(ifp);
|
||||
ns_interface_detach(&ifp);
|
||||
}
|
||||
}
|
||||
|
|
@ -708,21 +731,3 @@ ns_interfacemgr_setlistenon6(ns_interfacemgr_t *mgr, ns_listenlist_t *value) {
|
|||
UNLOCK(&mgr->lock);
|
||||
}
|
||||
|
||||
isc_result_t
|
||||
ns_interfacemgr_findudpdispatcher(ns_interfacemgr_t *mgr,
|
||||
isc_sockaddr_t *address,
|
||||
dns_dispatch_t **dispatchp)
|
||||
{
|
||||
ns_interface_t *ifp;
|
||||
|
||||
/*
|
||||
* Find a UDP dispatcher matching 'address', if it exists.
|
||||
*/
|
||||
|
||||
ifp = find_matching_interface(mgr, address);
|
||||
if (ifp == NULL || ifp->udpdispatch == NULL)
|
||||
return (ISC_R_NOTFOUND);
|
||||
dns_dispatch_attach(ifp->udpdispatch, dispatchp);
|
||||
|
||||
return (ISC_R_SUCCESS);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@
|
|||
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: server.c,v 1.221 2000/09/12 10:08:56 bwelling Exp $ */
|
||||
/* $Id: server.c,v 1.222 2000/09/22 00:13:05 gson Exp $ */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
|
|
@ -1618,13 +1618,8 @@ run_server(isc_task_t *task, isc_event_t *event) {
|
|||
&ns_g_dispatchmgr),
|
||||
"creating dispatch manager");
|
||||
|
||||
CHECKFATAL(ns_clientmgr_create(ns_g_mctx, ns_g_taskmgr, ns_g_timermgr,
|
||||
&server->clientmgr),
|
||||
"creating client manager");
|
||||
|
||||
CHECKFATAL(ns_interfacemgr_create(ns_g_mctx, ns_g_taskmgr,
|
||||
ns_g_socketmgr, ns_g_dispatchmgr,
|
||||
server->clientmgr,
|
||||
&server->interfacemgr),
|
||||
"creating interface manager");
|
||||
|
||||
|
|
@ -1664,7 +1659,6 @@ shutdown_server(isc_task_t *task, isc_event_t *event) {
|
|||
dns_view_detach(&view);
|
||||
}
|
||||
|
||||
ns_clientmgr_destroy(&server->clientmgr);
|
||||
isc_timer_detach(&server->interface_timer);
|
||||
|
||||
ns_interfacemgr_shutdown(server->interfacemgr);
|
||||
|
|
@ -1710,7 +1704,6 @@ ns_server_create(isc_mem_t *mctx, ns_server_t **serverp) {
|
|||
/* Initialize server data structures. */
|
||||
server->loadmgr = NULL;
|
||||
server->zonemgr = NULL;
|
||||
server->clientmgr = NULL;
|
||||
server->interfacemgr = NULL;
|
||||
ISC_LIST_INIT(server->viewlist);
|
||||
server->in_roothints = NULL;
|
||||
|
|
|
|||
Loading…
Reference in a new issue