merged changes from RC_1_0

This commit is contained in:
Arvid Norberg 2014-08-20 07:02:03 +00:00
parent 9f8916a7a0
commit 07af6f6216
4 changed files with 61 additions and 13 deletions

View File

@ -27,6 +27,7 @@
* almost completely changed the storage interface (for custom storage)
* added support for hashing pieces in multiple threads
* made uTP re-enter slow-start after time-out
* fixed uTP upload performance issue
* fix missing support for DHT put salt
@ -96,6 +97,7 @@
* fix uTP edge case where udp socket buffer fills up
* fix nagle implementation in uTP
* fixed bug in add_torrent_alert::message for magnet links
* disable optimistic disconnects when connection limit is low
* improved error handling of session::listen_on
* suppress initial 'completed' announce to trackers added with replace_trackers

View File

@ -522,19 +522,22 @@ namespace libtorrent {
std::string add_torrent_alert::message() const
{
char msg[600];
char info_hash[41];
char const* torrent_name = info_hash;
if (params.ti) torrent_name = params.ti->name().c_str();
else if (!params.name.empty()) torrent_name = params.name.c_str();
else if (!params.url.empty()) torrent_name = params.url.c_str();
else to_hex((const char*)&params.info_hash[0], 20, info_hash);
if (error)
{
snprintf(msg, sizeof(msg), "failed to add torrent: %s"
snprintf(msg, sizeof(msg), "failed to add torrent \"%s\": [%s] %s"
, torrent_name, error.category().name()
, convert_from_native(error.message()).c_str());
}
else
{
snprintf(msg, sizeof(msg), "added torrent: %s"
, !params.url.empty() ? params.url.c_str()
: params.ti ? params.ti->name().c_str()
: !params.name.empty() ? params.name.c_str()
: !params.uuid.empty() ? params.uuid.c_str()
: "");
snprintf(msg, sizeof(msg), "added torrent: %s", torrent_name);
}
return msg;
}

View File

@ -236,6 +236,7 @@ struct utp_socket_impl
, m_timeout(time_now_hires() + milliseconds(m_sm->connect_timeout()))
, m_last_history_step(time_now_hires())
, m_cwnd(TORRENT_ETHERNET_MTU << 16)
, m_ssthres(0)
, m_buffered_incoming_bytes(0)
, m_reply_micro(0)
, m_adv_wnd(TORRENT_ETHERNET_MTU)
@ -438,6 +439,11 @@ struct utp_socket_impl
timestamp_history m_delay_hist;
timestamp_history m_their_delay_hist;
// the slow-start threshold. This is the congestion window size (m_cwnd)
// in bytes the last time we left slow-start mode. This is used as a
// threshold to leave slow-start earlier next time, to avoid packet-loss
boost::int32_t m_ssthres;
// the number of bytes we have buffered in m_inbuf
boost::int32_t m_buffered_incoming_bytes;
@ -2153,6 +2159,14 @@ void utp_socket_impl::experienced_loss(int seq_nr)
// same packet again, ignore it.
if (compare_less_wrap(seq_nr, m_loss_seq_nr + 1, ACK_MASK)) return;
// if we happen to be in slow-start mode, we need to leave it
if (m_slow_start)
{
m_ssthres = m_cwnd >> 16;
m_slow_start = false;
UTP_LOGV("%8p: experienced loss, slow_start -> 0\n", this);
}
// cut window size in 2
m_cwnd = (std::max)(m_cwnd * m_sm->loss_multiplier() / 100, boost::int64_t(m_mtu << 16));
m_loss_seq_nr = m_seq_nr;
@ -2161,8 +2175,6 @@ void utp_socket_impl::experienced_loss(int seq_nr)
// the window size could go below one MMS here, if it does,
// we'll get a timeout in about one second
// if we happen to be in slow-start mode, we need to leave it
m_slow_start = false;
m_sm->inc_stats_counter(counters::utp_packet_loss);
}
@ -3062,6 +3074,7 @@ bool utp_socket_impl::incoming_packet(boost::uint8_t const* buf, int size
"send_buffer:%d "
"recv_buffer:%d "
"fast_resend_seq_nr:%d "
"ssthres:%d "
"\n"
, this
, sample
@ -3093,7 +3106,8 @@ bool utp_socket_impl::incoming_packet(boost::uint8_t const* buf, int size
, min_rtt / 1000
, m_write_buffer_size
, m_read_buffer_size
, m_fast_resend_seq_nr);
, m_fast_resend_seq_nr
, m_ssthres);
}
#endif
@ -3222,10 +3236,13 @@ void utp_socket_impl::do_ledbat(int acked_bytes, int delay, int in_flight)
if (delay >= target_delay)
{
if (m_slow_start)
{
UTP_LOGV("%8p: off_target: %d slow_start -> 0\n", this, target_delay - delay);
m_ssthres = m_cwnd >> 16;
m_slow_start = false;
}
m_sm->inc_stats_counter(counters::utp_samples_above_target);
m_slow_start = false;
}
else
{
@ -3239,11 +3256,25 @@ void utp_socket_impl::do_ledbat(int acked_bytes, int delay, int in_flight)
// congestion window), don't adjust it at all.
if (cwnd_saturated)
{
boost::int64_t exponential_gain = boost::int64_t(acked_bytes) << 16;
if (m_slow_start)
{
// mimic TCP slow-start by adding the number of acked
// bytes to cwnd
scaled_gain = (std::max)(boost::int64_t(acked_bytes) << 16, linear_gain);
if (m_ssthres != 0 && ((m_cwnd + exponential_gain) >> 16) > m_ssthres)
{
// if we would exeed the slow start threshold by growing the cwnd
// exponentially, don't do it, and leave slow-start mode. This
// make us avoid causing more delay and/or packet loss by being too
// aggressive
m_slow_start = false;
scaled_gain = linear_gain;
UTP_LOGV("%8p: cwnd > ssthres (%d) slow_start -> 0\n", this, m_ssthres);
}
else
{
scaled_gain = (std::max)(exponential_gain, linear_gain);
}
}
else
{
@ -3288,7 +3319,11 @@ void utp_socket_impl::do_ledbat(int acked_bytes, int delay, int in_flight)
}
if ((m_cwnd >> 16) >= m_adv_wnd)
{
m_slow_start = false;
UTP_LOGV("%8p: cwnd > advertized wnd (%d) slow_start -> 0\n"
, this, m_adv_wnd);
}
}
void utp_stream::bind(endpoint_type const& ep, error_code& ec) { }
@ -3390,6 +3425,13 @@ void utp_socket_impl::tick(ptime now)
// timed out
m_loss_seq_nr = m_seq_nr;
// when we time out, the cwnd is reset to 1 MSS, which means we
// need to ramp it up quickly again. enter slow start mode. This time
// we're very likely to have an ssthres set, which will make us leave
// slow start before inducing more delay or loss.
m_slow_start = true;
UTP_LOGV("%8p: timeout slow_start -> 1\n", this);
// we need to go one past m_seq_nr to cover the case
// where we just sent a SYN packet and then adjusted for
// the uTorrent sequence number reuse

View File

@ -71,6 +71,7 @@ metrics = {
'their_delay':['their delay (ms)', 'x1y2', delay_samples],
'get_microseconds':['clock (us)', 'x1y1', 'steps'],
'wnduser':['advertised window size (B)', 'x1y1', 'steps'],
'ssthres':['slow-start threshold (B)', 'x1y1', 'steps'],
'delay_base':['delay base (us)', 'x1y1', delay_base],
'their_delay_base':['their delay base (us)', 'x1y1', delay_base],
@ -204,7 +205,7 @@ plot = [
'y2': 'Time (ms)'
},
{
'data': ['max_window', 'cur_window', 'our_delay', 'target_delay'],
'data': ['max_window', 'cur_window', 'our_delay', 'target_delay', 'ssthres'],
'title': 'cwnd',
'y1': 'Bytes',
'y2': 'Time (ms)'