added some asserts to track down issue with peer counter in busy piece picker requests
This commit is contained in:
parent
dce2edb6cc
commit
c0635f0391
|
@ -1180,6 +1180,7 @@ namespace libtorrent
|
||||||
#endif
|
#endif
|
||||||
m_peer_choked = true;
|
m_peer_choked = true;
|
||||||
|
|
||||||
|
// clear the requests that haven't been sent yet
|
||||||
if (peer_info_struct() == 0 || !peer_info_struct()->on_parole)
|
if (peer_info_struct() == 0 || !peer_info_struct()->on_parole)
|
||||||
{
|
{
|
||||||
// if the peer is not in parole mode, clear the queued
|
// if the peer is not in parole mode, clear the queued
|
||||||
|
@ -1196,6 +1197,7 @@ namespace libtorrent
|
||||||
m_request_queue.clear();
|
m_request_queue.clear();
|
||||||
m_queued_time_critical = 0;
|
m_queued_time_critical = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool match_request(peer_request const& r, piece_block const& b, int block_size)
|
bool match_request(peer_request const& r, piece_block const& b, int block_size)
|
||||||
|
@ -2276,13 +2278,13 @@ namespace libtorrent
|
||||||
if (!qe.timed_out && !qe.not_wanted)
|
if (!qe.timed_out && !qe.not_wanted)
|
||||||
picker.abort_download(qe.block);
|
picker.abort_download(qe.block);
|
||||||
|
|
||||||
|
TORRENT_ASSERT(m_outstanding_bytes >= t->to_req(qe.block).length);
|
||||||
|
m_outstanding_bytes -= t->to_req(qe.block).length;
|
||||||
|
if (m_outstanding_bytes < 0) m_outstanding_bytes = 0;
|
||||||
TORRENT_ASSERT(m_download_queue[block_index] == pending_b);
|
TORRENT_ASSERT(m_download_queue[block_index] == pending_b);
|
||||||
m_download_queue.erase(m_download_queue.begin() + i);
|
m_download_queue.erase(m_download_queue.begin() + i);
|
||||||
--i;
|
--i;
|
||||||
--block_index;
|
--block_index;
|
||||||
TORRENT_ASSERT(m_outstanding_bytes >= t->block_size());
|
|
||||||
m_outstanding_bytes -= t->block_size();
|
|
||||||
if (m_outstanding_bytes < 0) m_outstanding_bytes = 0;
|
|
||||||
TORRENT_ASSERT(m_download_queue[block_index] == pending_b);
|
TORRENT_ASSERT(m_download_queue[block_index] == pending_b);
|
||||||
#if !defined TORRENT_DISABLE_INVARIANT_CHECKS && defined TORRENT_DEBUG
|
#if !defined TORRENT_DISABLE_INVARIANT_CHECKS && defined TORRENT_DEBUG
|
||||||
check_invariant();
|
check_invariant();
|
||||||
|
@ -3229,6 +3231,8 @@ namespace libtorrent
|
||||||
{
|
{
|
||||||
pending_block& qe = m_download_queue.back();
|
pending_block& qe = m_download_queue.back();
|
||||||
if (!qe.timed_out && !qe.not_wanted) picker.abort_download(qe.block);
|
if (!qe.timed_out && !qe.not_wanted) picker.abort_download(qe.block);
|
||||||
|
m_outstanding_bytes -= t->to_req(qe.block).length;
|
||||||
|
if (m_outstanding_bytes < 0) m_outstanding_bytes = 0;
|
||||||
m_download_queue.pop_back();
|
m_download_queue.pop_back();
|
||||||
}
|
}
|
||||||
while (!m_request_queue.empty())
|
while (!m_request_queue.empty())
|
||||||
|
@ -3239,6 +3243,9 @@ namespace libtorrent
|
||||||
}
|
}
|
||||||
m_queued_time_critical = 0;
|
m_queued_time_critical = 0;
|
||||||
|
|
||||||
|
#if !defined TORRENT_DISABLE_INVARIANT_CHECKS && defined TORRENT_DEBUG
|
||||||
|
check_invariant();
|
||||||
|
#endif
|
||||||
t->remove_peer(this);
|
t->remove_peer(this);
|
||||||
m_torrent.reset();
|
m_torrent.reset();
|
||||||
}
|
}
|
||||||
|
@ -4945,6 +4952,8 @@ namespace libtorrent
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef TORRENT_DEBUG
|
#ifdef TORRENT_DEBUG
|
||||||
|
struct peer_count_t { int num_peers; int num_peers_with_timeouts; };
|
||||||
|
|
||||||
void peer_connection::check_invariant() const
|
void peer_connection::check_invariant() const
|
||||||
{
|
{
|
||||||
TORRENT_ASSERT(m_queued_time_critical <= m_request_queue.size());
|
TORRENT_ASSERT(m_queued_time_critical <= m_request_queue.size());
|
||||||
|
@ -5061,7 +5070,7 @@ namespace libtorrent
|
||||||
|
|
||||||
if (t->has_picker())
|
if (t->has_picker())
|
||||||
{
|
{
|
||||||
std::map<piece_block, int> num_requests;
|
std::map<piece_block, peer_count_t> num_requests;
|
||||||
for (torrent::const_peer_iterator i = t->begin(); i != t->end(); ++i)
|
for (torrent::const_peer_iterator i = t->begin(); i != t->end(); ++i)
|
||||||
{
|
{
|
||||||
// make sure this peer is not a dangling pointer
|
// make sure this peer is not a dangling pointer
|
||||||
|
@ -5071,16 +5080,23 @@ namespace libtorrent
|
||||||
peer_connection const& p = *(*i);
|
peer_connection const& p = *(*i);
|
||||||
for (std::vector<pending_block>::const_iterator i = p.request_queue().begin()
|
for (std::vector<pending_block>::const_iterator i = p.request_queue().begin()
|
||||||
, end(p.request_queue().end()); i != end; ++i)
|
, end(p.request_queue().end()); i != end; ++i)
|
||||||
++num_requests[i->block];
|
{
|
||||||
|
++num_requests[i->block].num_peers;
|
||||||
|
++num_requests[i->block].num_peers_with_timeouts;
|
||||||
|
}
|
||||||
for (std::vector<pending_block>::const_iterator i = p.download_queue().begin()
|
for (std::vector<pending_block>::const_iterator i = p.download_queue().begin()
|
||||||
, end(p.download_queue().end()); i != end; ++i)
|
, end(p.download_queue().end()); i != end; ++i)
|
||||||
if (!i->not_wanted && !i->timed_out) ++num_requests[i->block];
|
{
|
||||||
|
if (!i->not_wanted && !i->timed_out) ++num_requests[i->block].num_peers;
|
||||||
|
++num_requests[i->block].num_peers_with_timeouts;
|
||||||
}
|
}
|
||||||
for (std::map<piece_block, int>::iterator i = num_requests.begin()
|
}
|
||||||
|
for (std::map<piece_block, peer_count_t>::iterator i = num_requests.begin()
|
||||||
, end(num_requests.end()); i != end; ++i)
|
, end(num_requests.end()); i != end; ++i)
|
||||||
{
|
{
|
||||||
piece_block b = i->first;
|
piece_block b = i->first;
|
||||||
int count = i->second;
|
int count = i->second.num_peers;
|
||||||
|
int count_with_timeouts = i->second.num_peers_with_timeouts;
|
||||||
int picker_count = t->picker().num_peers(b);
|
int picker_count = t->picker().num_peers(b);
|
||||||
if (!t->picker().is_downloaded(b))
|
if (!t->picker().is_downloaded(b))
|
||||||
TORRENT_ASSERT(picker_count == count);
|
TORRENT_ASSERT(picker_count == count);
|
||||||
|
|
|
@ -302,7 +302,7 @@ namespace libtorrent
|
||||||
ptime last_request = p.last_request(i->piece_index);
|
ptime last_request = p.last_request(i->piece_index);
|
||||||
ptime now = time_now();
|
ptime now = time_now();
|
||||||
|
|
||||||
// don't re-request from a piece more often than once every 20 seconds
|
// don't re-request from a piece more often than once every 5 seconds
|
||||||
// TODO: make configurable
|
// TODO: make configurable
|
||||||
if (now - last_request < seconds(5))
|
if (now - last_request < seconds(5))
|
||||||
return;
|
return;
|
||||||
|
|
Loading…
Reference in New Issue