Browse Source

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

	Moved connectedHostname, connectedAddr and connectedPort to
	Request object. Mark cached IP address bad on timeout to allow
	aria2 to renew IP address cache.
	* src/AbstractCommand.cc
	* src/AbstractProxyRequestCommand.cc
	* src/AbstractProxyRequestCommand.h
	* src/FtpInitiateConnectionCommand.cc
	* src/FtpNegotiationCommand.cc
	* src/FtpNegotiationCommand.h
	* src/HttpInitiateConnectionCommand.cc
	* src/HttpRequestCommand.cc
	* src/HttpRequestCommand.h
	* src/InitiateConnectionCommand.cc
	* src/InitiateConnectionCommand.h
	* src/Request.cc
	* src/Request.h
Tatsuhiro Tsujikawa 15 years ago
parent
commit
d687886c24

+ 19 - 0
ChangeLog

@@ -1,3 +1,22 @@
+2010-09-09  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
+
+	Moved connectedHostname, connectedAddr and connectedPort to
+	Request object. Mark cached IP address bad on timeout to allow
+	aria2 to renew IP address cache.
+	* src/AbstractCommand.cc
+	* src/AbstractProxyRequestCommand.cc
+	* src/AbstractProxyRequestCommand.h
+	* src/FtpInitiateConnectionCommand.cc
+	* src/FtpNegotiationCommand.cc
+	* src/FtpNegotiationCommand.h
+	* src/HttpInitiateConnectionCommand.cc
+	* src/HttpRequestCommand.cc
+	* src/HttpRequestCommand.h
+	* src/InitiateConnectionCommand.cc
+	* src/InitiateConnectionCommand.h
+	* src/Request.cc
+	* src/Request.h
+
 2010-09-08  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
 
 	Call RequestGroupMan::fillRequestGroupFromReserver() repeatedly

+ 19 - 2
src/AbstractCommand.cc

@@ -242,12 +242,29 @@ bool AbstractCommand::execute() {
     } else {
       if(checkPoint_.difference(global::wallclock) >= timeout_) {
         // timeout triggers ServerStat error state.
-
         SharedHandle<ServerStat> ss =
           e_->getRequestGroupMan()->getOrCreateServerStat(req_->getHost(),
                                                           req_->getProtocol());
         ss->setError();
-
+        // Purging IP address cache to renew IP address.
+        if(getLogger()->debug()) {
+          getLogger()->debug("CUID#%s - Marking IP address %s as bad",
+                             util::itos(getCuid()).c_str(),
+                             req_->getConnectedAddr().c_str());
+        }
+        e_->markBadIPAddress(req_->getConnectedHostname(),
+                             req_->getConnectedAddr(),
+                             req_->getConnectedPort());
+        if(e_->findCachedIPAddress
+           (req_->getConnectedHostname(), req_->getConnectedPort()).empty()) {
+          if(getLogger()->debug()) {
+            getLogger()->debug("CUID#%s - All IP addresses were marked bad."
+                               " Removing Entry.",
+                               util::itos(getCuid()).c_str());
+          }
+          e_->removeCachedIPAddress
+            (req_->getConnectedHostname(), req_->getConnectedPort());
+        }
         throw DL_RETRY_EX2(EX_TIME_OUT, downloadresultcode::TIME_OUT);
       }
       e_->addCommand(this);

+ 2 - 1
src/AbstractProxyRequestCommand.cc

@@ -77,7 +77,8 @@ bool AbstractProxyRequestCommand::executeInternal() {
   //socket->setBlockingMode();
   if(httpConnection_->sendBufferIsEmpty()) {
     if(!checkIfConnectionEstablished
-       (getSocket(), connectedHostname_, connectedAddr_, connectedPort_)) {
+       (getSocket(), getRequest()->getConnectedHostname(),
+        getRequest()->getConnectedAddr(), getRequest()->getConnectedPort())) {
       return true;
     }
     SharedHandle<HttpRequest> httpRequest(new HttpRequest());

+ 0 - 12
src/AbstractProxyRequestCommand.h

@@ -47,10 +47,6 @@ private:
   SharedHandle<Request> proxyRequest_;
 
   SharedHandle<HttpConnection> httpConnection_;
-
-  std::string connectedHostname_;
-  std::string connectedAddr_;
-  uint16_t connectedPort_;
 protected:
   virtual bool executeInternal();
 
@@ -70,14 +66,6 @@ public:
   virtual ~AbstractProxyRequestCommand();
 
   virtual Command* getNextCommand() = 0;
-
-  void setConnectedAddr
-  (const std::string& hostname, const std::string& addr, uint16_t port)
-  {
-    connectedHostname_ = hostname;
-    connectedAddr_ = addr;
-    connectedPort_ = port;
-  }
 };
 
 } // namespace aria2

+ 4 - 3
src/FtpInitiateConnectionCommand.cc

@@ -100,6 +100,7 @@ Command* FtpInitiateConnectionCommand::createNextCommand
       createSocket();
       getSocket()->establishConnection(addr, port);
       
+      getRequest()->setConnectedAddrInfo(hostname, addr, port);
       if(proxyMethod == V_GET) {
         // Use GET for FTP via HTTP proxy.
         getRequest()->setMethod(Request::METHOD_GET);
@@ -110,7 +111,6 @@ Command* FtpInitiateConnectionCommand::createNextCommand
           new HttpRequestCommand(getCuid(), getRequest(), getFileEntry(),
                                  getRequestGroup(), hc, getDownloadEngine(),
                                  getSocket());
-        c->setConnectedAddr(hostname, addr, port);
         c->setProxyRequest(proxyRequest);
         command = c;
       } else if(proxyMethod == V_TUNNEL) {
@@ -118,13 +118,13 @@ Command* FtpInitiateConnectionCommand::createNextCommand
           new FtpTunnelRequestCommand(getCuid(), getRequest(), getFileEntry(),
                                       getRequestGroup(), getDownloadEngine(),
                                       proxyRequest, getSocket());
-        c->setConnectedAddr(hostname, addr, port);
         command = c;
       } else {
         // TODO
         throw DL_ABORT_EX("ERROR");
       }
     } else {
+      setConnectedAddrInfo(getRequest(), hostname, pooledSocket);
       if(proxyMethod == V_TUNNEL) {
         command =
           new FtpNegotiationCommand(getCuid(), getRequest(), getFileEntry(),
@@ -168,7 +168,7 @@ Command* FtpInitiateConnectionCommand::createNextCommand
         new FtpNegotiationCommand(getCuid(), getRequest(), getFileEntry(),
                                   getRequestGroup(), getDownloadEngine(),
                                   getSocket());
-      c->setConnectedAddr(hostname, addr, port);
+      getRequest()->setConnectedAddrInfo(hostname, addr, port);
       command = c;
     } else {
       command =
@@ -177,6 +177,7 @@ Command* FtpInitiateConnectionCommand::createNextCommand
                                   pooledSocket,
                                   FtpNegotiationCommand::SEQ_SEND_CWD_PREP,
                                   options["baseWorkingDir"]);
+      setConnectedAddrInfo(getRequest(), hostname, pooledSocket);
     }
   }
   return command;

