deprecate bittyrant choking algorithm

This commit is contained in:
arvidn 2020-03-15 11:10:17 +01:00 committed by Arvid Norberg
parent 827d852c58
commit ce9be0c83f
14 changed files with 85 additions and 43 deletions

View File

@ -1,3 +1,4 @@
* deprecate the bittyrant choking algorithm
* add build option to disable streaming
1.2.5 release

View File

@ -842,7 +842,9 @@ void bind_alert()
.value("download_limit_too_low", performance_alert::download_limit_too_low)
.value("send_buffer_watermark_too_low", performance_alert::send_buffer_watermark_too_low)
.value("too_many_optimistic_unchoke_slots", performance_alert::too_many_optimistic_unchoke_slots)
#if TORRENT_ABI_VERSION == 1
.value("bittyrant_with_no_uplimit", performance_alert::bittyrant_with_no_uplimit)
#endif
.value("too_high_disk_queue_limit", performance_alert::too_high_disk_queue_limit)
.value("too_few_outgoing_ports", performance_alert::too_few_outgoing_ports)
.value("too_few_file_descriptors", performance_alert::too_few_file_descriptors)

View File

@ -104,7 +104,9 @@ void bind_peer_info()
.def_readonly("upload_rate_peak", &peer_info::upload_rate_peak)
.def_readonly("progress", &peer_info::progress)
.def_readonly("progress_ppm", &peer_info::progress_ppm)
#if TORRENT_ABI_VERSION == 1
.def_readonly("estimated_reciprocation_rate", &peer_info::estimated_reciprocation_rate)
#endif
.add_property("local_endpoint", get_local_endpoint)
;

View File

@ -17,7 +17,9 @@ void bind_session_settings()
.value("auto_expand_choker", settings_pack::rate_based_choker)
#endif
.value("rate_based_choker", settings_pack::rate_based_choker)
#if TORRENT_ABI_VERSION == 1
.value("bittyrant_choker", settings_pack::bittyrant_choker)
#endif
;
enum_<settings_pack::seed_choking_algorithm_t>("seed_choking_algorithm_t")

View File

@ -195,7 +195,6 @@ bool print_ip = true;
bool print_local_ip = false;
bool print_timers = false;
bool print_block = false;
bool print_peer_rate = false;
bool print_fails = false;
bool print_send_bufs = true;
bool print_disk_stats = false;
@ -322,7 +321,6 @@ int print_peer_info(std::string& out
if (print_timers) out += "inactive wait timeout q-time ";
out += " v disk ^ rtt ";
if (print_block) out += "block-progress ";
if (print_peer_rate) out += "est.rec.rate ";
out += "client \x1b[K\n";
++pos;
@ -453,14 +451,6 @@ int print_peer_info(std::string& out
}
}
if (print_peer_rate)
{
bool const unchoked = !(i->flags & lt::peer_info::choked);
std::snprintf(str, sizeof(str), " %s"
, unchoked ? add_suffix(i->estimated_reciprocation_rate, "/s").c_str() : " ");
out += str;
}
out += " ";
if (i->flags & lt::peer_info::handshake)
@ -1617,7 +1607,6 @@ example alert_masks:
if (c == '2') print_connecting_peers = !print_connecting_peers;
if (c == '3') print_timers = !print_timers;
if (c == '4') print_block = !print_block;
if (c == '5') print_peer_rate = !print_peer_rate;
if (c == '6') print_fails = !print_fails;
if (c == '7') print_send_bufs = !print_send_bufs;
if (c == '8') print_local_ip = !print_local_ip;
@ -1662,7 +1651,7 @@ up/down arrow keys: select torrent
COLUMN OPTIONS
[1] toggle IP column [2] toggle show peer connection attempts
[3] toggle timers column [4] toggle block progress column
[5] toggle peer rate column [6] toggle failures column
[6] toggle failures column
[7] toggle send buffers column [8] toggle local IP column
)");
int tmp;

View File

