diff --git a/bin/named/server.c b/bin/named/server.c index 652bb67570..c8f3422f66 100644 --- a/bin/named/server.c +++ b/bin/named/server.c @@ -805,6 +805,11 @@ load_configuration(const char *filename, ns_server_t *server, /* * Configure the zone manager. */ + { + isc_int32_t transfersin = 10; + (void) dns_c_ctx_gettransfersin(configctx, &transfersin); + dns_zonemgr_settransfersin(server->zonemgr, transfersin); + } { isc_int32_t transfersperns = 2; (void) dns_c_ctx_gettransfersperns(configctx, &transfersperns); diff --git a/doc/misc/options b/doc/misc/options index fbf55d0897..2038dd5554 100644 --- a/doc/misc/options +++ b/doc/misc/options @@ -69,7 +69,7 @@ options { [ min-roots number; ] No [ serial-queries number; ] No [ transfer-format ( one-answer | many-answers ); ] Yes - [ transfers-in number; ] No + [ transfers-in number; ] Yes [ transfers-out number; ] Yes [ transfers-per-ns number; ] Yes [ transfer-source ip_addr; ] Yes diff --git a/lib/dns/xfrin.c b/lib/dns/xfrin.c index 0102aeae6d..0fb4d2f471 100644 --- a/lib/dns/xfrin.c +++ b/lib/dns/xfrin.c @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: xfrin.c,v 1.50 2000/02/25 00:50:36 gson Exp $ */ + /* $Id: xfrin.c,v 1.51 2000/02/25 17:34:04 gson Exp $ */ #include @@ -508,9 +508,9 @@ dns_xfrin_create(dns_zone_t *zone, isc_sockaddr_t *masteraddr, dns_tsigkey_t *key = NULL; isc_netaddr_t masterip; dns_peer_t *peer = NULL; - int maxtransfers; + int maxtransfersin, maxtransfersperns; + int nxfrsin, nxfrsperns; dns_xfrinlist_t *transferlist; - int nxfrs; REQUIRE(xfrp != NULL && *xfrp == NULL); @@ -573,25 +573,29 @@ dns_xfrin_create(dns_zone_t *zone, isc_sockaddr_t *masteraddr, * and we don't want to create the transfer object until we * know there is quota available. */ - maxtransfers = dns_zonemgr_getttransfersperns(dns_zone_getmgr(zone)); + maxtransfersin = + dns_zonemgr_getttransfersin(dns_zone_getmgr(zone)); + maxtransfersperns = + dns_zonemgr_getttransfersperns(dns_zone_getmgr(zone)); if (peer != NULL) { - (void) dns_peer_gettransfers(peer, &maxtransfers); + (void) dns_peer_gettransfers(peer, &maxtransfersperns); } transferlist = dns_zonemgr_gettransferlist(dns_zone_getmgr(zone)); LOCK(&transferlist->lock); - nxfrs = 0; + nxfrsin = nxfrsperns = 0; for (x = ISC_LIST_HEAD(transferlist->transfers); x != NULL; x = ISC_LIST_NEXT(x, link)) { isc_netaddr_t xip; isc_netaddr_fromsockaddr(&xip, &x->masteraddr); + nxfrsin++; if (isc_netaddr_equal(&xip, &masterip)) - nxfrs++; + nxfrsperns++; } - if (nxfrs >= maxtransfers) { + if (nxfrsin >= maxtransfersin || nxfrsperns >= maxtransfersperns) { result = ISC_R_QUOTA; xfrin_log1(ISC_LOG_INFO, zonename, masteraddr, "deferred: %s", isc_result_totext(result)); diff --git a/lib/dns/zone.c b/lib/dns/zone.c index 19be164e4f..0128240ced 100644 --- a/lib/dns/zone.c +++ b/lib/dns/zone.c @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: zone.c,v 1.83 2000/02/25 00:50:38 gson Exp $ */ + /* $Id: zone.c,v 1.84 2000/02/25 17:34:05 gson Exp $ */ #include @@ -26,7 +26,6 @@ #include #include #include -#include #include #include #include @@ -199,9 +198,10 @@ struct dns_zonemgr { isc_rwlock_t conflock; /* Locked by rwlock. */ ISC_LIST(dns_zone_t) zones; - /* Maximum locked by conflock. */ - isc_quota_t transfersin; + /* Locked by conflock. */ + int transfersin; int transfersperns; + /* Contains its own lock. */ dns_xfrinlist_t transferlist; }; @@ -3147,22 +3147,16 @@ dns_zonemgr_create(isc_mem_t *mctx, isc_taskmgr_t *taskmgr, goto free_rwlock; } - result = isc_quota_init(&zmgr->transfersin, 10); - if (result != ISC_R_SUCCESS) { - UNEXPECTED_ERROR(__FILE__, __LINE__, - "isc_quota_init() failed: %s", - isc_result_totext(result)); - result = DNS_R_UNEXPECTED; - goto free_conflock; - } + zmgr->transfersin = 10; zmgr->transfersperns = 2; + result = dns_xfrinlist_init(&zmgr->transferlist); if (result != ISC_R_SUCCESS) { UNEXPECTED_ERROR(__FILE__, __LINE__, "dns_transferlist_init() failed: %s", isc_result_totext(result)); result = DNS_R_UNEXPECTED; - goto free_transfersin; + goto free_conflock; } /* Create the zone task pool. */ @@ -3184,8 +3178,6 @@ dns_zonemgr_create(isc_mem_t *mctx, isc_taskmgr_t *taskmgr, dns_xfrinlist_destroy(&zmgr->transferlist); free_taskpool: isc_taskpool_destroy(&zmgr->zonetasks); - free_transfersin: - isc_quota_destroy(&zmgr->transfersin); free_conflock: isc_rwlock_destroy(&zmgr->conflock); free_rwlock: @@ -3313,12 +3305,12 @@ dns_zonemgr_unlockconf(dns_zonemgr_t *zmgr, isc_rwlocktype_t type) { void dns_zonemgr_settransfersin(dns_zonemgr_t *zmgr, int value) { - zmgr->transfersin.max = value; + zmgr->transfersin = value; } int dns_zonemgr_getttransfersin(dns_zonemgr_t *zmgr) { - return (zmgr->transfersin.max); + return (zmgr->transfersin); } void