added assertions that the stats is updated properly when receiving and sending bytes on peer_connections

This commit is contained in:
Arvid Norberg 2008-09-21 17:12:26 +00:00
parent 8ffc345308
commit 13b343c1af
3 changed files with 99 additions and 11 deletions

View File

@ -253,6 +253,10 @@ namespace libtorrent
{ return m_stat[download_payload].counter(); } { return m_stat[download_payload].counter(); }
size_type last_payload_uploaded() const size_type last_payload_uploaded() const
{ return m_stat[upload_payload].counter(); } { return m_stat[upload_payload].counter(); }
size_type last_protocol_downloaded() const
{ return m_stat[download_protocol].counter(); }
size_type last_protocol_uploaded() const
{ return m_stat[upload_protocol].counter(); }
// these are the channels we keep stats for // these are the channels we keep stats for
enum enum

View File

@ -1364,8 +1364,19 @@ namespace libtorrent
TORRENT_ASSERT(m_message_handler[packet_type] != 0); TORRENT_ASSERT(m_message_handler[packet_type] != 0);
#ifndef NDEBUG
size_type cur_payload_dl = m_statistics.last_payload_downloaded();
size_type cur_protocol_dl = m_statistics.last_protocol_downloaded();
#endif
// call the correct handler for this packet type // call the correct handler for this packet type
(this->*m_message_handler[packet_type])(received); (this->*m_message_handler[packet_type])(received);
#ifndef NDEBUG
TORRENT_ASSERT(m_statistics.last_payload_downloaded() - cur_payload_dl >= 0);
TORRENT_ASSERT(m_statistics.last_protocol_downloaded() - cur_protocol_dl >= 0);
size_type stats_diff = m_statistics.last_payload_downloaded() - cur_payload_dl +
m_statistics.last_protocol_downloaded() - cur_protocol_dl;
TORRENT_ASSERT(stats_diff == received);
#endif
return packet_finished(); return packet_finished();
} }
@ -1728,11 +1739,13 @@ namespace libtorrent
{ {
INVARIANT_CHECK; INVARIANT_CHECK;
if (error) return; if (error)
boost::shared_ptr<torrent> t = associated_torrent().lock(); {
if (in_handshake())
m_statistics.received_bytes(0, bytes_transferred); m_statistics.received_bytes(0, bytes_transferred);
return;
}
boost::shared_ptr<torrent> t = associated_torrent().lock();
#ifndef TORRENT_DISABLE_ENCRYPTION #ifndef TORRENT_DISABLE_ENCRYPTION
TORRENT_ASSERT(in_handshake() || !m_rc4_encrypted || m_encrypted); TORRENT_ASSERT(in_handshake() || !m_rc4_encrypted || m_encrypted);
@ -1752,6 +1765,8 @@ namespace libtorrent
// for outgoing // for outgoing
if (m_state == read_pe_dhkey) if (m_state == read_pe_dhkey)
{ {
m_statistics.received_bytes(0, bytes_transferred);
TORRENT_ASSERT(!m_encrypted); TORRENT_ASSERT(!m_encrypted);
TORRENT_ASSERT(!m_rc4_encrypted); TORRENT_ASSERT(!m_rc4_encrypted);
TORRENT_ASSERT(packet_size() == dh_key_len); TORRENT_ASSERT(packet_size() == dh_key_len);
@ -1821,6 +1836,8 @@ namespace libtorrent
if (recv_buffer.left() < 20) if (recv_buffer.left() < 20)
{ {
m_statistics.received_bytes(0, bytes_transferred);
if (packet_finished()) if (packet_finished())
disconnect("sync hash not found", 2); disconnect("sync hash not found", 2);
return; return;
@ -1844,6 +1861,8 @@ namespace libtorrent
// No sync // No sync
if (syncoffset == -1) if (syncoffset == -1)
{ {
m_statistics.received_bytes(0, bytes_transferred);
std::size_t bytes_processed = recv_buffer.left() - 20; std::size_t bytes_processed = recv_buffer.left() - 20;
m_sync_bytes_read += bytes_processed; m_sync_bytes_read += bytes_processed;
if (m_sync_bytes_read >= 512) if (m_sync_bytes_read >= 512)
@ -1869,12 +1888,18 @@ namespace libtorrent
m_state = read_pe_skey_vc; m_state = read_pe_skey_vc;
// skey,vc - 28 bytes // skey,vc - 28 bytes
m_sync_hash.reset(); m_sync_hash.reset();
int transferred_used = bytes_processed - recv_buffer.left() + bytes_transferred;
TORRENT_ASSERT(transferred_used <= int(bytes_transferred));
m_statistics.received_bytes(0, transferred_used);
bytes_transferred -= transferred_used;
cut_receive_buffer(bytes_processed, 28); cut_receive_buffer(bytes_processed, 28);
} }
} }
if (m_state == read_pe_skey_vc) if (m_state == read_pe_skey_vc)
{ {
m_statistics.received_bytes(0, bytes_transferred);
TORRENT_ASSERT(!m_encrypted); TORRENT_ASSERT(!m_encrypted);
TORRENT_ASSERT(!m_rc4_encrypted); TORRENT_ASSERT(!m_rc4_encrypted);
TORRENT_ASSERT(!is_local()); TORRENT_ASSERT(!is_local());
@ -1948,6 +1973,7 @@ namespace libtorrent
if (recv_buffer.left() < 8) if (recv_buffer.left() < 8)
{ {
m_statistics.received_bytes(0, bytes_transferred);
if (packet_finished()) if (packet_finished())
disconnect("sync verification constant not found", 2); disconnect("sync verification constant not found", 2);
return; return;
@ -1972,13 +1998,16 @@ namespace libtorrent
{ {
std::size_t bytes_processed = recv_buffer.left() - 8; std::size_t bytes_processed = recv_buffer.left() - 8;
m_sync_bytes_read += bytes_processed; m_sync_bytes_read += bytes_processed;
m_statistics.received_bytes(0, bytes_transferred);
if (m_sync_bytes_read >= 512) if (m_sync_bytes_read >= 512)
{ {
disconnect("sync verification constant not found within 520 bytes", 2); disconnect("sync verification constant not found within 520 bytes", 2);
return; return;
} }
cut_receive_buffer(bytes_processed, (std::min)(packet_size(), (512+8) - m_sync_bytes_read)); cut_receive_buffer(bytes_processed, (std::min)(packet_size()
, (512+8) - m_sync_bytes_read));
TORRENT_ASSERT(!packet_finished()); TORRENT_ASSERT(!packet_finished());
return; return;
@ -1991,6 +2020,11 @@ namespace libtorrent
(*m_logger) << " sync point (verification constant) found at offset " (*m_logger) << " sync point (verification constant) found at offset "
<< m_sync_bytes_read + bytes_processed - 8 << "\n"; << m_sync_bytes_read + bytes_processed - 8 << "\n";
#endif #endif
int transferred_used = bytes_processed - recv_buffer.left() + bytes_transferred;
TORRENT_ASSERT(transferred_used <= int(bytes_transferred));
m_statistics.received_bytes(0, transferred_used);
bytes_transferred -= transferred_used;
cut_receive_buffer(bytes_processed, 4 + 2); cut_receive_buffer(bytes_processed, 4 + 2);
// delete verification constant // delete verification constant
@ -2005,6 +2039,8 @@ namespace libtorrent
TORRENT_ASSERT(!m_encrypted); TORRENT_ASSERT(!m_encrypted);
TORRENT_ASSERT(!m_rc4_encrypted); TORRENT_ASSERT(!m_rc4_encrypted);
TORRENT_ASSERT(packet_size() == 4+2); TORRENT_ASSERT(packet_size() == 4+2);
m_statistics.received_bytes(0, bytes_transferred);
bytes_transferred = 0;
if (!packet_finished()) return; if (!packet_finished()) return;
@ -2131,6 +2167,8 @@ namespace libtorrent
if (m_state == read_pe_pad) if (m_state == read_pe_pad)
{ {
TORRENT_ASSERT(!m_encrypted); TORRENT_ASSERT(!m_encrypted);
m_statistics.received_bytes(0, bytes_transferred);
bytes_transferred = 0;
if (!packet_finished()) return; if (!packet_finished()) return;
int pad_size = is_local() ? packet_size() : packet_size() - 2; int pad_size = is_local() ? packet_size() : packet_size() - 2;
@ -2176,6 +2214,7 @@ namespace libtorrent
if (m_state == read_pe_ia) if (m_state == read_pe_ia)
{ {
m_statistics.received_bytes(0, bytes_transferred);
TORRENT_ASSERT(!is_local()); TORRENT_ASSERT(!is_local());
TORRENT_ASSERT(!m_encrypted); TORRENT_ASSERT(!m_encrypted);
@ -2206,6 +2245,8 @@ namespace libtorrent
if (m_state == init_bt_handshake) if (m_state == init_bt_handshake)
{ {
m_statistics.received_bytes(0, bytes_transferred);
bytes_transferred = 0;
TORRENT_ASSERT(m_encrypted); TORRENT_ASSERT(m_encrypted);
// decrypt remaining received bytes // decrypt remaining received bytes
@ -2246,6 +2287,8 @@ namespace libtorrent
if (m_state == read_protocol_identifier) if (m_state == read_protocol_identifier)
{ {
m_statistics.received_bytes(0, bytes_transferred);
bytes_transferred = 0;
TORRENT_ASSERT(packet_size() == 20); TORRENT_ASSERT(packet_size() == 20);
if (!packet_finished()) return; if (!packet_finished()) return;
@ -2306,6 +2349,8 @@ namespace libtorrent
// fall through // fall through
if (m_state == read_info_hash) if (m_state == read_info_hash)
{ {
m_statistics.received_bytes(0, bytes_transferred);
bytes_transferred = 0;
TORRENT_ASSERT(packet_size() == 28); TORRENT_ASSERT(packet_size() == 28);
if (!packet_finished()) return; if (!packet_finished()) return;
@ -2392,6 +2437,8 @@ namespace libtorrent
// fall through // fall through
if (m_state == read_peer_id) if (m_state == read_peer_id)
{ {
m_statistics.received_bytes(0, bytes_transferred);
bytes_transferred = 0;
if (!t) if (!t)
{ {
TORRENT_ASSERT(!packet_finished()); // TODO TORRENT_ASSERT(!packet_finished()); // TODO
@ -2529,11 +2576,19 @@ namespace libtorrent
{ {
// Make sure this is not fallen though into // Make sure this is not fallen though into
TORRENT_ASSERT(recv_buffer == receive_buffer()); TORRENT_ASSERT(recv_buffer == receive_buffer());
TORRENT_ASSERT(packet_size() == 5);
if (!t) return; if (!t) return;
m_statistics.received_bytes(0, bytes_transferred);
if (recv_buffer.left() < 4) return; if (recv_buffer.left() < 4)
{
m_statistics.received_bytes(0, bytes_transferred);
return;
}
int transferred_used = 4 - recv_buffer.left() + bytes_transferred;
TORRENT_ASSERT(transferred_used <= int(bytes_transferred));
m_statistics.received_bytes(0, transferred_used);
bytes_transferred -= transferred_used;
const char* ptr = recv_buffer.begin; const char* ptr = recv_buffer.begin;
int packet_size = detail::read_int32(ptr); int packet_size = detail::read_int32(ptr);
@ -2541,6 +2596,7 @@ namespace libtorrent
// don't accept packets larger than 1 MB // don't accept packets larger than 1 MB
if (packet_size > 1024*1024 || packet_size < 0) if (packet_size > 1024*1024 || packet_size < 0)
{ {
m_statistics.received_bytes(0, bytes_transferred);
// packet too large // packet too large
std::stringstream msg; std::stringstream msg;
msg << "packet > 1 MB (" << (unsigned int)packet_size << " bytes)"; msg << "packet > 1 MB (" << (unsigned int)packet_size << " bytes)";
@ -2550,11 +2606,12 @@ namespace libtorrent
if (packet_size == 0) if (packet_size == 0)
{ {
m_statistics.received_bytes(0, bytes_transferred);
incoming_keepalive(); incoming_keepalive();
if (is_disconnecting()) return; if (is_disconnecting()) return;
// keepalive message // keepalive message
m_state = read_packet_size; m_state = read_packet_size;
cut_receive_buffer(4, 4); cut_receive_buffer(4, 5);
return; return;
} }
else else
@ -2563,7 +2620,7 @@ namespace libtorrent
m_state = read_packet; m_state = read_packet;
cut_receive_buffer(4, packet_size); cut_receive_buffer(4, packet_size);
bytes_transferred = 1; TORRENT_ASSERT(bytes_transferred == 1);
recv_buffer = receive_buffer(); recv_buffer = receive_buffer();
TORRENT_ASSERT(recv_buffer.left() == 1); TORRENT_ASSERT(recv_buffer.left() == 1);
} }
@ -2594,7 +2651,11 @@ namespace libtorrent
{ {
INVARIANT_CHECK; INVARIANT_CHECK;
if (error) return; if (error)
{
m_statistics.sent_bytes(0, bytes_transferred);
return;
}
// manage the payload markers // manage the payload markers
int amount_payload = 0; int amount_payload = 0;

View File

@ -3498,7 +3498,18 @@ namespace libtorrent
TORRENT_ASSERT(m_recv_pos <= int(m_recv_buffer.size() TORRENT_ASSERT(m_recv_pos <= int(m_recv_buffer.size()
+ m_disk_recv_buffer_size)); + m_disk_recv_buffer_size));
#ifndef NDEBUG
size_type cur_payload_dl = m_statistics.last_payload_downloaded();
size_type cur_protocol_dl = m_statistics.last_protocol_downloaded();
#endif
on_receive(error, bytes_transferred); on_receive(error, bytes_transferred);
#ifndef NDEBUG
TORRENT_ASSERT(m_statistics.last_payload_downloaded() - cur_payload_dl >= 0);
TORRENT_ASSERT(m_statistics.last_protocol_downloaded() - cur_protocol_dl >= 0);
size_type stats_diff = m_statistics.last_payload_downloaded() - cur_payload_dl +
m_statistics.last_protocol_downloaded() - cur_protocol_dl;
TORRENT_ASSERT(stats_diff == bytes_transferred);
#endif
TORRENT_ASSERT(m_packet_size > 0); TORRENT_ASSERT(m_packet_size > 0);
@ -3746,7 +3757,19 @@ namespace libtorrent
m_last_sent = time_now(); m_last_sent = time_now();
#ifndef NDEBUG
size_type cur_payload_ul = m_statistics.last_payload_uploaded();
size_type cur_protocol_ul = m_statistics.last_protocol_uploaded();
#endif
on_sent(error, bytes_transferred); on_sent(error, bytes_transferred);
#ifndef NDEBUG
TORRENT_ASSERT(m_statistics.last_payload_uploaded() - cur_payload_ul >= 0);
TORRENT_ASSERT(m_statistics.last_protocol_uploaded() - cur_protocol_ul >= 0);
size_type stats_diff = m_statistics.last_payload_uploaded() - cur_payload_ul
+ m_statistics.last_protocol_uploaded() - cur_protocol_ul;
TORRENT_ASSERT(stats_diff == bytes_transferred);
#endif
fill_send_buffer(); fill_send_buffer();
setup_send(); setup_send();