|
@@ -37,7 +37,7 @@ public:
|
|
|
/// \param address Address object representing this address
|
|
|
/// \param rtt Initial round-trip time
|
|
|
AddressEntry(const asiolink::IOAddress& address, uint32_t rtt = 0) :
|
|
|
- address_(address), rtt_(rtt)
|
|
|
+ address_(address), rtt_(rtt), dead_until_(0)
|
|
|
{}
|
|
|
|
|
|
/// \return Address object
|
|
@@ -46,7 +46,12 @@ public:
|
|
|
}
|
|
|
|
|
|
/// \return Current round-trip time
|
|
|
- uint32_t getRTT() const {
|
|
|
+ uint32_t getRTT() {
|
|
|
+ if(dead_until_ != 0 && time(NULL) >= dead_until_){
|
|
|
+ dead_until_ = 0;
|
|
|
+ rtt_ = 1; //reset the rtt to a small value so it has an opportunity to be updated
|
|
|
+ }
|
|
|
+
|
|
|
return rtt_;
|
|
|
}
|
|
|
|
|
@@ -54,7 +59,11 @@ public:
|
|
|
///
|
|
|
/// \param rtt New RTT to be associated with this address
|
|
|
void setRTT(uint32_t rtt) {
|
|
|
- rtt_ = rtt; // TODO: Modify to use weighting formula
|
|
|
+ if(rtt == UNREACHABLE){
|
|
|
+ dead_until_ = time(NULL) + 5*60;//Cache the unreachable server for 5 minutes (RFC2308 sec7.2)
|
|
|
+ }
|
|
|
+
|
|
|
+ rtt_ = rtt;
|
|
|
}
|
|
|
|
|
|
/// Mark address as unreachable.
|
|
@@ -65,8 +74,8 @@ public:
|
|
|
/// Check if address is unreachable
|
|
|
///
|
|
|
/// \return true if the address is unreachable, false if not
|
|
|
- bool isUnreachable() const {
|
|
|
- return (rtt_ == UNREACHABLE);
|
|
|
+ bool isUnreachable() {
|
|
|
+ return (getRTT() == UNREACHABLE); // The getRTT() will check the cache time for unreachable server
|
|
|
}
|
|
|
|
|
|
/// \return true if the object is a V4 address
|
|
@@ -85,6 +94,7 @@ public:
|
|
|
private:
|
|
|
asiolink::IOAddress address_; ///< Address
|
|
|
uint32_t rtt_; ///< Round-trip time
|
|
|
+ time_t dead_until_; ///< Dead time for unreachable server
|
|
|
};
|
|
|
|
|
|
} // namespace dns
|