diff --git a/ChangeLog b/ChangeLog index f79f4ee7..d34008af 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2010-08-07 Tatsuhiro Tsujikawa + + Updated malformed message handling. + * src/DHTMessageTracker.cc + * src/DHTMessageTracker.h + 2010-08-07 Tatsuhiro Tsujikawa Evaluate callback is non-null. diff --git a/src/DHTMessageTracker.cc b/src/DHTMessageTracker.cc index 2d68713c..ae0b2a91 100644 --- a/src/DHTMessageTracker.cc +++ b/src/DHTMessageTracker.cc @@ -98,11 +98,8 @@ DHTMessageTracker::messageArrived SharedHandle callback = entry->getCallback(); return std::make_pair(message, callback); } catch(RecoverableException& e) { - if(!entry->getCallback().isNull()) { - entry->getCallback()->onTimeout(targetNode); - } - return std::pair, - SharedHandle >(); + handleTimeoutEntry(entry); + throw; } } } @@ -113,36 +110,42 @@ DHTMessageTracker::messageArrived SharedHandle >(); } +void DHTMessageTracker::handleTimeoutEntry +(const SharedHandle& entry) +{ + try { + SharedHandle node = entry->getTargetNode(); + if(logger_->debug()) { + logger_->debug("Message timeout: To:%s:%u", + node->getIPAddress().c_str(), node->getPort()); + } + node->updateRTT(entry->getElapsedMillis()); + node->timeout(); + if(node->isBad()) { + if(logger_->debug()) { + logger_->debug("Marked bad: %s:%u", + node->getIPAddress().c_str(), node->getPort()); + } + routingTable_->dropNode(node); + } + SharedHandle callback = entry->getCallback(); + if(!callback.isNull()) { + callback->onTimeout(node); + } + } catch(RecoverableException& e) { + logger_->info("Exception thrown while handling timeouts.", e); + } +} + void DHTMessageTracker::handleTimeout() { for(std::deque >::iterator i = entries_.begin(), eoi = entries_.end(); i != eoi;) { if((*i)->isTimeout()) { - try { SharedHandle entry = *i; i = entries_.erase(i); eoi = entries_.end(); - SharedHandle node = entry->getTargetNode(); - if(logger_->debug()) { - logger_->debug("Message timeout: To:%s:%u", - node->getIPAddress().c_str(), node->getPort()); - } - node->updateRTT(entry->getElapsedMillis()); - node->timeout(); - if(node->isBad()) { - if(logger_->debug()) { - logger_->debug("Marked bad: %s:%u", - node->getIPAddress().c_str(), node->getPort()); - } - routingTable_->dropNode(node); - } - SharedHandle callback = entry->getCallback(); - if(!callback.isNull()) { - callback->onTimeout(node); - } - } catch(RecoverableException& e) { - logger_->info("Exception thrown while handling timeouts.", e); - } + handleTimeoutEntry(entry); } else { ++i; } diff --git a/src/DHTMessageTracker.h b/src/DHTMessageTracker.h index befcd577..ac20ea39 100644 --- a/src/DHTMessageTracker.h +++ b/src/DHTMessageTracker.h @@ -63,6 +63,8 @@ private: SharedHandle factory_; Logger* logger_; + + void handleTimeoutEntry(const SharedHandle& entry); public: DHTMessageTracker();