Ver Fonte

Don't send announce_peer message with empty token in
DHTPeerLookupTask. Replace old node ID with new node ID when response
message is received in DHTAbstractNodeLookupTask.

Tatsuhiro Tsujikawa há 15 anos atrás
pai
commit
a9f734218f
2 ficheiros alterados com 26 adições e 10 exclusões
  1. 8 0
      src/DHTAbstractNodeLookupTask.h
  2. 18 10
      src/DHTPeerLookupTask.cc

+ 8 - 0
src/DHTAbstractNodeLookupTask.h

@@ -173,6 +173,14 @@ public:
   void onReceived(const ResponseMessage* message)
   {
     --inFlightMessage_;
+    // Replace old Node ID with new Node ID.
+    for(std::deque<SharedHandle<DHTNodeLookupEntry> >::iterator i =
+          entries_.begin(), eoi = entries_.end(); i != eoi; ++i) {
+      if((*i)->node->getIPAddress() == message->getRemoteNode()->getIPAddress()
+         && (*i)->node->getPort() == message->getRemoteNode()->getPort()) {
+        (*i)->node = message->getRemoteNode();
+      }
+    }
     onReceivedInternal(message);
     std::vector<SharedHandle<DHTNode> > nodes;
     getNodesFromMessage(nodes, message);

+ 18 - 10
src/DHTPeerLookupTask.cc

@@ -102,17 +102,25 @@ void DHTPeerLookupTask::onFinish()
   size_t num = DHTBucket::K;
   for(std::deque<SharedHandle<DHTNodeLookupEntry> >::const_iterator i =
         getEntries().begin(), eoi = getEntries().end();
-      i != eoi && num > 0; ++i, --num) {
-    if((*i)->used) {
-      const SharedHandle<DHTNode>& node = (*i)->node;
-      SharedHandle<DHTMessage> m = 
-        getMessageFactory()->createAnnouncePeerMessage
-        (node,
-         getTargetID(), // this is infoHash
-         btRuntime_->getListenPort(),
-         tokenStorage_[util::toHex(node->getID(), DHT_ID_LENGTH)]);
-      getMessageDispatcher()->addMessageToQueue(m);
+      i != eoi && num > 0; ++i) {
+    if(!(*i)->used) {
+      continue;
     }
+    const SharedHandle<DHTNode>& node = (*i)->node;
+    std::string idHex = util::toHex(node->getID(), DHT_ID_LENGTH);
+    std::string token = tokenStorage_[idHex];
+    if(token.empty()) {
+      A2_LOG_DEBUG(fmt("Token is empty for ID:%s", idHex.c_str()));
+      continue;
+    }
+    SharedHandle<DHTMessage> m =
+      getMessageFactory()->createAnnouncePeerMessage
+      (node,
+       getTargetID(), // this is infoHash
+       btRuntime_->getListenPort(),
+       token);
+    getMessageDispatcher()->addMessageToQueue(m);
+    --num;
   }
 }