Fix network state reporting in server and client.

This commit is contained in:
Arthur Britto
2012-12-14 16:34:11 -08:00
parent 5b60c73489
commit f93dc7a7b4
4 changed files with 40 additions and 28 deletions

View File

@@ -33,6 +33,18 @@ NetworkOPs::NetworkOPs(boost::asio::io_service& io_service, LedgerMaster* pLedge
{
}
std::string NetworkOPs::strOperatingMode()
{
static const char* paStatusToken[] = {
"disconnected",
"connected",
"tracking",
"full"
};
return paStatusToken[mMode];
}
boost::posix_time::ptime NetworkOPs::getNetworkTimePT()
{
int offset = 0;
@@ -871,17 +883,12 @@ void NetworkOPs::setMode(OperatingMode om)
if ((om >= omCONNECTED) && (mMode == omDISCONNECTED))
mConnectTime = boost::posix_time::second_clock::universal_time();
Log lg((om < mMode) ? lsWARNING : lsINFO);
if (om == omDISCONNECTED)
lg << "STATE->Disconnected";
else if (om == omCONNECTED)
lg << "STATE->Connected";
else if (om == omTRACKING)
lg << "STATE->Tracking";
else
lg << "STATE->Full";
mMode = om;
Log lg((om < mMode) ? lsWARNING : lsINFO);
lg << "STATE->" << strOperatingMode();
if ((om == omDISCONNECTED) || (mMode == omDISCONNECTED))
{
boost::recursive_mutex::scoped_lock sl(mMonitorLock);
@@ -890,7 +897,7 @@ void NetworkOPs::setMode(OperatingMode om)
Json::Value jvObj(Json::objectValue);
jvObj["type"] = "serverStatus";
jvObj["server_status"] = om >= omCONNECTED ? "ok" : "noNetwork";
jvObj["server_status"] = strOperatingMode();
BOOST_FOREACH(InfoSub* ispListener, mSubServer)
{
@@ -898,8 +905,6 @@ void NetworkOPs::setMode(OperatingMode om)
}
}
}
mMode = om;
}

View File

@@ -124,10 +124,7 @@ public:
uint32 getLedgerID(const uint256& hash);
uint32 getCurrentLedgerID();
OperatingMode getOperatingMode() { return mMode; }
inline bool available() {
// XXX Later this can be relaxed to omCONNECTED
return mMode >= omTRACKING;
}
std::string strOperatingMode();
Ledger::pointer getClosedLedger() { return mLedgerMaster->getClosedLedger(); }
Ledger::pointer getCurrentLedger() { return mLedgerMaster->getCurrentLedger(); }

View File

@@ -2101,21 +2101,24 @@ Json::Value RPCHandler::doSubscribe(Json::Value jvRequest)
if(streamName=="server")
{
mNetOps->subServer(mInfoSub, jvResult);
jvResult["server_status"] = mNetOps->available() ? "ok" : "noNetwork";
}else if(streamName=="ledger")
jvResult["server_status"] = mNetOps->strOperatingMode();
} else if(streamName=="ledger")
{
mNetOps->subLedger(mInfoSub, jvResult);
}else if(streamName=="transactions")
} else if(streamName=="transactions")
{
mNetOps->subTransactions(mInfoSub);
}else if(streamName=="rt_transactions")
} else if(streamName=="rt_transactions")
{
mNetOps->subRTTransactions(mInfoSub);
}else
{
}
else {
jvResult["error"] = str(boost::format("Unknown stream: %s") % streamName);
}
}else
} else
{
jvResult["error"] = "malformedSteam";
}
@@ -2362,7 +2365,9 @@ Json::Value RPCHandler::doCommand(Json::Value& jvRequest, int iRole)
{
return rpcError(rpcNO_EVENTS);
}
else if ((commandsA[i].iOptions & optNetwork) && !mNetOps->available())
else if (commandsA[i].iOptions & optNetwork
&& mNetOps->getOperatingMode() != NetworkOPs::omTRACKING
&& mNetOps->getOperatingMode() != NetworkOPs::omFULL)
{
return rpcError(rpcNO_NETWORK);
}

View File

@@ -289,6 +289,7 @@ Remote.prototype._set_state = function (state) {
this.state = state;
this.emit('state', state);
switch (state) {
case 'online':
this.online_state = 'open';
@@ -499,7 +500,11 @@ Remote.prototype._connect_message = function (ws, json) {
break;
case 'serverStatus':
this._set_state(message.server_status === 'ok' ? 'online' : 'offline');
// This message is only received when online. As we are connected, it is the definative final state.
this._set_state(
message.server_status === 'tracking' || message.server_status === 'full'
? 'online'
: 'offline');
break;
// All other messages
@@ -861,7 +866,7 @@ Remote.prototype._server_subscribe = function () {
self.emit('ledger_closed', message);
}
if (message.server_status === "ok") {
if (message.server_status === 'tracking' || message.server_status === 'full') {
self._set_state('online');
}