+ 2 - 1
src/FtpNegotiationCommand.cc

@@ -141,7 +141,8 @@ bool FtpNegotiationCommand::executeInternal() {
 
 bool FtpNegotiationCommand::recvGreeting() {
   if(!checkIfConnectionEstablished
-     (getSocket(), connectedHostname_, connectedAddr_, connectedPort_)) {
+     (getSocket(), getRequest()->getConnectedHostname(),
+      getRequest()->getConnectedAddr(), getRequest()->getConnectedPort())) {
     sequence_ = SEQ_EXIT;
     return false;
   }

+ 0 - 12
src/FtpNegotiationCommand.h

@@ -150,10 +150,6 @@ private:
   // Resolved address for proxy
   std::string proxyAddr_;
 
-  std::string connectedHostname_;
-  std::string connectedAddr_;
-  uint16_t connectedPort_;
-
   std::deque<std::string> cwdDirs_;
 protected:
   virtual bool executeInternal();
@@ -167,14 +163,6 @@ public:
                         Seq seq = SEQ_RECV_GREETING,
                         const std::string& baseWorkingDir = "/");
   virtual ~FtpNegotiationCommand();
-
-  void setConnectedAddr
-  (const std::string& hostname, const std::string& addr, uint16_t port)
-  {
-    connectedHostname_ = hostname;
-    connectedAddr_ = addr;
-    connectedPort_ = port;
-  }
 };
 
 } // namespace aria2

+ 4 - 5
src/HttpInitiateConnectionCommand.cc

@@ -85,6 +85,7 @@ Command* HttpInitiateConnectionCommand::createNextCommand
       createSocket();
       getSocket()->establishConnection(addr, port);
 
+      getRequest()->setConnectedAddrInfo(hostname, addr, port);
       if(proxyMethod == V_TUNNEL) {
         HttpProxyRequestCommand* c =
           new HttpProxyRequestCommand(getCuid(),
@@ -94,7 +95,6 @@ Command* HttpInitiateConnectionCommand::createNextCommand
                                       getDownloadEngine(),
                                       proxyRequest,
                                       getSocket());
-        c->setConnectedAddr(hostname, addr, port);
         command = c;
       } else if(proxyMethod == V_GET) {
         SharedHandle<HttpConnection> httpConnection
@@ -106,7 +106,6 @@ Command* HttpInitiateConnectionCommand::createNextCommand
                                                        httpConnection,
                                                        getDownloadEngine(),
                                                        getSocket());
-        c->setConnectedAddr(hostname, addr, port);
         c->setProxyRequest(proxyRequest);
         command = c;
       } else {
@@ -114,6 +113,7 @@ Command* HttpInitiateConnectionCommand::createNextCommand
         throw DL_ABORT_EX("ERROR");
       }
     } else {
+      setConnectedAddrInfo(getRequest(), hostname, pooledSocket);
       SharedHandle<HttpConnection> httpConnection
         (new HttpConnection(getCuid(), pooledSocket));
       HttpRequestCommand* c = new HttpRequestCommand(getCuid(),
@@ -139,8 +139,10 @@ Command* HttpInitiateConnectionCommand::createNextCommand
       }
       createSocket();
       getSocket()->establishConnection(addr, port);
+      getRequest()->setConnectedAddrInfo(hostname, addr, port);
     } else {
       setSocket(pooledSocket);
+      setConnectedAddrInfo(getRequest(), hostname, pooledSocket);
     }
     SharedHandle<HttpConnection> httpConnection
       (new HttpConnection(getCuid(), getSocket()));
