update interest when changing upload-only mode

This commit is contained in:
arvidn 2015-06-16 01:24:35 -04:00
parent 75fa65f922
commit 323af56cc2
4 changed files with 16 additions and 11 deletions

View File

@ -389,7 +389,7 @@ namespace libtorrent
// this adds an announcement in the announcement queue // this adds an announcement in the announcement queue
// it will let the peer know that we have the given piece // it will let the peer know that we have the given piece
void announce_piece(int index); void announce_piece(int index);
// this will tell the peer to announce the given piece // this will tell the peer to announce the given piece
// and only allow it to request that piece // and only allow it to request that piece
void superseed_piece(int replace_piece, int new_piece); void superseed_piece(int replace_piece, int new_piece);

View File

@ -140,7 +140,7 @@ namespace libtorrent
void bt_peer_connection::start() void bt_peer_connection::start()
{ {
peer_connection::start(); peer_connection::start();
// start in the state where we are trying to read the // start in the state where we are trying to read the
// handshake from the other side // handshake from the other side
m_recv_buffer.reset(20); m_recv_buffer.reset(20);
@ -185,7 +185,7 @@ namespace libtorrent
cork c_(*this); cork c_(*this);
#if !defined(TORRENT_DISABLE_ENCRYPTION) && !defined(TORRENT_DISABLE_EXTENSIONS) #if !defined(TORRENT_DISABLE_ENCRYPTION) && !defined(TORRENT_DISABLE_EXTENSIONS)
boost::uint8_t out_enc_policy = m_settings.get_int(settings_pack::out_enc_policy); boost::uint8_t out_enc_policy = m_settings.get_int(settings_pack::out_enc_policy);
#ifdef TORRENT_USE_OPENSSL #ifdef TORRENT_USE_OPENSSL
@ -245,14 +245,14 @@ namespace libtorrent
#endif #endif
{ {
write_handshake(); write_handshake();
// start in the state where we are trying to read the // start in the state where we are trying to read the
// handshake from the other side // handshake from the other side
m_recv_buffer.reset(20); m_recv_buffer.reset(20);
setup_receive(); setup_receive();
} }
} }
void bt_peer_connection::on_metadata() void bt_peer_connection::on_metadata()
{ {
#ifndef TORRENT_DISABLE_LOGGING #ifndef TORRENT_DISABLE_LOGGING
@ -489,10 +489,10 @@ namespace libtorrent
TORRENT_ASSERT(!m_rc4_encrypted); TORRENT_ASSERT(!m_rc4_encrypted);
TORRENT_ASSERT(is_outgoing()); TORRENT_ASSERT(is_outgoing());
TORRENT_ASSERT(!m_sent_handshake); TORRENT_ASSERT(!m_sent_handshake);
boost::shared_ptr<torrent> t = associated_torrent().lock(); boost::shared_ptr<torrent> t = associated_torrent().lock();
TORRENT_ASSERT(t); TORRENT_ASSERT(t);
hasher h; hasher h;
sha1_hash const& info_hash = t->torrent_file().info_hash(); sha1_hash const& info_hash = t->torrent_file().info_hash();
char const* const secret = m_dh_key_exchange->get_secret(); char const* const secret = m_dh_key_exchange->get_secret();
@ -1083,7 +1083,7 @@ namespace libtorrent
bitfield bits; bitfield bits;
bits.assign((char*)recv_buffer.begin + 1 bits.assign((char*)recv_buffer.begin + 1
, t->valid_metadata()?get_bitfield().size():(m_recv_buffer.packet_size()-1)*8); , t->valid_metadata()?get_bitfield().size():(m_recv_buffer.packet_size()-1)*8);
incoming_bitfield(bits); incoming_bitfield(bits);
} }
@ -1124,7 +1124,7 @@ namespace libtorrent
INVARIANT_CHECK; INVARIANT_CHECK;
TORRENT_ASSERT(received >= 0); TORRENT_ASSERT(received >= 0);
buffer::const_interval recv_buffer = m_recv_buffer.get(); buffer::const_interval recv_buffer = m_recv_buffer.get();
int recv_pos = m_recv_buffer.pos(); // recv_buffer.end - recv_buffer.begin; int recv_pos = m_recv_buffer.pos(); // recv_buffer.end - recv_buffer.begin;
@ -1374,7 +1374,7 @@ namespace libtorrent
const char* ptr = recv_buffer.begin + 1; const char* ptr = recv_buffer.begin + 1;
int listen_port = detail::read_uint16(ptr); int listen_port = detail::read_uint16(ptr);
incoming_dht_port(listen_port); incoming_dht_port(listen_port);
if (!m_supports_dht_port) if (!m_supports_dht_port)

View File

@ -2082,7 +2082,7 @@ namespace libtorrent
if (t && t->has_picker()) if (t && t->has_picker())
t->picker().check_peer_invariant(m_have_piece, this); t->picker().check_peer_invariant(m_have_piece, this);
#endif #endif
// this will cause us to send the INTERESTED message // this will cause us to send the INTERESTED message
if (!t->is_upload_only()) if (!t->is_upload_only())
t->peer_is_interesting(*this); t->peer_is_interesting(*this);

View File

@ -1057,6 +1057,9 @@ namespace libtorrent
, end(m_connections.end()); i != end; ++i) , end(m_connections.end()); i != end; ++i)
{ {
peer_connection* p = (*i); peer_connection* p = (*i);
// we may want to disconnect other upload-only peers
if (p->upload_only())
p->update_interest();
p->cancel_all_requests(); p->cancel_all_requests();
} }
// this is used to try leaving upload only mode periodically // this is used to try leaving upload only mode periodically
@ -1076,6 +1079,8 @@ namespace libtorrent
, end(m_connections.end()); i != end; ++i) , end(m_connections.end()); i != end; ++i)
{ {
peer_connection* p = (*i); peer_connection* p = (*i);
// we may be interested now, or no longer interested
p->update_interest();
p->send_block_requests(); p->send_block_requests();
} }
} }