fixed potential issue where a piece could be checked twice
This commit is contained in:
parent
fea3bf2ced
commit
d7c30bc01b
|
@ -28,6 +28,7 @@
|
||||||
incoming connection
|
incoming connection
|
||||||
* added more detailed instrumentation of the disk I/O thread
|
* added more detailed instrumentation of the disk I/O thread
|
||||||
|
|
||||||
|
* fixed potential issue where a piece could be checked twice
|
||||||
* fixed build issue on windows related to GetCompressedSize()
|
* fixed build issue on windows related to GetCompressedSize()
|
||||||
* fixed deadlock when starting torrents with certain invalid tracker URLs
|
* fixed deadlock when starting torrents with certain invalid tracker URLs
|
||||||
* fixed iterator bug in disk I/O thread
|
* fixed iterator bug in disk I/O thread
|
||||||
|
|
|
@ -2352,6 +2352,7 @@ namespace libtorrent
|
||||||
m_timeout_extend = 0;
|
m_timeout_extend = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool was_finished = picker.is_piece_finished(p.piece);
|
||||||
// did we request this block from any other peers?
|
// did we request this block from any other peers?
|
||||||
bool multi = picker.num_peers(block_finished) > 1;
|
bool multi = picker.num_peers(block_finished) > 1;
|
||||||
picker.mark_as_writing(block_finished, peer_info_struct());
|
picker.mark_as_writing(block_finished, peer_info_struct());
|
||||||
|
@ -2370,7 +2371,7 @@ namespace libtorrent
|
||||||
// did we just finish the piece?
|
// did we just finish the piece?
|
||||||
// this means all blocks are either written
|
// this means all blocks are either written
|
||||||
// to disk or are in the disk write cache
|
// to disk or are in the disk write cache
|
||||||
if (picker.is_piece_finished(p.piece))
|
if (picker.is_piece_finished(p.piece) && !was_finished)
|
||||||
{
|
{
|
||||||
#ifdef TORRENT_DEBUG
|
#ifdef TORRENT_DEBUG
|
||||||
check_postcondition post_checker2_(t, false);
|
check_postcondition post_checker2_(t, false);
|
||||||
|
|
|
@ -677,6 +677,8 @@ namespace libtorrent
|
||||||
// avoid crash trying to access the picker when there is nont
|
// avoid crash trying to access the picker when there is nont
|
||||||
if (is_seed()) return;
|
if (is_seed()) return;
|
||||||
|
|
||||||
|
if (picker().have_piece(piece)) return;
|
||||||
|
|
||||||
peer_request p;
|
peer_request p;
|
||||||
p.piece = piece;
|
p.piece = piece;
|
||||||
p.start = 0;
|
p.start = 0;
|
||||||
|
@ -739,13 +741,6 @@ namespace libtorrent
|
||||||
m_need_save_resume_data = true;
|
m_need_save_resume_data = true;
|
||||||
|
|
||||||
picker().mark_as_finished(block_finished, 0);
|
picker().mark_as_finished(block_finished, 0);
|
||||||
|
|
||||||
// did we just finish the piece?
|
|
||||||
if (picker().is_piece_finished(p.piece))
|
|
||||||
{
|
|
||||||
async_verify_piece(p.piece, bind(&torrent::piece_finished, shared_from_this()
|
|
||||||
, p.piece, _1));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void torrent::on_disk_cache_complete(int ret, disk_io_job const& j)
|
void torrent::on_disk_cache_complete(int ret, disk_io_job const& j)
|
||||||
|
@ -2106,6 +2101,8 @@ namespace libtorrent
|
||||||
|
|
||||||
TORRENT_ASSERT(valid_metadata());
|
TORRENT_ASSERT(valid_metadata());
|
||||||
|
|
||||||
|
TORRENT_ASSERT(!m_picker->have_piece(index));
|
||||||
|
|
||||||
// even though the piece passed the hash-check
|
// even though the piece passed the hash-check
|
||||||
// it might still have failed being written to disk
|
// it might still have failed being written to disk
|
||||||
// if so, piece_picker::write_failed() has been
|
// if so, piece_picker::write_failed() has been
|
||||||
|
|
Loading…
Reference in New Issue