diff --git a/ripple2010.vcxproj b/ripple2010.vcxproj
index c09787f99..a7f8d1599 100644
--- a/ripple2010.vcxproj
+++ b/ripple2010.vcxproj
@@ -57,6 +57,7 @@
true
..\OpenSSL\lib\VC;..\boost_1_52_0\stage\lib;..\protobuf\vsprojects\Debug
ssleay32MDd.lib;libeay32MTd.lib;libprotobuf.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+ $(OutDir)rippled.exe
@@ -81,18 +82,19 @@
true
true
true
- ..\OpenSSL\lib\VC;..\boost_1_47_0\stage\lib;..\protobuf-2.4.1\vsprojects\Release
+ ..\OpenSSL\lib\VC;..\boost_1_52_0\stage\lib;..\protobuf\vsprojects\Release
libprotobuf.lib;ssleay32MD.lib;libeay32MD.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+ $(OutDir)rippled.exe
-
+
@@ -122,11 +124,13 @@
+
+
@@ -147,13 +151,13 @@
-
+
@@ -181,7 +185,6 @@
-
@@ -298,8 +301,8 @@
Document
- /code/protobuf/protoc -I=..\newcoin --cpp_out=\code\newcoin\ ..\newcoin/src/cpp/ripple/ripple.proto
- \code\newcoin\src\ripple.pb.h
+ "../protobuf/protoc" -I=..\newcoin --cpp_out=..\newcoin\ ..\newcoin/src/cpp/ripple/ripple.proto
+ ..\newcoin\src\ripple.pb.h
diff --git a/ripple2010.vcxproj.filters b/ripple2010.vcxproj.filters
index 2c8ed95fc..2ac1549e3 100644
--- a/ripple2010.vcxproj.filters
+++ b/ripple2010.vcxproj.filters
@@ -39,9 +39,6 @@
Source Files\database
-
- Source Files\database
-
Source Files\json
@@ -189,9 +186,6 @@
Source Files
-
- Source Files
-
Source Files
@@ -279,9 +273,6 @@
Source Files
-
- Source Files
-
Source Files
@@ -354,6 +345,18 @@
Source Files
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
diff --git a/src/cpp/ripple/CallRPC.cpp b/src/cpp/ripple/CallRPC.cpp
index b64f94ab6..424f64a73 100644
--- a/src/cpp/ripple/CallRPC.cpp
+++ b/src/cpp/ripple/CallRPC.cpp
@@ -492,6 +492,7 @@ Json::Value RPCParser::parseCommand(std::string strMethod, Json::Value jvParams)
{ "sign", &RPCParser::parseSignSubmit, 2, 2 },
{ "submit", &RPCParser::parseSignSubmit, 1, 2 },
{ "server_info", &RPCParser::parseAsIs, 0, 0 },
+ { "server_state", &RPCParser::parseAsIs, 0, 0 },
{ "stop", &RPCParser::parseAsIs, 0, 0 },
// { "transaction_entry", &RPCParser::parseTransactionEntry, -1, -1 },
{ "tx", &RPCParser::parseTx, 1, 1 },
diff --git a/src/cpp/ripple/LedgerAcquire.cpp b/src/cpp/ripple/LedgerAcquire.cpp
index 27470c888..d97a60f9d 100644
--- a/src/cpp/ripple/LedgerAcquire.cpp
+++ b/src/cpp/ripple/LedgerAcquire.cpp
@@ -718,7 +718,7 @@ LedgerAcquire::pointer LedgerAcquireMaster::findCreate(const uint256& hash)
ptr->setTimer(); // Cannot call in constructor
}
else
- cLog(lsINFO) << "LedgerAcquireMaster acquiring ledger we already have";
+ cLog(lsDEBUG) << "LedgerAcquireMaster acquiring ledger we already have";
return ptr;
}
diff --git a/src/cpp/ripple/LedgerMaster.cpp b/src/cpp/ripple/LedgerMaster.cpp
index 86e690b2e..60b5b464c 100644
--- a/src/cpp/ripple/LedgerMaster.cpp
+++ b/src/cpp/ripple/LedgerMaster.cpp
@@ -128,6 +128,7 @@ TER LedgerMaster::doTransaction(const SerializedTransaction& txn, TransactionEng
bool LedgerMaster::haveLedgerRange(uint32 from, uint32 to)
{
+ boost::recursive_mutex::scoped_lock sl(mLock);
uint32 prevMissing = mCompleteLedgers.prevMissing(to + 1);
return (prevMissing == RangeSet::RangeSetAbsent) || (prevMissing < from);
}
diff --git a/src/cpp/ripple/LedgerMaster.h b/src/cpp/ripple/LedgerMaster.h
index ebb10d227..514b05551 100644
--- a/src/cpp/ripple/LedgerMaster.h
+++ b/src/cpp/ripple/LedgerMaster.h
@@ -67,10 +67,13 @@ public:
ScopedLock getLock() { return ScopedLock(mLock); }
// The current ledger is the ledger we believe new transactions should go in
- Ledger::ref getCurrentLedger() { return mCurrentLedger; }
+ Ledger::ref getCurrentLedger() { return mCurrentLedger; }
// The finalized ledger is the last closed/accepted ledger
- Ledger::ref getClosedLedger() { return mFinalizedLedger; }
+ Ledger::ref getClosedLedger() { return mFinalizedLedger; }
+
+ // The published ledger is the last fully validated ledger
+ Ledger::ref getValidatedLedger() { return mPubLedger; }
TER doTransaction(const SerializedTransaction& txn, TransactionEngineParams params);
@@ -82,7 +85,11 @@ public:
void switchLedgers(Ledger::ref lastClosed, Ledger::ref newCurrent);
- std::string getCompleteLedgers() { return mCompleteLedgers.toString(); }
+ std::string getCompleteLedgers()
+ {
+ boost::recursive_mutex::scoped_lock sl(mLock);
+ return mCompleteLedgers.toString();
+ }
Ledger::pointer closeLedger(bool recoverHeldTransactions);
@@ -108,7 +115,11 @@ public:
return mLedgerHistory.getLedgerByHash(hash);
}
- void setLedgerRangePresent(uint32 minV, uint32 maxV) { mCompleteLedgers.setRange(minV, maxV); }
+ void setLedgerRangePresent(uint32 minV, uint32 maxV)
+ {
+ boost::recursive_mutex::scoped_lock sl(mLock);
+ mCompleteLedgers.setRange(minV, maxV);
+ }
void addHeldTransaction(const Transaction::pointer& trans);
void fixMismatch(Ledger::ref ledger);
diff --git a/src/cpp/ripple/NetworkOPs.cpp b/src/cpp/ripple/NetworkOPs.cpp
index 3fdebeb7e..d907ad963 100644
--- a/src/cpp/ripple/NetworkOPs.cpp
+++ b/src/cpp/ripple/NetworkOPs.cpp
@@ -1008,7 +1008,7 @@ void NetworkOPs::pubServer()
jvObj["type"] = "serverStatus";
jvObj["server_status"] = strOperatingMode();
jvObj["load_base"] = theApp->getFeeTrack().getLoadBase();
- jvObj["load_fee"] = theApp->getFeeTrack().getLoadFactor();
+ jvObj["load_factor"] = theApp->getFeeTrack().getLoadFactor();
BOOST_FOREACH(InfoSub* ispListener, mSubServer)
{
@@ -1093,7 +1093,7 @@ bool NetworkOPs::recvValidation(const SerializedValidation::pointer& val)
return theApp->getValidations().addValidation(val);
}
-Json::Value NetworkOPs::getServerInfo()
+Json::Value NetworkOPs::getServerInfo(bool human, bool admin)
{
Json::Value info = Json::objectValue;
@@ -1111,8 +1111,13 @@ Json::Value NetworkOPs::getServerInfo()
if (mNeedNetworkLedger)
info["network_ledger"] = "waiting";
- if (theConfig.VALIDATION_PUB.isValid())
- info["pubkey_validator"] = theConfig.VALIDATION_PUB.humanNodePublic();
+ if (admin)
+ {
+ if (theConfig.VALIDATION_PUB.isValid())
+ info["pubkey_validator"] = theConfig.VALIDATION_PUB.humanNodePublic();
+ else
+ info["pubkey_validator"] = "none";
+ }
info["pubkey_node"] = theApp->getWallet().getNodePublic().humanNodePublic();
@@ -1121,29 +1126,58 @@ Json::Value NetworkOPs::getServerInfo()
Json::Value lastClose = Json::objectValue;
lastClose["proposers"] = theApp->getOPs().getPreviousProposers();
- lastClose["converge_time"] = static_cast(theApp->getOPs().getPreviousConvergeTime()) / 1000.0;
+ if (human)
+ lastClose["converge_time_s"] = static_cast(theApp->getOPs().getPreviousConvergeTime()) / 1000.0;
+ else
+ lastClose["converge_time"] = Json::Int(theApp->getOPs().getPreviousConvergeTime());
info["last_close"] = lastClose;
// if (mConsensus)
// info["consensus"] = mConsensus->getJson();
- info["load"] = theApp->getJobQueue().getJson();
- info["load_factor"] =
- static_cast(theApp->getFeeTrack().getLoadBase()) / theApp->getFeeTrack().getLoadFactor();
+ if (admin)
+ info["load"] = theApp->getJobQueue().getJson();
+
+ if (!human)
+ {
+ info["load_base"] = theApp->getFeeTrack().getLoadBase();
+ info["load_factor"] = theApp->getFeeTrack().getLoadFactor();
+ }
+ else
+ info["load_factor"] =
+ static_cast(theApp->getFeeTrack().getLoadBase()) / theApp->getFeeTrack().getLoadFactor();
+
+ bool valid = false;
+ Ledger::pointer lpClosed = getValidatedLedger();
+ if (lpClosed)
+ valid = true;
+ else
+ lpClosed = getClosedLedger();
- Ledger::pointer lpClosed = getClosedLedger();
if (lpClosed)
{
uint64 baseFee = lpClosed->getBaseFee();
uint64 baseRef = lpClosed->getReferenceFeeUnits();
Json::Value l(Json::objectValue);
- l["seq"] = Json::UInt(lpClosed->getLedgerSeq());
- l["hash"] = lpClosed->getHash().GetHex();
- l["base_fee"] = static_cast(Json::UInt(baseFee)) / SYSTEM_CURRENCY_PARTS;
- l["reserve_base"] =
- static_cast(Json::UInt(lpClosed->getReserve(0) * baseFee / baseRef)) / SYSTEM_CURRENCY_PARTS;
- l["reserve_inc"] =
- static_cast(Json::UInt(lpClosed->getReserveInc() * baseFee / baseRef)) / SYSTEM_CURRENCY_PARTS;
+ l["seq"] = Json::UInt(lpClosed->getLedgerSeq());
+ l["hash"] = lpClosed->getHash().GetHex();
+ l["validated"] = valid;
+ if (!human)
+ {
+ l["base_fee"] = Json::Value::UInt(baseFee);
+ l["reserve_base"] = Json::Value::UInt(lpClosed->getReserve(0));
+ l["reserve_inc"] = Json::Value::UInt(lpClosed->getReserveInc());
+ l["close_time"] = Json::Value::UInt(lpClosed->getCloseTimeNC());
+ }
+ else
+ {
+ l["base_fee_xrp"] = static_cast(Json::UInt(baseFee)) / SYSTEM_CURRENCY_PARTS;
+ l["reserve_base_xrp"] =
+ static_cast(Json::UInt(lpClosed->getReserve(0) * baseFee / baseRef)) / SYSTEM_CURRENCY_PARTS;
+ l["reserve_inc_xrp"] =
+ static_cast(Json::UInt(lpClosed->getReserveInc() * baseFee / baseRef)) / SYSTEM_CURRENCY_PARTS;
+ l["age"] = Json::UInt(getCloseTimeNC() - lpClosed->getCloseTimeNC());
+ }
info["closed_ledger"] = l;
}
@@ -1521,7 +1555,7 @@ bool NetworkOPs::subServer(InfoSub* ispListener, Json::Value& jvResult)
jvResult["random"] = uRandom.ToString();
jvResult["server_status"] = strOperatingMode();
jvResult["load_base"] = theApp->getFeeTrack().getLoadBase();
- jvResult["load_fee"] = theApp->getFeeTrack().getLoadFactor();
+ jvResult["load_factor"] = theApp->getFeeTrack().getLoadFactor();
return mSubServer.insert(ispListener).second;
}
diff --git a/src/cpp/ripple/NetworkOPs.h b/src/cpp/ripple/NetworkOPs.h
index 3101880dd..764dec483 100644
--- a/src/cpp/ripple/NetworkOPs.h
+++ b/src/cpp/ripple/NetworkOPs.h
@@ -141,6 +141,7 @@ public:
std::string strOperatingMode();
Ledger::ref getClosedLedger() { return mLedgerMaster->getClosedLedger(); }
+ Ledger::ref getValidatedLedger() { return mLedgerMaster->getValidatedLedger(); }
Ledger::ref getCurrentLedger() { return mLedgerMaster->getCurrentLedger(); }
Ledger::pointer getLedgerByHash(const uint256& hash) { return mLedgerMaster->getLedgerByHash(hash); }
Ledger::pointer getLedgerBySeq(const uint32 seq) { return mLedgerMaster->getLedgerBySeq(seq); }
@@ -243,7 +244,7 @@ public:
int getPreviousConvergeTime() { return mLastCloseConvergeTime; }
uint32 getLastCloseTime() { return mLastCloseTime; }
void setLastCloseTime(uint32 t) { mLastCloseTime = t; }
- Json::Value getServerInfo();
+ Json::Value getServerInfo(bool human, bool admin);
uint32 acceptLedger();
boost::unordered_map >& peekStoredProposals() { return mStoredProposals; }
diff --git a/src/cpp/ripple/Peer.cpp b/src/cpp/ripple/Peer.cpp
index c41125210..7c0590dbf 100644
--- a/src/cpp/ripple/Peer.cpp
+++ b/src/cpp/ripple/Peer.cpp
@@ -1392,7 +1392,7 @@ void Peer::recvGetLedger(ripple::TMGetLedger& packet)
logMe += "LedgerHash:"; logMe += ledgerhash.GetHex();
ledger = theApp->getLedgerMaster().getLedgerByHash(ledgerhash);
- tLog(!ledger, lsINFO) << "Don't have ledger " << ledgerhash;
+ tLog(!ledger, lsDEBUG) << "Don't have ledger " << ledgerhash;
if (!ledger && (packet.has_querytype() && !packet.has_requestcookie()))
{
std::vector peerList = theApp->getConnectionPool().getPeerVector();
@@ -1417,7 +1417,7 @@ void Peer::recvGetLedger(ripple::TMGetLedger& packet)
else if (packet.has_ledgerseq())
{
ledger = theApp->getLedgerMaster().getLedgerBySeq(packet.ledgerseq());
- tLog(!ledger, lsINFO) << "Don't have ledger " << packet.ledgerseq();
+ tLog(!ledger, lsDEBUG) << "Don't have ledger " << packet.ledgerseq();
}
else if (packet.has_ltype() && (packet.ltype() == ripple::ltCURRENT))
ledger = theApp->getLedgerMaster().getCurrentLedger();
diff --git a/src/cpp/ripple/RPCHandler.cpp b/src/cpp/ripple/RPCHandler.cpp
index 85a50fb00..2948b52e2 100644
--- a/src/cpp/ripple/RPCHandler.cpp
+++ b/src/cpp/ripple/RPCHandler.cpp
@@ -1305,7 +1305,16 @@ Json::Value RPCHandler::doServerInfo(Json::Value)
{
Json::Value ret(Json::objectValue);
- ret["info"] = theApp->getOPs().getServerInfo();
+ ret["info"] = theApp->getOPs().getServerInfo(true, mRole == ADMIN);
+
+ return ret;
+}
+
+Json::Value RPCHandler::doServerState(Json::Value)
+{
+ Json::Value ret(Json::objectValue);
+
+ ret["state"] = theApp->getOPs().getServerInfo(false, mRole == ADMIN);
return ret;
}
@@ -2589,7 +2598,8 @@ Json::Value RPCHandler::doCommand(Json::Value& jvRequest, int iRole)
{ "ripple_path_find", &RPCHandler::doRipplePathFind, false, optCurrent },
{ "sign", &RPCHandler::doSign, false, optCurrent },
{ "submit", &RPCHandler::doSubmit, false, optCurrent },
- { "server_info", &RPCHandler::doServerInfo, true, optNone },
+ { "server_info", &RPCHandler::doServerInfo, false, optNone },
+ { "server_state", &RPCHandler::doServerState, false, optNone },
{ "stop", &RPCHandler::doStop, true, optNone },
{ "transaction_entry", &RPCHandler::doTransactionEntry, false, optCurrent },
{ "tx", &RPCHandler::doTx, false, optNetwork },
diff --git a/src/cpp/ripple/RPCHandler.h b/src/cpp/ripple/RPCHandler.h
index a1d891700..5c3365e01 100644
--- a/src/cpp/ripple/RPCHandler.h
+++ b/src/cpp/ripple/RPCHandler.h
@@ -66,7 +66,8 @@ class RPCHandler
Json::Value doProfile(Json::Value params);
Json::Value doRandom(Json::Value jvRequest);
Json::Value doRipplePathFind(Json::Value jvRequest);
- Json::Value doServerInfo(Json::Value params);
+ Json::Value doServerInfo(Json::Value params); // for humans
+ Json::Value doServerState(Json::Value params); // for machines
Json::Value doSessionClose(Json::Value params);
Json::Value doSessionOpen(Json::Value params);
Json::Value doStop(Json::Value params);