Implemented auto-reconnect for portgroups
This commit is contained in:
parent
b5909e5e41
commit
7b673a0d57
@ -56,8 +56,6 @@ MainWindow::MainWindow(QWidget *parent)
|
|||||||
localServer_ = new QProcess(this);
|
localServer_ = new QProcess(this);
|
||||||
localServer_->setProcessChannelMode(QProcess::ForwardedChannels);
|
localServer_->setProcessChannelMode(QProcess::ForwardedChannels);
|
||||||
localServer_->start(serverApp, QStringList());
|
localServer_->start(serverApp, QStringList());
|
||||||
// TODO: waitForReadyRead() is a kludge till we implement auto-retry!
|
|
||||||
localServer_->waitForReadyRead(1000);
|
|
||||||
|
|
||||||
pgl = new PortGroupList;
|
pgl = new PortGroupList;
|
||||||
|
|
||||||
|
@ -27,6 +27,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
|
|||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
#include <QProcess>
|
#include <QProcess>
|
||||||
#include <QTemporaryFile>
|
#include <QTemporaryFile>
|
||||||
|
#include <QTimer>
|
||||||
#include <QtGlobal>
|
#include <QtGlobal>
|
||||||
|
|
||||||
using ::google::protobuf::NewCallback;
|
using ::google::protobuf::NewCallback;
|
||||||
@ -46,6 +47,13 @@ PortGroup::PortGroup(QHostAddress ip, quint16 port)
|
|||||||
statsController = new PbRpcController(portIdList_, portStatsList_);
|
statsController = new PbRpcController(portIdList_, portStatsList_);
|
||||||
isGetStatsPending_ = false;
|
isGetStatsPending_ = false;
|
||||||
|
|
||||||
|
reconnect = false;
|
||||||
|
reconnectAfter = kMinReconnectWaitTime;
|
||||||
|
reconnectTimer = new QTimer(this);
|
||||||
|
reconnectTimer->setSingleShot(true);
|
||||||
|
connect(reconnectTimer, SIGNAL(timeout()),
|
||||||
|
this, SLOT(on_reconnectTimer_timeout()));
|
||||||
|
|
||||||
rpcChannel = new PbRpcChannel(ip, port);
|
rpcChannel = new PbRpcChannel(ip, port);
|
||||||
serviceStub = new OstProto::OstService::Stub(rpcChannel);
|
serviceStub = new OstProto::OstService::Stub(rpcChannel);
|
||||||
|
|
||||||
@ -75,6 +83,15 @@ PortGroup::~PortGroup()
|
|||||||
// ------------------------------------------------
|
// ------------------------------------------------
|
||||||
// Slots
|
// Slots
|
||||||
// ------------------------------------------------
|
// ------------------------------------------------
|
||||||
|
void PortGroup::on_reconnectTimer_timeout()
|
||||||
|
{
|
||||||
|
reconnectAfter *= 2;
|
||||||
|
if (reconnectAfter > kMaxReconnectWaitTime)
|
||||||
|
reconnectAfter = kMaxReconnectWaitTime;
|
||||||
|
|
||||||
|
connectToHost();
|
||||||
|
}
|
||||||
|
|
||||||
void PortGroup::on_rpcChannel_stateChanged(QAbstractSocket::SocketState state)
|
void PortGroup::on_rpcChannel_stateChanged(QAbstractSocket::SocketState state)
|
||||||
{
|
{
|
||||||
qDebug("state changed %d", state);
|
qDebug("state changed %d", state);
|
||||||
@ -98,6 +115,8 @@ void PortGroup::on_rpcChannel_connected()
|
|||||||
qDebug("connected\n");
|
qDebug("connected\n");
|
||||||
emit portGroupDataChanged(mPortGroupId);
|
emit portGroupDataChanged(mPortGroupId);
|
||||||
|
|
||||||
|
reconnectAfter = kMinReconnectWaitTime;
|
||||||
|
|
||||||
qDebug("requesting portlist ...");
|
qDebug("requesting portlist ...");
|
||||||
|
|
||||||
PbRpcController *controller = new PbRpcController(void_, portIdList);
|
PbRpcController *controller = new PbRpcController(void_, portIdList);
|
||||||
@ -115,12 +134,25 @@ void PortGroup::on_rpcChannel_disconnected()
|
|||||||
|
|
||||||
emit portListChanged(mPortGroupId);
|
emit portListChanged(mPortGroupId);
|
||||||
emit portGroupDataChanged(mPortGroupId);
|
emit portGroupDataChanged(mPortGroupId);
|
||||||
|
|
||||||
|
if (reconnect)
|
||||||
|
{
|
||||||
|
qDebug("starting reconnect timer for %d ms ...", reconnectAfter);
|
||||||
|
reconnectTimer->start(reconnectAfter);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void PortGroup::on_rpcChannel_error(QAbstractSocket::SocketError socketError)
|
void PortGroup::on_rpcChannel_error(QAbstractSocket::SocketError socketError)
|
||||||
{
|
{
|
||||||
qDebug("%s: error %d", __FUNCTION__, socketError);
|
qDebug("%s: error %d", __FUNCTION__, socketError);
|
||||||
emit portGroupDataChanged(mPortGroupId);
|
emit portGroupDataChanged(mPortGroupId);
|
||||||
|
|
||||||
|
qDebug("%s: state %d", __FUNCTION__, rpcChannel->state());
|
||||||
|
if ((rpcChannel->state() == QAbstractSocket::UnconnectedState) && reconnect)
|
||||||
|
{
|
||||||
|
qDebug("starting reconnect timer for %d ms...", reconnectAfter);
|
||||||
|
reconnectTimer->start(reconnectAfter);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void PortGroup::processPortIdList(PbRpcController *controller)
|
void PortGroup::processPortIdList(PbRpcController *controller)
|
||||||
|
@ -37,6 +37,7 @@ LOW
|
|||||||
#define DEFAULT_SERVER_PORT 7878
|
#define DEFAULT_SERVER_PORT 7878
|
||||||
|
|
||||||
class QFile;
|
class QFile;
|
||||||
|
class QTimer;
|
||||||
|
|
||||||
class PortGroup : public QObject {
|
class PortGroup : public QObject {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
@ -46,6 +47,11 @@ private:
|
|||||||
quint32 mPortGroupId;
|
quint32 mPortGroupId;
|
||||||
QString mUserAlias; // user defined
|
QString mUserAlias; // user defined
|
||||||
|
|
||||||
|
bool reconnect;
|
||||||
|
int reconnectAfter; // time in milliseconds
|
||||||
|
static const int kMinReconnectWaitTime = 2000; // ms
|
||||||
|
static const int kMaxReconnectWaitTime = 60000; // ms
|
||||||
|
QTimer *reconnectTimer;
|
||||||
PbRpcChannel *rpcChannel;
|
PbRpcChannel *rpcChannel;
|
||||||
PbRpcController *statsController;
|
PbRpcController *statsController;
|
||||||
bool isGetStatsPending_;
|
bool isGetStatsPending_;
|
||||||
@ -63,10 +69,10 @@ public:
|
|||||||
quint16 port = DEFAULT_SERVER_PORT);
|
quint16 port = DEFAULT_SERVER_PORT);
|
||||||
~PortGroup();
|
~PortGroup();
|
||||||
|
|
||||||
void connectToHost() { rpcChannel->establish(); }
|
void connectToHost() { reconnect = true; rpcChannel->establish(); }
|
||||||
void connectToHost(QHostAddress ip, quint16 port)
|
void connectToHost(QHostAddress ip, quint16 port)
|
||||||
{ rpcChannel->establish(ip, port); }
|
{ reconnect = true; rpcChannel->establish(ip, port); }
|
||||||
void disconnectFromHost() { rpcChannel->tearDown(); }
|
void disconnectFromHost() { reconnect = false; rpcChannel->tearDown(); }
|
||||||
|
|
||||||
int numPorts() const { return mPorts.size(); }
|
int numPorts() const { return mPorts.size(); }
|
||||||
quint32 id() const { return mPortGroupId; }
|
quint32 id() const { return mPortGroupId; }
|
||||||
@ -123,6 +129,7 @@ signals:
|
|||||||
void statsChanged(quint32 portGroupId);
|
void statsChanged(quint32 portGroupId);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
void on_reconnectTimer_timeout();
|
||||||
void on_rpcChannel_stateChanged(QAbstractSocket::SocketState state);
|
void on_rpcChannel_stateChanged(QAbstractSocket::SocketState state);
|
||||||
void on_rpcChannel_connected();
|
void on_rpcChannel_connected();
|
||||||
void on_rpcChannel_disconnected();
|
void on_rpcChannel_disconnected();
|
||||||
|
Loading…
Reference in New Issue
Block a user