From b8451ff076689afb63c7f25fee1491977e0ba9a2 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Tue, 25 Jun 2013 11:52:05 -0700 Subject: [PATCH 01/37] Looks like a bit more delay is needed to smooth the latency. --- Subtrees/leveldb/db/db_impl.cc | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Subtrees/leveldb/db/db_impl.cc b/Subtrees/leveldb/db/db_impl.cc index 95241cfb8..af02467b3 100644 --- a/Subtrees/leveldb/db/db_impl.cc +++ b/Subtrees/leveldb/db/db_impl.cc @@ -823,9 +823,8 @@ Status DBImpl::FinishCompactionOutputFile(CompactionState* compact, (unsigned long long) current_entries, (unsigned long long) current_bytes); - // rate-limit compaction file creation - // with a 25ms pause - env_->SleepForMicroseconds(25000); + // rate-limit compaction file creation with a 100ms pause + env_->SleepForMicroseconds(100000); } } return s; From 44883ab59c45b4d25384181962b83279e9a897e1 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Tue, 25 Jun 2013 17:20:02 -0700 Subject: [PATCH 02/37] Disable the JSON cache due to issue 99. --- src/cpp/ripple/RPCHandler.cpp | 62 +++++++++++------------------------ 1 file changed, 20 insertions(+), 42 deletions(-) diff --git a/src/cpp/ripple/RPCHandler.cpp b/src/cpp/ripple/RPCHandler.cpp index 991fe2235..395fc71d3 100644 --- a/src/cpp/ripple/RPCHandler.cpp +++ b/src/cpp/ripple/RPCHandler.cpp @@ -1098,49 +1098,36 @@ Json::Value RPCHandler::doAccountLines (Json::Value params, LoadType* loadType, if (lpLedger->hasAccount (raAccount)) { jvResult["account"] = raAccount.humanAccountID (); + Json::Value& jsonLines = (jvResult["lines"] = Json::arrayValue); - boost::shared_ptr jvsLines = - theApp->getOPs ().getJSONCache (JSONCache::kindLines, lpLedger->getHash (), raAccount.getAccountID ()); + AccountItems rippleLines (raAccount.getAccountID (), lpLedger, AccountItem::pointer (new RippleState ())); - if (!jvsLines) + BOOST_FOREACH (AccountItem::ref item, rippleLines.getItems ()) { - jvsLines = boost::make_shared (Json::arrayValue); - Json::Value& jsonLines = *jvsLines; + RippleState* line = (RippleState*)item.get (); - AccountItems rippleLines (raAccount.getAccountID (), lpLedger, AccountItem::pointer (new RippleState ())); - - BOOST_FOREACH (AccountItem::ref item, rippleLines.getItems ()) + if (!raPeer.isValid () || raPeer.getAccountID () == line->getAccountIDPeer ()) { - RippleState* line = (RippleState*)item.get (); + const STAmount& saBalance = line->getBalance (); + const STAmount& saLimit = line->getLimit (); + const STAmount& saLimitPeer = line->getLimitPeer (); - if (!raPeer.isValid () || raPeer.getAccountID () == line->getAccountIDPeer ()) - { - const STAmount& saBalance = line->getBalance (); - const STAmount& saLimit = line->getLimit (); - const STAmount& saLimitPeer = line->getLimitPeer (); + Json::Value& jPeer = jsonLines.append (Json::objectValue); - Json::Value& jPeer = jsonLines.append (Json::objectValue); - - jPeer["account"] = RippleAddress::createHumanAccountID (line->getAccountIDPeer ()); - // Amount reported is positive if current account holds other account's IOUs. - // Amount reported is negative if other account holds current account's IOUs. - jPeer["balance"] = saBalance.getText (); - jPeer["currency"] = saBalance.getHumanCurrency (); - jPeer["limit"] = saLimit.getText (); - jPeer["limit_peer"] = saLimitPeer.getText (); - jPeer["quality_in"] = static_cast (line->getQualityIn ()); - jPeer["quality_out"] = static_cast (line->getQualityOut ()); - } + jPeer["account"] = RippleAddress::createHumanAccountID (line->getAccountIDPeer ()); + // Amount reported is positive if current account holds other account's IOUs. + // Amount reported is negative if other account holds current account's IOUs. + jPeer["balance"] = saBalance.getText (); + jPeer["currency"] = saBalance.getHumanCurrency (); + jPeer["limit"] = saLimit.getText (); + jPeer["limit_peer"] = saLimitPeer.getText (); + jPeer["quality_in"] = static_cast (line->getQualityIn ()); + jPeer["quality_out"] = static_cast (line->getQualityOut ()); } - - theApp->getOPs ().storeJSONCache (JSONCache::kindLines, lpLedger->getHash (), - raAccount.getAccountID (), jvsLines); } if (!bUnlocked) MasterLockHolder.unlock (); - - jvResult["lines"] = *jvsLines; } else { @@ -1208,21 +1195,12 @@ Json::Value RPCHandler::doAccountOffers (Json::Value params, LoadType* loadType, if (!lpLedger->hasAccount (raAccount)) return rpcError (rpcACT_NOT_FOUND); - boost::shared_ptr jvsOffers = - theApp->getOPs ().getJSONCache (JSONCache::kindOffers, lpLedger->getHash (), raAccount.getAccountID ()); - - if (!jvsOffers) - { - jvsOffers = boost::make_shared (Json::arrayValue); - lpLedger->visitAccountItems (raAccount.getAccountID (), BIND_TYPE (&offerAdder, boost::ref (*jvsOffers), P_1)); - theApp->getOPs ().storeJSONCache (JSONCache::kindOffers, lpLedger->getHash (), raAccount.getAccountID (), jvsOffers); - } + Json::Value& jvsOffers = (jvResult["offers"] = Json::arrayValue); + lpLedger->visitAccountItems (raAccount.getAccountID (), BIND_TYPE (&offerAdder, boost::ref (jvsOffers), P_1)); if (!bUnlocked) MasterLockHolder.unlock (); - jvResult["offers"] = *jvsOffers; - return jvResult; } From 18d4a0480ce9a87a7cc900fbdaddff708ed10012 Mon Sep 17 00:00:00 2001 From: Vinnie Falco Date: Thu, 27 Jun 2013 20:26:00 -0700 Subject: [PATCH 03/37] Fix stdc limit macros error --- modules/ripple_websocket/ripple_websocket.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/modules/ripple_websocket/ripple_websocket.cpp b/modules/ripple_websocket/ripple_websocket.cpp index c791744e3..4785cb965 100644 --- a/modules/ripple_websocket/ripple_websocket.cpp +++ b/modules/ripple_websocket/ripple_websocket.cpp @@ -4,6 +4,11 @@ */ //============================================================================== +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS 1 +#endif +#include + #include "ripple_websocket.h" // Unity build file for websocket From f31ba168270eb677bcd7c7deb5f80829ab1e47da Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Fri, 28 Jun 2013 16:30:37 -0700 Subject: [PATCH 04/37] Fix a race condition in NetworkOPs::gotTXData --- src/cpp/ripple/NetworkOPs.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/cpp/ripple/NetworkOPs.cpp b/src/cpp/ripple/NetworkOPs.cpp index a9e7f5196..b7be9a3c8 100644 --- a/src/cpp/ripple/NetworkOPs.cpp +++ b/src/cpp/ripple/NetworkOPs.cpp @@ -1024,13 +1024,20 @@ void NetworkOPs::takePosition (int seq, SHAMap::ref position) SHAMapAddNode NetworkOPs::gotTXData (const boost::shared_ptr& peer, uint256 const& hash, const std::list& nodeIDs, const std::list< Blob >& nodeData) { - if (!haveConsensusObject ()) + + boost::shared_ptr consensus; + { + ScopedLock mlh(theApp->getMasterLock()); + consensus = mConsensus; + } + + if (!consensus) { WriteLog (lsWARNING, NetworkOPs) << "Got TX data with no consensus object"; return SHAMapAddNode (); } - return mConsensus->peerGaveNodes (peer, hash, nodeIDs, nodeData); + return consensus->peerGaveNodes (peer, hash, nodeIDs, nodeData); } bool NetworkOPs::hasTXSet (const boost::shared_ptr& peer, uint256 const& set, protocol::TxSetStatus status) From 45479728c911776791da20aca9accf351be26318 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Mon, 1 Jul 2013 08:42:30 -0700 Subject: [PATCH 05/37] Fix a case that doesn't canonicalize to zero. --- modules/ripple_data/protocol/ripple_STAmount.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ripple_data/protocol/ripple_STAmount.cpp b/modules/ripple_data/protocol/ripple_STAmount.cpp index ef23958b1..fe1ef9d0d 100644 --- a/modules/ripple_data/protocol/ripple_STAmount.cpp +++ b/modules/ripple_data/protocol/ripple_STAmount.cpp @@ -436,7 +436,7 @@ void STAmount::canonicalize () ++mOffset; } - if (mOffset < cMinOffset) + if ((mOffset < cMinOffset) || (mValue < vMinValue)) { mValue = 0; mOffset = 0; From 1241260744891b2580502f5148f9d471264779d2 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Mon, 1 Jul 2013 08:45:28 -0700 Subject: [PATCH 06/37] Typo --- modules/ripple_data/protocol/ripple_STAmount.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ripple_data/protocol/ripple_STAmount.cpp b/modules/ripple_data/protocol/ripple_STAmount.cpp index fe1ef9d0d..467e7ea39 100644 --- a/modules/ripple_data/protocol/ripple_STAmount.cpp +++ b/modules/ripple_data/protocol/ripple_STAmount.cpp @@ -436,7 +436,7 @@ void STAmount::canonicalize () ++mOffset; } - if ((mOffset < cMinOffset) || (mValue < vMinValue)) + if ((mOffset < cMinOffset) || (mValue < cMinValue)) { mValue = 0; mOffset = 0; From a912c3012adaee7d2ab61c92fc3fac52fb103281 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Mon, 1 Jul 2013 11:30:21 -0700 Subject: [PATCH 07/37] Try to track down the bug that's causing isEquivalent to return false on a reconstructed transaction. --- .../protocol/ripple_SerializedObject.cpp | 18 ++++++++++++++++++ .../protocol/ripple_SerializedTypes.cpp | 8 ++++++++ .../protocol/ripple_SerializedTypes.h | 6 +----- 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/modules/ripple_data/protocol/ripple_SerializedObject.cpp b/modules/ripple_data/protocol/ripple_SerializedObject.cpp index 82ce1284a..5a07dd568 100644 --- a/modules/ripple_data/protocol/ripple_SerializedObject.cpp +++ b/modules/ripple_data/protocol/ripple_SerializedObject.cpp @@ -379,7 +379,10 @@ bool STObject::isEquivalent (const SerializedType& t) const const STObject* v = dynamic_cast (&t); if (!v) + { + WriteLog (lsDEBUG, STObject) << "notEquiv " << getFullText() << " not object"; return false; + } boost::ptr_vector::const_iterator it1 = mData.begin (), end1 = mData.end (); boost::ptr_vector::const_iterator it2 = v->mData.begin (), end2 = v->mData.end (); @@ -387,7 +390,19 @@ bool STObject::isEquivalent (const SerializedType& t) const while ((it1 != end1) && (it2 != end2)) { if ((it1->getSType () != it2->getSType ()) || !it1->isEquivalent (*it2)) + { + if (it1->getSType () != it2->getSType ()) + { + WriteLog (lsDEBUG, STObject) << "notEquiv type " << it1->getFullText() << " != " + << it2->getFullText(); + } + else + { + WriteLog (lsDEBUG, STObject) << "notEquiv " << it1->getFullText() << " != " + << it2->getFullText(); + } return false; + } ++it1; ++it2; @@ -1164,7 +1179,10 @@ bool STArray::isEquivalent (const SerializedType& t) const const STArray* v = dynamic_cast (&t); if (!v) + { + WriteLog (lsDEBUG, STObject) << "notEquiv " << getFullText() << " not array"; return false; + } return value == v->value; } diff --git a/modules/ripple_data/protocol/ripple_SerializedTypes.cpp b/modules/ripple_data/protocol/ripple_SerializedTypes.cpp index 43ae0bbba..eaacad42e 100644 --- a/modules/ripple_data/protocol/ripple_SerializedTypes.cpp +++ b/modules/ripple_data/protocol/ripple_SerializedTypes.cpp @@ -22,6 +22,14 @@ SerializedType& SerializedType::operator= (const SerializedType& t) return *this; } +bool SerializedType::isEquivalent (const SerializedType& t) const +{ + assert (getSType () == STI_NOTPRESENT); + if (t.getSType () == STI_NOTPRESENT) + return true; + WriteLog (lsDEBUG, SerializedType) << "notEquiv " << getFullText() << " not STI_NOTPRESENT"; + return false; +} void STPathSet::printDebug () { diff --git a/modules/ripple_data/protocol/ripple_SerializedTypes.h b/modules/ripple_data/protocol/ripple_SerializedTypes.h index 20eff2c06..5137d21be 100644 --- a/modules/ripple_data/protocol/ripple_SerializedTypes.h +++ b/modules/ripple_data/protocol/ripple_SerializedTypes.h @@ -113,11 +113,7 @@ public: ; } - virtual bool isEquivalent (const SerializedType& t) const - { - assert (getSType () == STI_NOTPRESENT); - return t.getSType () == STI_NOTPRESENT; - } + virtual bool isEquivalent (const SerializedType& t) const; void addFieldID (Serializer& s) const { From 141f2d8885d9b3f56d661d2e53ab88c738c164ba Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Mon, 1 Jul 2013 11:37:50 -0700 Subject: [PATCH 08/37] Temporary fix to crash on "1e-95". --- src/cpp/ripple/NetworkOPs.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cpp/ripple/NetworkOPs.cpp b/src/cpp/ripple/NetworkOPs.cpp index b7be9a3c8..53f017d62 100644 --- a/src/cpp/ripple/NetworkOPs.cpp +++ b/src/cpp/ripple/NetworkOPs.cpp @@ -225,7 +225,7 @@ Transaction::pointer NetworkOPs::submitTransactionSync (Transaction::ref tpTrans WriteLog (lsFATAL, NetworkOPs) << tpTransNew->getSTransaction ()->getJson (0); WriteLog (lsFATAL, NetworkOPs) << tpTrans->getSTransaction ()->getJson (0); - assert (false); + // assert (false); "1e-95" as amount can trigger this tpTransNew.reset (); } From 2edb7a59d1880f19f5f7eec5fc9302ac79ffa4ba Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Tue, 2 Jul 2013 00:27:12 -0700 Subject: [PATCH 09/37] Whitespace --- src/cpp/ripple/ripple_SHAMap.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cpp/ripple/ripple_SHAMap.cpp b/src/cpp/ripple/ripple_SHAMap.cpp index 6e1220b42..16801ce90 100644 --- a/src/cpp/ripple/ripple_SHAMap.cpp +++ b/src/cpp/ripple/ripple_SHAMap.cpp @@ -889,7 +889,7 @@ bool SHAMap::fetchRoot (uint256 const& hash, SHAMapSyncFilter* filter) SHAMapTreeNode::pointer newRoot = fetchNodeExternalNT(SHAMapNode(), hash); if (newRoot) root = newRoot; - else + else { Blob nodeData; From fa8e64014e8303b6e04c466de619d874fced0eb2 Mon Sep 17 00:00:00 2001 From: Vinnie Falco Date: Tue, 2 Jul 2013 07:36:08 -0700 Subject: [PATCH 10/37] Break ripple_app module into 8 pieces (from 4) --- Builds/VisualStudio2012/RippleD.vcxproj | 4 + .../VisualStudio2012/RippleD.vcxproj.filters | 12 ++ modules/ripple_app/ripple_app.cpp | 164 +++++++++++------- modules/ripple_app/ripple_app_pt5.cpp | 8 + modules/ripple_app/ripple_app_pt6.cpp | 8 + modules/ripple_app/ripple_app_pt7.cpp | 8 + modules/ripple_app/ripple_app_pt8.cpp | 8 + src/cpp/ripple/ripple_ProofOfWork.cpp | 1 + 8 files changed, 151 insertions(+), 62 deletions(-) create mode 100644 modules/ripple_app/ripple_app_pt5.cpp create mode 100644 modules/ripple_app/ripple_app_pt6.cpp create mode 100644 modules/ripple_app/ripple_app_pt7.cpp create mode 100644 modules/ripple_app/ripple_app_pt8.cpp diff --git a/Builds/VisualStudio2012/RippleD.vcxproj b/Builds/VisualStudio2012/RippleD.vcxproj index d43197f18..ba7f912ff 100644 --- a/Builds/VisualStudio2012/RippleD.vcxproj +++ b/Builds/VisualStudio2012/RippleD.vcxproj @@ -169,6 +169,10 @@ + + + + true true diff --git a/Builds/VisualStudio2012/RippleD.vcxproj.filters b/Builds/VisualStudio2012/RippleD.vcxproj.filters index bde464967..c5f063b9e 100644 --- a/Builds/VisualStudio2012/RippleD.vcxproj.filters +++ b/Builds/VisualStudio2012/RippleD.vcxproj.filters @@ -900,6 +900,18 @@ 1. Modules\ripple_app\refactored + + 1. Modules\ripple_app + + + 1. Modules\ripple_app + + + 1. Modules\ripple_app + + + 1. Modules\ripple_app + diff --git a/modules/ripple_app/ripple_app.cpp b/modules/ripple_app/ripple_app.cpp index 5856c38bb..6cf4dfd66 100644 --- a/modules/ripple_app/ripple_app.cpp +++ b/modules/ripple_app/ripple_app.cpp @@ -265,36 +265,21 @@ static const uint64 tenTo17m1 = tenTo17 - 1; #if ! defined (RIPPLE_MAIN_PART) || RIPPLE_MAIN_PART == 1 -#include "src/cpp/ripple/RPCHandler.cpp" #include "src/cpp/ripple/Ledger.cpp" -#include "src/cpp/ripple/ripple_SHAMap.cpp" // Uses theApp #include "src/cpp/ripple/ripple_SHAMapDelta.cpp" -#include "src/cpp/ripple/ripple_SHAMapItem.cpp" #include "src/cpp/ripple/ripple_SHAMapNode.cpp" -#include "src/cpp/ripple/ripple_SHAMapSync.cpp" #include "src/cpp/ripple/ripple_SHAMapTreeNode.cpp" -#include "src/cpp/ripple/ripple_SHAMapMissingNode.cpp" #include "src/cpp/ripple/ripple_Database.cpp" -#include "src/cpp/ripple/ripple_AccountItem.cpp" #include "src/cpp/ripple/ripple_AccountItems.cpp" -#include "src/cpp/ripple/AccountSetTransactor.cpp" #include "src/cpp/ripple/ripple_AccountState.cpp" -#include "src/cpp/ripple/ripple_CanonicalTXSet.cpp" #include "src/cpp/ripple/ChangeTransactor.cpp" -#include "src/cpp/ripple/Contract.cpp" #include "src/cpp/ripple/ripple_DBInit.cpp" -#include "src/cpp/ripple/HTTPRequest.cpp" #include "src/cpp/ripple/Interpreter.cpp" -#include "src/cpp/ripple/LedgerProposal.cpp" #include "src/cpp/ripple/LedgerTiming.cpp" -#include "src/cpp/ripple/ripple_LoadManager.cpp" #include "src/cpp/ripple/main.cpp" -#include "src/cpp/ripple/ripple_NicknameState.cpp" #include "src/cpp/ripple/ripple_Offer.cpp" -#include "src/cpp/ripple/OfferCancelTransactor.cpp" #include "src/cpp/ripple/Operation.cpp" -#include "src/cpp/ripple/OrderBookDB.cpp" #endif @@ -302,6 +287,29 @@ static const uint64 tenTo17m1 = tenTo17 - 1; #if ! defined (RIPPLE_MAIN_PART) || RIPPLE_MAIN_PART == 2 +#include "src/cpp/ripple/RPCHandler.cpp" +#include "src/cpp/ripple/ripple_SHAMap.cpp" // Uses theApp +#include "src/cpp/ripple/ripple_SHAMapItem.cpp" +#include "src/cpp/ripple/ripple_SHAMapSync.cpp" +#include "src/cpp/ripple/ripple_SHAMapMissingNode.cpp" + +#include "src/cpp/ripple/ripple_AccountItem.cpp" +#include "src/cpp/ripple/AccountSetTransactor.cpp" +#include "src/cpp/ripple/ripple_CanonicalTXSet.cpp" +#include "src/cpp/ripple/Contract.cpp" +#include "src/cpp/ripple/HTTPRequest.cpp" +#include "src/cpp/ripple/LedgerProposal.cpp" +#include "src/cpp/ripple/ripple_LoadManager.cpp" +#include "src/cpp/ripple/ripple_NicknameState.cpp" +#include "src/cpp/ripple/OfferCancelTransactor.cpp" +#include "src/cpp/ripple/OrderBookDB.cpp" + +#endif + +//------------------------------------------------------------------------------ + +#if ! defined (RIPPLE_MAIN_PART) || RIPPLE_MAIN_PART == 3 + // This is for PeerDoor and WSDoor // Generate DH for SSL connection. static DH* handleTmpDh (SSL* ssl, int is_export, int iKeyLength) @@ -311,61 +319,22 @@ static DH* handleTmpDh (SSL* ssl, int is_export, int iKeyLength) } #include "src/cpp/ripple/ripple_RippleCalc.cpp" -#include "src/cpp/ripple/ripple_UniqueNodeList.cpp" #include "src/cpp/ripple/CallRPC.cpp" -#include "src/cpp/ripple/ripple_InboundLedger.cpp" #include "src/cpp/ripple/ripple_PathState.cpp" -#include "src/cpp/ripple/ripple_SqliteDatabase.cpp" #include "src/cpp/ripple/ParameterTable.cpp" -#include "src/cpp/ripple/PaymentTransactor.cpp" #include "src/cpp/ripple/PeerDoor.cpp" -#include "src/cpp/ripple/RegularKeySetTransactor.cpp" #include "src/cpp/ripple/ripple_RippleLineCache.cpp" -#include "src/cpp/ripple/ripple_RippleState.cpp" #include "src/cpp/ripple/rpc.cpp" -#include "src/cpp/ripple/RPCDoor.cpp" #include "src/cpp/ripple/RPCErr.cpp" -#include "src/cpp/ripple/RPCServer.cpp" #include "src/cpp/ripple/RPCSub.cpp" -#include "src/cpp/ripple/ScriptData.cpp" #include "src/cpp/ripple/SerializedValidation.cpp" -#include "src/cpp/ripple/SNTPClient.cpp" #include "src/cpp/ripple/Transaction.cpp" -#include "src/cpp/ripple/TransactionCheck.cpp" #include "src/cpp/ripple/TransactionEngine.cpp" -#include "src/cpp/ripple/TransactionMaster.cpp" #include "src/cpp/ripple/TransactionMeta.cpp" -#include "src/cpp/ripple/TransactionQueue.cpp" #include "src/cpp/ripple/Transactor.cpp" -#include "src/cpp/ripple/TrustSetTransactor.cpp" #include "src/cpp/ripple/WSConnection.cpp" #include "src/cpp/ripple/WSDoor.cpp" -#include "src/cpp/ripple/WSHandler.cpp" - -#endif - -//------------------------------------------------------------------------------ - -#if ! defined (RIPPLE_MAIN_PART) || RIPPLE_MAIN_PART == 3 - -#include "src/cpp/ripple/ripple_Peer.cpp" -#include "src/cpp/ripple/ripple_LedgerEntrySet.cpp" -#include "src/cpp/ripple/ripple_Application.cpp" -#include "src/cpp/ripple/ripple_Pathfinder.cpp" -#include "src/cpp/ripple/OfferCreateTransactor.cpp" -#include "src/cpp/ripple/ripple_Features.cpp" -#include "src/cpp/ripple/ripple_Validations.cpp" - -#include "src/cpp/ripple/ripple_LocalCredentials.cpp" -#include "src/cpp/ripple/WalletAddTransactor.cpp" -#include "src/cpp/ripple/ripple_HashedObject.cpp" -#include "src/cpp/ripple/ripple_AcceptedLedgerTx.cpp" -#include "src/cpp/ripple/ripple_AcceptedLedger.cpp" -#include "src/cpp/ripple/ripple_DatabaseCon.cpp" -#include "src/cpp/ripple/ripple_DisputedTx.cpp" -#include "src/cpp/ripple/ripple_FeeVote.cpp" -#include "src/cpp/ripple/ripple_HashRouter.cpp" #endif @@ -373,24 +342,95 @@ static DH* handleTmpDh (SSL* ssl, int is_export, int iKeyLength) #if ! defined (RIPPLE_MAIN_PART) || RIPPLE_MAIN_PART == 4 +// This is for PeerDoor and WSDoor +// Generate DH for SSL connection. +static DH* handleTmpDh (SSL* ssl, int is_export, int iKeyLength) +{ + // VFALCO TODO eliminate this horrendous dependency on theApp and LocalCredentials + return 512 == iKeyLength ? theApp->getLocalCredentials ().getDh512 () : theApp->getLocalCredentials ().getDh1024 (); +} + +#include "src/cpp/ripple/ripple_UniqueNodeList.cpp" +#include "src/cpp/ripple/ripple_InboundLedger.cpp" +#include "src/cpp/ripple/ripple_SqliteDatabase.cpp" + +#include "src/cpp/ripple/PaymentTransactor.cpp" +#include "src/cpp/ripple/RegularKeySetTransactor.cpp" +#include "src/cpp/ripple/ripple_RippleState.cpp" +#include "src/cpp/ripple/RPCDoor.cpp" +#include "src/cpp/ripple/RPCServer.cpp" +#include "src/cpp/ripple/ScriptData.cpp" +#include "src/cpp/ripple/SNTPClient.cpp" +#include "src/cpp/ripple/TransactionCheck.cpp" +#include "src/cpp/ripple/TransactionMaster.cpp" +#include "src/cpp/ripple/TransactionQueue.cpp" +#include "src/cpp/ripple/TrustSetTransactor.cpp" +#include "src/cpp/ripple/WSHandler.cpp" + +#endif + +//------------------------------------------------------------------------------ + +#if ! defined (RIPPLE_MAIN_PART) || RIPPLE_MAIN_PART == 5 + +#include "src/cpp/ripple/ripple_Peer.cpp" +#include "src/cpp/ripple/ripple_Application.cpp" +#include "src/cpp/ripple/OfferCreateTransactor.cpp" +#include "src/cpp/ripple/ripple_Validations.cpp" + +#include "src/cpp/ripple/WalletAddTransactor.cpp" +#include "src/cpp/ripple/ripple_AcceptedLedgerTx.cpp" +#include "src/cpp/ripple/ripple_DatabaseCon.cpp" +#include "src/cpp/ripple/ripple_FeeVote.cpp" + +#endif + +//------------------------------------------------------------------------------ + +#if ! defined (RIPPLE_MAIN_PART) || RIPPLE_MAIN_PART == 6 + +#include "src/cpp/ripple/ripple_LedgerEntrySet.cpp" +#include "src/cpp/ripple/ripple_Pathfinder.cpp" +#include "src/cpp/ripple/ripple_Features.cpp" + +#include "src/cpp/ripple/ripple_LocalCredentials.cpp" +#include "src/cpp/ripple/ripple_HashedObject.cpp" +#include "src/cpp/ripple/ripple_AcceptedLedger.cpp" +#include "src/cpp/ripple/ripple_DisputedTx.cpp" +#include "src/cpp/ripple/ripple_HashRouter.cpp" + +#endif + +//------------------------------------------------------------------------------ + +#if ! defined (RIPPLE_MAIN_PART) || RIPPLE_MAIN_PART == 7 + #include "src/cpp/ripple/NetworkOPs.cpp" -#include "src/cpp/ripple/ripple_LedgerConsensus.cpp" #include "src/cpp/ripple/ripple_Peers.cpp" -#include "src/cpp/ripple/LedgerMaster.cpp" #include "src/cpp/ripple/ripple_HashedObjectStore.cpp" -#include "src/cpp/ripple/HttpsClient.cpp" #include "src/cpp/ripple/ripple_InboundLedgers.cpp" -#include "src/cpp/ripple/ripple_InfoSub.cpp" #include "src/cpp/ripple/ripple_LedgerHistory.cpp" -#include "src/cpp/ripple/ripple_OrderBook.cpp" #include "src/cpp/ripple/ripple_PathRequest.cpp" +#include "src/cpp/ripple/ripple_SerializedLedger.cpp" +#include "src/cpp/ripple/ripple_TransactionAcquire.cpp" + +#endif + +//------------------------------------------------------------------------------ + +#if ! defined (RIPPLE_MAIN_PART) || RIPPLE_MAIN_PART == 8 + +#include "src/cpp/ripple/ripple_LedgerConsensus.cpp" +#include "src/cpp/ripple/LedgerMaster.cpp" +#include "src/cpp/ripple/HttpsClient.cpp" + +#include "src/cpp/ripple/ripple_InfoSub.cpp" +#include "src/cpp/ripple/ripple_OrderBook.cpp" #include "src/cpp/ripple/ripple_PeerSet.cpp" #include "src/cpp/ripple/ripple_ProofOfWork.cpp" -#include "src/cpp/ripple/ripple_ProofOfWorkFactory.cpp" -#include "src/cpp/ripple/ripple_SerializedLedger.cpp" +#include "src/cpp/ripple/ripple_ProofOfWorkFactory.cpp" // requires ProofOfWork.cpp for ProofOfWork::sMaxDifficulty #include "src/cpp/ripple/ripple_SerializedTransaction.cpp" -#include "src/cpp/ripple/ripple_TransactionAcquire.cpp" #include "src/cpp/ripple/ripple_SHAMapSyncFilters.cpp" // requires Application diff --git a/modules/ripple_app/ripple_app_pt5.cpp b/modules/ripple_app/ripple_app_pt5.cpp new file mode 100644 index 000000000..d169e86eb --- /dev/null +++ b/modules/ripple_app/ripple_app_pt5.cpp @@ -0,0 +1,8 @@ +//------------------------------------------------------------------------------ +/* + Copyright (c) 2011-2013, OpenCoin, Inc. +*/ +//============================================================================== + +#define RIPPLE_MAIN_PART 5 +#include "ripple_app.cpp" diff --git a/modules/ripple_app/ripple_app_pt6.cpp b/modules/ripple_app/ripple_app_pt6.cpp new file mode 100644 index 000000000..1e41133a6 --- /dev/null +++ b/modules/ripple_app/ripple_app_pt6.cpp @@ -0,0 +1,8 @@ +//------------------------------------------------------------------------------ +/* + Copyright (c) 2011-2013, OpenCoin, Inc. +*/ +//============================================================================== + +#define RIPPLE_MAIN_PART 6 +#include "ripple_app.cpp" diff --git a/modules/ripple_app/ripple_app_pt7.cpp b/modules/ripple_app/ripple_app_pt7.cpp new file mode 100644 index 000000000..78fe6c8aa --- /dev/null +++ b/modules/ripple_app/ripple_app_pt7.cpp @@ -0,0 +1,8 @@ +//------------------------------------------------------------------------------ +/* + Copyright (c) 2011-2013, OpenCoin, Inc. +*/ +//============================================================================== + +#define RIPPLE_MAIN_PART 7 +#include "ripple_app.cpp" diff --git a/modules/ripple_app/ripple_app_pt8.cpp b/modules/ripple_app/ripple_app_pt8.cpp new file mode 100644 index 000000000..0cd81dc0e --- /dev/null +++ b/modules/ripple_app/ripple_app_pt8.cpp @@ -0,0 +1,8 @@ +//------------------------------------------------------------------------------ +/* + Copyright (c) 2011-2013, OpenCoin, Inc. +*/ +//============================================================================== + +#define RIPPLE_MAIN_PART 8 +#include "ripple_app.cpp" diff --git a/src/cpp/ripple/ripple_ProofOfWork.cpp b/src/cpp/ripple/ripple_ProofOfWork.cpp index 537e7dcb1..03f407f7e 100644 --- a/src/cpp/ripple/ripple_ProofOfWork.cpp +++ b/src/cpp/ripple/ripple_ProofOfWork.cpp @@ -38,6 +38,7 @@ bool powResultInfo (POWResult powCode, std::string& strToken, std::string& strHu return iIndex >= 0; } +// VFALCO TODO Move these to a header because they are used by ripple_ProofOfWorkFactory.cpp const uint256 ProofOfWork::sMinTarget ("00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"); const int ProofOfWork::sMaxIterations (1 << 23); const int ProofOfWork::sMaxDifficulty (30); From d0d5388fd6afa7c2b01e8551b09a02b0a584dc27 Mon Sep 17 00:00:00 2001 From: Vinnie Falco Date: Tue, 2 Jul 2013 07:54:17 -0700 Subject: [PATCH 11/37] Add new ripple_app parts to SConstruct --- SConstruct | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/SConstruct b/SConstruct index b040c4c3c..e5e3779d3 100644 --- a/SConstruct +++ b/SConstruct @@ -113,7 +113,11 @@ COMPILED_FILES = [ 'modules/ripple_app/ripple_app_pt1.cpp', 'modules/ripple_app/ripple_app_pt2.cpp', 'modules/ripple_app/ripple_app_pt3.cpp', - 'modules/ripple_app/ripple_app_pt4.cpp' + 'modules/ripple_app/ripple_app_pt4.cpp', + 'modules/ripple_app/ripple_app_pt5.cpp', + 'modules/ripple_app/ripple_app_pt6.cpp', + 'modules/ripple_app/ripple_app_pt7.cpp', + 'modules/ripple_app/ripple_app_pt8.cpp' ] #------------------------------------------------------------------------------- From d8033012acb4aea984e6f05c436c13cda07701ba Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Tue, 2 Jul 2013 22:14:36 -0700 Subject: [PATCH 12/37] Phase one of the pathfinding fix. --- src/cpp/ripple/ripple_RippleCalc.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/cpp/ripple/ripple_RippleCalc.cpp b/src/cpp/ripple/ripple_RippleCalc.cpp index be78eb615..0b0c57e71 100644 --- a/src/cpp/ripple/ripple_RippleCalc.cpp +++ b/src/cpp/ripple/ripple_RippleCalc.cpp @@ -519,6 +519,9 @@ TER RippleCalc::calcNodeDeliverRev ( if (tesSUCCESS != terResult) break; + if (saInPassAct > saTakerPays) + saInPassAct = saTakerPays; + if (saInPassAct < saInPassReq) { // Adjust output to conform to limited input. From 70ddbd7b913e66d45725b855d1ff4610719f571b Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Tue, 2 Jul 2013 23:18:58 -0700 Subject: [PATCH 13/37] More path fixes. --- src/cpp/ripple/ripple_RippleCalc.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/cpp/ripple/ripple_RippleCalc.cpp b/src/cpp/ripple/ripple_RippleCalc.cpp index 0b0c57e71..ced1f7931 100644 --- a/src/cpp/ripple/ripple_RippleCalc.cpp +++ b/src/cpp/ripple/ripple_RippleCalc.cpp @@ -49,7 +49,7 @@ TER RippleCalc::calcNodeAdvance ( TER terResult = tesSUCCESS; - WriteLog (lsDEBUG, RippleCalc) << "calcNodeAdvance"; + WriteLog (lsDEBUG, RippleCalc) << "calcNodeAdvance: TakerPays:" << saTakerPays << " TakerGets:" << saTakerGets; int loopCount = 0; @@ -476,6 +476,9 @@ TER RippleCalc::calcNodeDeliverRev ( % saOutPassAct % saOutPlusFees); + if (saInPassReq > saTakerPays) + saInPassReq = saTakerPays; + if (!saInPassReq) { // After rounding did not want anything. @@ -519,9 +522,6 @@ TER RippleCalc::calcNodeDeliverRev ( if (tesSUCCESS != terResult) break; - if (saInPassAct > saTakerPays) - saInPassAct = saTakerPays; - if (saInPassAct < saInPassReq) { // Adjust output to conform to limited input. @@ -691,7 +691,7 @@ TER RippleCalc::calcNodeDeliverFwd ( STAmount saInFunded = STAmount::mulRound (saOutPassFunded, saOfrRate, saTakerPays, true); // Offer maximum in - Limited by by payout. STAmount saInTotal = STAmount::mulRound (saInFunded, saInFeeRate, true); // Offer maximum in with fees. STAmount saInSum = std::min (saInTotal, saInReq - saInAct - saInFees); // In limited by remaining. - STAmount saInPassAct = STAmount::divRound (saInSum, saInFeeRate, true); // In without fees. + STAmount saInPassAct = std::min (saTakerPays, STAmount::divRound (saInSum, saInFeeRate, true)); // In without fees. STAmount saOutPassMax = std::min (saOutPassFunded, STAmount::divRound (saInPassAct, saOfrRate, saTakerGets, true)); // Out limited by in remaining. STAmount saInPassFeesMax = saInSum - saInPassAct; @@ -790,7 +790,7 @@ TER RippleCalc::calcNodeDeliverFwd ( assert (saOutPassAct < saOutPassMax); - saInPassAct = STAmount::mulRound (saOutPassAct, saOfrRate, saInReq, true); + saInPassAct = std::min (saTakerPays, STAmount::mulRound (saOutPassAct, saOfrRate, saInReq, true)); saInPassFees = std::min (saInPassFeesMax, STAmount::mulRound (saInPassAct, saInFeeRate, true)); } From a35b3fbc6a382d92c104efa2af00047ad52ab3b2 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Tue, 2 Jul 2013 23:37:52 -0700 Subject: [PATCH 14/37] Remove the compaction delay. Somehow it's not helping. --- Subtrees/leveldb/db/db_impl.cc | 3 --- 1 file changed, 3 deletions(-) diff --git a/Subtrees/leveldb/db/db_impl.cc b/Subtrees/leveldb/db/db_impl.cc index af02467b3..0de9ca746 100644 --- a/Subtrees/leveldb/db/db_impl.cc +++ b/Subtrees/leveldb/db/db_impl.cc @@ -822,9 +822,6 @@ Status DBImpl::FinishCompactionOutputFile(CompactionState* compact, (unsigned long long) output_number, (unsigned long long) current_entries, (unsigned long long) current_bytes); - - // rate-limit compaction file creation with a 100ms pause - env_->SleepForMicroseconds(100000); } } return s; From 907d3d59ba8eb36251c1b65684e37c6f6d7d5667 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Wed, 3 Jul 2013 06:57:52 -0700 Subject: [PATCH 15/37] Temporarily disable SF_RETRY logic until it can be rethought. --- src/cpp/ripple/NetworkOPs.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/cpp/ripple/NetworkOPs.cpp b/src/cpp/ripple/NetworkOPs.cpp index 53f017d62..a240a38f6 100644 --- a/src/cpp/ripple/NetworkOPs.cpp +++ b/src/cpp/ripple/NetworkOPs.cpp @@ -259,9 +259,8 @@ void NetworkOPs::runTransactionQueue () if (isTemMalformed (r)) // malformed, cache bad theApp->getHashRouter ().setFlag (txn->getID (), SF_BAD); - else if (isTelLocal (r) || isTerRetry (r)) // can be retried - theApp->getHashRouter ().setFlag (txn->getID (), SF_RETRY); - +// else if (isTelLocal (r) || isTerRetry (r)) // can be retried +// theApp->getHashRouter ().setFlag (txn->getID (), SF_RETRY); if (isTerRetry (r)) { @@ -352,8 +351,8 @@ Transaction::pointer NetworkOPs::processTransaction (Transaction::pointer trans, if (isTemMalformed (r)) // malformed, cache bad theApp->getHashRouter ().setFlag (trans->getID (), SF_BAD); - else if (isTelLocal (r) || isTerRetry (r)) // can be retried - theApp->getHashRouter ().setFlag (trans->getID (), SF_RETRY); +// else if (isTelLocal (r) || isTerRetry (r)) // can be retried +// theApp->getHashRouter ().setFlag (trans->getID (), SF_RETRY); #ifdef DEBUG From 86196a6e46954a888a9d27b6595c035e69cb71f1 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Wed, 3 Jul 2013 07:14:47 -0700 Subject: [PATCH 16/37] More logging. --- src/cpp/ripple/ripple_Peer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cpp/ripple/ripple_Peer.cpp b/src/cpp/ripple/ripple_Peer.cpp index ffb26889e..38deb1e28 100644 --- a/src/cpp/ripple/ripple_Peer.cpp +++ b/src/cpp/ripple/ripple_Peer.cpp @@ -1117,7 +1117,7 @@ void PeerImp::recvTransaction (protocol::TMTransaction& packet, ScopedLock& Mast return; } - WriteLog (lsDEBUG, Peer) << "Got new transaction from peer"; + WriteLog (lsDEBUG, Peer) << "Got new transaction from peer " << getIP () << " : " << stx->getTransactionID (); if (mCluster) flags |= SF_TRUSTED | SF_SIGGOOD; From c46a89e7add43d937f29cdafef6ab293abf46443 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Wed, 3 Jul 2013 07:50:01 -0700 Subject: [PATCH 17/37] Don't sign/submit when network is not stable. --- src/cpp/ripple/RPCHandler.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/cpp/ripple/RPCHandler.cpp b/src/cpp/ripple/RPCHandler.cpp index 395fc71d3..b210b94a1 100644 --- a/src/cpp/ripple/RPCHandler.cpp +++ b/src/cpp/ripple/RPCHandler.cpp @@ -3682,9 +3682,7 @@ Json::Value RPCHandler::doCommand (const Json::Value& params, int iRole, LoadTyp return rpcError (rpcNO_NETWORK); } - // XXX Should verify we have a current ledger. - - if ((commandsA[i].iOptions & optCurrent) && false) + if ((commandsA[i].iOptions & optCurrent) && (theApp->getLedgerMaster().getValidatedLedgerAge() > 60)) { return rpcError (rpcNO_CURRENT); } From bdf160455c0449490139756a82ec829e6e18dce4 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Wed, 3 Jul 2013 07:53:32 -0700 Subject: [PATCH 18/37] Identify log messages from running the queued transactions --- src/cpp/ripple/NetworkOPs.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/cpp/ripple/NetworkOPs.cpp b/src/cpp/ripple/NetworkOPs.cpp index a240a38f6..4dc5ffe43 100644 --- a/src/cpp/ripple/NetworkOPs.cpp +++ b/src/cpp/ripple/NetworkOPs.cpp @@ -265,7 +265,7 @@ void NetworkOPs::runTransactionQueue () if (isTerRetry (r)) { // transaction should be held - WriteLog (lsDEBUG, NetworkOPs) << "Transaction should be held: " << r; + WriteLog (lsDEBUG, NetworkOPs) << "QTransaction should be held: " << r; dbtx->setStatus (HELD); theApp->getMasterTransaction ().canonicalize (dbtx, true); mLedgerMaster->addHeldTransaction (dbtx); @@ -273,18 +273,18 @@ void NetworkOPs::runTransactionQueue () else if (r == tefPAST_SEQ) { // duplicate or conflict - WriteLog (lsINFO, NetworkOPs) << "Transaction is obsolete"; + WriteLog (lsINFO, NetworkOPs) << "QTransaction is obsolete"; dbtx->setStatus (OBSOLETE); } else if (r == tesSUCCESS) { - WriteLog (lsINFO, NetworkOPs) << "Transaction is now included in open ledger"; + WriteLog (lsINFO, NetworkOPs) << "QTransaction is now included in open ledger"; dbtx->setStatus (INCLUDED); theApp->getMasterTransaction ().canonicalize (dbtx, true); } else { - WriteLog (lsDEBUG, NetworkOPs) << "Status other than success " << r; + WriteLog (lsDEBUG, NetworkOPs) << "QStatus other than success " << r; dbtx->setStatus (INVALID); } From fffdcfe4bf3847bc612fce978129f074b10d1a98 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Wed, 3 Jul 2013 08:35:16 -0700 Subject: [PATCH 19/37] Fix a bug parsing source currencies. --- src/cpp/ripple/ripple_PathRequest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cpp/ripple/ripple_PathRequest.cpp b/src/cpp/ripple/ripple_PathRequest.cpp index 04978d517..cfe7d1f91 100644 --- a/src/cpp/ripple/ripple_PathRequest.cpp +++ b/src/cpp/ripple/ripple_PathRequest.cpp @@ -188,7 +188,7 @@ int PathRequest::parseJson (const Json::Value& jvParams, bool complete) const Json::Value& jvCur = jvSrcCur[i]; uint160 uCur, uIss; - if (!jvCur.isArray() || !jvCur.isMember ("currency") || !STAmount::currencyFromString (uCur, jvCur["currency"].asString ())) + if (!jvCur.isObject() || !jvCur.isMember ("currency") || !STAmount::currencyFromString (uCur, jvCur["currency"].asString ())) { jvStatus = rpcError (rpcSRC_CUR_MALFORMED); return PFR_PJ_INVALID; From 5b6e9f9f9b2245b2cd8500b6e9eac27779550e80 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Wed, 3 Jul 2013 08:17:02 -0700 Subject: [PATCH 20/37] Log display name for transactions. --- src/cpp/ripple/ripple_Peer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cpp/ripple/ripple_Peer.cpp b/src/cpp/ripple/ripple_Peer.cpp index 38deb1e28..c0d3a57e6 100644 --- a/src/cpp/ripple/ripple_Peer.cpp +++ b/src/cpp/ripple/ripple_Peer.cpp @@ -1117,7 +1117,7 @@ void PeerImp::recvTransaction (protocol::TMTransaction& packet, ScopedLock& Mast return; } - WriteLog (lsDEBUG, Peer) << "Got new transaction from peer " << getIP () << " : " << stx->getTransactionID (); + WriteLog (lsDEBUG, Peer) << "Got new transaction from peer " << getDisplayName () << " : " << stx->getTransactionID (); if (mCluster) flags |= SF_TRUSTED | SF_SIGGOOD; From b2943d0b5389a5f2d4b68d721271f65d6d67619e Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Wed, 3 Jul 2013 09:20:53 -0700 Subject: [PATCH 21/37] More logging --- src/cpp/ripple/NetworkOPs.cpp | 3 +++ src/cpp/ripple/TransactionEngine.cpp | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/cpp/ripple/NetworkOPs.cpp b/src/cpp/ripple/NetworkOPs.cpp index 4dc5ffe43..5736a3b91 100644 --- a/src/cpp/ripple/NetworkOPs.cpp +++ b/src/cpp/ripple/NetworkOPs.cpp @@ -294,6 +294,7 @@ void NetworkOPs::runTransactionQueue () if (theApp->getHashRouter ().swapSet (txn->getID (), peers, SF_RELAYED)) { + WriteLog (lsDEBUG, NetworkOPs) << "relaying"; protocol::TMTransaction tx; Serializer s; dbtx->getSTransaction ()->add (s); @@ -304,6 +305,8 @@ void NetworkOPs::runTransactionQueue () PackedMessage::pointer packet = boost::make_shared (tx, protocol::mtTRANSACTION); theApp->getPeers ().relayMessageBut (peers, packet); } + else + WriteLog(lsDEBUG, NetworkOPs) << "recently relayed"; } txn->doCallbacks (r); diff --git a/src/cpp/ripple/TransactionEngine.cpp b/src/cpp/ripple/TransactionEngine.cpp index 4d3198765..2db19eb2a 100644 --- a/src/cpp/ripple/TransactionEngine.cpp +++ b/src/cpp/ripple/TransactionEngine.cpp @@ -146,7 +146,7 @@ TER TransactionEngine::applyTransaction (const SerializedTransaction& txn, Trans } } else - WriteLog (lsDEBUG, TransactionEngine) << "Not applying transaction"; + WriteLog (lsDEBUG, TransactionEngine) << "Not applying transaction " << txID; if (didApply) { From ab12bae17fb499d9f19c8e3cea3edf06cbd622a0 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Wed, 3 Jul 2013 09:24:18 -0700 Subject: [PATCH 22/37] Temporarily disable relaying when not in full sync. --- src/cpp/ripple/NetworkOPs.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/cpp/ripple/NetworkOPs.cpp b/src/cpp/ripple/NetworkOPs.cpp index 5736a3b91..b762b3806 100644 --- a/src/cpp/ripple/NetworkOPs.cpp +++ b/src/cpp/ripple/NetworkOPs.cpp @@ -288,7 +288,8 @@ void NetworkOPs::runTransactionQueue () dbtx->setStatus (INVALID); } - if (didApply || (mMode != omFULL)) +// if (didApply || (mMode != omFULL)) + if (didApply) { std::set peers; From a732f397cb64b4093177b0924fbe8144cd31681f Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Wed, 3 Jul 2013 09:38:22 -0700 Subject: [PATCH 23/37] Limit transaction queue size. --- src/cpp/ripple/ripple_Peer.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/cpp/ripple/ripple_Peer.cpp b/src/cpp/ripple/ripple_Peer.cpp index c0d3a57e6..e968aa6db 100644 --- a/src/cpp/ripple/ripple_Peer.cpp +++ b/src/cpp/ripple/ripple_Peer.cpp @@ -1122,8 +1122,11 @@ void PeerImp::recvTransaction (protocol::TMTransaction& packet, ScopedLock& Mast if (mCluster) flags |= SF_TRUSTED | SF_SIGGOOD; - theApp->getJobQueue ().addJob (jtTRANSACTION, "recvTransction->checkTransaction", + if (theApp->getJobQueue().getJobCount(jtTRANSACTION) < 100) + theApp->getJobQueue ().addJob (jtTRANSACTION, "recvTransction->checkTransaction", BIND_TYPE (&checkTransaction, P_1, flags, stx, boost::weak_ptr (shared_from_this ()))); + else + WriteLog(lsINFO, Peer) << " Transaction queue is full"; #ifndef TRUST_NETWORK } From 537b0f1088f05f63a71392775345b7c094234ee2 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Wed, 3 Jul 2013 09:43:21 -0700 Subject: [PATCH 24/37] Temporary workaround. --- src/cpp/ripple/ripple_Peer.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/cpp/ripple/ripple_Peer.cpp b/src/cpp/ripple/ripple_Peer.cpp index e968aa6db..2daddf52c 100644 --- a/src/cpp/ripple/ripple_Peer.cpp +++ b/src/cpp/ripple/ripple_Peer.cpp @@ -1122,11 +1122,13 @@ void PeerImp::recvTransaction (protocol::TMTransaction& packet, ScopedLock& Mast if (mCluster) flags |= SF_TRUSTED | SF_SIGGOOD; - if (theApp->getJobQueue().getJobCount(jtTRANSACTION) < 100) + if (theApp->getJobQueue().getJobCount(jtTRANSACTION) > 100) + WriteLog(lsINFO, Peer) << "Transaction queue is full"; + else if (theApp->getLedgerMaster()->getValidatedLedgerAge() > 240) + WriteLog(lsINFO, Peer) << "No new transactions until synchronized"; + else theApp->getJobQueue ().addJob (jtTRANSACTION, "recvTransction->checkTransaction", BIND_TYPE (&checkTransaction, P_1, flags, stx, boost::weak_ptr (shared_from_this ()))); - else - WriteLog(lsINFO, Peer) << " Transaction queue is full"; #ifndef TRUST_NETWORK } From dd431b47f53ffba5f6840de4f34795053e4f88d5 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Wed, 3 Jul 2013 09:46:52 -0700 Subject: [PATCH 25/37] Typo --- src/cpp/ripple/ripple_Peer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cpp/ripple/ripple_Peer.cpp b/src/cpp/ripple/ripple_Peer.cpp index 2daddf52c..9b8f18d08 100644 --- a/src/cpp/ripple/ripple_Peer.cpp +++ b/src/cpp/ripple/ripple_Peer.cpp @@ -1124,7 +1124,7 @@ void PeerImp::recvTransaction (protocol::TMTransaction& packet, ScopedLock& Mast if (theApp->getJobQueue().getJobCount(jtTRANSACTION) > 100) WriteLog(lsINFO, Peer) << "Transaction queue is full"; - else if (theApp->getLedgerMaster()->getValidatedLedgerAge() > 240) + else if (theApp->getLedgerMaster().getValidatedLedgerAge() > 240) WriteLog(lsINFO, Peer) << "No new transactions until synchronized"; else theApp->getJobQueue ().addJob (jtTRANSACTION, "recvTransction->checkTransaction", From c9b8009e3a67abc30921b2fb53dc69ee6dc4a216 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Wed, 3 Jul 2013 11:16:14 -0700 Subject: [PATCH 26/37] Avoid relaying very old transactions --- src/cpp/ripple/ripple_Peer.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/cpp/ripple/ripple_Peer.cpp b/src/cpp/ripple/ripple_Peer.cpp index 9b8f18d08..a5a532896 100644 --- a/src/cpp/ripple/ripple_Peer.cpp +++ b/src/cpp/ripple/ripple_Peer.cpp @@ -1101,10 +1101,11 @@ void PeerImp::recvTransaction (protocol::TMTransaction& packet, ScopedLock& Mast Serializer s (packet.rawtransaction ()); SerializerIterator sit (s); SerializedTransaction::pointer stx = boost::make_shared (boost::ref (sit)); + uint256 txID = stx->getTransactionID(); int flags; - if (! theApp->getHashRouter ().addSuppressionPeer (stx->getTransactionID (), mPeerId, flags)) + if (! theApp->getHashRouter ().addSuppressionPeer (txID, mPeerId, flags)) { // we have seen this transaction recently if (isSetBit (flags, SF_BAD)) @@ -1117,7 +1118,12 @@ void PeerImp::recvTransaction (protocol::TMTransaction& packet, ScopedLock& Mast return; } - WriteLog (lsDEBUG, Peer) << "Got new transaction from peer " << getDisplayName () << " : " << stx->getTransactionID (); + if (theApp->getMasterTransaction().fetch(txID, true)) + { + WriteLog (lsDEBUG, Peer) << "Peer " << getDisplayName() << " send old TX " << txID; + } + + WriteLog (lsDEBUG, Peer) << "Got new transaction from peer " << getDisplayName () << " : " << txID; if (mCluster) flags |= SF_TRUSTED | SF_SIGGOOD; From 699ac3d25669f04f3b30974100df16d1cb287499 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Wed, 3 Jul 2013 11:23:58 -0700 Subject: [PATCH 27/37] Raise default hold time. --- src/cpp/ripple/ripple_IHashRouter.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cpp/ripple/ripple_IHashRouter.h b/src/cpp/ripple/ripple_IHashRouter.h index 55b1cd8af..48f06cc9f 100644 --- a/src/cpp/ripple/ripple_IHashRouter.h +++ b/src/cpp/ripple/ripple_IHashRouter.h @@ -31,7 +31,7 @@ public: // static inline int getDefaultHoldTime () { - return 120; + return 300; } // VFALCO TODO rename the parameter to entryHoldTimeInSeconds From da9cd1dcfe9e7e79fc481a1c3de7ba1003984240 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Wed, 3 Jul 2013 11:36:18 -0700 Subject: [PATCH 28/37] Missing return in previous commit. --- src/cpp/ripple/ripple_Peer.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/cpp/ripple/ripple_Peer.cpp b/src/cpp/ripple/ripple_Peer.cpp index a5a532896..45496f9e9 100644 --- a/src/cpp/ripple/ripple_Peer.cpp +++ b/src/cpp/ripple/ripple_Peer.cpp @@ -1121,6 +1121,7 @@ void PeerImp::recvTransaction (protocol::TMTransaction& packet, ScopedLock& Mast if (theApp->getMasterTransaction().fetch(txID, true)) { WriteLog (lsDEBUG, Peer) << "Peer " << getDisplayName() << " send old TX " << txID; + return; } WriteLog (lsDEBUG, Peer) << "Got new transaction from peer " << getDisplayName () << " : " << txID; From bc5781e05dd4c9276299443d5fb7d5a9eba0420f Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Wed, 3 Jul 2013 12:36:37 -0700 Subject: [PATCH 29/37] Load manager fixes. --- src/cpp/ripple/ripple_LoadManager.cpp | 3 ++- src/cpp/ripple/ripple_Peer.cpp | 28 +++++++++++++++++++++++---- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/cpp/ripple/ripple_LoadManager.cpp b/src/cpp/ripple/ripple_LoadManager.cpp index 6bd6004c1..5d071f723 100644 --- a/src/cpp/ripple/ripple_LoadManager.cpp +++ b/src/cpp/ripple/ripple_LoadManager.cpp @@ -210,7 +210,8 @@ private: if (source.isPrivileged ()) // privileged sources never warn/cutoff return false; - if ((source.mBalance >= mDebitLimit) && (source.mLastWarning == now)) // no need to warn + if ( (source.mBalance >= mDebitWarn) || + ((source.mBalance >= mDebitLimit) && (source.mLastWarning == now))) return false; return true; diff --git a/src/cpp/ripple/ripple_Peer.cpp b/src/cpp/ripple/ripple_Peer.cpp index 45496f9e9..46838975f 100644 --- a/src/cpp/ripple/ripple_Peer.cpp +++ b/src/cpp/ripple/ripple_Peer.cpp @@ -198,7 +198,7 @@ PeerImp::PeerImp (boost::asio::io_service& io_service, boost::asio::ssl::context mCluster (false), mPeerId (peerID), mPrivate (false), - mLoad (""), + mLoad (std::string()), mMinLedger (0), mMaxLedger (0), mSocketSsl (io_service, ctx), @@ -975,6 +975,8 @@ void PeerImp::recvHello (protocol::TMHello& packet) { mCluster = true; mLoad.setPrivileged (); + if (!mNodeName.empty()) + mLoad.rename (mNodeName); WriteLog (lsINFO, Peer) << "Cluster connection to \"" << (mNodeName.empty () ? getIP () : mNodeName) << "\" established"; } @@ -1121,6 +1123,7 @@ void PeerImp::recvTransaction (protocol::TMTransaction& packet, ScopedLock& Mast if (theApp->getMasterTransaction().fetch(txID, true)) { WriteLog (lsDEBUG, Peer) << "Peer " << getDisplayName() << " send old TX " << txID; + applyLoadCharge (LT_InvalidRequest); return; } @@ -2217,11 +2220,28 @@ void PeerImp::sendGetPeers () void PeerImp::applyLoadCharge (LoadType loadType) { + // IMPLEMENATION IS INCOMPLETE + + // VFALCO TODO This needs to implemented before open sourcing. + if (theApp->getLoadManager ().applyLoadCharge (mLoad, loadType)) { - // UNIMPLEMENTED - - // VFALCO TODO This needs to implemented before open sourcing. + if (mCluster) + { + WriteLog (lsWARNING, Peer) << "aLC: " << getDisplayName() << " load from cluster"; + } + else if (theApp->getLoadManager ().shouldCutoff(mLoad)) + { + WriteLog (lsWARNING, Peer) << "aLC: " << getDisplayName() << " should cutoff"; + } + else if (theApp->getLoadManager ().shouldWarn (mLoad)) + { + WriteLog (lsWARNING, Peer) << "aLC: " << getDisplayName() << " load warning"; + } + else + { + WriteLog (lsWARNING, Peer) << "aLC: " << getDisplayName() << " cannot figure out"; + } } } From d303e7dba80fab35d1a250a5150da2c96c62c5be Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Wed, 3 Jul 2013 13:20:27 -0700 Subject: [PATCH 30/37] Shed load if the ledger publication engine is falling behind. --- src/cpp/ripple/LedgerMaster.cpp | 22 ++++++++++++++++++++++ src/cpp/ripple/LedgerMaster.h | 1 + src/cpp/ripple/ripple_Application.cpp | 3 +++ src/cpp/ripple/ripple_LoadManager.cpp | 2 ++ 4 files changed, 28 insertions(+) diff --git a/src/cpp/ripple/LedgerMaster.cpp b/src/cpp/ripple/LedgerMaster.cpp index de1a90a8b..7cfff58c1 100644 --- a/src/cpp/ripple/LedgerMaster.cpp +++ b/src/cpp/ripple/LedgerMaster.cpp @@ -25,6 +25,7 @@ Ledger::ref LedgerMaster::getCurrentSnapshot () int LedgerMaster::getValidatedLedgerAge () { + boost::recursive_mutex::scoped_lock ml (mLock); if (!mValidLedger) { WriteLog (lsDEBUG, LedgerMaster) << "No validated ledger"; @@ -39,6 +40,27 @@ int LedgerMaster::getValidatedLedgerAge () return static_cast (ret); } +bool LedgerMaster::isCaughtUp(std::string& reason) +{ + if (getValidatedLedgerAge() > 180) + { + reason = "No recently-validated ledger"; + return false; + } + boost::recursive_mutex::scoped_lock ml (mLock); + if (!mValidLedger || !mPubLedger) + { + reason = "No published ledger"; + return false; + } + if (mValidLedger->getLedgerSeq() > (mPubLedger->getLedgerSeq() + 3)) + { + reason = "Published ledger lags validated ledger"; + return false; + } + return true; +} + void LedgerMaster::addHeldTransaction (Transaction::ref transaction) { // returns true if transaction was added diff --git a/src/cpp/ripple/LedgerMaster.h b/src/cpp/ripple/LedgerMaster.h index 330a2c8d5..45b7913aa 100644 --- a/src/cpp/ripple/LedgerMaster.h +++ b/src/cpp/ripple/LedgerMaster.h @@ -60,6 +60,7 @@ public: return mPubLedger; } int getValidatedLedgerAge (); + bool isCaughtUp(std::string& reason); TER doTransaction (SerializedTransaction::ref txn, TransactionEngineParams params, bool& didApply); diff --git a/src/cpp/ripple/ripple_Application.cpp b/src/cpp/ripple/ripple_Application.cpp index 49cbeecd0..dbce6a46c 100644 --- a/src/cpp/ripple/ripple_Application.cpp +++ b/src/cpp/ripple/ripple_Application.cpp @@ -829,6 +829,9 @@ bool serverOkay (std::string& reason) return false; } + if (!theApp->getLedgerMaster().isCaughtUp(reason)) + return false; + if (theApp->getFeeTrack ().isLoaded ()) { reason = "Too much load"; diff --git a/src/cpp/ripple/ripple_LoadManager.cpp b/src/cpp/ripple/ripple_LoadManager.cpp index 5d071f723..4488e4458 100644 --- a/src/cpp/ripple/ripple_LoadManager.cpp +++ b/src/cpp/ripple/ripple_LoadManager.cpp @@ -201,6 +201,8 @@ private: // We do it this way in case we want to add exponential decay later int now = UptimeTimer::getInstance ().getElapsedSeconds (); + + boost::mutex::scoped_lock sl (mLock); canonicalize (source, now); source.mBalance += credits; From c0351e959a070f205e98f4bab3070d2319840b22 Mon Sep 17 00:00:00 2001 From: Vinnie Falco Date: Wed, 3 Jul 2013 13:47:27 -0700 Subject: [PATCH 31/37] Fix config-example for local signing --- test/config-example.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/config-example.js b/test/config-example.js index 1df83b72f..45bb94596 100644 --- a/test/config-example.js +++ b/test/config-example.js @@ -31,7 +31,8 @@ exports.servers = { 'local_sequence' : true, 'local_fee' : true, // 'validation_seed' : "shhDFVsmS2GSu5vUyZSPXYfj1r79h", - // 'validators' : "n9L8LZZCwsdXzKUN9zoVxs4YznYXZ9hEhsQZY7aVpxtFaSceiyDZ beta" + // 'validators' : "n9L8LZZCwsdXzKUN9zoVxs4YznYXZ9hEhsQZY7aVpxtFaSceiyDZ beta", + 'local_signing' : false, } }; From 89b4d70cd454ce1a2633c338eed95866a32bfb4f Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Thu, 4 Jul 2013 00:26:27 -0700 Subject: [PATCH 32/37] Fix a bug in RangeSet::clearValue --- modules/ripple_basics/containers/ripple_RangeSet.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/ripple_basics/containers/ripple_RangeSet.cpp b/modules/ripple_basics/containers/ripple_RangeSet.cpp index 155bca307..3e554039f 100644 --- a/modules/ripple_basics/containers/ripple_RangeSet.cpp +++ b/modules/ripple_basics/containers/ripple_RangeSet.cpp @@ -120,8 +120,7 @@ void RangeSet::clearValue (uint32 v) mRanges.erase (it); else { - mRanges[v + 1] = it->second; - it->second = v - 1; + ++ (it->first); } } else if (it->second == v) From e65027bded1afb43e46a898902331464cc7167ac Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Thu, 4 Jul 2013 00:30:56 -0700 Subject: [PATCH 33/37] This is the right fix. --- modules/ripple_basics/containers/ripple_RangeSet.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/ripple_basics/containers/ripple_RangeSet.cpp b/modules/ripple_basics/containers/ripple_RangeSet.cpp index 3e554039f..30b0fcafb 100644 --- a/modules/ripple_basics/containers/ripple_RangeSet.cpp +++ b/modules/ripple_basics/containers/ripple_RangeSet.cpp @@ -120,7 +120,9 @@ void RangeSet::clearValue (uint32 v) mRanges.erase (it); else { - ++ (it->first); + uint32 oldEnd = it->second; + mRanges.erase(it); + mRanges[v + 1] = oldEnd; } } else if (it->second == v) From 1fb4106f2f15187199d5d169a6aede6129045b76 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Fri, 5 Jul 2013 02:17:35 -0700 Subject: [PATCH 34/37] Hotfix: Reverse assumes forward expires offers. Forward doesn't. --- src/cpp/ripple/ripple_RippleCalc.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/cpp/ripple/ripple_RippleCalc.cpp b/src/cpp/ripple/ripple_RippleCalc.cpp index ced1f7931..1574a5ea1 100644 --- a/src/cpp/ripple/ripple_RippleCalc.cpp +++ b/src/cpp/ripple/ripple_RippleCalc.cpp @@ -2366,6 +2366,7 @@ void TransactionEngine::calcOfferBridgeNext ( { // Offer is expired. WriteLog (lsINFO, RippleCalc) << "calcOfferFirst: encountered expired offer"; + musUnfundedFound.insert(uOfferIndex); } else { From be68458aff5de5ed73ce58168a51eabce5b4f676 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Fri, 5 Jul 2013 03:34:24 -0700 Subject: [PATCH 35/37] Some cleanups. --- src/cpp/ripple/ripple_SHAMapSync.cpp | 16 +++------------- src/cpp/ripple/ripple_SHAMapTreeNode.cpp | 4 +--- src/cpp/ripple/ripple_SHAMapTreeNode.h | 2 +- 3 files changed, 5 insertions(+), 17 deletions(-) diff --git a/src/cpp/ripple/ripple_SHAMapSync.cpp b/src/cpp/ripple/ripple_SHAMapSync.cpp index a2eebd5f6..2c5621ce2 100644 --- a/src/cpp/ripple/ripple_SHAMapSync.cpp +++ b/src/cpp/ripple/ripple_SHAMapSync.cpp @@ -56,7 +56,7 @@ void SHAMap::getMissingNodes (std::vector& nodeIDs, std::vector& nodeIDs, std::vectorsetFullBelow (); - - if (mType == smtSTATE) - { - fullBelowCache.add (node->getNodeHash ()); - dropBelow (node); - } + fullBelowCache.add (node->getNodeHash ()); } } @@ -148,12 +143,7 @@ std::vector SHAMap::getNeededHashes (int max, SHAMapSyncFilter* filter) if (have_all) { node->setFullBelow (); - - if (mType == smtSTATE) - { - fullBelowCache.add (node->getNodeHash ()); - dropBelow (node); - } + fullBelowCache.add (node->getNodeHash ()); } } diff --git a/src/cpp/ripple/ripple_SHAMapTreeNode.cpp b/src/cpp/ripple/ripple_SHAMapTreeNode.cpp index 3ff484020..0a7d16dcf 100644 --- a/src/cpp/ripple/ripple_SHAMapTreeNode.cpp +++ b/src/cpp/ripple/ripple_SHAMapTreeNode.cpp @@ -356,12 +356,10 @@ void SHAMapTreeNode::addRaw (Serializer& s, SHANodeFormat format) bool SHAMapTreeNode::setItem (SHAMapItem::ref i, TNType type) { - uint256 hash = getNodeHash (); mType = type; mItem = i; assert (isLeaf ()); - updateHash (); - return getNodeHash () != hash; + return updateHash (); } SHAMapItem::pointer SHAMapTreeNode::getItem () const diff --git a/src/cpp/ripple/ripple_SHAMapTreeNode.h b/src/cpp/ripple/ripple_SHAMapTreeNode.h index 44705dd49..bc653adef 100644 --- a/src/cpp/ripple/ripple_SHAMapTreeNode.h +++ b/src/cpp/ripple/ripple_SHAMapTreeNode.h @@ -122,7 +122,7 @@ public: return !!mItem; } SHAMapItem::ref peekItem () - { + { // CAUTION: Do not modify the item return mItem; } SHAMapItem::pointer getItem () const; From 6f90ed259b7f5214fa1008d6f18982da6d141c64 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Fri, 5 Jul 2013 06:17:32 -0700 Subject: [PATCH 36/37] This looks like the right fix. --- src/cpp/ripple/ripple_RippleCalc.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/cpp/ripple/ripple_RippleCalc.cpp b/src/cpp/ripple/ripple_RippleCalc.cpp index 1574a5ea1..55fec68c5 100644 --- a/src/cpp/ripple/ripple_RippleCalc.cpp +++ b/src/cpp/ripple/ripple_RippleCalc.cpp @@ -186,8 +186,10 @@ TER RippleCalc::calcNodeAdvance ( // Offer is expired. WriteLog (lsTRACE, RippleCalc) << "calcNodeAdvance: expired offer"; - assert (musUnfundedFound.find (uOfferIndex) != musUnfundedFound.end ()); // Verify reverse found it too. - // Just skip it. It will be deleted. + if (bReverse) + musUnfundedFound.insert(uOfferIndex); + else // it will already be deleted + assert (musUnfundedFound.find (uOfferIndex) != musUnfundedFound.end ()); // Verify reverse found it too. continue; } else if (!saTakerPays.isPositive () || !saTakerGets.isPositive ()) From dc08a9061ec5c649519fe48d53f025f3440a03a1 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Sat, 6 Jul 2013 12:35:18 -0700 Subject: [PATCH 37/37] Fix some possible cases where a node could be marked as full below when it shouldn't be. --- src/cpp/ripple/ripple_SHAMapSync.cpp | 6 ++++-- src/cpp/ripple/ripple_SHAMapTreeNode.cpp | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/cpp/ripple/ripple_SHAMapSync.cpp b/src/cpp/ripple/ripple_SHAMapSync.cpp index 2c5621ce2..d09b33c0f 100644 --- a/src/cpp/ripple/ripple_SHAMapSync.cpp +++ b/src/cpp/ripple/ripple_SHAMapSync.cpp @@ -77,7 +77,8 @@ void SHAMap::getMissingNodes (std::vector& nodeIDs, std::vectorsetFullBelow (); - fullBelowCache.add (node->getNodeHash ()); + if (mType == smtSTATE) + fullBelowCache.add (node->getNodeHash ()); } } @@ -143,7 +144,8 @@ std::vector SHAMap::getNeededHashes (int max, SHAMapSyncFilter* filter) if (have_all) { node->setFullBelow (); - fullBelowCache.add (node->getNodeHash ()); + if (mType == smtSTATE) + fullBelowCache.add (node->getNodeHash ()); } } diff --git a/src/cpp/ripple/ripple_SHAMapTreeNode.cpp b/src/cpp/ripple/ripple_SHAMapTreeNode.cpp index 0a7d16dcf..4f096071b 100644 --- a/src/cpp/ripple/ripple_SHAMapTreeNode.cpp +++ b/src/cpp/ripple/ripple_SHAMapTreeNode.cpp @@ -19,7 +19,7 @@ SHAMapTreeNode::SHAMapTreeNode (const SHAMapTreeNode& node, uint32 seq) : SHAMap } SHAMapTreeNode::SHAMapTreeNode (const SHAMapNode& node, SHAMapItem::ref item, TNType type, uint32 seq) : - SHAMapNode (node), mItem (item), mSeq (seq), mType (type), mIsBranch (0), mFullBelow (true) + SHAMapNode (node), mItem (item), mSeq (seq), mType (type), mIsBranch (0), mFullBelow (false) { assert (item->peekData ().size () >= 12); updateHash ();