2009-07-13 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>

Don't call prepareForRetry(1) if all segments are ignored in
	SegmentMan.
	* src/AbstractCommand.cc
	* src/BitfieldMan.cc
	* src/BitfieldMan.h
	* src/SegmentMan.cc
	* src/SegmentMan.h
pull/1/head
Tatsuhiro Tsujikawa 2009-07-13 15:02:32 +00:00
parent 19913203b7
commit 894641dfdb
6 changed files with 45 additions and 5 deletions

View File

@ -1,3 +1,13 @@
2009-07-13 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Don't call prepareForRetry(1) if all segments are ignored in
SegmentMan.
* src/AbstractCommand.cc
* src/BitfieldMan.cc
* src/BitfieldMan.h
* src/SegmentMan.cc
* src/SegmentMan.h
2009-07-12 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net> 2009-07-12 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Removed FileEntry::getAssociatedUris() Removed FileEntry::getAssociatedUris()

View File

@ -149,8 +149,14 @@ bool AbstractCommand::execute() {
if(_segments.empty()) { if(_segments.empty()) {
// TODO socket could be pooled here if pipelining is enabled... // TODO socket could be pooled here if pipelining is enabled...
logger->info(MSG_NO_SEGMENT_AVAILABLE, cuid); logger->info(MSG_NO_SEGMENT_AVAILABLE, cuid);
// When all segments are ignored in SegmentMan, there are
// no URIs available, so don't retry.
if(_requestGroup->getSegmentMan()->allSegmentsIgnored()) {
return true;
} else {
return prepareForRetry(1); return prepareForRetry(1);
} }
}
} else { } else {
size_t maxSegments = req->getMaxPipelinedRequest(); size_t maxSegments = req->getMaxPipelinedRequest();
if(_segments.size() < maxSegments) { if(_segments.size() < maxSegments) {

View File

@ -511,22 +511,37 @@ bool BitfieldMan::isFilteredAllBitSet() const {
} }
} }
bool BitfieldMan::isAllBitSet() const { static bool testAllBitSet
if(bitfieldLength == 0) { (const unsigned char* bitfield, size_t length, size_t blocks)
{
if(length == 0) {
return true; return true;
} }
for(size_t i = 0; i < bitfieldLength-1; ++i) { for(size_t i = 0; i < length-1; ++i) {
if(bitfield[i] != 0xff) { if(bitfield[i] != 0xff) {
return false; return false;
} }
} }
unsigned char b = ~((128 >> (blocks-1)%8)-1); unsigned char b = ~((128 >> (blocks-1)%8)-1);
if(bitfield[bitfieldLength-1] != b) { if(bitfield[length-1] != b) {
return false; return false;
} }
return true; return true;
} }
bool BitfieldMan::isAllBitSet() const
{
return testAllBitSet(bitfield, bitfieldLength, blocks);
}
bool BitfieldMan::isAllFilterBitSet() const
{
if(!filterBitfield) {
return false;
}
return testAllBitSet(filterBitfield, bitfieldLength, blocks);
}
bool BitfieldMan::isBitSet(size_t index) const bool BitfieldMan::isBitSet(size_t index) const
{ {
return bitfield::test(bitfield, blocks, index); return bitfield::test(bitfield, blocks, index);

View File

@ -209,6 +209,8 @@ public:
bool isAllBitSet() const; bool isAllBitSet() const;
bool isAllFilterBitSet() const;
const unsigned char* getBitfield() const const unsigned char* getBitfield() const
{ {
return bitfield; return bitfield;

View File

@ -388,4 +388,9 @@ void SegmentMan::recognizeSegmentFor(const SharedHandle<FileEntry>& fileEntry)
_ignoreBitfield.removeFilter(fileEntry->getOffset(), fileEntry->getLength()); _ignoreBitfield.removeFilter(fileEntry->getOffset(), fileEntry->getLength());
} }
bool SegmentMan::allSegmentsIgnored() const
{
return _ignoreBitfield.isAllFilterBitSet();
}
} // namespace aria2 } // namespace aria2

View File

@ -233,6 +233,8 @@ public:
// Includes segments that fileEntry covers in segment selection. // Includes segments that fileEntry covers in segment selection.
void recognizeSegmentFor(const SharedHandle<FileEntry>& fileEntry); void recognizeSegmentFor(const SharedHandle<FileEntry>& fileEntry);
bool allSegmentsIgnored() const;
}; };
typedef SharedHandle<SegmentMan> SegmentManHandle; typedef SharedHandle<SegmentMan> SegmentManHandle;