mirror of
https://github.com/XRPLF/rippled.git
synced 2025-11-27 14:35:52 +00:00
Fix network state reporting in server and client.
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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(); }
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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');
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user