implemented the 'transfers-in' option
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 <config.h>
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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 <config.h>
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
#include <isc/magic.h>
|
||||
#include <isc/mktemplate.h>
|
||||
#include <isc/print.h>
|
||||
#include <isc/quota.h>
|
||||
#include <isc/serial.h>
|
||||
#include <isc/taskpool.h>
|
||||
#include <isc/timer.h>
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user