From: Marcus Eggenberger Date: Mon, 21 Jul 2008 12:17:10 +0000 (+0200) Subject: fixing some inconsitency in the new connection loss detection... breaks protocol X-Git-Tag: 0.3.0~249 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=6fec875b14593ce6c83a9095fa5334afac6b6777 fixing some inconsitency in the new connection loss detection... breaks protocol --- diff --git a/src/common/signalproxy.cpp b/src/common/signalproxy.cpp index 9a3c5576..467041ee 100644 --- a/src/common/signalproxy.cpp +++ b/src/common/signalproxy.cpp @@ -33,6 +33,7 @@ #include #include #include +#include #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::iterator peerIter = _peers.begin(); QHash::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(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 ¶ms) { 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 ¶ms) { + 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(); + 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) diff --git a/src/common/signalproxy.h b/src/common/signalproxy.h index 557e8dd3..1c2d1da8 100644 --- a/src/common/signalproxy.h +++ b/src/common/signalproxy.h @@ -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 ¶ms); + void receiveHeartBeatReply(QIODevice *dev, const QVariantList ¶ms); + 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 _peerByteCount; diff --git a/version.inc b/version.inc index cb3734e0..fc1e0156 100644 --- a/version.inc +++ b/version.inc @@ -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