@@ -150,9 +152,6 @@ Command* HttpInitiateConnectionCommand::createNextCommand
                              httpConnection,
                              getDownloadEngine(),
                              getSocket());
-    if(pooledSocket.isNull()) {
-      c->setConnectedAddr(hostname, addr, port);
-    }
     command = c;
   }
   return command;

+ 2 - 1
src/HttpRequestCommand.cc

@@ -131,7 +131,8 @@ bool HttpRequestCommand::executeInternal() {
   }
   if(httpConnection_->sendBufferIsEmpty()) {
     if(!checkIfConnectionEstablished
-       (getSocket(), connectedHostname_, connectedAddr_, connectedPort_)) {
+       (getSocket(), getRequest()->getConnectedHostname(),
+        getRequest()->getConnectedAddr(), getRequest()->getConnectedPort())) {
       return true;
     }
 

+ 0 - 12
src/HttpRequestCommand.h

@@ -47,10 +47,6 @@ private:
   SharedHandle<Request> proxyRequest_;
 
   SharedHandle<HttpConnection> httpConnection_;
-
-  std::string connectedHostname_;
-  std::string connectedAddr_;
-  uint16_t connectedPort_;
 protected:
   virtual bool executeInternal();
 public:
@@ -64,14 +60,6 @@ public:
   virtual ~HttpRequestCommand();
 
   void setProxyRequest(const SharedHandle<Request>& proxyRequest);
-
-  void setConnectedAddr
-  (const std::string& hostname, const std::string& addr, uint16_t port)
-  {
-    connectedHostname_ = hostname;
-    connectedAddr_ = addr;
-    connectedPort_ = port;
-  }
 };
 
 } // namespace aria2

+ 10 - 0
src/InitiateConnectionCommand.cc

@@ -120,4 +120,14 @@ bool InitiateConnectionCommand::executeInternal() {
   }
 }
 
+void InitiateConnectionCommand::setConnectedAddrInfo
+(const SharedHandle<Request>& req,
+ const std::string& hostname,
+ const SharedHandle<SocketCore>& socket)
+{
+  std::pair<std::string, uint16_t> peerAddr;
+  socket->getPeerInfo(peerAddr);
+  req->setConnectedAddrInfo(hostname, peerAddr.first, peerAddr.second);
+}
+
 } // namespace aria2

+ 5 - 0
src/InitiateConnectionCommand.h

@@ -59,6 +59,11 @@ protected:
   (const std::string& hostname, const std::string& addr, uint16_t port,
    const std::vector<std::string>& resolvedAddresses,
    const SharedHandle<Request>& proxyRequest) = 0;
+
+  void setConnectedAddrInfo
+  (const SharedHandle<Request>& req,
+   const std::string& hostname,
+   const SharedHandle<SocketCore>& socket);
 public:
   InitiateConnectionCommand(cuid_t cuid, const SharedHandle<Request>& req,
                             const SharedHandle<FileEntry>& fileEntry,

+ 3 - 1
src/Request.cc

@@ -64,7 +64,8 @@ Request::Request():
   method_(METHOD_GET),
   hasPassword_(false),
   ipv6LiteralAddress_(false),
-  removalRequested_(false)
+  removalRequested_(false),
+  connectedPort_(0)
 {}
 
 static std::string removeFragment(const std::string& uri)
@@ -116,6 +117,7 @@ bool Request::setUri(const std::string& uri) {
 bool Request::resetUri() {
   previousUri_ = referer_;
   supportsPersistentConnection_ = true;
+  setConnectedAddrInfo(A2STR::NIL, A2STR::NIL, 0);
   return parseUri(uri_);
 }
 

+ 29 - 0
src/Request.h

@@ -90,6 +90,12 @@ private:
 
   bool removalRequested_;
 
+  std::string connectedHostname_;
+
+  std::string connectedAddr_;
+
+  uint16_t connectedPort_;
+
   bool parseUri(const std::string& uri);
 public:
   Request();
@@ -216,6 +222,29 @@ public:
     return removalRequested_;
   }
 
+  void setConnectedAddrInfo
+  (const std::string& hostname, const std::string& addr, uint16_t port)
+  {
+    connectedHostname_ = hostname;
+    connectedAddr_ = addr;
+    connectedPort_ = port;
+  }
+
+  const std::string& getConnectedHostname() const
+  {
+    return connectedHostname_;
+  }
+
+  const std::string& getConnectedAddr() const
+  {
+    return connectedAddr_;
+  }
+
+  uint16_t getConnectedPort() const
+  {
+    return connectedPort_;
+  }
+
   static const std::string METHOD_GET;
   static const std::string METHOD_HEAD;