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() boost::posix_time::ptime NetworkOPs::getNetworkTimePT()
{ {
int offset = 0; int offset = 0;
@@ -871,17 +883,12 @@ void NetworkOPs::setMode(OperatingMode om)
if ((om >= omCONNECTED) && (mMode == omDISCONNECTED)) if ((om >= omCONNECTED) && (mMode == omDISCONNECTED))
mConnectTime = boost::posix_time::second_clock::universal_time(); mConnectTime = boost::posix_time::second_clock::universal_time();
Log lg((om < mMode) ? lsWARNING : lsINFO); mMode = om;
if (om == omDISCONNECTED)
lg << "STATE->Disconnected"; Log lg((om < mMode) ? lsWARNING : lsINFO);
else if (om == omCONNECTED)
lg << "STATE->Connected"; lg << "STATE->" << strOperatingMode();
else if (om == omTRACKING)
lg << "STATE->Tracking";
else
lg << "STATE->Full";
if ((om == omDISCONNECTED) || (mMode == omDISCONNECTED))
{ {
boost::recursive_mutex::scoped_lock sl(mMonitorLock); boost::recursive_mutex::scoped_lock sl(mMonitorLock);
@@ -889,8 +896,8 @@ void NetworkOPs::setMode(OperatingMode om)
{ {
Json::Value jvObj(Json::objectValue); Json::Value jvObj(Json::objectValue);
jvObj["type"] = "serverStatus"; jvObj["type"] = "serverStatus";
jvObj["server_status"] = om >= omCONNECTED ? "ok" : "noNetwork"; jvObj["server_status"] = strOperatingMode();
BOOST_FOREACH(InfoSub* ispListener, mSubServer) 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 getLedgerID(const uint256& hash);
uint32 getCurrentLedgerID(); uint32 getCurrentLedgerID();
OperatingMode getOperatingMode() { return mMode; } OperatingMode getOperatingMode() { return mMode; }
inline bool available() { std::string strOperatingMode();
// XXX Later this can be relaxed to omCONNECTED
return mMode >= omTRACKING;
}
Ledger::pointer getClosedLedger() { return mLedgerMaster->getClosedLedger(); } Ledger::pointer getClosedLedger() { return mLedgerMaster->getClosedLedger(); }
Ledger::pointer getCurrentLedger() { return mLedgerMaster->getCurrentLedger(); } Ledger::pointer getCurrentLedger() { return mLedgerMaster->getCurrentLedger(); }

View File

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

View File

@@ -289,6 +289,7 @@ Remote.prototype._set_state = function (state) {
this.state = state; this.state = state;
this.emit('state', state); this.emit('state', state);
switch (state) { switch (state) {
case 'online': case 'online':
this.online_state = 'open'; this.online_state = 'open';
@@ -499,7 +500,11 @@ Remote.prototype._connect_message = function (ws, json) {
break; break;
case 'serverStatus': 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; break;
// All other messages // All other messages
@@ -861,7 +866,7 @@ Remote.prototype._server_subscribe = function () {
self.emit('ledger_closed', message); self.emit('ledger_closed', message);
} }
if (message.server_status === "ok") { if (message.server_status === 'tracking' || message.server_status === 'full') {
self._set_state('online'); self._set_state('online');
} }