keeps track of the number of requests waiting in the send buffer and adjusts bandwidht priority accordingly in the bandwidth limiter
This commit is contained in:
parent
a7ed5578b6
commit
a20f1a8fa0
|
@ -2551,6 +2551,7 @@ struct peer_info
|
||||||
|
|
||||||
size_type load_balancing;
|
size_type load_balancing;
|
||||||
|
|
||||||
|
int requests_in_buffer;
|
||||||
int download_queue_length;
|
int download_queue_length;
|
||||||
int upload_queue_length;
|
int upload_queue_length;
|
||||||
|
|
||||||
|
@ -2757,6 +2758,8 @@ and free upload that we give. Every peer gets a certain amount of free upload, b
|
||||||
this member says how much <em>extra</em> free upload this peer has got. If it is a negative
|
this member says how much <em>extra</em> 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
|
number it means that this was a peer from which we have got this amount of free
|
||||||
download.</p>
|
download.</p>
|
||||||
|
<p><tt class="docutils literal"><span class="pre">requests_in_buffer</span></tt> is the number of requests messages that are currently in the
|
||||||
|
send buffer waiting to be sent.</p>
|
||||||
<p><tt class="docutils literal"><span class="pre">download_queue_length</span></tt> is the number of piece-requests we have sent to this peer
|
<p><tt class="docutils literal"><span class="pre">download_queue_length</span></tt> is the number of piece-requests we have sent to this peer
|
||||||
that hasn't been answered with a piece yet.</p>
|
that hasn't been answered with a piece yet.</p>
|
||||||
<p><tt class="docutils literal"><span class="pre">upload_queue_length</span></tt> is the number of piece-requests we have received from this peer
|
<p><tt class="docutils literal"><span class="pre">upload_queue_length</span></tt> is the number of piece-requests we have received from this peer
|
||||||
|
|
|
@ -2528,6 +2528,7 @@ It contains the following fields::
|
||||||
|
|
||||||
size_type load_balancing;
|
size_type load_balancing;
|
||||||
|
|
||||||
|
int requests_in_buffer;
|
||||||
int download_queue_length;
|
int download_queue_length;
|
||||||
int upload_queue_length;
|
int upload_queue_length;
|
||||||
|
|
||||||
|
@ -2724,6 +2725,9 @@ this member says how much *extra* free upload this peer has got. If it is a nega
|
||||||
number it means that this was a peer from which we have got this amount of free
|
number it means that this was a peer from which we have got this amount of free
|
||||||
download.
|
download.
|
||||||
|
|
||||||
|
``requests_in_buffer`` is the number of requests messages that are currently in the
|
||||||
|
send buffer waiting to be sent.
|
||||||
|
|
||||||
``download_queue_length`` is the number of piece-requests we have sent to this peer
|
``download_queue_length`` is the number of piece-requests we have sent to this peer
|
||||||
that hasn't been answered with a piece yet.
|
that hasn't been answered with a piece yet.
|
||||||
|
|
||||||
|
|
|
@ -320,7 +320,7 @@ void print_peer_info(std::ostream& out, std::vector<libtorrent::peer_info> const
|
||||||
#endif
|
#endif
|
||||||
out << "down (total | peak ) up (total | peak ) sent-req recv flags source ";
|
out << "down (total | peak ) up (total | peak ) sent-req recv flags source ";
|
||||||
if (print_fails) out << "fail hshf ";
|
if (print_fails) out << "fail hshf ";
|
||||||
if (print_send_bufs) out << "sndb quota rcvb ";
|
if (print_send_bufs) out << "rq sndb quota rcvb ";
|
||||||
if (print_timers) out << "inactive wait timeout ";
|
if (print_timers) out << "inactive wait timeout ";
|
||||||
out << "disk rtt ";
|
out << "disk rtt ";
|
||||||
if (print_block) out << "block-progress ";
|
if (print_block) out << "block-progress ";
|
||||||
|
@ -399,7 +399,8 @@ void print_peer_info(std::ostream& out, std::vector<libtorrent::peer_info> const
|
||||||
}
|
}
|
||||||
if (print_send_bufs)
|
if (print_send_bufs)
|
||||||
{
|
{
|
||||||
out << to_string(i->used_send_buffer, 6) << " ("<< add_suffix(i->send_buffer_size) << ") "
|
out << to_string(i->requests_in_buffer, 2) << " "
|
||||||
|
<< to_string(i->used_send_buffer, 6) << " ("<< add_suffix(i->send_buffer_size) << ") "
|
||||||
<< to_string(i->send_quota, 5) << " "
|
<< to_string(i->send_quota, 5) << " "
|
||||||
<< to_string(i->used_receive_buffer, 6) << " ("<< add_suffix(i->receive_buffer_size) << ") ";
|
<< to_string(i->used_receive_buffer, 6) << " ("<< add_suffix(i->receive_buffer_size) << ") ";
|
||||||
}
|
}
|
||||||
|
|
|
@ -275,7 +275,7 @@ public:
|
||||||
// these functions encrypt the send buffer if m_rc4_encrypted
|
// these functions encrypt the send buffer if m_rc4_encrypted
|
||||||
// is true, otherwise it passes the call to the
|
// is true, otherwise it passes the call to the
|
||||||
// peer_connection functions of the same names
|
// peer_connection functions of the same names
|
||||||
void send_buffer(char* buf, int size);
|
void send_buffer(char* buf, int size, int flags = 0);
|
||||||
buffer::interval allocate_send_buffer(int size);
|
buffer::interval allocate_send_buffer(int size);
|
||||||
template <class Destructor>
|
template <class Destructor>
|
||||||
void append_send_buffer(char* buffer, int size, Destructor const& destructor)
|
void append_send_buffer(char* buffer, int size, Destructor const& destructor)
|
||||||
|
|
|
@ -409,7 +409,8 @@ namespace libtorrent
|
||||||
|
|
||||||
// these functions are virtual to let bt_peer_connection hook into them
|
// these functions are virtual to let bt_peer_connection hook into them
|
||||||
// and encrypt the content
|
// and encrypt the content
|
||||||
virtual void send_buffer(char const* begin, int size);
|
enum message_type_flags { message_type_request = 1 };
|
||||||
|
virtual void send_buffer(char const* begin, int size, int flags = 0);
|
||||||
virtual buffer::interval allocate_send_buffer(int size);
|
virtual buffer::interval allocate_send_buffer(int size);
|
||||||
virtual void setup_send();
|
virtual void setup_send();
|
||||||
|
|
||||||
|
@ -681,6 +682,10 @@ namespace libtorrent
|
||||||
// downloaded from this peer
|
// downloaded from this peer
|
||||||
std::vector<int> m_suggested_pieces;
|
std::vector<int> m_suggested_pieces;
|
||||||
|
|
||||||
|
// a list of byte offsets inside the send buffer
|
||||||
|
// the piece requests
|
||||||
|
std::vector<int> m_requests_in_buffer;
|
||||||
|
|
||||||
// the number of pieces this peer
|
// the number of pieces this peer
|
||||||
// has. Must be the same as
|
// has. Must be the same as
|
||||||
// std::count(m_have_piece.begin(),
|
// std::count(m_have_piece.begin(),
|
||||||
|
|
|
@ -143,6 +143,10 @@ namespace libtorrent
|
||||||
// for yet
|
// for yet
|
||||||
int download_queue_length;
|
int download_queue_length;
|
||||||
|
|
||||||
|
// the number of request messages
|
||||||
|
// waiting to be sent inside the send buffer
|
||||||
|
int requests_in_buffer;
|
||||||
|
|
||||||
// the number of requests that is
|
// the number of requests that is
|
||||||
// tried to be maintained (this is
|
// tried to be maintained (this is
|
||||||
// typically a function of download speed)
|
// typically a function of download speed)
|
||||||
|
|
|
@ -601,7 +601,7 @@ namespace libtorrent
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void bt_peer_connection::send_buffer(char* buf, int size)
|
void bt_peer_connection::send_buffer(char* buf, int size, int flags)
|
||||||
{
|
{
|
||||||
TORRENT_ASSERT(buf);
|
TORRENT_ASSERT(buf);
|
||||||
TORRENT_ASSERT(size > 0);
|
TORRENT_ASSERT(size > 0);
|
||||||
|
@ -609,7 +609,7 @@ namespace libtorrent
|
||||||
if (m_encrypted && m_rc4_encrypted)
|
if (m_encrypted && m_rc4_encrypted)
|
||||||
m_RC4_handler->encrypt(buf, size);
|
m_RC4_handler->encrypt(buf, size);
|
||||||
|
|
||||||
peer_connection::send_buffer(buf, size);
|
peer_connection::send_buffer(buf, size, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
buffer::interval bt_peer_connection::allocate_send_buffer(int size)
|
buffer::interval bt_peer_connection::allocate_send_buffer(int size)
|
||||||
|
@ -1405,7 +1405,7 @@ namespace libtorrent
|
||||||
detail::write_int32(r.piece, ptr); // index
|
detail::write_int32(r.piece, ptr); // index
|
||||||
detail::write_int32(r.start, ptr); // begin
|
detail::write_int32(r.start, ptr); // begin
|
||||||
detail::write_int32(r.length, ptr); // length
|
detail::write_int32(r.length, ptr); // length
|
||||||
send_buffer(msg, sizeof(msg));
|
send_buffer(msg, sizeof(msg), message_type_request);
|
||||||
}
|
}
|
||||||
|
|
||||||
void bt_peer_connection::write_bitfield()
|
void bt_peer_connection::write_bitfield()
|
||||||
|
|
|
@ -1542,8 +1542,8 @@ namespace libtorrent
|
||||||
|
|
||||||
#if defined TORRENT_VERBOSE_LOGGING || defined TORRENT_ERROR_LOGGING
|
#if defined TORRENT_VERBOSE_LOGGING || defined TORRENT_ERROR_LOGGING
|
||||||
(*m_logger) << time_now_string()
|
(*m_logger) << time_now_string()
|
||||||
<< " *** SKIPPED_PIECE [ piece: " << i->piece_index << " | "
|
<< " *** SKIPPED_PIECE [ piece: " << i->block.piece_index << " | "
|
||||||
"b: " << i->block_index << " ] ***\n";
|
"b: " << i->block.block_index << " ] ***\n";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
++i->skipped;
|
++i->skipped;
|
||||||
|
@ -2401,6 +2401,7 @@ namespace libtorrent
|
||||||
p.load_balancing = total_free_upload();
|
p.load_balancing = total_free_upload();
|
||||||
|
|
||||||
p.download_queue_length = int(download_queue().size() + m_request_queue.size());
|
p.download_queue_length = int(download_queue().size() + m_request_queue.size());
|
||||||
|
p.requests_in_buffer = int(m_requests_in_buffer.size());
|
||||||
p.target_dl_queue_length = int(desired_queue_size());
|
p.target_dl_queue_length = int(desired_queue_size());
|
||||||
p.upload_queue_length = int(upload_queue().size());
|
p.upload_queue_length = int(upload_queue().size());
|
||||||
|
|
||||||
|
@ -2955,15 +2956,16 @@ namespace libtorrent
|
||||||
TORRENT_ASSERT(t);
|
TORRENT_ASSERT(t);
|
||||||
if (m_bandwidth_limit[upload_channel].max_assignable() > 0)
|
if (m_bandwidth_limit[upload_channel].max_assignable() > 0)
|
||||||
{
|
{
|
||||||
#ifdef TORRENT_VERBOSE_LOGGING
|
int priority = is_interesting() * 2 + m_requests_in_buffer.size();
|
||||||
(*m_logger) << time_now_string() << " *** REQUEST_BANDWIDTH [ upload ]\n";
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// peers that we are not interested in are non-prioritized
|
// peers that we are not interested in are non-prioritized
|
||||||
m_channel_state[upload_channel] = peer_info::bw_torrent;
|
m_channel_state[upload_channel] = peer_info::bw_torrent;
|
||||||
t->request_bandwidth(upload_channel, self()
|
t->request_bandwidth(upload_channel, self()
|
||||||
, m_send_buffer.size()
|
, m_send_buffer.size(), priority);
|
||||||
, is_interesting() * 2);
|
#ifdef TORRENT_VERBOSE_LOGGING
|
||||||
|
(*m_logger) << time_now_string() << " *** REQUEST_BANDWIDTH [ upload prio: "
|
||||||
|
<< priority << "]\n";
|
||||||
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -3146,8 +3148,11 @@ namespace libtorrent
|
||||||
m_packet_size = packet_size;
|
m_packet_size = packet_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
void peer_connection::send_buffer(char const* buf, int size)
|
void peer_connection::send_buffer(char const* buf, int size, int flags)
|
||||||
{
|
{
|
||||||
|
if (flags == message_type_request)
|
||||||
|
m_requests_in_buffer.push_back(m_send_buffer.size() + size);
|
||||||
|
|
||||||
int free_space = m_send_buffer.space_in_last_buffer();
|
int free_space = m_send_buffer.space_in_last_buffer();
|
||||||
if (free_space > size) free_space = size;
|
if (free_space > size) free_space = size;
|
||||||
if (free_space > 0)
|
if (free_space > 0)
|
||||||
|
@ -3491,6 +3496,14 @@ namespace libtorrent
|
||||||
TORRENT_ASSERT(m_channel_state[upload_channel] == peer_info::bw_network);
|
TORRENT_ASSERT(m_channel_state[upload_channel] == peer_info::bw_network);
|
||||||
|
|
||||||
m_send_buffer.pop_front(bytes_transferred);
|
m_send_buffer.pop_front(bytes_transferred);
|
||||||
|
|
||||||
|
for (std::vector<int>::iterator i = m_requests_in_buffer.begin()
|
||||||
|
, end(m_requests_in_buffer.end()); i != end; ++i)
|
||||||
|
*i -= bytes_transferred;
|
||||||
|
|
||||||
|
while (!m_requests_in_buffer.empty()
|
||||||
|
&& m_requests_in_buffer.front() <= 0)
|
||||||
|
m_requests_in_buffer.erase(m_requests_in_buffer.begin());
|
||||||
|
|
||||||
m_channel_state[upload_channel] = peer_info::bw_idle;
|
m_channel_state[upload_channel] = peer_info::bw_idle;
|
||||||
|
|
||||||
|
|
|
@ -303,7 +303,7 @@ namespace libtorrent
|
||||||
(*m_logger) << request << "\n";
|
(*m_logger) << request << "\n";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
send_buffer(request.c_str(), request.size());
|
send_buffer(request.c_str(), request.size(), message_type_request);
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------
|
// --------------------------
|
||||||
|
|
Loading…
Reference in New Issue