2006-10-01 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>

To add timeout to async name resolution:

	* src/AbstractCommand.h
	(nameResolveFinished): New function. This is not elegant way. It needs
	to be more refined.
	(nameResolverCheck): New variable.
	* src/AbstractCommand.cc
	(AbstractCommand): Added nameResolverCheck.
	(execute): Added the check whether the name resolution has finished.
	(setNameResolverCheck): Set nameResolverCheck to true.
	(disableNameResolverCheck): Set nameResolverCheck to false.
	(nameResolverFinished): New function.
	* src/FtpInitiateConnectionCommand.h
	(nameResolverFinished): New function.
	* src/HttpInitiateConnectionCommand.h
	(nameResolverFinished): New function.

	To add the support for a non-compact response from a tracker:

	* src/PeerListProcessor.h: New class.
	* src/DefaultPeerListProcessor.h: New class.
	* src/DefaultPeerListProcessor.cc: New class.
	* src/CompactPeerListProcessor.h: New class.
	* src/CompactPeerListProcessor.cc: New class.
	* src/DelegatingPeerListProcessor.h: New class.
	* src/DelegatingPeerListProcessor.cc: New class.	
	* src/TorrentMan.cc
	(addPeer): New function(overload).
	(addPeer): Delete unused peers only when new peer is added.
	* src/TorrentMan.h
	(PeerListProcessor.h): Included.
	(Peers): Removed.
	(addPeer): New function(overload).
	* src/TrackerUpdateCommand.cc
	(netinet/in.h): Removed.
	(DelegatingPeerListProcessor.h): Included.
	(execute): Updated to use DelegatingPeerListProcessor.
	
	To fix the memory leak in TorrentMan::peers:

	* src/PeerAbstractCommand.cc
	(onAbort): Added peer->resetStatus().
	* src/Peer.h
	(resetStatus): Made public.
	
	To improve the precision of the speed calculation:

	* src/SpeedCalc.h
	(nextInterval): New variable.
	* src/SpeedCalc.cc
	(reset): Added nextInterval.
	(isIntervalOver): Use nextInterval instead of CHANGE_INTERVAL_SEC.
	(changeSw): Set nextInterval to 15 seconds relative to the current
	instant time.

	* src/main.cc
	(showVersion): Updated.
pull/1/head
Tatsuhiro Tsujikawa 2006-10-01 11:29:14 +00:00
parent f7f1770633
commit 07e91896e1
26 changed files with 666 additions and 68 deletions

View File

@ -1,3 +1,63 @@
2006-10-01 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
To add timeout to async name resolution:
* src/AbstractCommand.h
(nameResolveFinished): New function. This is not elegant way. It needs
to be more refined.
(nameResolverCheck): New variable.
* src/AbstractCommand.cc
(AbstractCommand): Added nameResolverCheck.
(execute): Added the check whether the name resolution has finished.
(setNameResolverCheck): Set nameResolverCheck to true.
(disableNameResolverCheck): Set nameResolverCheck to false.
(nameResolverFinished): New function.
* src/FtpInitiateConnectionCommand.h
(nameResolverFinished): New function.
* src/HttpInitiateConnectionCommand.h
(nameResolverFinished): New function.
To add the support for a non-compact response from a tracker:
* src/PeerListProcessor.h: New class.
* src/DefaultPeerListProcessor.h: New class.
* src/DefaultPeerListProcessor.cc: New class.
* src/CompactPeerListProcessor.h: New class.
* src/CompactPeerListProcessor.cc: New class.
* src/DelegatingPeerListProcessor.h: New class.
* src/DelegatingPeerListProcessor.cc: New class.
* src/TorrentMan.cc
(addPeer): New function(overload).
(addPeer): Delete unused peers only when new peer is added.
* src/TorrentMan.h
(PeerListProcessor.h): Included.
(Peers): Removed.
(addPeer): New function(overload).
* src/TrackerUpdateCommand.cc
(netinet/in.h): Removed.
(DelegatingPeerListProcessor.h): Included.
(execute): Updated to use DelegatingPeerListProcessor.
To fix the memory leak in TorrentMan::peers:
* src/PeerAbstractCommand.cc
(onAbort): Added peer->resetStatus().
* src/Peer.h
(resetStatus): Made public.
To improve the precision of the speed calculation:
* src/SpeedCalc.h
(nextInterval): New variable.
* src/SpeedCalc.cc
(reset): Added nextInterval.
(isIntervalOver): Use nextInterval instead of CHANGE_INTERVAL_SEC.
(changeSw): Set nextInterval to 15 seconds relative to the current
instant time.
* src/main.cc
(showVersion): Updated.
2006-09-23 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
* src/main.cc

View File

