]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
1436. [func] dns_zonemgr_resumexfrs() can be used to restart
authorMark Andrews <marka@isc.org>
Wed, 26 Feb 2003 03:45:59 +0000 (03:45 +0000)
committerMark Andrews <marka@isc.org>
Wed, 26 Feb 2003 03:45:59 +0000 (03:45 +0000)
                        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
bin/named/server.c
lib/dns/include/dns/zone.h
lib/dns/zone.c

diff --git a/CHANGES b/CHANGES
index d7a184c50f59cf92c1b30f2392593a2b8bd71a1b..9398e4f5db7ee02dfd429d3ea05f37a2d5e51c08 100644 (file)
--- 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]
index 6aa3e466170bcc8752fec63ab39288f3fdd8bff1..f293ddcd1862184005b2c8383fa06464ee8a1159 100644 (file)
@@ -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 <config.h>
 
@@ -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);
index 61b1c06d23e05ae592d8fd8fd7b169d23b3986a6..158060274162cd4127acb1508bc0b602a25b4a43 100644 (file)
@@ -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);
 /*
index 219961fde8c935df4b4d77b67a7a707f8ab1eb57..6d1d692b4334db70d031d9ce3cd0972c3459a0a5 100644 (file)
@@ -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 <config.h>
 
@@ -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.
                         */