diff options
author | Robert Kiraly <oldcoder@yahoo.com> | 2016-06-03 00:50:21 -0700 |
---|---|---|
committer | Zeno- <kde.psych@gmail.com> | 2016-06-03 17:50:21 +1000 |
commit | 7ea4a03c835d68a6fb58aa55aa6a6315ec80b79f (patch) | |
tree | 86ff865549b31e61295b8f49b03b62fc334e5dd2 /src | |
parent | 569998011e0a9cb6179f1e79fb15b7a3ce80977f (diff) | |
download | minetest-7ea4a03c835d68a6fb58aa55aa6a6315ec80b79f.tar.gz minetest-7ea4a03c835d68a6fb58aa55aa6a6315ec80b79f.tar.bz2 minetest-7ea4a03c835d68a6fb58aa55aa6a6315ec80b79f.zip |
Sapier's fix for the RESEND RELIABLE problem (#4170)
Diffstat (limited to 'src')
-rw-r--r-- | src/network/connection.cpp | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/src/network/connection.cpp b/src/network/connection.cpp index 02c0aa165..b711cae11 100644 --- a/src/network/connection.cpp +++ b/src/network/connection.cpp @@ -71,6 +71,9 @@ static inline float CALC_DTIME(unsigned int lasttime, unsigned int curtime) { #define PING_TIMEOUT 5.0 +/* maximum number of retries for reliable packets */ +#define MAX_RELIABLE_RETRY 5 + static u16 readPeerId(u8 *packetdata) { return readU16(&packetdata[4]); @@ -1399,6 +1402,7 @@ void ConnectionSendThread::runTimeouts(float dtime) } float resend_timeout = dynamic_cast<UDPPeer*>(&peer)->getResendTimeout(); + bool retry_count_exceeded = false; for(u16 i=0; i<CHANNEL_COUNT; i++) { std::list<BufferedPacket> timed_outs; @@ -1438,6 +1442,13 @@ void ConnectionSendThread::runTimeouts(float dtime) channel->UpdateBytesLost(k->data.getSize()); k->resend_count++; + 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() <<"RE-SENDING timed-out RELIABLE to " << k->address.serializeString() @@ -1452,9 +1463,18 @@ void ConnectionSendThread::runTimeouts(float dtime) // do not handle rtt here as we can't decide if this packet was // 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,dynamic_cast<UDPPeer*>(&peer)->getLegacyPeer()); } + /* skip to next peer if we did timeout */ + if (retry_count_exceeded) + continue; + /* send ping if necessary */ if (dynamic_cast<UDPPeer*>(&peer)->Ping(dtime,data)) { LOG(dout_con<<m_connection->getDesc() |