瀏覽代碼

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

	Updated malformed message handling.
	* src/DHTMessageTracker.cc
	* src/DHTMessageTracker.h
Tatsuhiro Tsujikawa 15 年之前
父節點
當前提交
15b29bed15
共有 3 個文件被更改,包括 38 次插入27 次删除
  1. 6 0
      ChangeLog
  2. 30 27
      src/DHTMessageTracker.cc
  3. 2 0
      src/DHTMessageTracker.h

+ 6 - 0
ChangeLog

@@ -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>
 
 	Evaluate callback is non-null.

+ 30 - 27
src/DHTMessageTracker.cc

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

+ 2 - 0
src/DHTMessageTracker.h

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