@ -44,7 +44,8 @@
AbstractCommand::AbstractCommand(int cuid, Request* req, DownloadEngine* e,
const SocketHandle& s):
Command(cuid), req(req), e(e), socket(s),
checkSocketIsReadable(false), checkSocketIsWritable(false) {
checkSocketIsReadable(false), checkSocketIsWritable(false),
nameResolverCheck(false) {
setReadCheckSocket(socket);
timeout = this->e->option->getAsInt(PREF_TIMEOUT);
@ -73,7 +74,10 @@ bool AbstractCommand::execute() {
}
if(checkSocketIsReadable && readCheckTarget->isReadable(0) ||
checkSocketIsWritable && writeCheckTarget->isWritable(0) ||
!checkSocketIsReadable && !checkSocketIsWritable) {
#ifdef ENABLE_ASYNC_DNS
nameResolverCheck && nameResolveFinished() ||
#endif // ENABLE_ASYNC_DNS
!checkSocketIsReadable && !checkSocketIsWritable && !nameResolverCheck) {
checkPoint.reset();
Segment segment;
if(e->segmentMan->downloadStarted) {
@ -200,10 +204,12 @@ void AbstractCommand::setWriteCheckSocket(const SocketHandle& socket) {
#ifdef ENABLE_ASYNC_DNS
void AbstractCommand::setNameResolverCheck(const NameResolverHandle& resolver) {
nameResolverCheck = true;
e->addNameResolverCheck(resolver, this);
}
void AbstractCommand::disableNameResolverCheck(const NameResolverHandle& resolver) {
nameResolverCheck = false;
e->deleteNameResolverCheck(resolver, this);
}
@ -228,4 +234,8 @@ bool AbstractCommand::resolveHostname(const string& hostname,
return false;
}
}
bool AbstractCommand::nameResolveFinished() const {
return false;
}
#endif // ENABLE_ASYNC_DNS

View File

@ -63,6 +63,7 @@ protected:
void setNameResolverCheck(const NameResolverHandle& resolver);
void disableNameResolverCheck(const NameResolverHandle& resolver);
bool resolveHostname(const string& hostname, const NameResolverHandle& nameResolver);
virtual bool nameResolveFinished() const;
#endif // ENABLE_ASYNC_DNS
void setTimeout(int timeout) { this->timeout = timeout; }
private:
@ -70,6 +71,7 @@ private:
bool checkSocketIsWritable;
SocketHandle readCheckTarget;
SocketHandle writeCheckTarget;
bool nameResolverCheck;
public:
AbstractCommand(int cuid, Request* req, DownloadEngine* e, const SocketHandle& s = SocketHandle());
virtual ~AbstractCommand();

View File

@ -0,0 +1,64 @@
/*
* aria2 - The high speed download utility
*
* Copyright (C) 2006 Tatsuhiro Tsujikawa
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/* copyright --> */
#include "CompactPeerListProcessor.h"
#include "Data.h"
#include <netinet/in.h>
bool CompactPeerListProcessor::canHandle(const MetaEntry* peersEntry) const {
return dynamic_cast<const Data*>(peersEntry) != 0;
}
Peers CompactPeerListProcessor::extractPeer(const MetaEntry* peersEntry) {
Peers peers;
const Data* peersData = (const Data*)peersEntry;
if(peersData->getLen() > 0) {
for(int i = 0; i < peersData->getLen(); i += 6) {
unsigned int ipaddr1 = (unsigned char)*(peersData->getData()+i);
unsigned int ipaddr2 = (unsigned char)*(peersData->getData()+i+1);
unsigned int ipaddr3 = (unsigned char)*(peersData->getData()+i+2);
unsigned int ipaddr4 = (unsigned char)*(peersData->getData()+i+3);
unsigned int port = ntohs(*(unsigned short int*)(peersData->getData()+i+4));
char ipaddr[16];
snprintf(ipaddr, sizeof(ipaddr), "%d.%d.%d.%d",
ipaddr1, ipaddr2, ipaddr3, ipaddr4);
PeerHandle peer =
PeerHandle(new Peer(ipaddr, port, pieceLength, totalLength));
peers.push_back(peer);
}
}
return peers;
}

View File

@ -0,0 +1,55 @@
/*
* aria2 - The high speed download utility
*
* Copyright (C) 2006 Tatsuhiro Tsujikawa
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/* copyright --> */
#ifndef _D_COMPACT_PEER_LIST_PROCESSOR_H_
#define _D_COMPACT_PEER_LIST_PROCESSOR_H_
#include "PeerListProcessor.h"
class CompactPeerListProcessor : public PeerListProcessor {
private:
int pieceLength;
long long int totalLength;
public:
CompactPeerListProcessor(int pieceLength, long long int totalLength)
:pieceLength(pieceLength),
totalLength(totalLength) {}
virtual ~CompactPeerListProcessor() {}
virtual Peers extractPeer(const MetaEntry* peersEntry);
virtual bool canHandle(const MetaEntry* peersEntry) const;
};
#endif // _D_COMPACT_PEER_LIST_PROCESSOR_H_

View File

@ -0,0 +1,70 @@
/* <!-- copyright */
/*
* aria2 - The high speed download utility
*
* Copyright (C) 2006 Tatsuhiro Tsujikawa
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/* copyright --> */
#include "DefaultPeerListProcessor.h"
#include "List.h"
#include "Dictionary.h"
#include "Data.h"
bool DefaultPeerListProcessor::canHandle(const MetaEntry* peersEntry) const {
const List* peersList = dynamic_cast<const List*>(peersEntry);
return peersList != 0;
}
Peers DefaultPeerListProcessor::extractPeer(const MetaEntry* peersEntry) {
Peers peers;
const List* peersList = dynamic_cast<const List*>(peersEntry);
if(!peersList) {
return peers;
}
const MetaList& metaList = peersList->getList();
for(MetaList::const_iterator itr = metaList.begin();
itr != metaList.end(); itr++) {
const Dictionary* peerDic = dynamic_cast<const Dictionary*>(*itr);
if(!peerDic) {
break;
}
const Data* ip = dynamic_cast<const Data*>(peerDic->get("ip"));
const Data* port = dynamic_cast<const Data*>(peerDic->get("port"));
if(!ip || !port || !port->isNumber()) {
continue;
}
PeerHandle peer = PeerHandle(new Peer(ip->toString(),
port->toInt(),
pieceLength,
totalLength));
peers.push_back(peer);
}
return peers;
}

View File

@ -0,0 +1,56 @@
/* <!-- copyright */
/*
* aria2 - The high speed download utility
*
* Copyright (C) 2006 Tatsuhiro Tsujikawa
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/* copyright --> */
#ifndef _D_DEFAULT_PEER_LIST_PROCESSOR_H_
#define _D_DEFAULT_PEER_LIST_PROCESSOR_H_
#include "PeerListProcessor.h"
class DefaultPeerListProcessor : public PeerListProcessor {
private:
int pieceLength;
long long int totalLength;
public:
DefaultPeerListProcessor(int pieceLength, long long int totalLength)
:pieceLength(pieceLength),
totalLength(totalLength) {}
virtual ~DefaultPeerListProcessor() {}
virtual Peers extractPeer(const MetaEntry* peersEntry);
virtual bool canHandle(const MetaEntry* peersEntry) const;
};
#endif // _D_DEFAULT_PEER_LIST_PROCESSOR_H_

View File

@ -0,0 +1,57 @@
/*
* aria2 - The high speed download utility
*
* Copyright (C) 2006 Tatsuhiro Tsujikawa
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/* copyright --> */
#include "DelegatingPeerListProcessor.h"
Peers DelegatingPeerListProcessor::extractPeer(const MetaEntry* peersEntry) {
Peers peers;
for(PeerListProcessors::iterator itr = processors.begin();
itr != processors.end(); itr++) {
PeerListProcessorHandle processor = *itr;
if(processor->canHandle(peersEntry)) {
Peers tempPeers = processor->extractPeer(peersEntry);
copy(tempPeers.begin(), tempPeers.end(), back_inserter(peers));
break;
}
}
return peers;
}
bool DelegatingPeerListProcessor::canHandle(const MetaEntry* peersEntry) const {
for(PeerListProcessors::const_iterator itr = processors.begin();
itr != processors.end(); itr++) {
if((*itr)->canHandle(peersEntry)) {
return true;
}
}
}

View File

@ -0,0 +1,63 @@
/*
* aria2 - The high speed download utility
*
* Copyright (C) 2006 Tatsuhiro Tsujikawa
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/* copyright --> */
#ifndef _D_DELEGATING_PEER_LIST_PROCESSOR_H_
#define _D_DELEGATING_PEER_LIST_PROCESSOR_H_
#include "PeerListProcessor.h"
#include "DefaultPeerListProcessor.h"
#include "CompactPeerListProcessor.h"
typedef deque<PeerListProcessorHandle> PeerListProcessors;
class DelegatingPeerListProcessor : public PeerListProcessor {
private:
int pieceLength;
long long int totalLength;
PeerListProcessors processors;
public:
DelegatingPeerListProcessor(int pieceLength, long long int totalLength)
:pieceLength(pieceLength),
totalLength(totalLength) {
processors.push_back(new DefaultPeerListProcessor(pieceLength, totalLength));
processors.push_back(new CompactPeerListProcessor(pieceLength, totalLength));
}
virtual ~DelegatingPeerListProcessor() {}
virtual Peers extractPeer(const MetaEntry* peersEntry);
virtual bool canHandle(const MetaEntry* peersEntry) const;
};
#endif // _D_DELEGATING_PEER_LIST_PROCESSOR_H_

View File

@ -45,6 +45,12 @@ private:
bool useHttpProxy() const;
bool useHttpProxyGet() const;
bool useHttpProxyConnect() const;
#ifdef ENABLE_ASYNC_DNS
virtual bool nameResolveFinished() const {
return nameResolver->getStatus() == NameResolver::STATUS_SUCCESS ||
nameResolver->getStatus() == NameResolver::STATUS_ERROR;
}
#endif // ENABLE_ASYNC_DNS
protected:
bool executeInternal(Segment& segment);
public:

View File

@ -55,6 +55,12 @@ protected:
* evaluated by RequestCommand.
*/
bool executeInternal(Segment& segment);
#ifdef ENABLE_ASYNC_DNS
virtual bool nameResolveFinished() const {
return nameResolver->getStatus() == NameResolver::STATUS_SUCCESS ||
nameResolver->getStatus() == NameResolver::STATUS_ERROR;
}
#endif // ENABLE_ASYNC_DNS
public:
HttpInitiateConnectionCommand(int cuid, Request* req, DownloadEngine* e);
~HttpInitiateConnectionCommand();

View File

@ -120,7 +120,11 @@ SRCS += MetaEntry.h\
TimeSeedCriteria.h\
ShareRatioSeedCriteria.h\
UnionSeedCriteria.h\
SeedCheckCommand.cc SeedCheckCommand.h
SeedCheckCommand.cc SeedCheckCommand.h\
PeerListProcessor.h\
DefaultPeerListProcessor.cc DefaultPeerListProcessor.h\
CompactPeerListProcessor.cc CompactPeerListProcessor.h\
DelegatingPeerListProcessor.cc DelegatingPeerListProcessor.h
endif # ENABLE_BITTORRENT
if ENABLE_METALINK

View File

@ -97,7 +97,11 @@ bin_PROGRAMS = aria2c$(EXEEXT)
@ENABLE_BITTORRENT_TRUE@ TimeSeedCriteria.h\
@ENABLE_BITTORRENT_TRUE@ ShareRatioSeedCriteria.h\
@ENABLE_BITTORRENT_TRUE@ UnionSeedCriteria.h\
@ENABLE_BITTORRENT_TRUE@ SeedCheckCommand.cc SeedCheckCommand.h
@ENABLE_BITTORRENT_TRUE@ SeedCheckCommand.cc SeedCheckCommand.h\
@ENABLE_BITTORRENT_TRUE@ PeerListProcessor.h\
@ENABLE_BITTORRENT_TRUE@ DefaultPeerListProcessor.cc DefaultPeerListProcessor.h\
@ENABLE_BITTORRENT_TRUE@ CompactPeerListProcessor.cc CompactPeerListProcessor.h\
@ENABLE_BITTORRENT_TRUE@ DelegatingPeerListProcessor.cc DelegatingPeerListProcessor.h
@ENABLE_METALINK_TRUE@am__append_3 = Metalinker.cc Metalinker.h\
@ENABLE_METALINK_TRUE@ MetalinkEntry.cc MetalinkEntry.h\
@ -203,8 +207,12 @@ am__libaria2c_a_SOURCES_DIST = Socket.h SocketCore.cc SocketCore.h \
TorrentRequestInfo.cc TorrentRequestInfo.h SeedCriteria.h \
TimeSeedCriteria.h ShareRatioSeedCriteria.h \
UnionSeedCriteria.h SeedCheckCommand.cc SeedCheckCommand.h \
Metalinker.cc Metalinker.h MetalinkEntry.cc MetalinkEntry.h \
MetalinkResource.cc MetalinkResource.h MetalinkProcessor.h \
PeerListProcessor.h DefaultPeerListProcessor.cc \
DefaultPeerListProcessor.h CompactPeerListProcessor.cc \
CompactPeerListProcessor.h DelegatingPeerListProcessor.cc \
DelegatingPeerListProcessor.h Metalinker.cc Metalinker.h \
MetalinkEntry.cc MetalinkEntry.h MetalinkResource.cc \
MetalinkResource.h MetalinkProcessor.h \
Xml2MetalinkProcessor.cc Xml2MetalinkProcessor.h \
MetalinkRequestInfo.cc MetalinkRequestInfo.h
@ENABLE_ASYNC_DNS_TRUE@am__objects_1 = NameResolver.$(OBJEXT)
@ -257,7 +265,10 @@ am__libaria2c_a_SOURCES_DIST = Socket.h SocketCore.cc SocketCore.h \
@ENABLE_BITTORRENT_TRUE@ PeerMessageFactory.$(OBJEXT) \
@ENABLE_BITTORRENT_TRUE@ HaveEraseCommand.$(OBJEXT) \
@ENABLE_BITTORRENT_TRUE@ TorrentRequestInfo.$(OBJEXT) \
@ENABLE_BITTORRENT_TRUE@ SeedCheckCommand.$(OBJEXT)
@ENABLE_BITTORRENT_TRUE@ SeedCheckCommand.$(OBJEXT) \
@ENABLE_BITTORRENT_TRUE@ DefaultPeerListProcessor.$(OBJEXT) \
@ENABLE_BITTORRENT_TRUE@ CompactPeerListProcessor.$(OBJEXT) \
@ENABLE_BITTORRENT_TRUE@ DelegatingPeerListProcessor.$(OBJEXT)
@ENABLE_METALINK_TRUE@am__objects_3 = Metalinker.$(OBJEXT) \
@ENABLE_METALINK_TRUE@ MetalinkEntry.$(OBJEXT) \
@ENABLE_METALINK_TRUE@ MetalinkResource.$(OBJEXT) \
@ -583,11 +594,14 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ChokeMessage.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ChunkedEncoding.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Command.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CompactPeerListProcessor.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ConsoleDownloadEngine.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CookieBox.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CopyDiskAdaptor.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Data.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DefaultDiskWriter.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DefaultPeerListProcessor.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DelegatingPeerListProcessor.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Dictionary.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DirectDiskAdaptor.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Directory.Po@am__quote@

View File

@ -75,8 +75,6 @@ private:
long long int sessionDownloadLength;
int pieceLength;
int latency;
void resetStatus();
public:
Peer(string ipaddr, int port, int pieceLength, long long int totalLength)
:entryId(0), ipaddr(ipaddr), port(port), error(0),
@ -108,6 +106,8 @@ public:
return !(*this == p);
}
void resetStatus();
void updateUploadLength(int bytes) {
peerStat.updateUploadLength(bytes);
sessionUploadLength += bytes;

View File

@ -99,6 +99,7 @@ void PeerAbstractCommand::onAbort(Exception* ex) {
} else {
peer->error += MAX_PEER_ERROR;
}
peer->resetStatus();
}
void PeerAbstractCommand::disableReadCheckSocket() {

56
src/PeerListProcessor.h Normal file
View File

@ -0,0 +1,56 @@
/* <!-- copyright */
/*
* aria2 - The high speed download utility
*
* Copyright (C) 2006 Tatsuhiro Tsujikawa
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/* copyright --> */
#ifndef _D_PEER_LIST_PROCESSOR_H_
#define _D_PEER_LIST_PROCESSOR_H_
#include "common.h"
#include "MetaEntry.h"
#include "Peer.h"
#include "SharedHandle.h"
typedef deque<PeerHandle> Peers;
class PeerListProcessor {
public:
virtual ~PeerListProcessor() {}
virtual Peers extractPeer(const MetaEntry* peersEntry) = 0;
virtual bool canHandle(const MetaEntry* peersEntry) const = 0;
};
typedef SharedHandle<PeerListProcessor> PeerListProcessorHandle;
#endif // _D_PEER_LIST_PROCESSOR_H_

View File

@ -54,6 +54,7 @@ void SpeedCalc::reset() {
prevSpeed = 0;
start.reset();
accumulatedLength = 0;
nextInterval = CHANGE_INTERVAL_SEC;
}
int SpeedCalc::calculateSpeed() {
@ -88,13 +89,14 @@ void SpeedCalc::update(int bytes) {
}
bool SpeedCalc::isIntervalOver() const {
return CHANGE_INTERVAL_SEC <= cpArray[sw].difference();
return nextInterval <= cpArray[sw].difference();
}
void SpeedCalc::changeSw() {
lengthArray[sw] = 0;
cpArray[sw].reset();
sw ^= 0x01;
nextInterval = cpArray[sw].difference()+CHANGE_INTERVAL_SEC;
}
int SpeedCalc::getAvgSpeed() const {

View File

@ -47,6 +47,7 @@ private:
int prevSpeed;
Time start;
long long int accumulatedLength;
int nextInterval;
bool isIntervalOver() const;
void changeSw();

View File

@ -89,12 +89,23 @@ void TorrentMan::updatePeers(const Peers& peers) {
this->peers = peers;
}
bool TorrentMan::addPeer(const PeerHandle& peer) {
if(peers.size() >= MAX_PEER_LIST_SIZE) {
deleteUnusedPeer(peers.size()-MAX_PEER_LIST_SIZE+15);
void TorrentMan::addPeer(const Peers& peers) {
for(Peers::const_iterator itr = peers.begin();
itr != peers.end(); itr++) {
const PeerHandle& peer = *itr;
if(addPeer(peer)) {
logger->debug("Adding peer %s:%d",
peer->ipaddr.c_str(), peer->port);
}
}
}
bool TorrentMan::addPeer(const PeerHandle& peer) {
Peers::iterator itr = find(peers.begin(), peers.end(), peer);
if(itr == peers.end()) {
if(peers.size() > MAX_PEER_LIST_SIZE) {
deleteUnusedPeer(peers.size()-MAX_PEER_LIST_SIZE+1);
}
++peerEntryIdCounter;
peer->entryId = peerEntryIdCounter;
peers.push_back(peer);

View File

@ -47,6 +47,7 @@
#include "DiskAdaptor.h"
#include "Request.h"
#include "TimeA2.h"
#include "PeerListProcessor.h"
#include <deque>
#include <map>
#include <string>
@ -85,7 +86,6 @@ public:
index(index) {}
};
typedef deque<PeerHandle> Peers;
typedef deque<HaveEntry> Haves;
typedef deque<int> PieceIndexes;
typedef deque<Piece> Pieces;
@ -156,6 +156,7 @@ public:
// TODO do not use this method
void updatePeers(const Peers& peers);
bool addPeer(const PeerHandle& peer);
void addPeer(const Peers& peers);
//void updatePeer(const Peer* peer);
const Peers& getPeers() const { return peers; }
PeerHandle getPeer() const;

View File

@ -40,7 +40,7 @@
#include "PeerInitiateConnectionCommand.h"
#include "SleepCommand.h"
#include "Util.h"
#include <netinet/in.h>
#include "DelegatingPeerListProcessor.h"
TrackerUpdateCommand::TrackerUpdateCommand(int cuid, TorrentDownloadEngine*e):Command(cuid), e(e) {
logger = LogFactory::getInstance();
@ -132,32 +132,15 @@ bool TrackerUpdateCommand::execute() {
logger->debug("CUID#%d - Incomplete:%d",
cuid, e->torrentMan->incomplete);
}
const MetaEntry* peersEntry = response->get("peers");
if(!e->torrentMan->isHalt() &&
e->torrentMan->connections < MIN_PEERS &&
dynamic_cast<const Data*>(response->get("peers"))) {
Data* peers = (Data*)response->get("peers");
if(peers != NULL && peers->getLen() > 0) {
for(int i = 0; i < peers->getLen(); i += 6) {
unsigned int ipaddr1 = (unsigned char)*(peers->getData()+i);
unsigned int ipaddr2 = (unsigned char)*(peers->getData()+i+1);
unsigned int ipaddr3 = (unsigned char)*(peers->getData()+i+2);
unsigned int ipaddr4 = (unsigned char)*(peers->getData()+i+3);
unsigned int port = ntohs(*(unsigned short int*)(peers->getData()+i+4));
char ipaddr[16];
snprintf(ipaddr, sizeof(ipaddr), "%d.%d.%d.%d",
ipaddr1, ipaddr2, ipaddr3, ipaddr4);
PeerHandle peer =
PeerHandle(new Peer(ipaddr, port, e->torrentMan->pieceLength,
e->torrentMan->getTotalLength()));
if(e->torrentMan->addPeer(peer)) {
logger->debug("CUID#%d - Adding peer %s:%d",
cuid, peer->ipaddr.c_str(), peer->port);
}
}
} else {
logger->info("CUID#%d - No peer list received.", cuid);
}
peersEntry) {
DelegatingPeerListProcessor proc(e->torrentMan->pieceLength,
e->torrentMan->getTotalLength());
Peers peers = proc.extractPeer(peersEntry);
e->torrentMan->addPeer(peers);
while(e->torrentMan->isPeerAvailable() &&
e->torrentMan->connections < MIN_PEERS) {
PeerHandle peer = e->torrentMan->getPeer();
@ -169,6 +152,10 @@ bool TrackerUpdateCommand::execute() {
logger->debug("CUID#%d - Adding new command CUID#%d", cuid, newCuid);
}
}
if(!peersEntry) {
logger->info("CUID#%d - No peer list received.", cuid);
}
if(e->torrentMan->req->getTrackerEvent() == Request::STARTED) {
e->torrentMan->req->setTrackerEvent(Request::AUTO);
}

View File

@ -85,11 +85,11 @@ void setSignalHander(int signal, void (*handler)(int), int flags) {
void showVersion() {
cout << PACKAGE << _(" version ") << PACKAGE_VERSION << endl;
cout << "Copyright (C) 2006 Tatsuhiro Tsujikawa" << endl;
cout << endl;
cout << "**Configuration**" << endl;
cout << FeatureConfig::getInstance()->getConfigurationSummary();
cout << endl;
cout << "Copyright (C) 2006 Tatsuhiro Tsujikawa" << endl;
cout << endl;
cout <<
_("This program is free software; you can redistribute it and/or modify\n"
"it under the terms of the GNU General Public License as published by\n"

View File

@ -0,0 +1,57 @@
#include "DefaultPeerListProcessor.h"
#include "MetaFileUtil.h"
#include "Exception.h"
#include <cppunit/extensions/HelperMacros.h>
using namespace std;
class DefaultPeerListProcessorTest:public CppUnit::TestFixture {
CPPUNIT_TEST_SUITE(DefaultPeerListProcessorTest);
CPPUNIT_TEST(testExtractPeer);
CPPUNIT_TEST(testExtract2Peers);
CPPUNIT_TEST_SUITE_END();
private:
public:
void setUp() {
}
void testExtractPeer();
void testExtract2Peers();
};
CPPUNIT_TEST_SUITE_REGISTRATION( DefaultPeerListProcessorTest );
void DefaultPeerListProcessorTest::testExtractPeer() {
DefaultPeerListProcessor proc(1024*1024, 10*1024*1024);
string peersString = "d5:peersld2:ip11:192.168.0.17:peer id20:aria2-000000000000004:porti2006eeee";
Dictionary* dic = (Dictionary*)MetaFileUtil::bdecoding(peersString.c_str(), peersString.size());
CPPUNIT_ASSERT(proc.canHandle(dic->get("peers"));
Peers peers = proc.extractPeer(dic->get("peers"));
CPPUNIT_ASSERT_EQUAL((size_t)1, peers.size());
PeerHandle peer = *peers.begin();
CPPUNIT_ASSERT_EQUAL(string("192.168.0.1"), peer->ipaddr);
CPPUNIT_ASSERT_EQUAL(2006, peer->port);
}
void DefaultPeerListProcessorTest::testExtract2Peers() {
DefaultPeerListProcessor proc(1024*1024, 10*1024*1024);
string peersString = "d5:peersld2:ip11:192.168.0.17:peer id20:aria2-000000000000004:porti2006eed2:ip11:192.168.0.27:peer id20:aria2-000000000000004:porti2007eeee";
Dictionary* dic = (Dictionary*)MetaFileUtil::bdecoding(peersString.c_str(), peersString.size());
Peers peers = proc.extractPeer(dic->get("peers"));
CPPUNIT_ASSERT_EQUAL((size_t)2, peers.size());
PeerHandle peer = *peers.begin();
CPPUNIT_ASSERT_EQUAL(string("192.168.0.1"), peer->ipaddr);
CPPUNIT_ASSERT_EQUAL(2006, peer->port);
peer = *(peers.begin()+1);
CPPUNIT_ASSERT_EQUAL(string("192.168.0.2"), peer->ipaddr);
CPPUNIT_ASSERT_EQUAL(2007, peer->port);
}

View File

@ -39,7 +39,8 @@ aria2c_SOURCES = AllTest.cc\
ShareRatioSeedCriteriaTest.cc\
TimeSeedCriteriaTest.cc\
SegmentManTest.cc\
SpeedCalcTest.cc
SpeedCalcTest.cc\
DefaultPeerListProcessorTest.cc
#aria2c_CXXFLAGS = ${CPPUNIT_CFLAGS} -I../src -I../lib -Wall -D_FILE_OFFSET_BITS=64
#aria2c_LDFLAGS = ${CPPUNIT_LIBS}

View File

@ -77,7 +77,7 @@ am_aria2c_OBJECTS = AllTest.$(OBJEXT) RequestTest.$(OBJEXT) \
MetalinkEntryTest.$(OBJEXT) FeatureConfigTest.$(OBJEXT) \
ShareRatioSeedCriteriaTest.$(OBJEXT) \
TimeSeedCriteriaTest.$(OBJEXT) SegmentManTest.$(OBJEXT) \
SpeedCalcTest.$(OBJEXT)
SpeedCalcTest.$(OBJEXT) DefaultPeerListProcessorTest.$(OBJEXT)
aria2c_OBJECTS = $(am_aria2c_OBJECTS)
am__DEPENDENCIES_1 =
aria2c_DEPENDENCIES = ../src/libaria2c.a $(am__DEPENDENCIES_1)
@ -270,7 +270,8 @@ aria2c_SOURCES = AllTest.cc\
ShareRatioSeedCriteriaTest.cc\
TimeSeedCriteriaTest.cc\
SegmentManTest.cc\
SpeedCalcTest.cc
SpeedCalcTest.cc\
DefaultPeerListProcessorTest.cc
#aria2c_CXXFLAGS = ${CPPUNIT_CFLAGS} -I../src -I../lib -Wall -D_FILE_OFFSET_BITS=64
#aria2c_LDFLAGS = ${CPPUNIT_LIBS}
@ -342,6 +343,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CookieBoxTest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DataTest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DefaultDiskWriterTest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DefaultPeerListProcessorTest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DictionaryTest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FeatureConfigTest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FileTest.Po@am__quote@

View File

@ -12,6 +12,7 @@ class SegmentManTest:public CppUnit::TestFixture {
CPPUNIT_TEST(testSaveAndLoad);
CPPUNIT_TEST(testNullBitfield);
CPPUNIT_TEST(testCancelSegmentOnNullBitfield);
CPPUNIT_TEST(testBug);
CPPUNIT_TEST_SUITE_END();
private:
@ -22,6 +23,7 @@ public:
void testSaveAndLoad();
void testNullBitfield();
void testCancelSegmentOnNullBitfield();
void testBug();
};
@ -41,20 +43,20 @@ void SegmentManTest::testSaveAndLoad() {
segmentMan.ufilename = filename;
segmentMan.initBitfield(1024*1024, segmentMan.totalSize);
Segment2 seg1;
segmentMan.getSegment2(seg1, 1);
Segment seg1;
segmentMan.getSegment(seg1, 1);
seg1.writtenLength = seg1.length;
segmentMan.completeSegment2(1, seg1);
segmentMan.completeSegment(1, seg1);
Segment2 seg2;
segmentMan.getSegment2(seg2, 2);
Segment seg2;
segmentMan.getSegment(seg2, 2);
seg2.writtenLength = 512*1024;
segmentMan.updateSegment2(2, seg2);
segmentMan.updateSegment(2, seg2);
Segment2 seg3;
segmentMan.getSegment2(seg3, 3);
Segment seg3;
segmentMan.getSegment(seg3, 3);
seg2.writtenLength = 512*1024;
segmentMan.updateSegment2(2, seg2);
segmentMan.updateSegment(2, seg2);
segmentMan.save();
@ -66,12 +68,12 @@ void SegmentManTest::testSaveAndLoad() {
CPPUNIT_ASSERT_EQUAL(segmentMan.totalSize, segmentManLoad.totalSize);
Segment2 seg2Load;
segmentManLoad.getSegment2(seg2Load, 2, seg2.index);
Segment seg2Load;
segmentManLoad.getSegment(seg2Load, 2, seg2.index);
CPPUNIT_ASSERT_EQUAL(seg2, seg2Load);
Segment2 seg3Load;
segmentManLoad.getSegment2(seg3Load, 3, seg3.index);
Segment seg3Load;
segmentManLoad.getSegment(seg3Load, 3, seg3.index);
CPPUNIT_ASSERT_EQUAL(seg3, seg3Load);
CPPUNIT_ASSERT_EQUAL(segmentMan.getDownloadLength(), segmentManLoad.getDownloadLength());
@ -88,26 +90,36 @@ void SegmentManTest::testNullBitfield() {
op.put(PREF_SEGMENT_SIZE, Util::itos(1024*1024));
segmentMan.option = &op;
Segment2 segment;
CPPUNIT_ASSERT(segmentMan.getSegment2(segment, 1));
CPPUNIT_ASSERT_EQUAL(Segment2(0, 0, 0), segment);
Segment segment;
CPPUNIT_ASSERT(segmentMan.getSegment(segment, 1));
CPPUNIT_ASSERT_EQUAL(Segment(0, 0, 0), segment);
Segment2 segment2;
CPPUNIT_ASSERT(!segmentMan.getSegment2(segment2, 2));
Segment segment2;
CPPUNIT_ASSERT(!segmentMan.getSegment(segment2, 2));
long long int totalLength = 1024*1024;
segment.writtenLength = totalLength;
CPPUNIT_ASSERT(segmentMan.updateSegment2(1, segment));
CPPUNIT_ASSERT(segmentMan.updateSegment(1, segment));
CPPUNIT_ASSERT_EQUAL(totalLength, segmentMan.getDownloadLength());
CPPUNIT_ASSERT(segmentMan.completeSegment2(1, segment));
CPPUNIT_ASSERT(segmentMan.completeSegment(1, segment));
CPPUNIT_ASSERT_EQUAL(totalLength, segmentMan.getDownloadLength());
}
void SegmentManTest::testCancelSegmentOnNullBitfield() {
SegmentMan segmentMan;
Segment2 segment;
CPPUNIT_ASSERT(segmentMan.getSegment2(segment, 1));
CPPUNIT_ASSERT(segmentMan.cancelSegment2(1, segment));
CPPUNIT_ASSERT(segmentMan.getSegment2(segment, 1));
Segment segment;
CPPUNIT_ASSERT(segmentMan.getSegment(segment, 1));
segmentMan.cancelSegment(1);
CPPUNIT_ASSERT(segmentMan.getSegment(segment, 1));
}
void SegmentManTest::testBug() {
SegmentMan segmentMan;
segmentMan.ufilename = "bug";
cerr << "########################################" << endl;
segmentMan.load();
}