merged close_redundant_connections fix from RC_0_16

This commit is contained in:
Arvid Norberg 2013-01-27 21:25:06 +00:00
parent a35c32bc51
commit bca1d62bbe
3 changed files with 23 additions and 13 deletions

View File

@ -10,6 +10,7 @@
* fix uTP edge case where udp socket buffer fills up * fix uTP edge case where udp socket buffer fills up
* fix nagle implementation in uTP * fix nagle implementation in uTP
* make 'close_redudnant_connections' cover more cases
* set_piece_deadline() also unfilters the piece (if its priority is 0) * set_piece_deadline() also unfilters the piece (if its priority is 0)
* add work-around for bug in windows vista and earlier in GetOverlappedResult * add work-around for bug in windows vista and earlier in GetOverlappedResult
* fix traversal algorithm leak in DHT * fix traversal algorithm leak in DHT

View File

@ -1853,6 +1853,11 @@ namespace libtorrent
if (m_upload_only_id == 0) return; if (m_upload_only_id == 0) return;
if (t->share_mode()) return; if (t->share_mode()) return;
// if we send upload-only, the other end is very likely to disconnect
// us, at least if it's a seed. If we don't want to close redundant
// connections, don't sent upload-only
if (!m_ses.settings().close_redundant_connections) return;
char msg[7] = {0, 0, 0, 3, msg_extended}; char msg[7] = {0, 0, 0, 3, msg_extended};
char* ptr = msg + 5; char* ptr = msg + 5;
detail::write_uint8(m_upload_only_id, ptr); detail::write_uint8(m_upload_only_id, ptr);

View File

@ -6183,25 +6183,29 @@ namespace libtorrent
m_completed_time = time(0); m_completed_time = time(0);
// disconnect all seeds // disconnect all seeds
// TODO: 1 should disconnect all peers that have the pieces we have if (settings().close_redundant_connections)
// not just seeds. It would be pretty expensive to check all pieces
// for all peers though
std::vector<peer_connection*> seeds;
for (peer_iterator i = m_connections.begin();
i != m_connections.end(); ++i)
{ {
peer_connection* p = *i; // TODO: 1 should disconnect all peers that have the pieces we have
TORRENT_ASSERT(p->associated_torrent().lock().get() == this); // not just seeds
if (p->upload_only()) // not just seeds. It would be pretty expensive to check all pieces
// for all peers though
std::vector<peer_connection*> seeds;
for (peer_iterator i = m_connections.begin();
i != m_connections.end(); ++i)
{ {
peer_connection* p = *i;
TORRENT_ASSERT(p->associated_torrent().lock().get() == this);
if (p->upload_only())
{
#if defined TORRENT_VERBOSE_LOGGING || defined TORRENT_ERROR_LOGGING #if defined TORRENT_VERBOSE_LOGGING || defined TORRENT_ERROR_LOGGING
p->peer_log("*** SEED, CLOSING CONNECTION"); p->peer_log("*** SEED, CLOSING CONNECTION");
#endif #endif
seeds.push_back(p); seeds.push_back(p);
}
} }
std::for_each(seeds.begin(), seeds.end()
, boost::bind(&peer_connection::disconnect, _1, errors::torrent_finished, 0));
} }
std::for_each(seeds.begin(), seeds.end()
, boost::bind(&peer_connection::disconnect, _1, errors::torrent_finished, 0));
if (m_abort) return; if (m_abort) return;