forked from premiere/premiere-libtorrent
added more asserts in an attempt to track down invalid policy peer pointers in the piece picker. also fixed a web seed related crash when geoip support is enabled
This commit is contained in:
parent
ccb1a880aa
commit
48b85ba586
|
@ -117,6 +117,10 @@ namespace libtorrent
|
||||||
// the state of this block
|
// the state of this block
|
||||||
enum { state_none, state_requested, state_writing, state_finished };
|
enum { state_none, state_requested, state_writing, state_finished };
|
||||||
unsigned state:2;
|
unsigned state:2;
|
||||||
|
#if defined TORRENT_DEBUG || TORRENT_RELEASE_ASSERTS
|
||||||
|
// to allow verifying the invariant of blocks belonging to the right piece
|
||||||
|
int piece_index;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
// the peers that are downloading this piece
|
// the peers that are downloading this piece
|
||||||
|
|
|
@ -346,6 +346,7 @@ namespace libtorrent
|
||||||
, m_holepunch_mode(false)
|
, m_holepunch_mode(false)
|
||||||
, m_ignore_stats(false)
|
, m_ignore_stats(false)
|
||||||
, m_corked(false)
|
, m_corked(false)
|
||||||
|
, m_has_metadata(true)
|
||||||
#if defined TORRENT_DEBUG || TORRENT_RELEASE_ASSERTS
|
#if defined TORRENT_DEBUG || TORRENT_RELEASE_ASSERTS
|
||||||
, m_in_constructor(true)
|
, m_in_constructor(true)
|
||||||
, m_disconnect_started(false)
|
, m_disconnect_started(false)
|
||||||
|
@ -3869,13 +3870,14 @@ namespace libtorrent
|
||||||
if (peer_info_struct())
|
if (peer_info_struct())
|
||||||
{
|
{
|
||||||
policy::peer* pi = peer_info_struct();
|
policy::peer* pi = peer_info_struct();
|
||||||
|
TORRENT_ASSERT(pi->in_use);
|
||||||
p.source = pi->source;
|
p.source = pi->source;
|
||||||
p.failcount = pi->failcount;
|
p.failcount = pi->failcount;
|
||||||
p.num_hashfails = pi->hashfails;
|
p.num_hashfails = pi->hashfails;
|
||||||
p.flags |= pi->on_parole ? peer_info::on_parole : 0;
|
p.flags |= pi->on_parole ? peer_info::on_parole : 0;
|
||||||
p.flags |= pi->optimistically_unchoked ? peer_info::optimistic_unchoke : 0;
|
p.flags |= pi->optimistically_unchoked ? peer_info::optimistic_unchoke : 0;
|
||||||
#ifndef TORRENT_DISABLE_GEO_IP
|
#ifndef TORRENT_DISABLE_GEO_IP
|
||||||
p.inet_as = pi->inet_as->first;
|
p.inet_as = pi->inet_as ? pi->inet_as->first : 0xffff;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -189,6 +189,9 @@ namespace libtorrent
|
||||||
ret.info[i].num_peers = 0;
|
ret.info[i].num_peers = 0;
|
||||||
ret.info[i].state = block_info::state_none;
|
ret.info[i].state = block_info::state_none;
|
||||||
ret.info[i].peer = 0;
|
ret.info[i].peer = 0;
|
||||||
|
#if defined TORRENT_DEBUG || TORRENT_RELEASE_ASSERTS
|
||||||
|
ret.info[i].piece_index = piece;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -304,6 +307,7 @@ namespace libtorrent
|
||||||
int num_writing = 0;
|
int num_writing = 0;
|
||||||
for (int k = 0; k < num_blocks; ++k)
|
for (int k = 0; k < num_blocks; ++k)
|
||||||
{
|
{
|
||||||
|
TORRENT_ASSERT(i->info[k].piece_index == i->index);
|
||||||
if (i->info[k].state == block_info::state_finished)
|
if (i->info[k].state == block_info::state_finished)
|
||||||
{
|
{
|
||||||
++num_finished;
|
++num_finished;
|
||||||
|
@ -827,6 +831,7 @@ namespace libtorrent
|
||||||
int num_blocks = blocks_in_piece(i->index);
|
int num_blocks = blocks_in_piece(i->index);
|
||||||
for (int k = 0; k < num_blocks; ++k)
|
for (int k = 0; k < num_blocks; ++k)
|
||||||
{
|
{
|
||||||
|
TORRENT_ASSERT(i->info[k].piece_index == index);
|
||||||
TORRENT_ASSERT(i->info[k].state == block_info::state_finished);
|
TORRENT_ASSERT(i->info[k].state == block_info::state_finished);
|
||||||
TORRENT_ASSERT(i->info[k].num_peers == 0);
|
TORRENT_ASSERT(i->info[k].num_peers == 0);
|
||||||
}
|
}
|
||||||
|
@ -1613,6 +1618,7 @@ namespace libtorrent
|
||||||
for (int j = 0; j < num_blocks_in_piece; ++j)
|
for (int j = 0; j < num_blocks_in_piece; ++j)
|
||||||
{
|
{
|
||||||
block_info const& info = i->info[j];
|
block_info const& info = i->info[j];
|
||||||
|
TORRENT_ASSERT(info.piece_index == i->index);
|
||||||
if (info.state != block_info::state_requested
|
if (info.state != block_info::state_requested
|
||||||
|| info.peer == peer)
|
|| info.peer == peer)
|
||||||
continue;
|
continue;
|
||||||
|
@ -1650,6 +1656,7 @@ namespace libtorrent
|
||||||
for (int j = 0; j < num_blocks_in_piece; ++j)
|
for (int j = 0; j < num_blocks_in_piece; ++j)
|
||||||
{
|
{
|
||||||
block_info const& info = i->info[j];
|
block_info const& info = i->info[j];
|
||||||
|
TORRENT_ASSERT(info.piece_index == i->index);
|
||||||
if (info.state != block_info::state_none) continue;
|
if (info.state != block_info::state_none) continue;
|
||||||
std::vector<piece_block>::iterator k = std::find(
|
std::vector<piece_block>::iterator k = std::find(
|
||||||
interesting_blocks.begin(), interesting_blocks.end()
|
interesting_blocks.begin(), interesting_blocks.end()
|
||||||
|
@ -1695,6 +1702,7 @@ namespace libtorrent
|
||||||
for (int j = 0; j < num_blocks_in_piece; ++j)
|
for (int j = 0; j < num_blocks_in_piece; ++j)
|
||||||
{
|
{
|
||||||
block_info const& info = k->info[j];
|
block_info const& info = k->info[j];
|
||||||
|
TORRENT_ASSERT(info.piece_index == k->index);
|
||||||
if (info.state == block_info::state_finished) continue;
|
if (info.state == block_info::state_finished) continue;
|
||||||
TORRENT_ASSERT(info.peer != 0);
|
TORRENT_ASSERT(info.peer != 0);
|
||||||
}
|
}
|
||||||
|
@ -1753,6 +1761,7 @@ namespace libtorrent
|
||||||
for (int j = 0; j < num_blocks_in_piece; ++j)
|
for (int j = 0; j < num_blocks_in_piece; ++j)
|
||||||
{
|
{
|
||||||
piece_picker::block_info const& info = p.info[j];
|
piece_picker::block_info const& info = p.info[j];
|
||||||
|
TORRENT_ASSERT(info.piece_index == p.index);
|
||||||
if (info.state != piece_picker::block_info::state_none
|
if (info.state != piece_picker::block_info::state_none
|
||||||
&& info.peer != peer)
|
&& info.peer != peer)
|
||||||
{
|
{
|
||||||
|
@ -1882,6 +1891,7 @@ namespace libtorrent
|
||||||
{
|
{
|
||||||
// ignore completed blocks and already requested blocks
|
// ignore completed blocks and already requested blocks
|
||||||
block_info const& info = dp.info[j];
|
block_info const& info = dp.info[j];
|
||||||
|
TORRENT_ASSERT(info.piece_index == dp.index);
|
||||||
if (info.state != block_info::state_none) continue;
|
if (info.state != block_info::state_none) continue;
|
||||||
backup_blocks2.push_back(piece_block(dp.index, j));
|
backup_blocks2.push_back(piece_block(dp.index, j));
|
||||||
}
|
}
|
||||||
|
@ -1892,6 +1902,7 @@ namespace libtorrent
|
||||||
{
|
{
|
||||||
// ignore completed blocks and already requested blocks
|
// ignore completed blocks and already requested blocks
|
||||||
block_info const& info = dp.info[j];
|
block_info const& info = dp.info[j];
|
||||||
|
TORRENT_ASSERT(info.piece_index == dp.index);
|
||||||
if (info.state != block_info::state_none) continue;
|
if (info.state != block_info::state_none) continue;
|
||||||
|
|
||||||
// if the piece is fast and the peer is slow, or vice versa,
|
// if the piece is fast and the peer is slow, or vice versa,
|
||||||
|
@ -1985,6 +1996,7 @@ namespace libtorrent
|
||||||
#ifdef TORRENT_DEBUG
|
#ifdef TORRENT_DEBUG
|
||||||
for (int k = 0; k < max_blocks; ++k)
|
for (int k = 0; k < max_blocks; ++k)
|
||||||
{
|
{
|
||||||
|
TORRENT_ASSERT(i->info[k].piece_index == index);
|
||||||
TORRENT_ASSERT(i->info[k].state == block_info::state_finished
|
TORRENT_ASSERT(i->info[k].state == block_info::state_finished
|
||||||
|| i->info[k].state == block_info::state_writing);
|
|| i->info[k].state == block_info::state_writing);
|
||||||
}
|
}
|
||||||
|
@ -2033,6 +2045,7 @@ namespace libtorrent
|
||||||
std::vector<downloading_piece>::const_iterator i = find_dl_piece(block.piece_index);
|
std::vector<downloading_piece>::const_iterator i = find_dl_piece(block.piece_index);
|
||||||
|
|
||||||
TORRENT_ASSERT(i != m_downloads.end());
|
TORRENT_ASSERT(i != m_downloads.end());
|
||||||
|
TORRENT_ASSERT(i->info[block.block_index].piece_index == block.piece_index);
|
||||||
return i->info[block.block_index].state == block_info::state_requested;
|
return i->info[block.block_index].state == block_info::state_requested;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2046,6 +2059,7 @@ namespace libtorrent
|
||||||
if (m_piece_map[block.piece_index].downloading == 0) return false;
|
if (m_piece_map[block.piece_index].downloading == 0) return false;
|
||||||
std::vector<downloading_piece>::const_iterator i = find_dl_piece(block.piece_index);
|
std::vector<downloading_piece>::const_iterator i = find_dl_piece(block.piece_index);
|
||||||
TORRENT_ASSERT(i != m_downloads.end());
|
TORRENT_ASSERT(i != m_downloads.end());
|
||||||
|
TORRENT_ASSERT(i->info[block.block_index].piece_index == block.piece_index);
|
||||||
return i->info[block.block_index].state == block_info::state_finished
|
return i->info[block.block_index].state == block_info::state_finished
|
||||||
|| i->info[block.block_index].state == block_info::state_writing;
|
|| i->info[block.block_index].state == block_info::state_writing;
|
||||||
}
|
}
|
||||||
|
@ -2060,6 +2074,7 @@ namespace libtorrent
|
||||||
if (m_piece_map[block.piece_index].downloading == 0) return false;
|
if (m_piece_map[block.piece_index].downloading == 0) return false;
|
||||||
std::vector<downloading_piece>::const_iterator i = find_dl_piece(block.piece_index);
|
std::vector<downloading_piece>::const_iterator i = find_dl_piece(block.piece_index);
|
||||||
TORRENT_ASSERT(i != m_downloads.end());
|
TORRENT_ASSERT(i != m_downloads.end());
|
||||||
|
TORRENT_ASSERT(i->info[block.block_index].piece_index == block.piece_index);
|
||||||
return i->info[block.block_index].state == block_info::state_finished;
|
return i->info[block.block_index].state == block_info::state_finished;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2088,6 +2103,7 @@ namespace libtorrent
|
||||||
downloading_piece& dp = add_download_piece(block.piece_index);
|
downloading_piece& dp = add_download_piece(block.piece_index);
|
||||||
dp.state = state;
|
dp.state = state;
|
||||||
block_info& info = dp.info[block.block_index];
|
block_info& info = dp.info[block.block_index];
|
||||||
|
TORRENT_ASSERT(info.piece_index == block.piece_index);
|
||||||
info.state = block_info::state_requested;
|
info.state = block_info::state_requested;
|
||||||
info.peer = peer;
|
info.peer = peer;
|
||||||
info.num_peers = 1;
|
info.num_peers = 1;
|
||||||
|
@ -2102,6 +2118,7 @@ namespace libtorrent
|
||||||
std::vector<downloading_piece>::iterator i = find_dl_piece(block.piece_index);
|
std::vector<downloading_piece>::iterator i = find_dl_piece(block.piece_index);
|
||||||
TORRENT_ASSERT(i != m_downloads.end());
|
TORRENT_ASSERT(i != m_downloads.end());
|
||||||
block_info& info = i->info[block.block_index];
|
block_info& info = i->info[block.block_index];
|
||||||
|
TORRENT_ASSERT(info.piece_index == block.piece_index);
|
||||||
if (info.state == block_info::state_writing
|
if (info.state == block_info::state_writing
|
||||||
|| info.state == block_info::state_finished)
|
|| info.state == block_info::state_finished)
|
||||||
return false;
|
return false;
|
||||||
|
@ -2135,6 +2152,7 @@ namespace libtorrent
|
||||||
TORRENT_ASSERT(i != m_downloads.end());
|
TORRENT_ASSERT(i != m_downloads.end());
|
||||||
|
|
||||||
block_info const& info = i->info[block.block_index];
|
block_info const& info = i->info[block.block_index];
|
||||||
|
TORRENT_ASSERT(info.piece_index == block.piece_index);
|
||||||
return info.num_peers;
|
return info.num_peers;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2181,6 +2199,7 @@ namespace libtorrent
|
||||||
downloading_piece& dp = add_download_piece(block.piece_index);
|
downloading_piece& dp = add_download_piece(block.piece_index);
|
||||||
dp.state = none;
|
dp.state = none;
|
||||||
block_info& info = dp.info[block.block_index];
|
block_info& info = dp.info[block.block_index];
|
||||||
|
TORRENT_ASSERT(info.piece_index == block.piece_index);
|
||||||
info.state = block_info::state_writing;
|
info.state = block_info::state_writing;
|
||||||
info.peer = peer;
|
info.peer = peer;
|
||||||
info.num_peers = 0;
|
info.num_peers = 0;
|
||||||
|
@ -2194,6 +2213,8 @@ namespace libtorrent
|
||||||
TORRENT_ASSERT(i != m_downloads.end());
|
TORRENT_ASSERT(i != m_downloads.end());
|
||||||
block_info& info = i->info[block.block_index];
|
block_info& info = i->info[block.block_index];
|
||||||
|
|
||||||
|
TORRENT_ASSERT(info.piece_index == block.piece_index);
|
||||||
|
|
||||||
info.peer = peer;
|
info.peer = peer;
|
||||||
if (info.state == block_info::state_requested) --i->requested;
|
if (info.state == block_info::state_requested) --i->requested;
|
||||||
TORRENT_ASSERT(i->requested >= 0);
|
TORRENT_ASSERT(i->requested >= 0);
|
||||||
|
@ -2203,6 +2224,7 @@ namespace libtorrent
|
||||||
|
|
||||||
++i->writing;
|
++i->writing;
|
||||||
info.state = block_info::state_writing;
|
info.state = block_info::state_writing;
|
||||||
|
TORRENT_ASSERT(info.piece_index == block.piece_index);
|
||||||
|
|
||||||
// all other requests for this block should have been
|
// all other requests for this block should have been
|
||||||
// cancelled now
|
// cancelled now
|
||||||
|
@ -2228,6 +2250,7 @@ namespace libtorrent
|
||||||
if (i == m_downloads.end()) return;
|
if (i == m_downloads.end()) return;
|
||||||
|
|
||||||
block_info& info = i->info[block.block_index];
|
block_info& info = i->info[block.block_index];
|
||||||
|
TORRENT_ASSERT(info.piece_index == block.piece_index);
|
||||||
TORRENT_ASSERT(info.state == block_info::state_writing);
|
TORRENT_ASSERT(info.state == block_info::state_writing);
|
||||||
TORRENT_ASSERT(info.num_peers == 0);
|
TORRENT_ASSERT(info.num_peers == 0);
|
||||||
|
|
||||||
|
@ -2289,6 +2312,7 @@ namespace libtorrent
|
||||||
downloading_piece& dp = add_download_piece(block.piece_index);
|
downloading_piece& dp = add_download_piece(block.piece_index);
|
||||||
dp.state = none;
|
dp.state = none;
|
||||||
block_info& info = dp.info[block.block_index];
|
block_info& info = dp.info[block.block_index];
|
||||||
|
TORRENT_ASSERT(info.piece_index == block.piece_index);
|
||||||
info.peer = peer;
|
info.peer = peer;
|
||||||
TORRENT_ASSERT(info.state == block_info::state_none);
|
TORRENT_ASSERT(info.state == block_info::state_none);
|
||||||
TORRENT_ASSERT(info.num_peers == 0);
|
TORRENT_ASSERT(info.num_peers == 0);
|
||||||
|
@ -2308,6 +2332,7 @@ namespace libtorrent
|
||||||
std::vector<downloading_piece>::iterator i = find_dl_piece(block.piece_index);
|
std::vector<downloading_piece>::iterator i = find_dl_piece(block.piece_index);
|
||||||
TORRENT_ASSERT(i != m_downloads.end());
|
TORRENT_ASSERT(i != m_downloads.end());
|
||||||
block_info& info = i->info[block.block_index];
|
block_info& info = i->info[block.block_index];
|
||||||
|
TORRENT_ASSERT(info.piece_index == block.piece_index);
|
||||||
|
|
||||||
if (info.state == block_info::state_finished) return;
|
if (info.state == block_info::state_finished) return;
|
||||||
|
|
||||||
|
@ -2352,6 +2377,7 @@ namespace libtorrent
|
||||||
|
|
||||||
TORRENT_ASSERT(block.block_index >= 0);
|
TORRENT_ASSERT(block.block_index >= 0);
|
||||||
|
|
||||||
|
TORRENT_ASSERT(i->info[block.block_index].piece_index == block.piece_index);
|
||||||
if (i->info[block.block_index].state == block_info::state_none)
|
if (i->info[block.block_index].state == block_info::state_none)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -2381,6 +2407,7 @@ namespace libtorrent
|
||||||
TORRENT_ASSERT(i != m_downloads.end());
|
TORRENT_ASSERT(i != m_downloads.end());
|
||||||
|
|
||||||
block_info& info = i->info[block.block_index];
|
block_info& info = i->info[block.block_index];
|
||||||
|
TORRENT_ASSERT(info.piece_index == block.piece_index);
|
||||||
|
|
||||||
TORRENT_ASSERT(info.state != block_info::state_none);
|
TORRENT_ASSERT(info.state != block_info::state_none);
|
||||||
|
|
||||||
|
|
|
@ -4503,6 +4503,14 @@ namespace libtorrent
|
||||||
|
|
||||||
if (m_ses.is_aborted()) return;
|
if (m_ses.is_aborted()) return;
|
||||||
|
|
||||||
|
#ifndef TORRENT_DISABLE_GEO_IP
|
||||||
|
int as = m_ses.as_for_ip(host->endpoint().address());
|
||||||
|
#ifdef TORRENT_DEBUG
|
||||||
|
web->peer_info.inet_as_num = as;
|
||||||
|
#endif
|
||||||
|
web->peer_info.inet_as = m_ses.lookup_as(as);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (int(m_connections.size()) >= m_max_connections
|
if (int(m_connections.size()) >= m_max_connections
|
||||||
|| m_ses.num_connections() >= m_ses.settings().connections_limit)
|
|| m_ses.num_connections() >= m_ses.settings().connections_limit)
|
||||||
return;
|
return;
|
||||||
|
@ -5351,6 +5359,7 @@ namespace libtorrent
|
||||||
i != end(); ++i)
|
i != end(); ++i)
|
||||||
{
|
{
|
||||||
peer_connection* peer = *i;
|
peer_connection* peer = *i;
|
||||||
|
TORRENT_ASSERT(peer->m_in_use == 1337);
|
||||||
|
|
||||||
// incoming peers that haven't finished the handshake should
|
// incoming peers that haven't finished the handshake should
|
||||||
// not be included in this list
|
// not be included in this list
|
||||||
|
|
Loading…
Reference in New Issue