From ed154bed637e67b1d3408651b7f30ac4bf4a0d43 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Sun, 7 Jul 2013 17:43:02 -0700 Subject: [PATCH 01/10] Don't assert if a payment chains two offers from the same offeror. --- src/cpp/ripple/ripple_LedgerEntrySet.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/cpp/ripple/ripple_LedgerEntrySet.cpp b/src/cpp/ripple/ripple_LedgerEntrySet.cpp index d80d72bd42..29fb941fa8 100644 --- a/src/cpp/ripple/ripple_LedgerEntrySet.cpp +++ b/src/cpp/ripple/ripple_LedgerEntrySet.cpp @@ -1577,7 +1577,9 @@ TER LedgerEntrySet::accountSend (const uint160& uSenderID, const uint160& uRecei { TER terResult = tesSUCCESS; - if (!saAmount) + assert (!saAmount.isNegative ()); + + if (!saAmount || (uSenderID == uReceiverID)) { nothing (); } @@ -1598,8 +1600,6 @@ TER LedgerEntrySet::accountSend (const uint160& uSenderID, const uint160& uRecei % (sleReceiver ? (sleReceiver->getFieldAmount (sfBalance)).getFullText () : "-") % saAmount.getFullText ()); - assert (!saAmount.isNegative ()); - if (sleSender) { if (sleSender->getFieldAmount (sfBalance) < saAmount) @@ -1635,7 +1635,6 @@ TER LedgerEntrySet::accountSend (const uint160& uSenderID, const uint160& uRecei % RippleAddress::createHumanAccountID (uReceiverID) % saAmount.getFullText ()); - assert (!saAmount.isNegative ()); terResult = rippleSend (uSenderID, uReceiverID, saAmount, saActual); } From 4155a6a45e566be600111144efc39a47cbdc2bc1 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Tue, 2 Jul 2013 13:31:43 -0700 Subject: [PATCH 02/10] If a tree consists only of a matching leaf, don't include that leaf in the fetch pack. --- src/cpp/ripple/ripple_SHAMapSync.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/cpp/ripple/ripple_SHAMapSync.cpp b/src/cpp/ripple/ripple_SHAMapSync.cpp index d09b33c0f0..2e04babd82 100644 --- a/src/cpp/ripple/ripple_SHAMapSync.cpp +++ b/src/cpp/ripple/ripple_SHAMapSync.cpp @@ -432,6 +432,10 @@ bool SHAMap::deepCompare (SHAMap& other) bool SHAMap::hasInnerNode (const SHAMapNode& nodeID, uint256 const& nodeHash) { + boost::unordered_map::iterator it = mTNByID.find (nodeID); + if (it != mTNByID.end()) + return it->second->getNodeHash() == nodeHash; + SHAMapTreeNode* node = root.get (); while (node->isInner () && (node->getDepth () < nodeID.getDepth ())) @@ -466,7 +470,7 @@ bool SHAMap::hasLeafNode (uint256 const& tag, uint256 const& nodeHash) node = getNodePointer (node->getChildNodeID (branch), nextHash); } - return false; + return node->getNodeHash() == nodeHash; } static void addFPtoList (std::list& list, const uint256& hash, const Blob& blob) From 47598a4d8df655cff8e5376e58ecc87be2b695d2 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Wed, 3 Jul 2013 00:42:29 -0700 Subject: [PATCH 03/10] Fetch pack micro-optimizations. --- src/cpp/ripple/NetworkOPs.cpp | 2 +- src/cpp/ripple/ripple_SHAMapSync.cpp | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/cpp/ripple/NetworkOPs.cpp b/src/cpp/ripple/NetworkOPs.cpp index b762b38069..9a487fa92a 100644 --- a/src/cpp/ripple/NetworkOPs.cpp +++ b/src/cpp/ripple/NetworkOPs.cpp @@ -2208,7 +2208,7 @@ void NetworkOPs::makeFetchPack (Job&, boost::weak_ptr wPeer, if (reply.objects ().size () >= 256) break; - haveLedger = wantLedger; + haveLedger = MOVE_P(wantLedger); wantLedger = getLedgerByHash (haveLedger->getParentHash ()); } while (wantLedger && (UptimeTimer::getInstance ().getElapsedSeconds () <= (uUptime + 1))); diff --git a/src/cpp/ripple/ripple_SHAMapSync.cpp b/src/cpp/ripple/ripple_SHAMapSync.cpp index 2e04babd82..e80616b8a8 100644 --- a/src/cpp/ripple/ripple_SHAMapSync.cpp +++ b/src/cpp/ripple/ripple_SHAMapSync.cpp @@ -512,7 +512,7 @@ void SHAMap::getFetchPack (SHAMap* have, bool includeLeaves, int max, { Serializer s; root->addRaw (s, snfPREFIX); - func (root->getNodeHash (), s.peekData ()); + func (boost::cref(root->getNodeHash ()), boost::cref(s.peekData ())); } return; @@ -535,7 +535,7 @@ void SHAMap::getFetchPack (SHAMap* have, bool includeLeaves, int max, // 1) Add this node to the pack Serializer s; node->addRaw (s, snfPREFIX); - func (node->getNodeHash (), s.peekData ()); + func (boost::cref(node->getNodeHash ()), boost::cref(s.peekData ())); --max; // 2) push non-matching child inner nodes @@ -557,7 +557,7 @@ void SHAMap::getFetchPack (SHAMap* have, bool includeLeaves, int max, { Serializer s; node->addRaw (s, snfPREFIX); - func (node->getNodeHash (), s.peekData ()); + func (boost::cref(node->getNodeHash ()), boost::cref(s.peekData ())); --max; } } From 6723b3580556098aaf9e8fffda413d92c6675206 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Mon, 8 Jul 2013 13:46:59 -0700 Subject: [PATCH 04/10] Don't sign a transaction for non-admin when under load. --- src/cpp/ripple/RPCHandler.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/cpp/ripple/RPCHandler.cpp b/src/cpp/ripple/RPCHandler.cpp index b210b94a1f..d7cf6902be 100644 --- a/src/cpp/ripple/RPCHandler.cpp +++ b/src/cpp/ripple/RPCHandler.cpp @@ -60,6 +60,9 @@ RPCHandler::RPCHandler (NetworkOPs* netOps, InfoSub::pointer infoSub) : mNetOps Json::Value RPCHandler::transactionSign (Json::Value params, bool bSubmit, bool bFailHard, ScopedLock& mlh) { + if (theApp()->getFeeTrack().isLoaded() && (mRole != ADMIN)) + return rpcError(rpcTOO_BUSY); + Json::Value jvResult; RippleAddress naSeed; RippleAddress raSrcAddressID; From f5ea459895311651ef7ae385f418a9f5672a5701 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Mon, 8 Jul 2013 13:47:26 -0700 Subject: [PATCH 05/10] Don't sign a transaction for non-admin when too busy. --- src/cpp/ripple/RPCHandler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cpp/ripple/RPCHandler.cpp b/src/cpp/ripple/RPCHandler.cpp index d7cf6902be..8ec6929134 100644 --- a/src/cpp/ripple/RPCHandler.cpp +++ b/src/cpp/ripple/RPCHandler.cpp @@ -60,7 +60,7 @@ RPCHandler::RPCHandler (NetworkOPs* netOps, InfoSub::pointer infoSub) : mNetOps Json::Value RPCHandler::transactionSign (Json::Value params, bool bSubmit, bool bFailHard, ScopedLock& mlh) { - if (theApp()->getFeeTrack().isLoaded() && (mRole != ADMIN)) + if (theApp->getFeeTrack().isLoaded() && (mRole != ADMIN)) return rpcError(rpcTOO_BUSY); Json::Value jvResult; From 90c5bc8d245de8224603478972df5e06dcde35a2 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Tue, 9 Jul 2013 09:40:43 -0700 Subject: [PATCH 06/10] Make Transaction::save a no-op. It can destroy metadata --- src/cpp/ripple/Transaction.cpp | 37 ++-------------------------------- 1 file changed, 2 insertions(+), 35 deletions(-) diff --git a/src/cpp/ripple/Transaction.cpp b/src/cpp/ripple/Transaction.cpp index eedcafdb17..e3cc1e7c35 100644 --- a/src/cpp/ripple/Transaction.cpp +++ b/src/cpp/ripple/Transaction.cpp @@ -122,41 +122,8 @@ void Transaction::setStatus (TransStatus ts, uint32 lseq) } void Transaction::save () -{ - if ((mStatus == INVALID) || (mStatus == REMOVED)) - return; - - char status; - - switch (mStatus) - { - case NEW: - status = TXN_SQL_NEW; - break; - - case INCLUDED: - status = TXN_SQL_INCLUDED; - break; - - case CONFLICTED: - status = TXN_SQL_CONFLICT; - break; - - case COMMITTED: - status = TXN_SQL_VALIDATED; - break; - - case HELD: - status = TXN_SQL_HELD; - break; - - default: - status = TXN_SQL_UNKNOWN; - } - - Database* db = theApp->getTxnDB ()->getDB (); - ScopedLock dbLock (theApp->getTxnDB ()->getDBLock ()); - db->executeSQL (mTransaction->getSQLInsertReplaceHeader () + mTransaction->getSQL (getLedger (), status) + ";"); +{ // This can destroy metadata, so don't do it + return; } Transaction::pointer Transaction::transactionFromSQL (Database* db, bool bValidate) From 8ef791c7eff4758e5f814939b4cc255317eb754f Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Wed, 10 Jul 2013 10:44:08 -0700 Subject: [PATCH 07/10] Offline signing doesn't require a current ledger. Conflicts: src/cpp/ripple/RPCHandler.cpp --- src/cpp/ripple/RPCHandler.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/cpp/ripple/RPCHandler.cpp b/src/cpp/ripple/RPCHandler.cpp index 8ec6929134..e614e84679 100644 --- a/src/cpp/ripple/RPCHandler.cpp +++ b/src/cpp/ripple/RPCHandler.cpp @@ -70,6 +70,11 @@ Json::Value RPCHandler::transactionSign (Json::Value params, bool bSubmit, bool WriteLog (lsDEBUG, RPCHandler) << boost::str (boost::format ("transactionSign: %s") % params); + if (!bOffline && (theApp->getLedgerMaster().getValidatedLedgerAge() > 120)) + { + return rpcError (rpcNO_CURRENT); + } + if (!params.isMember ("secret") || !params.isMember ("tx_json")) { return rpcError (rpcINVALID_PARAMS); @@ -3624,7 +3629,7 @@ Json::Value RPCHandler::doCommand (const Json::Value& params, int iRole, LoadTyp { "proof_verify", &RPCHandler::doProofVerify, true, optNone }, { "random", &RPCHandler::doRandom, false, optNone }, { "ripple_path_find", &RPCHandler::doRipplePathFind, false, optCurrent }, - { "sign", &RPCHandler::doSign, false, optCurrent }, + { "sign", &RPCHandler::doSign, false, optNone }, { "submit", &RPCHandler::doSubmit, false, optCurrent }, { "server_info", &RPCHandler::doServerInfo, false, optNone }, { "server_state", &RPCHandler::doServerState, false, optNone }, @@ -3685,7 +3690,7 @@ Json::Value RPCHandler::doCommand (const Json::Value& params, int iRole, LoadTyp return rpcError (rpcNO_NETWORK); } - if ((commandsA[i].iOptions & optCurrent) && (theApp->getLedgerMaster().getValidatedLedgerAge() > 60)) + if ((commandsA[i].iOptions & optCurrent) && (theApp->getLedgerMaster().getValidatedLedgerAge() > 120)) { return rpcError (rpcNO_CURRENT); } From 248f5b789e37204f5928bbe402580e8a76d4580c Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Fri, 12 Jul 2013 00:11:27 -0700 Subject: [PATCH 08/10] Fix a case where we timeout for no reason. --- src/cpp/ripple/ripple_InboundLedger.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/cpp/ripple/ripple_InboundLedger.cpp b/src/cpp/ripple/ripple_InboundLedger.cpp index 02bf1c3efd..91d942b6e1 100644 --- a/src/cpp/ripple/ripple_InboundLedger.cpp +++ b/src/cpp/ripple/ripple_InboundLedger.cpp @@ -154,6 +154,18 @@ void InboundLedger::onTimer (bool progress) if (!progress) { + if (isDone()) + { + WriteLog (lsINFO, InboundLedger) << "Already done " << mHash; + return; + } + checkLocal(); + if (isDone()) + { + WriteLog (lsINFO, InboundLedger) << "Completed fetch " << mHash; + return; + } + mAggressive = true; mByHash = true; int pc = getPeerCount (); From d62d759e6c52e539db19288e662d0eaff67c1fa5 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Fri, 12 Jul 2013 11:25:48 -0700 Subject: [PATCH 09/10] Don't call getCurrentSnapshot without the master lock --- src/cpp/ripple/RPCHandler.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/cpp/ripple/RPCHandler.cpp b/src/cpp/ripple/RPCHandler.cpp index e614e84679..b9b2c21854 100644 --- a/src/cpp/ripple/RPCHandler.cpp +++ b/src/cpp/ripple/RPCHandler.cpp @@ -107,9 +107,10 @@ Json::Value RPCHandler::transactionSign (Json::Value params, bool bSubmit, bool return rpcError (rpcINVALID_PARAMS); } + Ledger::pointer lSnapshot = mNetOps->getCurrentSnapshot (); AccountState::pointer asSrc = bOffline ? AccountState::pointer () // Don't look up address if offline. - : mNetOps->getAccountState (mNetOps->getCurrentSnapshot (), raSrcAddressID); + : mNetOps->getAccountState (lSnapshot, raSrcAddressID); mlh.unlock(); if (!bOffline && !asSrc) @@ -179,7 +180,6 @@ Json::Value RPCHandler::transactionSign (Json::Value params, bool bSubmit, bool return rpcError (rpcINVALID_PARAMS); } - Ledger::pointer lSnapshot = mNetOps->getCurrentSnapshot (); { bool bValid; RippleLineCache::pointer cache = boost::make_shared (lSnapshot); @@ -232,8 +232,7 @@ Json::Value RPCHandler::transactionSign (Json::Value params, bool bSubmit, bool if (!bOffline) { - Ledger::pointer lpCurrent = mNetOps->getCurrentSnapshot (); - SLE::pointer sleAccountRoot = mNetOps->getSLEi (lpCurrent, Ledger::getAccountRootIndex (raSrcAddressID.getAccountID ())); + SLE::pointer sleAccountRoot = mNetOps->getSLEi (lSnapshot, Ledger::getAccountRootIndex (raSrcAddressID.getAccountID ())); if (!sleAccountRoot) { From ce61a7d493691554e76ba447a296e7926bb47259 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Fri, 12 Jul 2013 16:53:13 -0700 Subject: [PATCH 10/10] Temporary change: Don't warn on cluster message. --- src/cpp/ripple/ripple_Peer.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/cpp/ripple/ripple_Peer.cpp b/src/cpp/ripple/ripple_Peer.cpp index 46838975ff..d140a2e776 100644 --- a/src/cpp/ripple/ripple_Peer.cpp +++ b/src/cpp/ripple/ripple_Peer.cpp @@ -899,8 +899,11 @@ void PeerImp::processReadBuffer () default: event->reName ("PeerImp::unknown"); - WriteLog (lsWARNING, Peer) << "Unknown Msg: " << type; - WriteLog (lsWARNING, Peer) << strHex (&mReadbuf[0], mReadbuf.size ()); + if (type != 5) + { // TEMPORARY: Don't warn on cluster message + WriteLog (lsWARNING, Peer) << "Unknown Msg: " << type; + WriteLog (lsWARNING, Peer) << strHex (&mReadbuf[0], mReadbuf.size ()); + } } } }