2010-08-07 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>

Updated malformed message handling.
	* src/DHTMessageTracker.cc
	* src/DHTMessageTracker.h
pull/1/head
Tatsuhiro Tsujikawa 2010-08-07 14:46:22 +00:00
parent d8e83b3f72
commit 15b29bed15
3 changed files with 38 additions and 27 deletions

View File

@ -1,3 +1,9 @@
2010-08-07 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Updated malformed message handling.
* src/DHTMessageTracker.cc
* src/DHTMessageTracker.h
2010-08-07 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net> 2010-08-07 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Evaluate callback is non-null. Evaluate callback is non-null.

View File

@ -98,11 +98,8 @@ DHTMessageTracker::messageArrived
SharedHandle<DHTMessageCallback> callback = entry->getCallback(); SharedHandle<DHTMessageCallback> callback = entry->getCallback();
return std::make_pair(message, callback); return std::make_pair(message, callback);
} catch(RecoverableException& e) { } catch(RecoverableException& e) {
if(!entry->getCallback().isNull()) { handleTimeoutEntry(entry);
entry->getCallback()->onTimeout(targetNode); throw;
}
return std::pair<SharedHandle<DHTResponseMessage>,
SharedHandle<DHTMessageCallback> >();
} }
} }
} }
@ -113,36 +110,42 @@ DHTMessageTracker::messageArrived
SharedHandle<DHTMessageCallback> >(); SharedHandle<DHTMessageCallback> >();
} }
void DHTMessageTracker::handleTimeoutEntry
(const SharedHandle<DHTMessageTrackerEntry>& entry)
{
try {
SharedHandle<DHTNode> 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<DHTMessageCallback> callback = entry->getCallback();
if(!callback.isNull()) {
callback->onTimeout(node);
}
} catch(RecoverableException& e) {
logger_->info("Exception thrown while handling timeouts.", e);
}
}
void DHTMessageTracker::handleTimeout() void DHTMessageTracker::handleTimeout()
{ {
for(std::deque<SharedHandle<DHTMessageTrackerEntry> >::iterator i = for(std::deque<SharedHandle<DHTMessageTrackerEntry> >::iterator i =
entries_.begin(), eoi = entries_.end(); i != eoi;) { entries_.begin(), eoi = entries_.end(); i != eoi;) {
if((*i)->isTimeout()) { if((*i)->isTimeout()) {
try {
SharedHandle<DHTMessageTrackerEntry> entry = *i; SharedHandle<DHTMessageTrackerEntry> entry = *i;
i = entries_.erase(i); i = entries_.erase(i);
eoi = entries_.end(); eoi = entries_.end();
SharedHandle<DHTNode> node = entry->getTargetNode(); handleTimeoutEntry(entry);
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<DHTMessageCallback> callback = entry->getCallback();
if(!callback.isNull()) {
callback->onTimeout(node);
}
} catch(RecoverableException& e) {
logger_->info("Exception thrown while handling timeouts.", e);
}
} else { } else {
++i; ++i;
} }

View File

@ -63,6 +63,8 @@ private:
SharedHandle<DHTMessageFactory> factory_; SharedHandle<DHTMessageFactory> factory_;
Logger* logger_; Logger* logger_;
void handleTimeoutEntry(const SharedHandle<DHTMessageTrackerEntry>& entry);
public: public:
DHTMessageTracker(); DHTMessageTracker();