[svn] commit: r3693 - /branches/trac408/src/lib/nsas/nameserver_entry.cc
BIND 10 source code commits
bind10-changes at lists.isc.org
Wed Dec 1 15:21:13 UTC 2010
Author: vorner
Date: Wed Dec 1 15:21:13 2010
New Revision: 3693
Log:
NameserverEntry passes TTL/expiration tests
With the slight possible problem of skipping to next second between
calls to time(). That needs to be fixed somehow.
Modified:
branches/trac408/src/lib/nsas/nameserver_entry.cc
Modified: branches/trac408/src/lib/nsas/nameserver_entry.cc
==============================================================================
--- branches/trac408/src/lib/nsas/nameserver_entry.cc (original)
+++ branches/trac408/src/lib/nsas/nameserver_entry.cc Wed Dec 1 15:21:13 2010
@@ -67,40 +67,32 @@
{
Lock lock(mutex_);
- /*
- * FIXME: This switch is not completely correct. What if it is EXPIRED
- * with expired_ok true and the given familly is unreachable?
- *
- * Write a test for this and:
- * * First check if EXPIRED (and not expired_ok) or NOT_ASKED, then we are
- * done.
- * * Second, check TTL and expire if not expired_ok. That might change us
- * to EXPIRED and we are done again.
- * * Then see if we have the given address family ready and return.
- * * Solve problem of both A and AAAA addresses with TTL 0 and then
- * when the second one comes, we should not give the first one even when
- * expired_ok, because it is in callback of the other one and it is
- * really expired.
- */
+ // Check TTL
+ time_t now(time(NULL));
+ // We take = as well, so we catch TTL 0 correctly
+ // expiration_ == 0 means not set, the reason is we are UNREACHABLE or
+ // NOT_ASKED or IN_PROGRESS
+ if (getState() != NOT_ASKED && expiration_ <= now && expiration_) {
+ setState(EXPIRED);
+ }
+
+ if (getState() == EXPIRED && !expired_ok) {
+ return EXPIRED;
+ }
+
switch (getState()) {
case IN_PROGRESS:
+ // Did we receive the address already?
if (!has_address_[family] && expect_address_[family]) {
return IN_PROGRESS;
}
// If we do not expect the address, then fall trough to READY
+ case EXPIRED: // If expired_ok, we pretend to be ready
case READY:
- // TODO: Check TTL. If it is too old,
- // set to EXPIRED and fall trough
- // If we do not have this kind of address, it is unreachable by it
if (!has_address_[family]) {
return UNREACHABLE;
}
- break;
- case EXPIRED:
- if (expired_ok) {
- break;
- }
- // If expired is not OK, we just return state
+ break; // OK, we give some answers
case NOT_ASKED:
case UNREACHABLE:
// TODO: Check TTL of UNREACHABLE
@@ -333,12 +325,15 @@
// We will request the addresses
// Set internal state first
+ // TODO: We might want to save the addresses somewhere so we do not
+ // lose RTT
address_.clear();
setState(IN_PROGRESS);
has_address_[V4_ONLY] = has_address_[V6_ONLY] = has_address_[ANY_OK] =
false;
expect_address_[V4_ONLY] = expect_address_[V6_ONLY] =
expect_address_[ANY_OK] = true;
+ expiration_ = 0;
// Store the callback
callbacks_.push_back(CallbackPair(family, callback));
More information about the bind10-changes
mailing list