mirror of
https://github.com/minetest/minetest.git
synced 2024-11-23 08:03:45 +01:00
Remove broken timeout behaviour
Code that relies on `resend_count` was added in 7ea4a03 and 247a1eb, but never worked. This was fixed in #11607 which caused the problem to surface. Hence undo the first commit entirely and change the logic of the second.
This commit is contained in:
parent
6ea558f8ac
commit
fe5cb2cdfb
@ -48,9 +48,6 @@ std::mutex log_conthread_mutex;
|
|||||||
#undef DEBUG_CONNECTION_KBPS
|
#undef DEBUG_CONNECTION_KBPS
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* maximum number of retries for reliable packets */
|
|
||||||
#define MAX_RELIABLE_RETRY 5
|
|
||||||
|
|
||||||
#define WINDOW_SIZE 5
|
#define WINDOW_SIZE 5
|
||||||
|
|
||||||
static session_t readPeerId(u8 *packetdata)
|
static session_t readPeerId(u8 *packetdata)
|
||||||
@ -212,7 +209,6 @@ void ConnectionSendThread::runTimeouts(float dtime)
|
|||||||
}
|
}
|
||||||
|
|
||||||
float resend_timeout = udpPeer->getResendTimeout();
|
float resend_timeout = udpPeer->getResendTimeout();
|
||||||
bool retry_count_exceeded = false;
|
|
||||||
for (Channel &channel : udpPeer->channels) {
|
for (Channel &channel : udpPeer->channels) {
|
||||||
|
|
||||||
// Remove timed out incomplete unreliable split packets
|
// Remove timed out incomplete unreliable split packets
|
||||||
@ -231,24 +227,16 @@ void ConnectionSendThread::runTimeouts(float dtime)
|
|||||||
m_iteration_packets_avaialble -= timed_outs.size();
|
m_iteration_packets_avaialble -= timed_outs.size();
|
||||||
|
|
||||||
for (const auto &k : timed_outs) {
|
for (const auto &k : timed_outs) {
|
||||||
session_t peer_id = readPeerId(*k.data);
|
|
||||||
u8 channelnum = readChannel(*k.data);
|
u8 channelnum = readChannel(*k.data);
|
||||||
u16 seqnum = readU16(&(k.data[BASE_HEADER_SIZE + 1]));
|
u16 seqnum = readU16(&(k.data[BASE_HEADER_SIZE + 1]));
|
||||||
|
|
||||||
channel.UpdateBytesLost(k.data.getSize());
|
channel.UpdateBytesLost(k.data.getSize());
|
||||||
|
|
||||||
if (k.resend_count > MAX_RELIABLE_RETRY) {
|
|
||||||
retry_count_exceeded = true;
|
|
||||||
timeouted_peers.push_back(peer->id);
|
|
||||||
/* no need to check additional packets if a single one did timeout*/
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
LOG(derr_con << m_connection->getDesc()
|
LOG(derr_con << m_connection->getDesc()
|
||||||
<< "RE-SENDING timed-out RELIABLE to "
|
<< "RE-SENDING timed-out RELIABLE to "
|
||||||
<< k.address.serializeString()
|
<< k.address.serializeString()
|
||||||
<< "(t/o=" << resend_timeout << "): "
|
<< "(t/o=" << resend_timeout << "): "
|
||||||
<< "from_peer_id=" << peer_id
|
<< "count=" << k.resend_count
|
||||||
<< ", channel=" << ((int) channelnum & 0xff)
|
<< ", channel=" << ((int) channelnum & 0xff)
|
||||||
<< ", seqnum=" << seqnum
|
<< ", seqnum=" << seqnum
|
||||||
<< std::endl);
|
<< std::endl);
|
||||||
@ -259,17 +247,9 @@ void ConnectionSendThread::runTimeouts(float dtime)
|
|||||||
// lost or really takes more time to transmit
|
// lost or really takes more time to transmit
|
||||||
}
|
}
|
||||||
|
|
||||||
if (retry_count_exceeded) {
|
|
||||||
break; /* no need to check other channels if we already did timeout */
|
|
||||||
}
|
|
||||||
|
|
||||||
channel.UpdateTimers(dtime);
|
channel.UpdateTimers(dtime);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* skip to next peer if we did timeout */
|
|
||||||
if (retry_count_exceeded)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
/* send ping if necessary */
|
/* send ping if necessary */
|
||||||
if (udpPeer->Ping(dtime, data)) {
|
if (udpPeer->Ping(dtime, data)) {
|
||||||
LOG(dout_con << m_connection->getDesc()
|
LOG(dout_con << m_connection->getDesc()
|
||||||
@ -1153,8 +1133,8 @@ SharedBuffer<u8> ConnectionReceiveThread::handlePacketType_Control(Channel *chan
|
|||||||
try {
|
try {
|
||||||
BufferedPacket p = channel->outgoing_reliables_sent.popSeqnum(seqnum);
|
BufferedPacket p = channel->outgoing_reliables_sent.popSeqnum(seqnum);
|
||||||
|
|
||||||
// only calculate rtt from straight sent packets
|
// the rtt calculation will be a bit off for re-sent packets but that's okay
|
||||||
if (p.resend_count == 0) {
|
{
|
||||||
// Get round trip time
|
// Get round trip time
|
||||||
u64 current_time = porting::getTimeMs();
|
u64 current_time = porting::getTimeMs();
|
||||||
|
|
||||||
@ -1174,6 +1154,7 @@ SharedBuffer<u8> ConnectionReceiveThread::handlePacketType_Control(Channel *chan
|
|||||||
dynamic_cast<UDPPeer *>(peer)->reportRTT(rtt);
|
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);
|
||||||
if (channel->outgoing_reliables_sent.size() == 0)
|
if (channel->outgoing_reliables_sent.size() == 0)
|
||||||
|
Loading…
Reference in New Issue
Block a user