From c3ea698877cdde327f2bf6a8e97347798fead2d4 Mon Sep 17 00:00:00 2001 From: Mark Andrews Date: Wed, 26 Feb 2003 03:45:59 +0000 Subject: [PATCH] 1436. [func] dns_zonemgr_resumexfrs() can be used to restart stalled transfers. 1435. [bug] zmgr_resume_xfrs() was being called read locked rather than write locked. zmgr_resume_xfrs() was not being called if the zone was being shutdown. 1434. [bug] "rndc reconfig" failed to initiate the initial zone transfer of new slave zones. developer: marka reviewer: explorer --- CHANGES | 11 +++++++ bin/named/server.c | 4 +-- lib/dns/include/dns/zone.h | 8 ++++- lib/dns/zone.c | 65 +++++++++++++++++++++++++++++++------- 4 files changed, 74 insertions(+), 14 deletions(-) diff --git a/CHANGES b/CHANGES index d7a184c50f..9398e4f5db 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,14 @@ +1436. [func] dns_zonemgr_resumexfrs() can be used to restart + stalled transfers. + +1435. [bug] zmgr_resume_xfrs() was being called read locked + rather than write locked. zmgr_resume_xfrs() + was not being called if the zone was being + shutdown. + +1434. [bug] "rndc reconfig" failed to initiate the initial + zone transfer of new slave zones. + 1433. [bug] named could trigger a REQUIRE failure if it could not get a file descriptor when attempting to write a master file. [RT #4347] diff --git a/bin/named/server.c b/bin/named/server.c index 6aa3e46617..f293ddcd18 100644 --- a/bin/named/server.c +++ b/bin/named/server.c @@ -15,7 +15,7 @@ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: server.c,v 1.395 2003/02/26 02:03:58 marka Exp $ */ +/* $Id: server.c,v 1.396 2003/02/26 03:45:58 marka Exp $ */ #include @@ -2408,7 +2408,7 @@ load_new_zones(ns_server_t *server, isc_boolean_t stop) { * so that we know when we need to force AXFR of * slave zones whose master files are missing. */ - CHECK(dns_zonemgr_forcemaint(server->zonemgr)); + dns_zonemgr_resumexfrs(server->zonemgr); cleanup: isc_task_endexclusive(server->task); return (result); diff --git a/lib/dns/include/dns/zone.h b/lib/dns/include/dns/zone.h index 61b1c06d23..1580602741 100644 --- a/lib/dns/include/dns/zone.h +++ b/lib/dns/include/dns/zone.h @@ -15,7 +15,7 @@ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: zone.h,v 1.121 2003/02/07 01:13:12 marka Exp $ */ +/* $Id: zone.h,v 1.122 2003/02/26 03:45:59 marka Exp $ */ #ifndef DNS_ZONE_H #define DNS_ZONE_H 1 @@ -1167,6 +1167,12 @@ dns_zonemgr_forcemaint(dns_zonemgr_t *zmgr); * earliest conveniene. */ +void +dns_zonemgr_resumexfrs(dns_zonemgr_t *zmgr); +/* + * Attempt to start any stalled zone transfers. + */ + void dns_zonemgr_shutdown(dns_zonemgr_t *zmgr); /* diff --git a/lib/dns/zone.c b/lib/dns/zone.c index 219961fde8..6d1d692b43 100644 --- a/lib/dns/zone.c +++ b/lib/dns/zone.c @@ -15,7 +15,7 @@ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: zone.c,v 1.383 2003/02/26 03:06:46 marka Exp $ */ +/* $Id: zone.c,v 1.384 2003/02/26 03:45:59 marka Exp $ */ #include @@ -414,7 +414,7 @@ static isc_result_t zone_dump(dns_zone_t *, isc_boolean_t); static void got_transfer_quota(isc_task_t *task, isc_event_t *event); static isc_result_t zmgr_start_xfrin_ifquota(dns_zonemgr_t *zmgr, dns_zone_t *zone); -static void zmgr_resume_xfrs(dns_zonemgr_t *zmgr); +static void zmgr_resume_xfrs(dns_zonemgr_t *zmgr, isc_boolean_t multi); static void zonemgr_free(dns_zonemgr_t *zmgr); static isc_result_t zonemgr_getio(dns_zonemgr_t *zmgr, isc_boolean_t high, isc_task_t *task, isc_taskaction_t action, @@ -993,6 +993,34 @@ zone_load(dns_zone_t *zone, unsigned int flags) { goto cleanup; } } + } + + INSIST(zone->db_argc >= 1); + + if ((zone->type == dns_zone_slave || zone->type == dns_zone_stub) && + (strcmp(zone->db_argv[0], "rbt") == 0 || + strcmp(zone->db_argv[0], "rbt64") == 0)) { + if (zone->masterfile != NULL) { + result = isc_file_exists(zone->masterfile); + } else { + start_timers: + if (zone->task != NULL) + zone_settimer(zone, &now); + result = ISC_R_SUCCESS; + goto cleanup; + } + if (result == ISC_R_FILENOTFOUND) { + dns_zone_log(zone, ISC_LOG_DEBUG(1), + "no master file"); + goto start_timers; + } else if (result != ISC_R_SUCCESS) { + dns_zone_log(zone, ISC_LOG_ERROR, + "loading master file %s: %s", + zone->masterfile, + dns_result_totext(result)); + result = ISC_R_SUCCESS; + goto start_timers; + } } dns_zone_log(zone, ISC_LOG_DEBUG(1), "starting load"); @@ -1005,7 +1033,6 @@ zone_load(dns_zone_t *zone, unsigned int flags) { */ TIME_NOW(&loadtime); - INSIST(zone->db_argc >= 1); result = dns_db_create(zone->mctx, zone->db_argv[0], &zone->origin, (zone->type == dns_zone_stub) ? dns_dbtype_stub : dns_dbtype_zone, @@ -1408,6 +1435,8 @@ zone_postload(dns_zone_t *zone, dns_db_t *db, isc_time_t loadtime, /* Mark the zone for immediate refresh. */ zone->refreshtime = now; + if (zone->task != NULL) + zone_settimer(zone, &now); result = ISC_R_SUCCESS; } return (result); @@ -5215,8 +5244,7 @@ zone_xfrdone(dns_zone_t *zone, isc_result_t result) { RWLOCK(&zone->zmgr->rwlock, isc_rwlocktype_write); ISC_LIST_UNLINK(zone->zmgr->xfrin_in_progress, zone, statelink); zone->statelist = NULL; - if (!DNS_ZONE_FLAG(zone, DNS_ZONEFLG_EXITING)) - zmgr_resume_xfrs(zone->zmgr); + zmgr_resume_xfrs(zone->zmgr, ISC_FALSE); RWUNLOCK(&zone->zmgr->rwlock, isc_rwlocktype_write); /* @@ -5886,6 +5914,7 @@ dns_zonemgr_forcemaint(dns_zonemgr_t *zmgr) { { dns_zone_maintenance(p); } + RWUNLOCK(&zmgr->rwlock, isc_rwlocktype_read); /* * Recent configuration changes may have increased the @@ -5893,12 +5922,22 @@ dns_zonemgr_forcemaint(dns_zonemgr_t *zmgr) { * transfers currently blocked on quota get started if * possible. */ - zmgr_resume_xfrs(zmgr); - - RWUNLOCK(&zmgr->rwlock, isc_rwlocktype_read); + RWLOCK(&zmgr->rwlock, isc_rwlocktype_write); + zmgr_resume_xfrs(zmgr, ISC_TRUE); + RWUNLOCK(&zmgr->rwlock, isc_rwlocktype_write); return (ISC_R_SUCCESS); } +void +dns_zonemgr_resumexfrs(dns_zonemgr_t *zmgr) { + + REQUIRE(DNS_ZONEMGR_VALID(zmgr)); + + RWLOCK(&zmgr->rwlock, isc_rwlocktype_write); + zmgr_resume_xfrs(zmgr, ISC_TRUE); + RWUNLOCK(&zmgr->rwlock, isc_rwlocktype_write); +} + void dns_zonemgr_shutdown(dns_zonemgr_t *zmgr) { REQUIRE(DNS_ZONEMGR_VALID(zmgr)); @@ -5965,16 +6004,20 @@ dns_zonemgr_getttransfersperns(dns_zonemgr_t *zmgr) { * The zone manager is locked by the caller. */ static void -zmgr_resume_xfrs(dns_zonemgr_t *zmgr) { +zmgr_resume_xfrs(dns_zonemgr_t *zmgr, isc_boolean_t multi) { dns_zone_t *zone; + dns_zone_t *next; for (zone = ISC_LIST_HEAD(zmgr->waiting_for_xfrin); zone != NULL; - zone = ISC_LIST_NEXT(zone, statelink)) + zone = next) { isc_result_t result; + next = ISC_LIST_NEXT(zone, statelink); result = zmgr_start_xfrin_ifquota(zmgr, zone); if (result == ISC_R_SUCCESS) { + if (multi) + continue; /* * We successfully filled the slot. We're done. */ @@ -5982,7 +6025,7 @@ zmgr_resume_xfrs(dns_zonemgr_t *zmgr) { } else if (result == ISC_R_QUOTA) { /* * Not enough quota. This is probably the per-server - * quota, because we only get called when a unit of + * quota, because we usually get called when a unit of * global quota has just been freed. Try the next * zone, it may succeed if it uses another master. */