sync to lt 1293
This commit is contained in:
parent
8e7e46c856
commit
6d515c8f39
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue