tackeling 30 sec ping timeout issues
authorMarcus Eggenberger <egs@quassel-irc.org>
Tue, 10 Mar 2009 11:22:34 +0000 (12:22 +0100)
committerMarcus Eggenberger <egs@quassel-irc.org>
Tue, 10 Mar 2009 11:22:52 +0000 (12:22 +0100)
src/core/corenetwork.cpp
src/core/corenetwork.h

index a357044..dedd819 100644 (file)
@@ -41,6 +41,8 @@ CoreNetwork::CoreNetwork(const NetworkId &networkid, CoreSession *session)
     _lastUsedServerIndex(0),
 
     _lastPingTime(0),
     _lastUsedServerIndex(0),
 
     _lastPingTime(0),
+    _maxPingCount(3),
+    _pingCount(0),
 
     // TODO make autowho configurable (possibly per-network)
     _autoWhoEnabled(true),
 
     // TODO make autowho configurable (possibly per-network)
     _autoWhoEnabled(true),
@@ -516,13 +518,14 @@ void CoreNetwork::doAutoReconnect() {
 
 void CoreNetwork::sendPing() {
   uint now = QDateTime::currentDateTime().toTime_t();
 
 void CoreNetwork::sendPing() {
   uint now = QDateTime::currentDateTime().toTime_t();
-  if(_lastPingTime != 0 && now - _lastPingTime <= (uint)(_pingTimer.interval() / 1000) + 1) {
+  if(_pingCount >= _maxPingCount && now - _lastPingTime <= (uint)(_pingTimer.interval() / 1000) + 1) {
     // the second check compares the actual elapsed time since the last ping and the pingTimer interval
     // if the interval is shorter then the actual elapsed time it means that this thread was somehow blocked
     // and unable to even handle a ping answer. So we ignore those misses.
     // the second check compares the actual elapsed time since the last ping and the pingTimer interval
     // if the interval is shorter then the actual elapsed time it means that this thread was somehow blocked
     // and unable to even handle a ping answer. So we ignore those misses.
-    disconnectFromIrc(false, QString("No Ping reply in %1 seconds.").arg(_pingTimer.interval() / 1000), true /* withReconnect */);
+    disconnectFromIrc(false, QString("No Ping reply in %1 seconds.").arg(_maxPingCount * _pingTimer.interval() / 1000), true /* withReconnect */);
   } else {
     _lastPingTime = now;
   } else {
     _lastPingTime = now;
+    _pingCount++;
     userInputHandler()->handlePing(BufferInfo(), QString());
   }
 }
     userInputHandler()->handlePing(BufferInfo(), QString());
   }
 }
index c11aee8..0a07af9 100644 (file)
@@ -106,7 +106,7 @@ public slots:
 
   Server usedServer() const;
 
 
   Server usedServer() const;
 
-  inline void resetPingTimeout() { _lastPingTime = 0; }
+  inline void resetPingTimeout() { _pingCount = 0; }
 
 signals:
   void recvRawServerMsg(QString);
 
 signals:
   void recvRawServerMsg(QString);
@@ -178,6 +178,8 @@ private:
 
   QTimer _pingTimer;
   uint _lastPingTime;
 
   QTimer _pingTimer;
   uint _lastPingTime;
+  uint _maxPingCount;
+  uint _pingCount;
 
   bool _autoWhoEnabled;
   QStringList _autoWhoQueue;
 
   bool _autoWhoEnabled;
   QStringList _autoWhoQueue;