[svn] commit: r3714 - in /branches/trac408/src/lib/nsas: tests/zone_entry_unittest.cc zone_entry.cc

BIND 10 source code commits bind10-changes at lists.isc.org
Fri Dec 3 21:32:44 UTC 2010


Author: vorner
Date: Fri Dec  3 21:32:37 2010
New Revision: 3714

Log:
Fix missing callback

Modified:
    branches/trac408/src/lib/nsas/tests/zone_entry_unittest.cc
    branches/trac408/src/lib/nsas/zone_entry.cc

Modified: branches/trac408/src/lib/nsas/tests/zone_entry_unittest.cc
==============================================================================
--- branches/trac408/src/lib/nsas/tests/zone_entry_unittest.cc (original)
+++ branches/trac408/src/lib/nsas/tests/zone_entry_unittest.cc Fri Dec  3 21:32:37 2010
@@ -160,9 +160,9 @@
     EXPECT_NO_THROW(resolver_->answer(2, ns_name_, RRType::AAAA(),
         rdata::in::AAAA("2001:db8::1")));
     // This should answer the third callback
+    EXPECT_EQ(0, callback_->unreachable_count_);
     ASSERT_EQ(3, callback_->successes_.size());
     EXPECT_TRUE(IOAddress("2001:db8::1").equal(callback_->successes_[2]));
-    EXPECT_EQ(0, callback_->unreachable_count_);
     // It should think it is ready
     EXPECT_EQ(Fetchable::READY, zone->getState());
     // When we ask something more, it should be answered right away

Modified: branches/trac408/src/lib/nsas/zone_entry.cc
==============================================================================
--- branches/trac408/src/lib/nsas/zone_entry.cc (original)
+++ branches/trac408/src/lib/nsas/zone_entry.cc Fri Dec  3 21:32:37 2010
@@ -296,6 +296,10 @@
                 process(CallbackPtr(), V4_ONLY, nameserver, self, lock);
                 process(CallbackPtr(), V6_ONLY, nameserver, self, lock);
             } else {
+                // Nothing to do anyway for this family, be dormant
+                if (callbacks_[family].empty()) {
+                    return;
+                }
                 /*
                  * Check that we are only in one process call on stack.
                  * It eliminates the problem when there are multiple nameserver
@@ -341,8 +345,13 @@
                     // We should not be locked, because this function can
                     // be called directly from the askIP again
                     lock->unlock();
-                    shared_ptr<NameserverCallback> ns_callback(new
-                        NameserverCallback(self, family));
+                    shared_ptr<NameserverCallback> ns_callbacks[ADDR_REQ_MAX];;
+                    ns_callbacks[ANY_OK].reset(new NameserverCallback(self,
+                        ANY_OK));
+                    ns_callbacks[V4_ONLY].reset(new NameserverCallback(self,
+                        V4_ONLY));
+                    ns_callbacks[V6_ONLY].reset(new NameserverCallback(self,
+                        V6_ONLY));
                     /*
                      * TODO: Possible place for an optimisation. We now ask
                      * everything we can. We should limit this to something like
@@ -351,7 +360,17 @@
                      * away is simpler.
                      */
                     BOOST_FOREACH(const NameserverPtr& ns, to_ask) {
-                        ns->askIP(resolver_, ns_callback, family, ns);
+                        // Put all 3 callbacks there. If we put just the
+                        // current family, it might not work due to missing
+                        // callback for different one.
+                        // If they recurse back to us (call directly), we kill
+                        // it by the in_process_
+                        ns->askIP(resolver_, ns_callbacks[V4_ONLY], V4_ONLY,
+                            ns);
+                        ns->askIP(resolver_, ns_callbacks[V6_ONLY], V6_ONLY,
+                            ns);
+                        ns->askIP(resolver_, ns_callbacks[ANY_OK], ANY_OK,
+                            ns);
                     }
                     // Retry with all the data that might have arrived
                     in_process_[family] = false;




More information about the bind10-changes mailing list