@ -458,7 +458,11 @@ TORRENT_VERSION_NAMESPACE_2
too_high_disk_queue_limit,
aio_limit_reached,
bittyrant_with_no_uplimit,
#if TORRENT_ABI_VERSION == 1
bittyrant_with_no_uplimit TORRENT_DEPRECATED_ENUM,
#else
deprecated_bittyrant_with_no_uplimit,
#endif
// This is generated if outgoing peer connections are failing because of *address in use*
// errors, indicating that ``settings_pack::outgoing_ports`` is set and is too small of

View File

@ -640,8 +640,6 @@ namespace aux {
// ``num_peers_half_open`` instead.
int num_connections() const override { return int(m_connections.size()); }
int peak_up_rate() const { return m_peak_up_rate; }
void trigger_unchoke() noexcept override
{
TORRENT_ASSERT(is_single_thread());
@ -1072,8 +1070,9 @@ namespace aux {
void sent_syn(bool ipv6) override;
void received_synack(bool ipv6) override;
#if TORRENT_ABI_VERSION == 1
int m_peak_up_rate = 0;
int m_peak_down_rate = 0;
#endif
void on_tick(error_code const& e);

View File

@ -513,9 +513,11 @@ namespace aux {
// returns true if the connection was disconnected
bool disconnect_if_redundant();
#if TORRENT_ABI_VERSION == 1
void increase_est_reciprocation_rate();
void decrease_est_reciprocation_rate();
int est_reciprocation_rate() const { return m_est_reciprocation_rate; }
#endif
#ifndef TORRENT_DISABLE_LOGGING
bool should_log(peer_log_alert::direction_t direction) const final;
@ -1029,11 +1031,13 @@ namespace aux {
int m_download_rate_peak = 0;
int m_upload_rate_peak = 0;
#if TORRENT_ABI_VERSION == 1
// when using the BitTyrant choker, this is our
// estimated reciprocation rate. i.e. the rate
// we need to send to this peer for it to unchoke
// us
int m_est_reciprocation_rate;
#endif
// stop sending data after this many bytes, INT_MAX = inf
int m_send_barrier = INT_MAX;

View File

@ -64,6 +64,13 @@ TORRENT_VERSION_NAMESPACE_2
// that libtorrent is connected to
struct TORRENT_EXPORT peer_info
{
// hidden
peer_info();
~peer_info();
peer_info(peer_info const&);
peer_info(peer_info&&);
peer_info& operator=(peer_info const&);
// a string describing the software at the other end of the connection.
// In some cases this information is not available, then it will contain
// a string that may give away something about which software is running
@ -133,7 +140,7 @@ TORRENT_VERSION_NAMESPACE_2
// The connection is currently queued for a connection
// attempt. This may happen if there is a limit set on
// the number of half-open TCP connections.
static constexpr peer_flags_t queued = 8_bit;
TORRENT_DEPRECATED_MEMBER static constexpr peer_flags_t queued = 8_bit;
#endif
// The peer has participated in a piece that failed the
@ -325,7 +332,7 @@ TORRENT_VERSION_NAMESPACE_2
#if TORRENT_ABI_VERSION == 1
// an estimate of the rate this peer is downloading at, in
// bytes per second.
int remote_dl_rate;
TORRENT_DEPRECATED_MEMBER int remote_dl_rate;
#endif
// the number of bytes this peer has pending in the disk-io thread.
@ -364,11 +371,15 @@ TORRENT_VERSION_NAMESPACE_2
// (parts per million).
int progress_ppm;
#if TORRENT_ABI_VERSION == 1
// this is an estimation of the upload rate, to this peer, where it will
// unchoke us. This is a coarse estimation based on the rate at which
// we sent right before we were choked. This is primarily used for the
// bittyrant choking algorithm.
int estimated_reciprocation_rate;
TORRENT_DEPRECATED_MEMBER int estimated_reciprocation_rate;
#else
int deprecated_estimated_reciprocation_rate;
#endif
// the IP-address to this peer. The type is an asio endpoint. For
// more info, see the asio_ documentation.
@ -406,21 +417,21 @@ TORRENT_VERSION_NAMESPACE_2
bandwidth_state_flags_t write_state;
#if TORRENT_ABI_VERSION == 1
static constexpr bandwidth_state_flags_t bw_torrent = bw_limit;
static constexpr bandwidth_state_flags_t bw_global = bw_limit;
TORRENT_DEPRECATED_MEMBER static constexpr bandwidth_state_flags_t bw_torrent = bw_limit;
TORRENT_DEPRECATED_MEMBER static constexpr bandwidth_state_flags_t bw_global = bw_limit;
// the number of bytes per second we are allowed to send to or receive
// from this peer. It may be -1 if there's no local limit on the peer.
// The global limit and the torrent limit may also be enforced.
int upload_limit;
int download_limit;
TORRENT_DEPRECATED_MEMBER int upload_limit;
TORRENT_DEPRECATED_MEMBER int download_limit;
// a measurement of the balancing of free download (that we get) and free
// upload that we give. Every peer gets a certain amount of free upload,
// but this member says how much *extra* free upload this peer has got.
// If it is a negative number it means that this was a peer from which we
// have got this amount of free download.
std::int64_t load_balancing;
TORRENT_DEPRECATED_MEMBER std::int64_t load_balancing;
#endif
};

View File

@ -1004,7 +1004,9 @@ namespace aux {
send_buffer_watermark_factor,
// ``choking_algorithm`` specifies which algorithm to use to determine
// which peers to unchoke.
// how many peers to unchoke. The unchoking algorithm for
// downloading torrents is always "tit-for-tat", i.e. the peers we
// download the fastest from are unchoked.
//
// The options for choking algorithms are:
//
@ -1016,20 +1018,10 @@ namespace aux {
// rate achieved to peers. The more slots that are opened, the
// marginal upload rate required to open up another slot increases.
//
// * ``bittyrant_choker`` attempts to optimize download rate by
// finding the reciprocation rate of each peer individually and
// prefers peers that gives the highest *return on investment*. It
// still allocates all upload capacity, but shuffles it around to
// the best peers first. For this choker to be efficient, you need
// to set a global upload rate limit
// (``settings_pack::upload_rate_limit``). For more information
// about this choker, see the paper_. This choker is not fully
// implemented nor tested.
//
// .. _paper: http://bittyrant.cs.washington.edu/#papers
//
// ``seed_choking_algorithm`` controls the seeding unchoke behavior.
// The available options are:
// i.e. How we select which peers to unchoke for seeding torrents.
// Since a seeding torrent isn't downloading anything, the
// tit-for-tat mechanism cannot be used. The available options are:
//
// * ``round_robin`` which round-robins the peers that are unchoked
// when seeding. This distributes the upload bandwidth uniformly and
@ -1043,6 +1035,9 @@ namespace aux {
// * ``anti_leech`` prioritizes peers who have just started or are
// just about to finish the download. The intention is to force
// peers in the middle of the download to trade with each other.
// This does not just take into account the pieces a peer is
// reporting having downloaded, but also the pieces we have sent
// to it.
choking_algorithm,
seed_choking_algorithm,
@ -1320,6 +1315,7 @@ namespace aux {
// allowed upload slots as optimistic unchoke slots.
num_optimistic_unchoke_slots,
#if TORRENT_ABI_VERSION == 1
// ``default_est_reciprocation_rate`` is the assumed reciprocation
// rate from peers when using the BitTyrant choker. If set too high,
// you will over-estimate your peers and be
@ -1336,9 +1332,14 @@ namespace aux {
// estimated reciprocation rate should be decreased by each unchoke
// interval a peer unchokes us. This only applies
// to the BitTyrant choker.
default_est_reciprocation_rate,
increase_est_reciprocation_rate,
decrease_est_reciprocation_rate,
default_est_reciprocation_rate TORRENT_DEPRECATED_ENUM,
increase_est_reciprocation_rate TORRENT_DEPRECATED_ENUM,
decrease_est_reciprocation_rate TORRENT_DEPRECATED_ENUM,
#else
deprecated_default_est_reciprocation_rate,
deprecated_increase_est_reciprocation_rate,
deprecated_decrease_est_reciprocation_rate,
#endif
// the max number of peers we accept from pex messages from a single
// peer. this limits the number of concurrent peers any of our peers
@ -1751,7 +1752,11 @@ namespace aux {
{
fixed_slots_choker = 0,
rate_based_choker = 2,
bittyrant_choker = 3
#if TORRENT_ABI_VERSION == 1
bittyrant_choker TORRENT_DEPRECATED_ENUM = 3
#else
deprecated_bittyrant_choker = 3
#endif
};
enum seed_choking_algorithm_t : std::uint8_t

View File

@ -197,6 +197,7 @@ namespace {
return c1 > c2;
}
#if TORRENT_ABI_VERSION == 1
bool bittyrant_unchoke_compare(peer_connection const* lhs
, peer_connection const* rhs)
{
@ -219,6 +220,7 @@ namespace {
// prioritize the one that has waited the longest to be unchoked
return lhs->time_of_last_unchoke() < rhs->time_of_last_unchoke();
}
#endif
} // anonymous namespace
@ -235,6 +237,7 @@ namespace {
}
#endif
#if TORRENT_ABI_VERSION == 1
// ==== BitTyrant ====
//
// if we're using the bittyrant unchoker, go through all peers that
@ -289,6 +292,9 @@ namespace {
return upload_slots;
}
#else
TORRENT_UNUSED(max_upload_rate);
#endif
int upload_slots = sett.get_int(settings_pack::unchoke_slots_limit);
if (upload_slots < 0)

View File

@ -167,7 +167,9 @@ namespace libtorrent {
// if t is nullptr, we better not be connecting, since
// we can't decrement the connecting counter
TORRENT_ASSERT(t || !m_connecting);
#if TORRENT_ABI_VERSION == 1
m_est_reciprocation_rate = m_settings.get_int(settings_pack::default_est_reciprocation_rate);
#endif
m_channel_state[upload_channel] = peer_info::bw_idle;
m_channel_state[download_channel] = peer_info::bw_idle;
@ -268,6 +270,7 @@ namespace libtorrent {
disconnect(ec, operation_t::unknown, peer_error);
}
#if TORRENT_ABI_VERSION == 1
void peer_connection::increase_est_reciprocation_rate()
{
TORRENT_ASSERT(is_single_thread());
@ -281,6 +284,7 @@ namespace libtorrent {
m_est_reciprocation_rate -= m_est_reciprocation_rate
* m_settings.get_int(settings_pack::decrease_est_reciprocation_rate) / 100;
}
#endif
int peer_connection::get_priority(int const channel) const
{
@ -4590,7 +4594,9 @@ namespace libtorrent {
p.progress_ppm = int(std::int64_t(p.pieces.count()) * 1000000 / p.pieces.size());
}
#if TORRENT_ABI_VERSION == 1
p.estimated_reciprocation_rate = m_est_reciprocation_rate;
#endif
error_code ec;
p.local_endpoint = get_socket()->local_endpoint(ec);

View File

@ -34,6 +34,12 @@ POSSIBILITY OF SUCH DAMAGE.
namespace libtorrent {
peer_info::peer_info() = default;
peer_info::~peer_info() = default;
peer_info::peer_info(peer_info const&) = default;
peer_info::peer_info(peer_info&&) = default;
peer_info& peer_info::operator=(peer_info const&) = default;
// This will no longer be necessary with C++17
constexpr peer_flags_t peer_info::interesting;
constexpr peer_flags_t peer_info::choked;

View File

@ -3335,8 +3335,9 @@ namespace {
}
}
#if TORRENT_ABI_VERSION == 1
m_peak_up_rate = std::max(m_stat.upload_rate(), m_peak_up_rate);
m_peak_down_rate = std::max(m_stat.download_rate(), m_peak_down_rate);
#endif
m_stat.second_tick(tick_interval_ms);
@ -4170,6 +4171,7 @@ namespace {
peers.push_back(p.get());
}
#if TORRENT_ABI_VERSION == 1
// the unchoker wants an estimate of our upload rate capacity
// (used by bittyrant)
int max_upload_rate = upload_rate_limit(m_global_class);
@ -4185,6 +4187,9 @@ namespace {
m_alerts.emplace_alert<performance_alert>(torrent_handle()
, performance_alert::bittyrant_with_no_uplimit);
}
#else
int const max_upload_rate = 0;
#endif
int const allowed_upload_slots = unchoke_sort(peers, max_upload_rate
, unchoke_interval, m_settings);