fixing some inconsitency in the new connection loss detection... breaks protocol
authorMarcus Eggenberger <egs@quassel-irc.org>
Mon, 21 Jul 2008 12:17:10 +0000 (14:17 +0200)
committerMarcus Eggenberger <egs@quassel-irc.org>
Mon, 21 Jul 2008 12:17:10 +0000 (14:17 +0200)
src/common/signalproxy.cpp
src/common/signalproxy.h
version.inc

index 9a3c557..467041e 100644 (file)
@@ -33,6 +33,7 @@
 #include <QMetaProperty>
 #include <QRegExp>
 #include <QThread>
+#include <QTime>
 
 #include "syncableobject.h"
 #include "util.h"
@@ -235,10 +236,6 @@ void SignalProxy::setProxyMode(ProxyMode mode) {
     initClient();
 }
 
-SignalProxy::ProxyMode SignalProxy::proxyMode() const {
-  return _proxyMode;
-}
-
 void SignalProxy::init() {
   connect(&_heartBeatTimer, SIGNAL(timeout()), this, SLOT(sendHeartBeat()));
   _heartBeatTimer.start(30 * 1000);
@@ -722,9 +719,13 @@ void SignalProxy::receivePeerSignal(QIODevice *sender, const QVariant &packedFun
     break;
     
   case HeartBeat:
-    receiveHeartBeat(sender);
+    receiveHeartBeat(sender, params);
     break;
-    
+
+  case HeartBeatReply:
+    receiveHeartBeatReply(sender, params);
+    break;
+
   default:
     qWarning() << "SignalProxy::receivePeerSignal(): received undefined CallType" << callType << params;
   }
@@ -1035,10 +1036,13 @@ void SignalProxy::setInitData(SyncableObject *obj, const QVariantMap &properties
 }
 
 void SignalProxy::sendHeartBeat() {
-  dispatchSignal(SignalProxy::HeartBeat, QVariantList());
+  dispatchSignal(SignalProxy::HeartBeat, QVariantList() << QTime::currentTime());
   QHash<QIODevice *, peerInfo>::iterator peerIter = _peers.begin();
   QHash<QIODevice *, peerInfo>::iterator peerIterEnd = _peers.end();
   while(peerIter != peerIterEnd) {
+    if(peerIter->sentHeartBeats > 0) {
+      updateLag(peerIter.key(), (float)_heartBeatTimer.interval());
+    }
     if(peerIter->sentHeartBeats > 1) {
       QAbstractSocket *socket = qobject_cast<QAbstractSocket *>(peerIter.key());
       qWarning() << "SignalProxy: Disconnecting peer:"
@@ -1052,15 +1056,40 @@ void SignalProxy::sendHeartBeat() {
   }
 }
 
-void SignalProxy::receiveHeartBeat(QIODevice *dev) {
+void SignalProxy::receiveHeartBeat(QIODevice *dev, const QVariantList &params) {
   if(!_peers.contains(dev)) {
     qWarning() << "SignalProxy: received heart beat from unknown Device:" << dev;
+  }
+  dispatchSignal(dev, SignalProxy::HeartBeatReply, params);
+}
+
+void SignalProxy::receiveHeartBeatReply(QIODevice *dev, const QVariantList &params) {
+  if(!_peers.contains(dev)) {
+    qWarning() << "SignalProxy: received heart beat reply from unknown Device:" << dev;
     return;
   }
 
   _peers[dev].sentHeartBeats = 0;
+
+  if(params.isEmpty()) {
+    qWarning() << "SignalProxy: received heart beat reply with less params then sent from:" << dev;
+    return;
+  }
+  
+  QTime sendTime = params[0].value<QTime>();
+  updateLag(dev, (float)sendTime.msecsTo(QTime::currentTime()) / 2);
 }
 
+void SignalProxy::updateLag(QIODevice *dev, float lag) {
+  Q_ASSERT(_peers.contains(dev));
+  _peers[dev].lag = lag;
+  if(proxyMode() == Client) {
+    qDebug() << "LAG" << lag;
+    emit lagUpdated(lag);
+  }
+}
+
+
 void SignalProxy::dumpProxyStats() {
   QString mode;
   if(proxyMode() == Server)
index 557e8dd..1c2d1da 100644 (file)
@@ -48,7 +48,8 @@ public:
     RpcCall,
     InitRequest,
     InitData,
-    HeartBeat
+    HeartBeat,
+    HeartBeatReply
   };
 
   SignalProxy(QObject *parent);
@@ -57,7 +58,7 @@ public:
   virtual ~SignalProxy();
 
   void setProxyMode(ProxyMode mode);
-  ProxyMode proxyMode() const;
+  inline ProxyMode proxyMode() const { return _proxyMode; }
 
   bool addPeer(QIODevice *iodev);
   void removePeer(QIODevice *iodev = 0);
@@ -120,13 +121,15 @@ private slots:
   void objectRenamed(const QString &newname, const QString &oldname);
   void objectRenamed(const QByteArray &classname, const QString &newname, const QString &oldname);
   void sendHeartBeat();
-  void receiveHeartBeat(QIODevice *dev);
-
+  void receiveHeartBeat(QIODevice *dev, const QVariantList &params);
+  void receiveHeartBeatReply(QIODevice *dev, const QVariantList &params);
+  
 signals:
   void peerRemoved(QIODevice *dev);
   void connected();
   void disconnected();
   void objectInitialized(SyncableObject *);
+  void lagUpdated(int lag);
   
 private:
   void init();
@@ -160,6 +163,8 @@ private:
   QVariantMap initData(SyncableObject *obj) const;
   void setInitData(SyncableObject *obj, const QVariantMap &properties);
 
+  void updateLag(QIODevice *dev, float lag);
+
 public:
   void dumpSyncMap(SyncableObject *object);
   inline int peerCount() const { return _peers.size(); }
@@ -170,6 +175,7 @@ private:
     quint32 byteCount;
     bool usesCompression;
     int sentHeartBeats;
+    float lag;
     peerInfo() : byteCount(0), usesCompression(false), sentHeartBeats(0) {}
   };
   //QHash<QIODevice*, peerInfo> _peerByteCount;
index cb3734e..fc1e015 100644 (file)
@@ -3,7 +3,7 @@
 
 //! This is the fallback version number in case we can't autogenerate one
 quasselBaseVersion = "0.3.0-pre";
-protocolVersion = 3;       //< Version of the client/core protocol
+protocolVersion = 4;       //< Version of the client/core protocol
 
-coreNeedsProtocol   = 3;   //< Minimum protocol version the core needs
-clientNeedsProtocol = 3;   //< Minimum protocol version the client needs
+coreNeedsProtocol   = 4;   //< Minimum protocol version the core needs
+clientNeedsProtocol = 4;   //< Minimum protocol version the client needs