sync to lt 1293

This commit is contained in:
Marcos Pinto 2007-05-26 23:32:19 +00:00
parent 8e7e46c856
commit 6d515c8f39
5 changed files with 62 additions and 65 deletions

View File

@ -101,6 +101,7 @@ namespace libtorrent
, ignore_limits_on_local_network(true) , ignore_limits_on_local_network(true)
, connection_speed(20) , connection_speed(20)
, send_redundant_have(false) , send_redundant_have(false)
, lazy_bitfields(true)
#ifndef TORRENT_DISABLE_DHT #ifndef TORRENT_DISABLE_DHT
, use_dht_as_fallback(true) , use_dht_as_fallback(true)
#endif #endif
@ -219,6 +220,12 @@ namespace libtorrent
// for collecting statistics in some cases. Default is false. // for collecting statistics in some cases. Default is false.
bool send_redundant_have; bool send_redundant_have;
// if this is true, outgoing bitfields will never be fuil. If the
// client is seed, a few bits will be set to 0, and later filled
// in with have messages. This is to prevent certain ISPs
// from stopping people from seeding.
bool lazy_bitfields;
#ifndef TORRENT_DISABLE_DHT #ifndef TORRENT_DISABLE_DHT
// while this is true, the dht will note be used unless the // while this is true, the dht will note be used unless the
// tracker is online // tracker is online

View File

@ -730,16 +730,6 @@ namespace libtorrent
// total_done - m_initial_done <= total_payload_download // total_done - m_initial_done <= total_payload_download
size_type m_initial_done; size_type m_initial_done;
#endif #endif
#ifdef TORRENT_LOGGING
boost::shared_ptr<logger> m_log;
boost::shared_ptr<logger> m_peer_log;
int m_second_count;
enum { debug_bw_history_size = 10 };
int m_ul_history[debug_bw_history_size];
int m_dl_history[debug_bw_history_size];
#endif
}; };
inline ptime torrent::next_announce() const inline ptime torrent::next_announce() const

View File

@ -775,19 +775,46 @@ namespace libtorrent
assert(m_sent_bitfield == false); assert(m_sent_bitfield == false);
assert(t->valid_metadata()); assert(t->valid_metadata());
int num_pieces = bitfield.size();
int lazy_pieces[50];
int num_lazy_pieces = 0;
int lazy_piece = 0;
assert(t->is_seed() == (std::count(bitfield.begin(), bitfield.end(), true) == num_pieces));
if (t->is_seed() && m_ses.settings().lazy_bitfields)
{
num_lazy_pieces = std::min(50, num_pieces / 10);
if (num_lazy_pieces < 1) num_lazy_pieces = 1;
for (int i = 0; i < num_pieces; ++i)
{
if (rand() % (num_pieces - i) >= num_lazy_pieces - lazy_piece) continue;
lazy_pieces[lazy_piece++] = i;
}
assert(lazy_piece == num_lazy_pieces);
lazy_piece = 0;
}
#ifdef TORRENT_VERBOSE_LOGGING #ifdef TORRENT_VERBOSE_LOGGING
(*m_logger) << time_now_string() << " ==> BITFIELD "; (*m_logger) << time_now_string() << " ==> BITFIELD ";
std::stringstream bitfield_string; std::stringstream bitfield_string;
for (int i = 0; i < (int)get_bitfield().size(); ++i) for (int i = 0; i < (int)get_bitfield().size(); ++i)
{ {
if (lazy_piece < num_lazy_pieces
&& lazy_pieces[lazy_piece] == i)
{
bitfield_string << "0";
++lazy_piece;
continue;
}
if (bitfield[i]) bitfield_string << "1"; if (bitfield[i]) bitfield_string << "1";
else bitfield_string << "0"; else bitfield_string << "0";
} }
bitfield_string << "\n"; bitfield_string << "\n";
(*m_logger) << bitfield_string.str(); (*m_logger) << bitfield_string.str();
lazy_piece = 0;
#endif #endif
const int packet_size = ((int)bitfield.size() + 7) / 8 + 5; const int packet_size = (num_pieces + 7) / 8 + 5;
buffer::interval i = allocate_send_buffer(packet_size); buffer::interval i = allocate_send_buffer(packet_size);
@ -795,12 +822,31 @@ namespace libtorrent
detail::write_uint8(msg_bitfield, i.begin); detail::write_uint8(msg_bitfield, i.begin);
std::fill(i.begin, i.end, 0); std::fill(i.begin, i.end, 0);
for (int c = 0; c < (int)bitfield.size(); ++c) for (int c = 0; c < num_pieces; ++c)
{ {
if (lazy_piece < num_lazy_pieces
&& lazy_pieces[lazy_piece])
{
++lazy_piece;
continue;
}
if (bitfield[c]) if (bitfield[c])
i.begin[c >> 3] |= 1 << (7 - (c & 7)); i.begin[c >> 3] |= 1 << (7 - (c & 7));
} }
assert(i.end - i.begin == ((int)bitfield.size() + 7) / 8); assert(i.end - i.begin == (num_pieces + 7) / 8);
if (num_lazy_pieces > 0)
{
for (int i = 0; i < num_lazy_pieces; ++i)
{
write_have(lazy_pieces[i]);
#ifdef TORRENT_VERBOSE_LOGGING
(*m_logger) << time_now_string()
<< " ==> HAVE [ piece: " << lazy_pieces[i] << "]\n";
#endif
}
}
#ifndef NDEBUG #ifndef NDEBUG
m_sent_bitfield = true; m_sent_bitfield = true;
#endif #endif

