Don't send WHO if we haven't received a reply for the last one yet
authorManuel Nickschas <sputnick@quassel-irc.org>
Sat, 14 Feb 2009 16:03:30 +0000 (17:03 +0100)
committerManuel Nickschas <sputnick@quassel-irc.org>
Sat, 14 Feb 2009 16:03:30 +0000 (17:03 +0100)
Before, we would send WHO in regular intervals even if no reply came back yet.
I suspect this, together with network issues, could be the reason for SendQ Exceeded
and similar issues.
Note that if we miss an ENDWHO reply now somehow, we won't ever send WHO again. I hope
this cannot happen.

src/core/corenetwork.cpp
src/core/corenetwork.h

index 32888ec..a357044 100644 (file)
@@ -46,7 +46,7 @@ CoreNetwork::CoreNetwork(const NetworkId &networkid, CoreSession *session)
     _autoWhoEnabled(true),
     _autoWhoInterval(90),
     _autoWhoNickLimit(0), // unlimited
     _autoWhoEnabled(true),
     _autoWhoInterval(90),
     _autoWhoNickLimit(0), // unlimited
-    _autoWhoDelay(3)
+    _autoWhoDelay(5)
 {
   _autoReconnectTimer.setSingleShot(true);
   _socketCloseTimer.setSingleShot(true);
 {
   _autoReconnectTimer.setSingleShot(true);
   _socketCloseTimer.setSingleShot(true);
@@ -257,7 +257,7 @@ void CoreNetwork::setChannelJoined(const QString &channel) {
 void CoreNetwork::setChannelParted(const QString &channel) {
   removeChannelKey(channel);
   _autoWhoQueue.removeAll(channel.toLower());
 void CoreNetwork::setChannelParted(const QString &channel) {
   removeChannelKey(channel);
   _autoWhoQueue.removeAll(channel.toLower());
-  _autoWhoInProgress.remove(channel.toLower());
+  _autoWhoPending.remove(channel.toLower());
 
   Core::setChannelPersistent(userId(), networkId(), channel, false);
 }
 
   Core::setChannelPersistent(userId(), networkId(), channel, false);
 }
@@ -275,9 +275,11 @@ void CoreNetwork::removeChannelKey(const QString &channel) {
 }
 
 bool CoreNetwork::setAutoWhoDone(const QString &channel) {
 }
 
 bool CoreNetwork::setAutoWhoDone(const QString &channel) {
-  if(_autoWhoInProgress.value(channel.toLower(), 0) <= 0)
+  QString chan = channel.toLower();
+  if(_autoWhoPending.value(chan, 0) <= 0)
     return false;
     return false;
-  _autoWhoInProgress[channel.toLower()]--;
+  if(--_autoWhoPending[chan] <= 0)
+    _autoWhoPending.remove(chan);
   return true;
 }
 
   return true;
 }
 
@@ -341,7 +343,7 @@ void CoreNetwork::socketDisconnected() {
   _autoWhoCycleTimer.stop();
   _autoWhoTimer.stop();
   _autoWhoQueue.clear();
   _autoWhoCycleTimer.stop();
   _autoWhoTimer.stop();
   _autoWhoQueue.clear();
-  _autoWhoInProgress.clear();
+  _autoWhoPending.clear();
 
   _socketCloseTimer.stop();
 
 
   _socketCloseTimer.stop();
 
@@ -536,12 +538,16 @@ void CoreNetwork::disablePingTimeout() {
 }
 
 void CoreNetwork::sendAutoWho() {
 }
 
 void CoreNetwork::sendAutoWho() {
+  // Don't send autowho if there are still some pending
+  if(_autoWhoPending.count())
+    return;
+
   while(!_autoWhoQueue.isEmpty()) {
     QString chan = _autoWhoQueue.takeFirst();
     IrcChannel *ircchan = ircChannel(chan);
     if(!ircchan) continue;
     if(_autoWhoNickLimit > 0 && ircchan->ircUsers().count() > _autoWhoNickLimit) continue;
   while(!_autoWhoQueue.isEmpty()) {
     QString chan = _autoWhoQueue.takeFirst();
     IrcChannel *ircchan = ircChannel(chan);
     if(!ircchan) continue;
     if(_autoWhoNickLimit > 0 && ircchan->ircUsers().count() > _autoWhoNickLimit) continue;
-    _autoWhoInProgress[chan]++;
+    _autoWhoPending[chan]++;
     putRawLine("WHO " + serverEncode(chan));
     if(_autoWhoQueue.isEmpty() && _autoWhoEnabled && !_autoWhoCycleTimer.isActive()) {
       // Timer was stopped, means a new cycle is due immediately
     putRawLine("WHO " + serverEncode(chan));
     if(_autoWhoQueue.isEmpty() && _autoWhoEnabled && !_autoWhoCycleTimer.isActive()) {
       // Timer was stopped, means a new cycle is due immediately
index 42ad12d..c11aee8 100644 (file)
@@ -75,7 +75,7 @@ public:
 
   inline QString channelKey(const QString &channel) const { return _channelKeys.value(channel.toLower(), QString()); }
 
 
   inline QString channelKey(const QString &channel) const { return _channelKeys.value(channel.toLower(), QString()); }
 
-  inline bool isAutoWhoInProgress(const QString &channel) const { return _autoWhoInProgress.value(channel.toLower(), 0); }
+  inline bool isAutoWhoInProgress(const QString &channel) const { return _autoWhoPending.value(channel.toLower(), 0); }
 
   inline UserId userId() const { return _coreSession->user(); }
 
 
   inline UserId userId() const { return _coreSession->user(); }
 
@@ -181,7 +181,7 @@ private:
 
   bool _autoWhoEnabled;
   QStringList _autoWhoQueue;
 
   bool _autoWhoEnabled;
   QStringList _autoWhoQueue;
-  QHash<QString, int> _autoWhoInProgress;
+  QHash<QString, int> _autoWhoPending;
   int _autoWhoInterval;
   int _autoWhoNickLimit;
   int _autoWhoDelay;
   int _autoWhoInterval;
   int _autoWhoNickLimit;
   int _autoWhoDelay;