summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Kiraly <oldcoder@yahoo.com>2016-06-03 00:50:21 -0700
committerZeno- <kde.psych@gmail.com>2016-06-03 17:50:21 +1000
commit7ea4a03c835d68a6fb58aa55aa6a6315ec80b79f (patch)
tree86ff865549b31e61295b8f49b03b62fc334e5dd2
parent569998011e0a9cb6179f1e79fb15b7a3ce80977f (diff)
downloadminetest-7ea4a03c835d68a6fb58aa55aa6a6315ec80b79f.tar.gz
minetest-7ea4a03c835d68a6fb58aa55aa6a6315ec80b79f.tar.bz2
minetest-7ea4a03c835d68a6fb58aa55aa6a6315ec80b79f.zip
Sapier's fix for the RESEND RELIABLE problem (#4170)
-rw-r--r--src/network/connection.cpp20
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()