From 427577eed473b1880fdb2263be4cdad1eaaabfce Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Mon, 21 Jun 2010 14:02:51 +0000 Subject: 2010-06-21 Tatsuhiro Tsujikawa Fixed the bug that corrups file if segment returned from SegmetnMan::getCleanSegmentIfOwnerIsIdle() has writtenLength > 0. * src/DownloadCommand.cc * src/SegmentMan.cc * src/SegmentMan.h * test/SegmentManTest.cc --- src/DownloadCommand.cc | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'src/DownloadCommand.cc') diff --git a/src/DownloadCommand.cc b/src/DownloadCommand.cc index 122cf26a..1bba9d04 100644 --- a/src/DownloadCommand.cc +++ b/src/DownloadCommand.cc @@ -315,10 +315,16 @@ bool DownloadCommand::prepareForNextSegment() { if(!tempSegment->complete()) { return prepareForRetry(0); } - SharedHandle nextSegment = - getSegmentMan()->getCleanSegmentIfOwnerIsIdle + SharedHandle nextSegment = getSegmentMan()->getSegment (getCuid(), tempSegment->getIndex()+1); if(nextSegment.isNull()) { + nextSegment = getSegmentMan()->getCleanSegmentIfOwnerIsIdle + (getCuid(), tempSegment->getIndex()+1); + } + if(nextSegment.isNull() || nextSegment->getWrittenLength() > 0) { + // If nextSegment->getWrittenLength() > 0, current socket must + // be closed because writing incoming data at + // nextSegment->getWrittenLength() corrupts file. return prepareForRetry(0); } else { getDownloadEngine()->addCommand(this); -- cgit