forked from premiere/premiere-libtorrent
optimized swarm startup time (shaved off about 1-2 seconds) by introducing torrent connection boost on the first tracker response for a torrent
This commit is contained in:
parent
8846fe4b93
commit
d554cf88e6
|
@ -1,3 +1,4 @@
|
||||||
|
* optimized swarm startup time (shaved off about 1-2 seconds)
|
||||||
* support DHT name lookup
|
* support DHT name lookup
|
||||||
* optimized memory usage of torrent_info and file_storage, forcing some API changes
|
* optimized memory usage of torrent_info and file_storage, forcing some API changes
|
||||||
around file_storage and file_entry
|
around file_storage and file_entry
|
||||||
|
|
|
@ -4008,6 +4008,8 @@ session_settings
|
||||||
int listen_queue_size;
|
int listen_queue_size;
|
||||||
|
|
||||||
bool announce_double_nat;
|
bool announce_double_nat;
|
||||||
|
|
||||||
|
int torrent_connect_boost;
|
||||||
};
|
};
|
||||||
|
|
||||||
``version`` is automatically set to the libtorrent version you're using
|
``version`` is automatically set to the libtorrent version you're using
|
||||||
|
@ -4810,6 +4812,12 @@ if ``announce_double_nat`` is true, the ``&ip=`` argument in tracker requests
|
||||||
(unless otherwise specified) will be set to the intermediate IP address, if the
|
(unless otherwise specified) will be set to the intermediate IP address, if the
|
||||||
user is double NATed. If ther user is not double NATed, this option has no affect.
|
user is double NATed. If ther user is not double NATed, this option has no affect.
|
||||||
|
|
||||||
|
``torrent_connect_boost`` is the number of peers to try to connect to immediately
|
||||||
|
when the first tracker response is received for a torrent. This is a boost to
|
||||||
|
given to new torrents to accelerate them starting up. The normal connect scheduler
|
||||||
|
is run once every second, this allows peers to be connected immediately instead
|
||||||
|
of waiting for the session tick to trigger connections.
|
||||||
|
|
||||||
pe_settings
|
pe_settings
|
||||||
===========
|
===========
|
||||||
|
|
||||||
|
|
|
@ -743,6 +743,11 @@ namespace libtorrent
|
||||||
|
|
||||||
utp_socket_manager m_utp_socket_manager;
|
utp_socket_manager m_utp_socket_manager;
|
||||||
|
|
||||||
|
// the number of torrent connection boosts
|
||||||
|
// connections that have been made this second
|
||||||
|
// this is deducted from the connect speed
|
||||||
|
int m_boost_connections;
|
||||||
|
|
||||||
#ifndef TORRENT_DISABLE_ENCRYPTION
|
#ifndef TORRENT_DISABLE_ENCRYPTION
|
||||||
pe_settings m_pe_settings;
|
pe_settings m_pe_settings;
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -252,6 +252,7 @@ namespace libtorrent
|
||||||
, rate_limit_utp(false)
|
, rate_limit_utp(false)
|
||||||
, listen_queue_size(5)
|
, listen_queue_size(5)
|
||||||
, announce_double_nat(false)
|
, announce_double_nat(false)
|
||||||
|
, torrent_connect_boost(10)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
// libtorrent version. Used for forward binary compatibility
|
// libtorrent version. Used for forward binary compatibility
|
||||||
|
@ -999,6 +1000,12 @@ namespace libtorrent
|
||||||
// IP address if the user is double NATed. If ther user is not
|
// IP address if the user is double NATed. If ther user is not
|
||||||
// double NATed, this option does not have an affect
|
// double NATed, this option does not have an affect
|
||||||
bool announce_double_nat;
|
bool announce_double_nat;
|
||||||
|
|
||||||
|
// the first tracker response after a torrent is started
|
||||||
|
// will cause this many connections to be made immediately.
|
||||||
|
// instead of waiting for the connection scheduler which
|
||||||
|
// triggeres every second
|
||||||
|
int torrent_connect_boost;
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifndef TORRENT_DISABLE_DHT
|
#ifndef TORRENT_DISABLE_DHT
|
||||||
|
|
|
@ -1243,6 +1243,13 @@ namespace libtorrent
|
||||||
// is waiting to finish all current download requests
|
// is waiting to finish all current download requests
|
||||||
// before actually closing all connections
|
// before actually closing all connections
|
||||||
bool m_graceful_pause_mode:1;
|
bool m_graceful_pause_mode:1;
|
||||||
|
|
||||||
|
// this is set to true when the torrent starts up
|
||||||
|
// The first tracker response, when this is true,
|
||||||
|
// will attempt to connect to a bunch of peers immediately
|
||||||
|
// and set this to false. We only do this once to get
|
||||||
|
// the torrent kick-started
|
||||||
|
bool m_need_connect_boost:1;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -499,6 +499,7 @@ namespace aux {
|
||||||
, m_half_open)
|
, m_half_open)
|
||||||
, m_utp_socket_manager(m_settings, m_udp_socket
|
, m_utp_socket_manager(m_settings, m_udp_socket
|
||||||
, boost::bind(&session_impl::incoming_connection, this, _1))
|
, boost::bind(&session_impl::incoming_connection, this, _1))
|
||||||
|
, m_boost_connections(0)
|
||||||
, m_timer(m_io_service)
|
, m_timer(m_io_service)
|
||||||
, m_lsd_announce_timer(m_io_service)
|
, m_lsd_announce_timer(m_io_service)
|
||||||
, m_host_resolver(m_io_service)
|
, m_host_resolver(m_io_service)
|
||||||
|
@ -2603,15 +2604,33 @@ namespace aux {
|
||||||
// equally likely to connect to a peer
|
// equally likely to connect to a peer
|
||||||
|
|
||||||
int free_slots = m_half_open.free_slots();
|
int free_slots = m_half_open.free_slots();
|
||||||
|
int max_connections = m_settings.connection_speed;
|
||||||
|
// boost connections are connections made by torrent connection
|
||||||
|
// boost, which are done immediately on a tracker response. These
|
||||||
|
// connections needs to be deducted from this second
|
||||||
|
if (m_boost_connections > 0)
|
||||||
|
{
|
||||||
|
if (m_boost_connections > max_connections)
|
||||||
|
{
|
||||||
|
m_boost_connections -= max_connections;
|
||||||
|
max_connections = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
max_connections -= m_boost_connections;
|
||||||
|
m_boost_connections = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!m_torrents.empty()
|
if (!m_torrents.empty()
|
||||||
&& free_slots > -m_half_open.limit()
|
&& free_slots > -m_half_open.limit()
|
||||||
&& num_connections() < m_settings.connections_limit
|
&& num_connections() < m_settings.connections_limit
|
||||||
&& !m_abort
|
&& !m_abort
|
||||||
&& m_settings.connection_speed > 0)
|
&& m_settings.connection_speed > 0
|
||||||
|
&& max_connections > 0)
|
||||||
{
|
{
|
||||||
// this is the maximum number of connections we will
|
// this is the maximum number of connections we will
|
||||||
// attempt this tick
|
// attempt this tick
|
||||||
int max_connections = m_settings.connection_speed;
|
|
||||||
int average_peers = 0;
|
int average_peers = 0;
|
||||||
if (num_downloads > 0)
|
if (num_downloads > 0)
|
||||||
average_peers = num_downloads_peers / num_downloads;
|
average_peers = num_downloads_peers / num_downloads;
|
||||||
|
|
|
@ -394,6 +394,7 @@ namespace libtorrent
|
||||||
, m_downloaders(0xffffff)
|
, m_downloaders(0xffffff)
|
||||||
, m_interface_index(0)
|
, m_interface_index(0)
|
||||||
, m_graceful_pause_mode(false)
|
, m_graceful_pause_mode(false)
|
||||||
|
, m_need_connect_boost(true)
|
||||||
{
|
{
|
||||||
TORRENT_ASSERT(m_ses.is_network_thread());
|
TORRENT_ASSERT(m_ses.is_network_thread());
|
||||||
#if defined TORRENT_VERBOSE_LOGGING || defined TORRENT_LOGGING || defined TORRENT_ERROR_LOGGING
|
#if defined TORRENT_VERBOSE_LOGGING || defined TORRENT_LOGGING || defined TORRENT_ERROR_LOGGING
|
||||||
|
@ -1892,6 +1893,27 @@ namespace libtorrent
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (m_need_connect_boost)
|
||||||
|
{
|
||||||
|
m_need_connect_boost = false;
|
||||||
|
// this is the first tracker response for this torrent
|
||||||
|
// instead of waiting one second for session_impl::on_tick()
|
||||||
|
// to be called, connect to a few peers immediately
|
||||||
|
int conns = (std::min)((std::min)(m_ses.m_settings.torrent_connect_boost
|
||||||
|
, m_ses.m_settings.connections_limit - m_ses.num_connections())
|
||||||
|
, m_ses.m_half_open.free_slots());
|
||||||
|
|
||||||
|
while (want_more_peers() && conns > 0)
|
||||||
|
{
|
||||||
|
if (!m_policy.connect_one_peer(m_ses.session_time())) break;
|
||||||
|
// increase m_ses.m_boost_connections for each connection
|
||||||
|
// attempt. This will be deducted from the connect speed
|
||||||
|
// the next time session_impl::on_tick() is triggered
|
||||||
|
--conns;
|
||||||
|
++m_ses.m_boost_connections;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ptime torrent::next_announce() const
|
ptime torrent::next_announce() const
|
||||||
|
|
Loading…
Reference in New Issue