forked from premiere/premiere-libtorrent
fixed checking of fast and suggest messages when used with magnet links
This commit is contained in:
parent
1f5a722b01
commit
f7ebefb285
|
@ -76,6 +76,7 @@ release 0.14.6
|
|||
* added missing functions to python binding related to torrent creation
|
||||
* fixed to add filename on web seed urls that lack it
|
||||
* fixed BOOST_ASIO_HASH_MAP_BUCKETS define for boost 1.39
|
||||
* fixed checking of fast and suggest messages when used with magnet links
|
||||
|
||||
release 0.14.5
|
||||
|
||||
|
|
|
@ -3575,6 +3575,8 @@ session_settings
|
|||
|
||||
int optimistic_disk_retry;
|
||||
bool disable_hash_check;
|
||||
|
||||
int max_suggest_pieces;
|
||||
};
|
||||
|
||||
``user_agent`` this is the client identification to the tracker.
|
||||
|
@ -4000,6 +4002,10 @@ to verify all downloaded data. It may be useful to turn this off for performance
|
|||
profiling and simulation scenarios. Do not disable the hash check for regular
|
||||
bittorrent clients.
|
||||
|
||||
``max_suggest_pieces`` is the max number of suggested piece indices received
|
||||
from a peer that's remembered. If a peer floods suggest messages, this limit
|
||||
prevents libtorrent from using too much RAM. It defaults to 10.
|
||||
|
||||
pe_settings
|
||||
===========
|
||||
|
||||
|
|
|
@ -179,6 +179,7 @@ namespace libtorrent
|
|||
, optimistic_disk_retry(10 * 60)
|
||||
, disable_hash_checks(false)
|
||||
, allow_i2p_mixed(false)
|
||||
, max_suggest_pieces(10)
|
||||
{}
|
||||
|
||||
// this is the user agent that will be sent to the tracker
|
||||
|
@ -633,6 +634,11 @@ namespace libtorrent
|
|||
// the anonymization of i2p, but still wants to
|
||||
// be able to connect to i2p peers.
|
||||
bool allow_i2p_mixed;
|
||||
|
||||
// the max number of pieces that a peer can
|
||||
// suggest to use before we start dropping
|
||||
// previous suggested piece
|
||||
int max_suggest_pieces;
|
||||
};
|
||||
|
||||
#ifndef TORRENT_DISABLE_DHT
|
||||
|
|
|
@ -535,6 +535,32 @@ namespace libtorrent
|
|||
boost::shared_ptr<torrent> t = associated_torrent().lock();
|
||||
m_have_piece.resize(t->torrent_file().num_pieces(), m_have_all);
|
||||
m_num_pieces = m_have_piece.count();
|
||||
|
||||
// now that we know how many pieces there are
|
||||
// remove any invalid allowed_fast and suggest pieces
|
||||
// now that we know what the number of pieces are
|
||||
for (std::vector<int>::iterator i = m_allowed_fast.begin();
|
||||
i != m_allowed_fast.end();)
|
||||
{
|
||||
if (*i < m_num_pieces)
|
||||
{
|
||||
++i;
|
||||
continue;
|
||||
}
|
||||
i = m_allowed_fast.erase(i);
|
||||
}
|
||||
|
||||
for (std::vector<int>::iterator i = m_suggested_pieces.begin();
|
||||
i != m_suggested_pieces.end();)
|
||||
{
|
||||
if (*i < m_num_pieces)
|
||||
{
|
||||
++i;
|
||||
continue;
|
||||
}
|
||||
i = m_suggested_pieces.erase(i);
|
||||
}
|
||||
|
||||
if (m_num_pieces == int(m_have_piece.size()))
|
||||
{
|
||||
#ifdef TORRENT_VERBOSE_LOGGING
|
||||
|
@ -739,6 +765,10 @@ namespace libtorrent
|
|||
m_suggested_pieces.begin(), m_suggested_pieces.end(), index);
|
||||
if (i != m_suggested_pieces.end()) m_suggested_pieces.erase(i);
|
||||
|
||||
// remove allowed fast pieces
|
||||
i = std::find(m_allowed_fast.begin(), m_allowed_fast.end(), index);
|
||||
if (i != m_allowed_fast.end()) m_allowed_fast.erase(i);
|
||||
|
||||
if (has_piece(index))
|
||||
{
|
||||
// if we got a piece that this peer has
|
||||
|
@ -1167,10 +1197,34 @@ namespace libtorrent
|
|||
#endif
|
||||
|
||||
if (is_disconnecting()) return;
|
||||
if (t->have_piece(index)) return;
|
||||
if (index < 0)
|
||||
{
|
||||
#if defined TORRENT_VERBOSE_LOGGING || defined TORRENT_ERROR_LOGGING
|
||||
(*m_logger) << time_now_string() << " <== INVALID_SUGGEST_PIECE [ " << index << " ]\n";
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
if (m_suggested_pieces.size() > 9)
|
||||
if (t->valid_metadata())
|
||||
{
|
||||
if (index >= int(m_have_piece.size()))
|
||||
{
|
||||
#if defined TORRENT_VERBOSE_LOGGING || defined TORRENT_ERROR_LOGGING
|
||||
(*m_logger) << time_now_string() << " <== INVALID_ALLOWED_FAST [ " << index << " | s: "
|
||||
<< int(m_have_piece.size()) << " ]\n";
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
// if we already have the piece, we can
|
||||
// ignore this message
|
||||
if (t->have_piece(index))
|
||||
return;
|
||||
}
|
||||
|
||||
if (m_suggested_pieces.size() > m_ses.m_settings.max_suggest_pieces)
|
||||
m_suggested_pieces.erase(m_suggested_pieces.begin());
|
||||
|
||||
m_suggested_pieces.push_back(index);
|
||||
|
||||
#ifdef TORRENT_VERBOSE_LOGGING
|
||||
|
@ -2439,10 +2493,17 @@ namespace libtorrent
|
|||
}
|
||||
#endif
|
||||
if (is_disconnecting()) return;
|
||||
if (index < 0)
|
||||
{
|
||||
#if defined TORRENT_VERBOSE_LOGGING || defined TORRENT_ERROR_LOGGING
|
||||
(*m_logger) << time_now_string() << " <== INVALID_ALLOWED_FAST [ " << " ]\n";
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
if (t->valid_metadata())
|
||||
{
|
||||
if (index < 0 || index >= int(m_have_piece.size()))
|
||||
if (index >= int(m_have_piece.size()))
|
||||
{
|
||||
#if defined TORRENT_VERBOSE_LOGGING || defined TORRENT_ERROR_LOGGING
|
||||
(*m_logger) << time_now_string() << " <== INVALID_ALLOWED_FAST [ " << index << " | s: "
|
||||
|
@ -2457,6 +2518,8 @@ namespace libtorrent
|
|||
return;
|
||||
}
|
||||
|
||||
// if we don't have the metadata, we'll verify
|
||||
// this piece index later
|
||||
m_allowed_fast.push_back(index);
|
||||
|
||||
// if the peer has the piece and we want
|
||||
|
@ -2476,10 +2539,6 @@ namespace libtorrent
|
|||
boost::shared_ptr<torrent> t = m_torrent.lock();
|
||||
TORRENT_ASSERT(t);
|
||||
|
||||
m_allowed_fast.erase(std::remove_if(m_allowed_fast.begin()
|
||||
, m_allowed_fast.end(), bind(&torrent::have_piece, t, _1))
|
||||
, m_allowed_fast.end());
|
||||
|
||||
// TODO: sort the allowed fast set in priority order
|
||||
return m_allowed_fast;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue