Revert RTT fixes ()

The reverted commit 968ce9af598024ec71e9ffb2d15c3997a13ad754
is suspected (through the use of bisection) of causing network slowdowns.
Revert for now as we are close to release.
This commit is contained in:
ANAND
2019-02-16 05:09:22 +05:30
committed by Paramat
parent 2153163cbd
commit 7a0e52acd6
5 changed files with 39 additions and 35 deletions

@ -459,7 +459,7 @@ void Client::step(float dtime)
counter = 0.0; counter = 0.0;
// connectedAndInitialized() is true, peer exists. // connectedAndInitialized() is true, peer exists.
float avg_rtt = getRTT(); float avg_rtt = getRTT();
infostream << "Client: average rtt: " << avg_rtt << std::endl; infostream << "Client: avg_rtt=" << avg_rtt << std::endl;
} }
/* /*
@ -1716,17 +1716,9 @@ void Client::afterContentReceived()
delete[] text; delete[] text;
} }
// returns the Round Trip Time
// if the RTT did not become updated within 2 seconds, e.g. before timing out,
// it returns the expired time instead
float Client::getRTT() float Client::getRTT()
{ {
float avg_rtt = m_con->getPeerStat(PEER_ID_SERVER, con::AVG_RTT); return m_con->getPeerStat(PEER_ID_SERVER,con::AVG_RTT);
float time_from_last_rtt =
m_con->getPeerStat(PEER_ID_SERVER, con::TIMEOUT_COUNTER);
if (avg_rtt + 2.0f > time_from_last_rtt)
return avg_rtt;
return time_from_last_rtt;
} }
float Client::getCurRate() float Client::getCurRate()

@ -809,9 +809,8 @@ void Peer::DecUseCount()
delete this; delete this;
} }
void Peer::RTTStatistics(float rtt, const std::string &profiler_id) void Peer::RTTStatistics(float rtt, const std::string &profiler_id,
{ unsigned int num_samples) {
static const float avg_factor = 100.0f / MAX_RELIABLE_WINDOW_SIZE;
if (m_last_rtt > 0) { if (m_last_rtt > 0) {
/* set min max values */ /* set min max values */
@ -824,12 +823,19 @@ void Peer::RTTStatistics(float rtt, const std::string &profiler_id)
if (m_rtt.avg_rtt < 0.0) if (m_rtt.avg_rtt < 0.0)
m_rtt.avg_rtt = rtt; m_rtt.avg_rtt = rtt;
else else
m_rtt.avg_rtt += (rtt - m_rtt.avg_rtt) * avg_factor; m_rtt.avg_rtt = m_rtt.avg_rtt * (num_samples/(num_samples-1)) +
rtt * (1/num_samples);
/* do jitter calculation */ /* do jitter calculation */
//just use some neutral value at beginning //just use some neutral value at beginning
float jitter = std::fabs(rtt - m_last_rtt); float jitter = m_rtt.jitter_min;
if (rtt > m_last_rtt)
jitter = rtt-m_last_rtt;
if (rtt <= m_last_rtt)
jitter = m_last_rtt - rtt;
if (jitter < m_rtt.jitter_min) if (jitter < m_rtt.jitter_min)
m_rtt.jitter_min = jitter; m_rtt.jitter_min = jitter;
@ -839,7 +845,8 @@ void Peer::RTTStatistics(float rtt, const std::string &profiler_id)
if (m_rtt.jitter_avg < 0.0) if (m_rtt.jitter_avg < 0.0)
m_rtt.jitter_avg = jitter; m_rtt.jitter_avg = jitter;
else else
m_rtt.jitter_avg += (jitter - m_rtt.jitter_avg) * avg_factor; m_rtt.jitter_avg = m_rtt.jitter_avg * (num_samples/(num_samples-1)) +
jitter * (1/num_samples);
if (!profiler_id.empty()) { if (!profiler_id.empty()) {
g_profiler->graphAdd(profiler_id + "_rtt", rtt); g_profiler->graphAdd(profiler_id + "_rtt", rtt);
@ -904,12 +911,16 @@ bool UDPPeer::getAddress(MTProtocols type,Address& toset)
void UDPPeer::reportRTT(float rtt) void UDPPeer::reportRTT(float rtt)
{ {
assert(rtt >= 0.0f); if (rtt < 0.0) {
return;
RTTStatistics(rtt, "rudp"); }
RTTStatistics(rtt,"rudp",MAX_RELIABLE_WINDOW_SIZE*10);
float timeout = getStat(AVG_RTT) * RESEND_TIMEOUT_FACTOR; float timeout = getStat(AVG_RTT) * RESEND_TIMEOUT_FACTOR;
timeout = rangelim(timeout, RESEND_TIMEOUT_MIN, RESEND_TIMEOUT_MAX); if (timeout < RESEND_TIMEOUT_MIN)
timeout = RESEND_TIMEOUT_MIN;
if (timeout > RESEND_TIMEOUT_MAX)
timeout = RESEND_TIMEOUT_MAX;
MutexAutoLock usage_lock(m_exclusive_access_mutex); MutexAutoLock usage_lock(m_exclusive_access_mutex);
resend_timeout = timeout; resend_timeout = timeout;

@ -581,15 +581,15 @@ class Peer {
return m_rtt.jitter_max; return m_rtt.jitter_max;
case AVG_JITTER: case AVG_JITTER:
return m_rtt.jitter_avg; return m_rtt.jitter_avg;
case TIMEOUT_COUNTER:
return m_timeout_counter;
} }
return -1; return -1;
} }
protected: protected:
virtual void reportRTT(float rtt) {}; virtual void reportRTT(float rtt) {};
void RTTStatistics(float rtt, const std::string &profiler_id = ""); void RTTStatistics(float rtt,
const std::string &profiler_id = "",
unsigned int num_samples = 1000);
bool IncUseCount(); bool IncUseCount();
void DecUseCount(); void DecUseCount();

@ -1155,17 +1155,19 @@ SharedBuffer<u8> ConnectionReceiveThread::handlePacketType_Control(Channel *chan
// a overflow is quite unlikely but as it'd result in major // a overflow is quite unlikely but as it'd result in major
// rtt miscalculation we handle it here // rtt miscalculation we handle it here
float rtt = 0.0f;
if (current_time > p.absolute_send_time) { if (current_time > p.absolute_send_time) {
rtt = (current_time - p.absolute_send_time) / 1000.0f; float rtt = (current_time - p.absolute_send_time) / 1000.0;
} else if (p.totaltime > 0) {
rtt = p.totaltime;
}
// Let peer calculate stuff according to it // Let peer calculate stuff according to it
// (avg_rtt and resend_timeout) // (avg_rtt and resend_timeout)
if (rtt != 0.0f)
dynamic_cast<UDPPeer *>(peer)->reportRTT(rtt); dynamic_cast<UDPPeer *>(peer)->reportRTT(rtt);
} else if (p.totaltime > 0) {
float rtt = p.totaltime;
// Let peer calculate stuff according to it
// (avg_rtt and resend_timeout)
dynamic_cast<UDPPeer *>(peer)->reportRTT(rtt);
}
} }
// put bytes for max bandwidth calculation // put bytes for max bandwidth calculation
channel->UpdateBytesSent(p.data.getSize(), 1); channel->UpdateBytesSent(p.data.getSize(), 1);

@ -30,8 +30,7 @@ typedef enum {
AVG_RTT, AVG_RTT,
MIN_JITTER, MIN_JITTER,
MAX_JITTER, MAX_JITTER,
AVG_JITTER, AVG_JITTER
TIMEOUT_COUNTER
} rtt_stat_type; } rtt_stat_type;
class Peer; class Peer;