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);