View File

@ -2581,6 +2581,10 @@ namespace libtorrent
d = time_now() - m_last_receive; d = time_now() - m_last_receive;
if (d > seconds(m_timeout)) return true; if (d > seconds(m_timeout)) return true;
// TODO: as long as we have less than 95% of the
// global (or local) connection limit, connections should
// never time out for another reason
// if the peer hasn't become interested and we haven't // if the peer hasn't become interested and we haven't
// become interested in the peer for 10 minutes, it // become interested in the peer for 10 minutes, it
// has also timed out. // has also timed out.
@ -2636,7 +2640,7 @@ namespace libtorrent
bool peer_connection::is_seed() const bool peer_connection::is_seed() const
{ {
INVARIANT_CHECK; INVARIANT_CHECK;
// if m_num_pieces == 0, we probably doesn't have the // if m_num_pieces == 0, we probably don't have the
// metadata yet. // metadata yet.
return m_num_pieces == (int)m_have_piece.size() && m_num_pieces > 0; return m_num_pieces == (int)m_have_piece.size() && m_num_pieces > 0;
} }

View File

@ -143,33 +143,6 @@ namespace
peer_id const& pid; peer_id const& pid;
}; };
#ifdef TORRENT_LOGGING
void print_legend(boost::shared_ptr<logger> l)
{
(*l) << "1. time, seconds\n"
<< "2. hard send quota, bytes\n"
<< "3. soft send quota, bytes\n"
<< "4. excess bytes sent\n"
<< "5. excess bytes sent last time slice\n"
<< "6. hard receive quota, bytes\n"
<< "7. soft receive quota, bytes\n"
<< "8. excess bytes received\n"
<< "9. excess bytes received last time slice\n"
<< "10. num peers\n"
<< "11. max ul quota limit\n"
<< "12. max dl quota limit\n"
<< "13. bytes sent\n"
<< "14. bytes sent 10 seconds mean\n"
<< "15. bytes received\n"
<< "16. bytes received 10 seconds mean\n"
<< "17. total payload download\n"
<< "18. total web seed payload download\n"
<< "19. total redundant bytes downloaded\n"
<< "\n";
}
#endif
} }
namespace libtorrent namespace libtorrent
@ -228,20 +201,7 @@ namespace libtorrent
#ifndef NDEBUG #ifndef NDEBUG
m_initial_done = 0; m_initial_done = 0;
#endif #endif
#ifdef TORRENT_LOGGING
m_log = ses.create_log("torrent_"
+ boost::lexical_cast<std::string>(tf.info_hash())
, m_ses.listen_port(), false);
print_legend(m_log);
m_second_count = 0;
std::fill_n(m_ul_history, 10, 0);
std::fill_n(m_dl_history, 10, 0);
m_peer_log = ses.create_log("torrent_peers_"
+ boost::lexical_cast<std::string>(tf.info_hash())
, m_ses.listen_port(), false);
#endif
INVARIANT_CHECK; INVARIANT_CHECK;
m_uploads_quota.min = 2; m_uploads_quota.min = 2;
@ -312,16 +272,6 @@ namespace libtorrent
m_initial_done = 0; m_initial_done = 0;
#endif #endif
#ifdef TORRENT_LOGGING
m_log = ses.create_log("torrent_"
+ boost::lexical_cast<std::string>(info_hash)
, m_ses.listen_port(), true);
print_legend(m_log);
m_second_count = 0;
std::fill_n(m_ul_history, 10, 0);
std::fill_n(m_dl_history, 10, 0);
#endif
INVARIANT_CHECK; INVARIANT_CHECK;
if (name) m_name.reset(new std::string(name)); if (name) m_name.reset(new std::string(name));
@ -903,8 +853,8 @@ namespace libtorrent
, end(peers.end()); i != end; ++i) , end(peers.end()); i != end; ++i)
{ {
peer_iterator p = m_connections.find(*i); peer_iterator p = m_connections.find(*i);
peer_connection& peer = *p->second;
if (p == m_connections.end()) continue; if (p == m_connections.end()) continue;
peer_connection& peer = *p->second;
peer.received_invalid_data(index); peer.received_invalid_data(index);
// either, we have received too many failed hashes // either, we have received too many failed hashes