From c98a3e3895368deed80804581c0613b3dcee9871 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Thu, 16 May 2013 11:23:40 -0700 Subject: [PATCH 01/39] Must wrap non-const references passed to make_shared. --- src/cpp/ripple/AcceptedLedger.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cpp/ripple/AcceptedLedger.cpp b/src/cpp/ripple/AcceptedLedger.cpp index 2e2f69f08..770d0e874 100644 --- a/src/cpp/ripple/AcceptedLedger.cpp +++ b/src/cpp/ripple/AcceptedLedger.cpp @@ -63,7 +63,7 @@ AcceptedLedger::AcceptedLedger(Ledger::ref ledger) : mLedger(ledger) for (SHAMapItem::pointer item = txSet.peekFirstItem(); !!item; item = txSet.peekNextItem(item->getTag())) { SerializerIterator sit(item->peekSerializer()); - insert(boost::make_shared(ledger->getLedgerSeq(), sit)); + insert(boost::make_shared(ledger->getLedgerSeq(), boost::ref(sit))); } } From 33b318c5bc1a62fcd0b13719425b743fd35f2c7a Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Thu, 16 May 2013 11:59:28 -0700 Subject: [PATCH 02/39] Improve backfill in validation gate. --- src/cpp/ripple/LedgerMaster.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/cpp/ripple/LedgerMaster.cpp b/src/cpp/ripple/LedgerMaster.cpp index dd93c393e..6240c80e3 100644 --- a/src/cpp/ripple/LedgerMaster.cpp +++ b/src/cpp/ripple/LedgerMaster.cpp @@ -549,7 +549,10 @@ void LedgerMaster::checkAccept(const uint256& hash, uint32 seq) Ledger::pointer ledger = mLedgerHistory.getLedgerByHash(hash); if (!ledger) + { + theApp->getMasterLedgerAcquire().findCreate(hash, seq); return; + } mValidLedger = ledger; tryPublish(); @@ -567,6 +570,8 @@ void LedgerMaster::tryPublish() } else if (mValidLedger->getLedgerSeq() > (mPubLedger->getLedgerSeq() + MAX_LEDGER_GAP)) { + cLog(lsWARNING) << "Gap in validated ledger stream " << mPubLedger->getLedgerSeq() << " - " << + mValidLedger->getLedgerSeq() - 1; mPubLedger = mValidLedger; mPubLedgers.push_back(mValidLedger); } @@ -605,11 +610,11 @@ void LedgerMaster::tryPublish() { if (theApp->getMasterLedgerAcquire().isFailure(hash)) { - cLog(lsFATAL) << "Unable to acquire a recent validated ledger"; + cLog(lsWARNING) << "Unable to acquire a recent validated ledger"; } else { - LedgerAcquire::pointer acq = theApp->getMasterLedgerAcquire().findCreate(hash, 0); + LedgerAcquire::pointer acq = theApp->getMasterLedgerAcquire().findCreate(hash, seq); if (!acq->isDone()) { acq->setAccept(); From 6d020177ca02d49dbe066e42c41b9fca84e0745b Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Thu, 16 May 2013 12:01:55 -0700 Subject: [PATCH 03/39] Log the sequence in the close time message. --- src/cpp/ripple/LedgerConsensus.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/cpp/ripple/LedgerConsensus.cpp b/src/cpp/ripple/LedgerConsensus.cpp index 556ea0de9..479a2d220 100644 --- a/src/cpp/ripple/LedgerConsensus.cpp +++ b/src/cpp/ripple/LedgerConsensus.cpp @@ -695,7 +695,8 @@ void LedgerConsensus::updateOurPositions() for (std::map::iterator it = closeTimes.begin(), end = closeTimes.end(); it != end; ++it) { - cLog(lsDEBUG) << "CCTime: " << it->first << " has " << it->second << ", " << threshVote << " required"; + cLog(lsDEBUG) << "CCTime: seq" << mPreviousLedger->getLedgerSeq() + 1 << ": " << + it->first << " has " << it->second << ", " << threshVote << " required"; if (it->second >= threshVote) { cLog(lsDEBUG) << "Close time consensus reached: " << it->first; From 7f25ccec496a621c4b1057dfff1240698a6ba662 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Thu, 16 May 2013 19:31:52 -0700 Subject: [PATCH 04/39] Make sure to check the signature, even in this odd edge case. --- src/cpp/ripple/LedgerMaster.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cpp/ripple/LedgerMaster.cpp b/src/cpp/ripple/LedgerMaster.cpp index 6240c80e3..b671240b4 100644 --- a/src/cpp/ripple/LedgerMaster.cpp +++ b/src/cpp/ripple/LedgerMaster.cpp @@ -103,7 +103,7 @@ Ledger::pointer LedgerMaster::closeLedger(bool recover) { TransactionEngineParams tepFlags = tapOPEN_LEDGER; - if (theApp->isNew(it->first.getTXID(), SF_SIGGOOD)); + if (theApp->isNew(it->first.getTXID(), SF_SIGGOOD)) tepFlags = static_cast(tepFlags | tapNO_CHECK_SIGN); bool didApply; From 4d0f02a46aab4f2e071638f656343aa8a716d3fb Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Thu, 16 May 2013 23:01:24 -0700 Subject: [PATCH 05/39] CondVar::SignalAll was broken, leading to deadlocks on Windows builds. http://code.google.com/p/leveldb/issues/detail?id=149 --- src/cpp/leveldb/port/port_win.cc | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/cpp/leveldb/port/port_win.cc b/src/cpp/leveldb/port/port_win.cc index 99c1d8e34..1b0f060a1 100644 --- a/src/cpp/leveldb/port/port_win.cc +++ b/src/cpp/leveldb/port/port_win.cc @@ -109,12 +109,10 @@ void CondVar::Signal() { void CondVar::SignalAll() { wait_mtx_.Lock(); - for(long i = 0; i < waiting_; ++i) { - ::ReleaseSemaphore(sem1_, 1, NULL); - while(waiting_ > 0) { - --waiting_; - ::WaitForSingleObject(sem2_, INFINITE); - } + ::ReleaseSemaphore(sem1_, waiting_, NULL); + while(waiting_ > 0) { + --waiting_; + ::WaitForSingleObject(sem2_, INFINITE); } wait_mtx_.Unlock(); } From 5e1dddd1c7a8a41bfda708d38d7ef7418324bf2c Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Fri, 17 May 2013 01:02:01 -0700 Subject: [PATCH 06/39] Second check if fetch pack should be skipped. --- src/cpp/ripple/LoadManager.cpp | 6 ++++++ src/cpp/ripple/LoadManager.h | 2 +- src/cpp/ripple/NetworkOPs.cpp | 9 ++++++++- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/cpp/ripple/LoadManager.cpp b/src/cpp/ripple/LoadManager.cpp index 46965ff2b..3f5fb662c 100644 --- a/src/cpp/ripple/LoadManager.cpp +++ b/src/cpp/ripple/LoadManager.cpp @@ -285,6 +285,12 @@ bool LoadFeeTrack::raiseLocalFee() return true; } +bool LoadFeeTrack::isLoaded() +{ + boost::mutex::scoped_lock sl(mLock); + return (raiseCount != 0) || (mLocalTxnLoadFee != lftNormalFee); +} + bool LoadFeeTrack::lowerLocalFee() { boost::mutex::scoped_lock sl(mLock); diff --git a/src/cpp/ripple/LoadManager.h b/src/cpp/ripple/LoadManager.h index 07722b9e6..4257b21af 100644 --- a/src/cpp/ripple/LoadManager.h +++ b/src/cpp/ripple/LoadManager.h @@ -185,7 +185,7 @@ public: void setRemoteFee(uint32); bool raiseLocalFee(); bool lowerLocalFee(); - bool isLoaded() { return (raiseCount != 0) || (mLocalTxnLoadFee != lftNormalFee); } + bool isLoaded(); }; diff --git a/src/cpp/ripple/NetworkOPs.cpp b/src/cpp/ripple/NetworkOPs.cpp index 4b09dde55..f7734311e 100644 --- a/src/cpp/ripple/NetworkOPs.cpp +++ b/src/cpp/ripple/NetworkOPs.cpp @@ -2004,9 +2004,16 @@ void NetworkOPs::getBookPage(Ledger::pointer lpLedger, const uint160& uTakerPays // jvResult["nodes"] = Json::Value(Json::arrayValue); } -void NetworkOPs::makeFetchPack(Job&, boost::weak_ptr wPeer, boost::shared_ptr request, +void NetworkOPs::makeFetchPack(Job&, boost::weak_ptr wPeer, + boost::shared_ptr request, Ledger::pointer wantLedger, Ledger::pointer haveLedger) { + if (theApp->getFeeTrack().isLoaded()) + { + cLog(lsINFO) << "Too busy to make fetch pack"; + return; + } + try { Peer::pointer peer = wPeer.lock(); From a71225f9a3ece69ab85af79b8c7a34c315d1ad35 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Fri, 17 May 2013 01:05:29 -0700 Subject: [PATCH 07/39] Don't service stale/superceded fetch pack requests. --- src/cpp/ripple/NetworkOPs.cpp | 7 ++++++- src/cpp/ripple/NetworkOPs.h | 2 +- src/cpp/ripple/Peer.cpp | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/cpp/ripple/NetworkOPs.cpp b/src/cpp/ripple/NetworkOPs.cpp index f7734311e..70404c310 100644 --- a/src/cpp/ripple/NetworkOPs.cpp +++ b/src/cpp/ripple/NetworkOPs.cpp @@ -2006,8 +2006,13 @@ void NetworkOPs::getBookPage(Ledger::pointer lpLedger, const uint160& uTakerPays void NetworkOPs::makeFetchPack(Job&, boost::weak_ptr wPeer, boost::shared_ptr request, - Ledger::pointer wantLedger, Ledger::pointer haveLedger) + Ledger::pointer wantLedger, Ledger::pointer haveLedger, uint32 uUptime) { + if (upTime() > (uUptime + 1)) + { + cLog(lsINFO) << "Fetch pack request got stale"; + return; + } if (theApp->getFeeTrack().isLoaded()) { cLog(lsINFO) << "Too busy to make fetch pack"; diff --git a/src/cpp/ripple/NetworkOPs.h b/src/cpp/ripple/NetworkOPs.h index c18f8b55c..ffaac4aef 100644 --- a/src/cpp/ripple/NetworkOPs.h +++ b/src/cpp/ripple/NetworkOPs.h @@ -282,7 +282,7 @@ public: void mapComplete(const uint256& hash, SHAMap::ref map); bool stillNeedTXSet(const uint256& hash); void makeFetchPack(Job&, boost::weak_ptr peer, boost::shared_ptr request, - Ledger::pointer wantLedger, Ledger::pointer haveLedger); + Ledger::pointer wantLedger, Ledger::pointer haveLedger, uint32 uUptime); bool shouldFetchPack(uint32 seq); void gotFetchPack(bool progress, uint32 seq); void addFetchPack(const uint256& hash, boost::shared_ptr< std::vector >& data); diff --git a/src/cpp/ripple/Peer.cpp b/src/cpp/ripple/Peer.cpp index 8474db6de..75e384c8d 100644 --- a/src/cpp/ripple/Peer.cpp +++ b/src/cpp/ripple/Peer.cpp @@ -1911,7 +1911,7 @@ void Peer::doFetchPack(const boost::shared_ptr& packe } theApp->getJobQueue().addJob(jtPACK, "MakeFetchPack", BIND_TYPE(&NetworkOPs::makeFetchPack, &theApp->getOPs(), P_1, - boost::weak_ptr(shared_from_this()), packet, wantLedger, haveLedger)); + boost::weak_ptr(shared_from_this()), packet, wantLedger, haveLedger, upTime())); } bool Peer::hasProto(int version) From 5b68834e3b97e345f13bcb94acbc8b706909924b Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Fri, 17 May 2013 01:13:45 -0700 Subject: [PATCH 08/39] Set correct hash in fetch pack. --- 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 70404c310..c218afbc0 100644 --- a/src/cpp/ripple/NetworkOPs.cpp +++ b/src/cpp/ripple/NetworkOPs.cpp @@ -2029,7 +2029,7 @@ void NetworkOPs::makeFetchPack(Job&, boost::weak_ptr wPeer, reply.set_query(false); if (request->has_seq()) reply.set_seq(request->seq()); - reply.set_ledgerhash(reply.ledgerhash()); + reply.set_ledgerhash(request->ledgerhash()); reply.set_type(ripple::TMGetObjectByHash::otFETCH_PACK); do From d22c11be1c162c700a75a7e71fe69581e3dc1778 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Fri, 17 May 2013 01:40:55 -0700 Subject: [PATCH 09/39] Return references. --- src/cpp/ripple/SerializedObject.cpp | 14 ++++++++------ src/cpp/ripple/SerializedObject.h | 4 ++-- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/cpp/ripple/SerializedObject.cpp b/src/cpp/ripple/SerializedObject.cpp index 2179d5d64..4b644847c 100644 --- a/src/cpp/ripple/SerializedObject.cpp +++ b/src/cpp/ripple/SerializedObject.cpp @@ -639,38 +639,40 @@ std::vector STObject::getFieldVL(SField::ref field) const return cf->getValue(); } -static const STAmount defaultAmount; const STAmount& STObject::getFieldAmount(SField::ref field) const { + static STAmount empty; const SerializedType* rf = peekAtPField(field); if (!rf) throw std::runtime_error("Field not found"); SerializedTypeID id = rf->getSType(); if (id == STI_NOTPRESENT) - return defaultAmount; // optional field not present + return empty; // optional field not present const STAmount *cf = dynamic_cast(rf); if (!cf) throw std::runtime_error("Wrong field type"); return *cf; } -STPathSet STObject::getFieldPathSet(SField::ref field) const +const STPathSet& STObject::getFieldPathSet(SField::ref field) const { + static STPathSet empty; const SerializedType* rf = peekAtPField(field); if (!rf) throw std::runtime_error("Field not found"); SerializedTypeID id = rf->getSType(); - if (id == STI_NOTPRESENT) return STPathSet(); // optional field not present + if (id == STI_NOTPRESENT) return empty; // optional field not present const STPathSet *cf = dynamic_cast(rf); if (!cf) throw std::runtime_error("Wrong field type"); return *cf; } -STVector256 STObject::getFieldV256(SField::ref field) const +const STVector256& STObject::getFieldV256(SField::ref field) const { + static STVector256 empty; const SerializedType* rf = peekAtPField(field); if (!rf) throw std::runtime_error("Field not found"); SerializedTypeID id = rf->getSType(); - if (id == STI_NOTPRESENT) return STVector256(); // optional field not present + if (id == STI_NOTPRESENT) return empty; // optional field not present const STVector256 *cf = dynamic_cast(rf); if (!cf) throw std::runtime_error("Wrong field type"); return *cf; diff --git a/src/cpp/ripple/SerializedObject.h b/src/cpp/ripple/SerializedObject.h index 97ab764f3..c1a7fa35e 100644 --- a/src/cpp/ripple/SerializedObject.h +++ b/src/cpp/ripple/SerializedObject.h @@ -131,8 +131,8 @@ public: uint160 getFieldAccount160(SField::ref field) const; std::vector getFieldVL(SField::ref field) const; const STAmount& getFieldAmount(SField::ref field) const; - STPathSet getFieldPathSet(SField::ref field) const; - STVector256 getFieldV256(SField::ref field) const; + const STPathSet& getFieldPathSet(SField::ref field) const; + const STVector256& getFieldV256(SField::ref field) const; void setFieldU8(SField::ref field, unsigned char); void setFieldU16(SField::ref field, uint16); From 141c2dce11b986b01525071e2f5bee0c6beecdf3 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Fri, 17 May 2013 01:44:37 -0700 Subject: [PATCH 10/39] Avoid needless allocate/copy/free --- src/cpp/ripple/Offer.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cpp/ripple/Offer.h b/src/cpp/ripple/Offer.h index cdb9dd8e8..82bc58646 100644 --- a/src/cpp/ripple/Offer.h +++ b/src/cpp/ripple/Offer.h @@ -15,9 +15,9 @@ public: AccountItem::pointer makeItem(const uint160&, SerializedLedgerEntry::ref ledgerEntry); LedgerEntryType getType(){ return(ltOFFER); } - STAmount getTakerPays(){ return(mTakerPays); } - STAmount getTakerGets(){ return(mTakerGets); } - RippleAddress getAccount(){ return(mAccount); } + const STAmount& getTakerPays(){ return(mTakerPays); } + const STAmount& getTakerGets(){ return(mTakerGets); } + const RippleAddress& getAccount(){ return(mAccount); } int getSeq(){ return(mSeq); } Json::Value getJson(int); From c377562e7f7f6ff7e54f5573f994fc64b1e981b8 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Fri, 17 May 2013 01:44:49 -0700 Subject: [PATCH 11/39] Cleanups. --- src/cpp/ripple/RPCHandler.cpp | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/src/cpp/ripple/RPCHandler.cpp b/src/cpp/ripple/RPCHandler.cpp index de444d4da..93482b0d6 100644 --- a/src/cpp/ripple/RPCHandler.cpp +++ b/src/cpp/ripple/RPCHandler.cpp @@ -1146,9 +1146,6 @@ Json::Value RPCHandler::doAccountOffers(Json::Value jvRequest, int& cost, Scoped AccountState::pointer as = mNetOps->getAccountState(lpLedger, raAccount); - if (lpLedger->isImmutable()) - MasterLockHolder.unlock(); - if (as) { Json::Value& jsonLines = (jvResult["offers"] = Json::arrayValue); @@ -1158,15 +1155,10 @@ Json::Value RPCHandler::doAccountOffers(Json::Value jvRequest, int& cost, Scoped { Offer* offer=(Offer*)item.get(); - STAmount takerPays = offer->getTakerPays(); - STAmount takerGets = offer->getTakerGets(); - //RippleAddress account = offer->getAccount(); - Json::Value& obj = jsonLines.append(Json::objectValue); - //obj["account"] = account.humanAccountID(); - takerPays.setJson(obj["taker_pays"]); - takerGets.setJson(obj["taker_gets"]); + offer->getTakerPays().setJson(obj["taker_pays"]); + offer->getTakerGets().setJson(obj["taker_gets"]); obj["seq"] = offer->getSeq(); } From 249d5575cd836ddaa646e677c92d3fbba4579443 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Fri, 17 May 2013 01:46:22 -0700 Subject: [PATCH 12/39] Avoid an allocate/copy/free --- src/cpp/ripple/AccountItems.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/cpp/ripple/AccountItems.cpp b/src/cpp/ripple/AccountItems.cpp index cbad2cb2e..7bb67977d 100644 --- a/src/cpp/ripple/AccountItems.cpp +++ b/src/cpp/ripple/AccountItems.cpp @@ -29,14 +29,12 @@ void AccountItems::fillItems(const uint160& accountID, Ledger::ref ledger) SLE::pointer ownerDir = ledger->getDirNode(currentIndex); if (!ownerDir) return; - STVector256 svOwnerNodes = ownerDir->getFieldV256(sfIndexes); - - BOOST_FOREACH(uint256& uNode, svOwnerNodes.peekValue()) + BOOST_FOREACH(const uint256& uNode, ownerDir->getFieldV256(sfIndexes).peekValue()) { SLE::pointer sleCur = ledger->getSLEi(uNode); AccountItem::pointer item = mOfType->makeItem(accountID, sleCur); - if(item) + if (item) { mItems.push_back(item); } From c0e046a72154e9f53d50a3cde4c299d368886ede Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Fri, 17 May 2013 01:46:39 -0700 Subject: [PATCH 13/39] Don't put a leaf node in a fetch pack just because it moved. --- src/cpp/ripple/SHAMap.h | 3 ++- src/cpp/ripple/SHAMapSync.cpp | 21 +++++++++++++++++---- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/cpp/ripple/SHAMap.h b/src/cpp/ripple/SHAMap.h index b60c8827c..da58b1c2a 100644 --- a/src/cpp/ripple/SHAMap.h +++ b/src/cpp/ripple/SHAMap.h @@ -377,7 +377,8 @@ protected: SHAMapItem::pointer onlyBelow(SHAMapTreeNode*); void eraseChildren(SHAMapTreeNode::pointer); void dropBelow(SHAMapTreeNode*); - bool hasNode(const SHAMapNode& id, const uint256& hash); + bool hasInnerNode(const SHAMapNode& nodeID, const uint256& hash); + bool hasLeafNode(const uint256& tag, const uint256& hash); bool walkBranch(SHAMapTreeNode* node, SHAMapItem::ref otherMapItem, bool isFirstMap, SHAMapDiff& differences, int& maxCount); diff --git a/src/cpp/ripple/SHAMapSync.cpp b/src/cpp/ripple/SHAMapSync.cpp index eb14df863..e52eee5c9 100644 --- a/src/cpp/ripple/SHAMapSync.cpp +++ b/src/cpp/ripple/SHAMapSync.cpp @@ -410,7 +410,7 @@ bool SHAMap::deepCompare(SHAMap& other) return true; } -bool SHAMap::hasNode(const SHAMapNode& nodeID, const uint256& nodeHash) +bool SHAMap::hasInnerNode(const SHAMapNode& nodeID, const uint256& nodeHash) { SHAMapTreeNode* node = root.get(); while (node->isInner() && (node->getDepth() < nodeID.getDepth())) @@ -423,6 +423,19 @@ bool SHAMap::hasNode(const SHAMapNode& nodeID, const uint256& nodeHash) return node->getNodeHash() == nodeHash; } +bool SHAMap::hasLeafNode(const uint256& tag, const uint256& nodeHash) +{ + SHAMapTreeNode* node = root.get(); + while (node->isInner()) + { + int branch = node->selectBranch(tag); + if (node->isEmptyBranch(branch)) + return false; + node = getNodePointer(node->getChildNodeID(branch), node->getChildHash(branch)); + } + return node->getNodeHash() == nodeHash; +} + std::list SHAMap::getFetchPack(SHAMap* have, bool includeLeaves, int max) { std::list ret; @@ -446,7 +459,7 @@ std::list SHAMap::getFetchPack(SHAMap* have, bool incl if (root->isLeaf()) { if (includeLeaves && !root->getNodeHash().isZero() && - (!have || !have->hasNode(*root, root->getNodeHash()))) + (!have || !have->hasLeafNode(root->getTag(), root->getNodeHash()))) { Serializer s; root->addRaw(s, snfPREFIX); @@ -486,10 +499,10 @@ std::list SHAMap::getFetchPack(SHAMap* have, bool incl SHAMapTreeNode *next = getNodePointer(childID, childHash); if (next->isInner()) { - if (!have || !have->hasNode(*next, childHash)) + if (!have || !have->hasInnerNode(*next, childHash)) stack.push(next); } - else if (includeLeaves && (!have || !have->hasNode(childID, childHash))) + if (includeLeaves && (!have || !have->hasLeafNode(next->getTag(), childHash))) { Serializer s; node->addRaw(s, snfPREFIX); From c2bea03886dc3327bd9d2109a94de6da7fcbf059 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Fri, 17 May 2013 01:50:19 -0700 Subject: [PATCH 14/39] Bug in previous commit. --- src/cpp/ripple/SHAMapSync.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cpp/ripple/SHAMapSync.cpp b/src/cpp/ripple/SHAMapSync.cpp index e52eee5c9..639ba1a5d 100644 --- a/src/cpp/ripple/SHAMapSync.cpp +++ b/src/cpp/ripple/SHAMapSync.cpp @@ -502,7 +502,7 @@ std::list SHAMap::getFetchPack(SHAMap* have, bool incl if (!have || !have->hasInnerNode(*next, childHash)) stack.push(next); } - if (includeLeaves && (!have || !have->hasLeafNode(next->getTag(), childHash))) + if (includeLeaves && (!have || !have->hasLeafNode(node->getTag(), childHash))) { Serializer s; node->addRaw(s, snfPREFIX); From ff6e035e6e846984d196199c844fff1c969dba30 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Fri, 17 May 2013 01:52:39 -0700 Subject: [PATCH 15/39] Bugfix. --- src/cpp/ripple/SHAMapSync.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cpp/ripple/SHAMapSync.cpp b/src/cpp/ripple/SHAMapSync.cpp index 639ba1a5d..33d58e442 100644 --- a/src/cpp/ripple/SHAMapSync.cpp +++ b/src/cpp/ripple/SHAMapSync.cpp @@ -502,7 +502,7 @@ std::list SHAMap::getFetchPack(SHAMap* have, bool incl if (!have || !have->hasInnerNode(*next, childHash)) stack.push(next); } - if (includeLeaves && (!have || !have->hasLeafNode(node->getTag(), childHash))) + else if (includeLeaves && (!have || !have->hasLeafNode(node->getTag(), childHash))) { Serializer s; node->addRaw(s, snfPREFIX); From 327f20710c946d591c828bbb568f7affcb1724c6 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Fri, 17 May 2013 01:56:34 -0700 Subject: [PATCH 16/39] Fix. --- src/cpp/ripple/SHAMapSync.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cpp/ripple/SHAMapSync.cpp b/src/cpp/ripple/SHAMapSync.cpp index 33d58e442..8d851b25d 100644 --- a/src/cpp/ripple/SHAMapSync.cpp +++ b/src/cpp/ripple/SHAMapSync.cpp @@ -502,7 +502,7 @@ std::list SHAMap::getFetchPack(SHAMap* have, bool incl if (!have || !have->hasInnerNode(*next, childHash)) stack.push(next); } - else if (includeLeaves && (!have || !have->hasLeafNode(node->getTag(), childHash))) + else if (includeLeaves && (!have || !have->hasLeafNode(next->getTag(), childHash))) { Serializer s; node->addRaw(s, snfPREFIX); From 1139ac5ab4d6c17ef3177dfb4ce6e01760c7dace Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Fri, 17 May 2013 02:04:04 -0700 Subject: [PATCH 17/39] Make fetch packs less generous. --- src/cpp/ripple/NetworkOPs.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cpp/ripple/NetworkOPs.cpp b/src/cpp/ripple/NetworkOPs.cpp index c218afbc0..6963cc0c6 100644 --- a/src/cpp/ripple/NetworkOPs.cpp +++ b/src/cpp/ripple/NetworkOPs.cpp @@ -2054,7 +2054,7 @@ void NetworkOPs::makeFetchPack(Job&, boost::weak_ptr wPeer, newObj.set_ledgerseq(lSeq); } - if (wantLedger->getAccountHash().isNonZero() && (pack.size() < 768)) + if (wantLedger->getAccountHash().isNonZero() && (pack.size() < 512)) { pack = wantLedger->peekTransactionMap()->getFetchPack(NULL, true, 256); BOOST_FOREACH(SHAMap::fetchPackEntry_t& node, pack) @@ -2065,11 +2065,11 @@ void NetworkOPs::makeFetchPack(Job&, boost::weak_ptr wPeer, newObj.set_ledgerseq(lSeq); } } - if (reply.objects().size() >= 512) + if (reply.objects().size() >= 256) break; haveLedger = wantLedger; wantLedger = getLedgerByHash(haveLedger->getParentHash()); - } while (wantLedger); + } while (wantLedger && (upTime() <= (uUptime + 1))); cLog(lsINFO) << "Built fetch pack with " << reply.objects().size() << " nodes"; PackedMessage::pointer msg = boost::make_shared(reply, ripple::mtGET_OBJECTS); From 968618a50c992961707b0ee9a5cb1b6da907702e Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Fri, 17 May 2013 02:04:12 -0700 Subject: [PATCH 18/39] More verbose logging of invalid node requests. --- src/cpp/ripple/Peer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cpp/ripple/Peer.cpp b/src/cpp/ripple/Peer.cpp index 75e384c8d..8f9dbd528 100644 --- a/src/cpp/ripple/Peer.cpp +++ b/src/cpp/ripple/Peer.cpp @@ -1608,7 +1608,7 @@ void Peer::recvGetLedger(ripple::TMGetLedger& packet) SHAMapNode mn(packet.nodeids(i).data(), packet.nodeids(i).size()); if(!mn.isValid()) { - cLog(lsWARNING) << "Request for invalid node"; + cLog(lsWARNING) << "Request for invalid node: " << logMe; punishPeer(LT_InvalidRequest); return; } From b6b455ab3730987fc5f4a231027ac02b82f96afb Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Fri, 17 May 2013 03:16:04 -0700 Subject: [PATCH 19/39] Release master lock while getting nodes from a mutable ledger for a peer. --- src/cpp/ripple/Peer.cpp | 14 ++++++++++---- src/cpp/ripple/Peer.h | 2 +- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/cpp/ripple/Peer.cpp b/src/cpp/ripple/Peer.cpp index 8f9dbd528..869a7dee8 100644 --- a/src/cpp/ripple/Peer.cpp +++ b/src/cpp/ripple/Peer.cpp @@ -438,7 +438,7 @@ void Peer::processReadBuffer() LoadEvent::autoptr event(theApp->getJobQueue().getLoadEventAP(jtPEER, "Peer::read")); - boost::recursive_mutex::scoped_lock sl(theApp->getMasterLock()); + ScopedLock sl(theApp->getMasterLock()); // If connected and get a mtHELLO or if not connected and get a non-mtHELLO, wrong message was sent. if (mHelloed == (type == ripple::mtHELLO)) @@ -601,7 +601,7 @@ void Peer::processReadBuffer() event->reName("Peer::getledger"); ripple::TMGetLedger msg; if (msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE)) - recvGetLedger(msg); + recvGetLedger(msg, sl); else cLog(lsWARNING) << "parse error: " << type; } @@ -866,7 +866,6 @@ static void checkTransaction(Job&, int flags, SerializedTransaction::pointer stx void Peer::recvTransaction(ripple::TMTransaction& packet) { - Transaction::pointer tx; #ifndef TRUST_NETWORK try @@ -1417,7 +1416,7 @@ void Peer::recvStatus(ripple::TMStatusChange& packet) mMaxLedger = packet.lastseq(); } -void Peer::recvGetLedger(ripple::TMGetLedger& packet) +void Peer::recvGetLedger(ripple::TMGetLedger& packet, ScopedLock& MasterLockHolder) { SHAMap::pointer map; ripple::TMLedgerData reply; @@ -1545,6 +1544,13 @@ void Peer::recvGetLedger(ripple::TMGetLedger& packet) return; } + if (ledger->isImmutable()) + MasterLockHolder.unlock(); + else + { + cLog(lsWARNING) << "Request for data from mutable ledger"; + } + // Fill out the reply uint256 lHash = ledger->getHash(); reply.set_ledgerhash(lHash.begin(), lHash.size()); diff --git a/src/cpp/ripple/Peer.h b/src/cpp/ripple/Peer.h index d7bf83834..8d279583d 100644 --- a/src/cpp/ripple/Peer.h +++ b/src/cpp/ripple/Peer.h @@ -100,7 +100,7 @@ protected: void recvSearchTransaction(ripple::TMSearchTransaction& packet); void recvGetAccount(ripple::TMGetAccount& packet); void recvAccount(ripple::TMAccount& packet); - void recvGetLedger(ripple::TMGetLedger& packet); + void recvGetLedger(ripple::TMGetLedger& packet, ScopedLock& MasterLockHolder); void recvLedger(const boost::shared_ptr& packet); void recvStatus(ripple::TMStatusChange& packet); void recvPropose(const boost::shared_ptr& packet); From cb9eff134a3bc8dd3317bf53313128982ce83fdf Mon Sep 17 00:00:00 2001 From: Vinnie Falco Date: Mon, 20 May 2013 07:43:21 -0700 Subject: [PATCH 20/39] Update .gitattributes for annoying files that keep changing --- .gitattributes | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitattributes b/.gitattributes index cde063865..e60f76626 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,6 +1,10 @@ # Set default behaviour, in case users don't have core.autocrlf set. * text=auto +# These annoying files +rippled.1 binary +LICENSE binary + # Visual Studio *.sln text eol=crlf *.vcproj text eol=crlf From a6bbef47188eb63b5248809a77020f46d6d691d0 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Tue, 21 May 2013 15:39:35 -0700 Subject: [PATCH 21/39] Let 'isValid' inline. --- src/cpp/ripple/RippleAddress.cpp | 5 ----- src/cpp/ripple/RippleAddress.h | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/src/cpp/ripple/RippleAddress.cpp b/src/cpp/ripple/RippleAddress.cpp index 5914c115b..4c0157422 100644 --- a/src/cpp/ripple/RippleAddress.cpp +++ b/src/cpp/ripple/RippleAddress.cpp @@ -35,11 +35,6 @@ RippleAddress::RippleAddress() : mIsValid(false) nVersion = VER_NONE; } -bool RippleAddress::isValid() const -{ - return mIsValid; -} - void RippleAddress::clear() { nVersion = VER_NONE; diff --git a/src/cpp/ripple/RippleAddress.h b/src/cpp/ripple/RippleAddress.h index eb19e60d9..d4f916b4f 100644 --- a/src/cpp/ripple/RippleAddress.h +++ b/src/cpp/ripple/RippleAddress.h @@ -28,7 +28,7 @@ public: RippleAddress(); // For public and private key, checks if they are legal. - bool isValid() const; + bool isValid() const { return mIsValid; } void clear(); bool isSet() const; From 23eafaab8528b13aaf66419a3fdfe042ed9fbb35 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Tue, 21 May 2013 15:40:44 -0700 Subject: [PATCH 22/39] doAccountLines micro-optimization. --- src/cpp/ripple/RPCHandler.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/cpp/ripple/RPCHandler.cpp b/src/cpp/ripple/RPCHandler.cpp index 0ec133cf7..a790dd4fa 100644 --- a/src/cpp/ripple/RPCHandler.cpp +++ b/src/cpp/ripple/RPCHandler.cpp @@ -1071,9 +1071,6 @@ Json::Value RPCHandler::doAccountLines(Json::Value jvRequest, int& cost, ScopedL { jvResult["account"] = raAccount.humanAccountID(); - // XXX This is wrong, we do access the current ledger and do need to worry about changes. - // We access a committed ledger and need not worry about changes. - AccountItems rippleLines(raAccount.getAccountID(), lpLedger, AccountItem::pointer(new RippleState())); Json::Value& jsonLines = (jvResult["lines"] = Json::arrayValue); @@ -1083,9 +1080,9 @@ Json::Value RPCHandler::doAccountLines(Json::Value jvRequest, int& cost, ScopedL if (!raPeer.isValid() || raPeer.getAccountID() == line->getAccountIDPeer()) { - STAmount saBalance = line->getBalance(); - STAmount saLimit = line->getLimit(); - STAmount saLimitPeer = line->getLimitPeer(); + const STAmount& saBalance = line->getBalance(); + const STAmount& saLimit = line->getLimit(); + const STAmount& saLimitPeer = line->getLimitPeer(); Json::Value& jPeer = jsonLines.append(Json::objectValue); @@ -2610,6 +2607,7 @@ Json::Value RPCHandler::lookupLedger(Json::Value jvRequest, Ledger::pointer& lpL case LEDGER_CURRENT: lpLedger = mNetOps->getCurrentSnapshot(); iLedgerIndex = lpLedger->getLedgerSeq(); + assert(lpLedger->isImmutable() && !lpLedger->isClosed()); break; case LEDGER_CLOSED: From 51ec5787d57a5a08062f9892277d8e7a1ade8460 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Tue, 21 May 2013 16:10:23 -0700 Subject: [PATCH 23/39] Track TaggedCache hit rates. --- src/cpp/ripple/TaggedCache.h | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/src/cpp/ripple/TaggedCache.h b/src/cpp/ripple/TaggedCache.h index f71f135d0..0058c87a2 100644 --- a/src/cpp/ripple/TaggedCache.h +++ b/src/cpp/ripple/TaggedCache.h @@ -63,16 +63,21 @@ protected: cache_type mCache; // Hold strong reference to recent objects int mLastSweep; + uint64 mHits, mMisses; + public: TaggedCache(const char *name, int size, int age) - : mName(name), mTargetSize(size), mTargetAge(age), mCacheCount(0), mLastSweep(upTime()) { ; } + : mName(name), mTargetSize(size), mTargetAge(age), mCacheCount(0), mLastSweep(upTime()), + mHits(0), mMisses(0) + { ; } int getTargetSize() const; int getTargetAge() const; int getCacheSize(); int getTrackSize(); - int getSweepAge(); + float getHitRate(); + void clearStats(); void setTargetSize(int size); void setTargetAge(int age); @@ -129,6 +134,19 @@ template int TaggedCache::getTra return mCache.size(); } +template float TaggedCache::getHitRate() +{ + boost::recursive_mutex::scoped_lock sl(mLock); + return (static_cast(mHits) * 100) / (1.0 + mHits + mMisses); +} + +template float TaggedCache::clearStats() +{ + boost::recursive_mutex::scoped_lock sl(mLock); + mHits = 0; + mMisses = 0; +} + template void TaggedCache::clear() { boost::recursive_mutex::scoped_lock sl(mLock); @@ -302,20 +320,27 @@ boost::shared_ptr TaggedCache::fetch(const key_type& key) cache_iterator cit = mCache.find(key); if (cit == mCache.end()) + { + ++mMisses; return data_ptr(); + } cache_entry& entry = cit->second; entry.touch(); if (entry.isCached()) + { + ++mHits; return entry.ptr; + } entry.ptr = entry.lock(); if (entry.isCached()) - { + { // independent of cache size, so not counted as a hit ++mCacheCount; return entry.ptr; } mCache.erase(cit); + ++mMisses; return data_ptr(); } From 6b2a6ea03e25666aa5673a94ae0c3919d41d75d6 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Tue, 21 May 2013 16:10:51 -0700 Subject: [PATCH 24/39] Report cache hit rates. --- src/cpp/ripple/AcceptedLedger.h | 2 ++ src/cpp/ripple/HashedObject.h | 4 +++- src/cpp/ripple/LedgerHistory.h | 1 + src/cpp/ripple/LedgerMaster.h | 5 +++-- src/cpp/ripple/RPCHandler.cpp | 5 +++++ 5 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/cpp/ripple/AcceptedLedger.h b/src/cpp/ripple/AcceptedLedger.h index f8de68739..25adc64f8 100644 --- a/src/cpp/ripple/AcceptedLedger.h +++ b/src/cpp/ripple/AcceptedLedger.h @@ -70,6 +70,8 @@ public: int getLedgerSeq() const { return mLedger->getLedgerSeq(); } int getTxnCount() const { return mMap.size(); } + static float getCacheHitRate() { return ALCache.getHitRate(); } + ALTransaction::pointer getTxn(int) const; }; diff --git a/src/cpp/ripple/HashedObject.h b/src/cpp/ripple/HashedObject.h index cfc712f13..7c2ac27f1 100644 --- a/src/cpp/ripple/HashedObject.h +++ b/src/cpp/ripple/HashedObject.h @@ -65,7 +65,9 @@ public: HashedObjectStore(int cacheSize, int cacheAge); - bool isLevelDB() { return mLevelDB; } + bool isLevelDB() { return mLevelDB; } + + float getCacheHitRate() { return mCache.getHitRate(); } bool store(HashedObjectType type, uint32 index, const std::vector& data, const uint256& hash) diff --git a/src/cpp/ripple/LedgerHistory.h b/src/cpp/ripple/LedgerHistory.h index 9ee0ed9e8..cfb9239c4 100644 --- a/src/cpp/ripple/LedgerHistory.h +++ b/src/cpp/ripple/LedgerHistory.h @@ -15,6 +15,7 @@ public: void addLedger(Ledger::pointer ledger); void addAcceptedLedger(Ledger::pointer ledger, bool fromConsensus); + float getCacheHitRate() { return mLedgersByHash.getHitRate(); } uint256 getLedgerHash(uint32 index); Ledger::pointer getLedgerBySeq(uint32 index); Ledger::pointer getLedgerByHash(const uint256& hash); diff --git a/src/cpp/ripple/LedgerMaster.h b/src/cpp/ripple/LedgerMaster.h index dddffaa42..33b634493 100644 --- a/src/cpp/ripple/LedgerMaster.h +++ b/src/cpp/ripple/LedgerMaster.h @@ -157,8 +157,9 @@ public: void resumeAcquiring(); - void tune(int size, int age) { mLedgerHistory.tune(size, age); } - void sweep(void) { mLedgerHistory.sweep(); } + void tune(int size, int age) { mLedgerHistory.tune(size, age); } + void sweep() { mLedgerHistory.sweep(); } + float getCacheHitRate() { return mLedgerHistory.getCacheHitRate(); } void addValidateCallback(callback& c) { mOnValidate.push_back(c); } diff --git a/src/cpp/ripple/RPCHandler.cpp b/src/cpp/ripple/RPCHandler.cpp index a790dd4fa..cf94b0099 100644 --- a/src/cpp/ripple/RPCHandler.cpp +++ b/src/cpp/ripple/RPCHandler.cpp @@ -2304,6 +2304,11 @@ Json::Value RPCHandler::doGetCounts(Json::Value jvRequest, int& cost, ScopedLock ret["write_load"] = theApp->getHashedObjectStore().getWriteLoad(); + ret["SLE_hit_rate"] = theApp->getSLECache().getHitRate(); + ret["node_hit_rate"] = theApp->getHashedObjectStore().getCacheHitRate(); + ret["ledger_hit_rate"] = theApp->getLedgerMaster().getCacheHitRate(); + ret["AL_hit_rate"] = AcceptedLedger::getCacheHitRate(); + std::string uptime; int s = upTime(); textTime(uptime, s, "year", 365*24*60*60); From 72f6d51015f8efefeb15d967fc947e679179d9b3 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Wed, 22 May 2013 00:10:02 -0700 Subject: [PATCH 25/39] wrong return type. --- src/cpp/ripple/TaggedCache.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cpp/ripple/TaggedCache.h b/src/cpp/ripple/TaggedCache.h index 0058c87a2..53e48a9ac 100644 --- a/src/cpp/ripple/TaggedCache.h +++ b/src/cpp/ripple/TaggedCache.h @@ -140,7 +140,7 @@ template float TaggedCache::getH return (static_cast(mHits) * 100) / (1.0 + mHits + mMisses); } -template float TaggedCache::clearStats() +template void TaggedCache::clearStats() { boost::recursive_mutex::scoped_lock sl(mLock); mHits = 0; From 365c113b43c52ad227fd008db9b1cc1351204c5c Mon Sep 17 00:00:00 2001 From: Vinnie Falco Date: Wed, 22 May 2013 07:50:50 -0700 Subject: [PATCH 26/39] Fix double to float conversion warning --- src/cpp/ripple/TaggedCache.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cpp/ripple/TaggedCache.h b/src/cpp/ripple/TaggedCache.h index 53e48a9ac..8b05e30e0 100644 --- a/src/cpp/ripple/TaggedCache.h +++ b/src/cpp/ripple/TaggedCache.h @@ -137,7 +137,7 @@ template int TaggedCache::getTra template float TaggedCache::getHitRate() { boost::recursive_mutex::scoped_lock sl(mLock); - return (static_cast(mHits) * 100) / (1.0 + mHits + mMisses); + return (static_cast(mHits) * 100) / (1.0f + mHits + mMisses); } template void TaggedCache::clearStats() From 03725e463ba31659ab5379593d9f14996aea6b8d Mon Sep 17 00:00:00 2001 From: Vinnie Falco Date: Wed, 22 May 2013 10:00:02 -0700 Subject: [PATCH 27/39] Fix misspelled multiple inclusion supression macro --- src/cpp/ripple/SHAMapSync.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cpp/ripple/SHAMapSync.h b/src/cpp/ripple/SHAMapSync.h index ea7caee9d..60e55a139 100644 --- a/src/cpp/ripple/SHAMapSync.h +++ b/src/cpp/ripple/SHAMapSync.h @@ -1,5 +1,5 @@ -#ifndef __SHAMAPYSNC__ -#define __SHAMAPSYNC__ +#ifndef SHAMAPSYNC_H +#define SHAMAPSYNC_H #include "SHAMap.h" #include "Application.h" From aaf93be9ed2364f97ae607fa40da7af87fec5e3a Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Wed, 22 May 2013 14:36:21 -0700 Subject: [PATCH 28/39] Remove unneeded code that was implicated in a deadlock path. --- src/cpp/ripple/NetworkOPs.cpp | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/src/cpp/ripple/NetworkOPs.cpp b/src/cpp/ripple/NetworkOPs.cpp index 6963cc0c6..0e206bd72 100644 --- a/src/cpp/ripple/NetworkOPs.cpp +++ b/src/cpp/ripple/NetworkOPs.cpp @@ -783,24 +783,7 @@ bool NetworkOPs::checkLastClosedLedger(const std::vector& peerLis return true; } if (!mAcquiringLedger->isComplete()) - { // add more peers - int count = 0; - BOOST_FOREACH(Peer::ref it, peerList) - { - if (it->getClosedLedgerHash() == closedLedger) - { - ++count; - mAcquiringLedger->peerHas(it); - } - } - if (!count) - { // just ask everyone - BOOST_FOREACH(Peer::ref it, peerList) - if (it->isConnected()) - mAcquiringLedger->peerHas(it); - } return true; - } clearNeedNetworkLedger(); consensus = mAcquiringLedger->getLedger(); } From 7dc3335147717a1affc8e67b673893353e24a0ff Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Thu, 23 May 2013 02:03:31 -0700 Subject: [PATCH 29/39] Deadlock fix. --- src/cpp/ripple/Peer.cpp | 5 +++-- src/cpp/ripple/Peer.h | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/cpp/ripple/Peer.cpp b/src/cpp/ripple/Peer.cpp index 869a7dee8..3c557b567 100644 --- a/src/cpp/ripple/Peer.cpp +++ b/src/cpp/ripple/Peer.cpp @@ -612,7 +612,7 @@ void Peer::processReadBuffer() event->reName("Peer::ledgerdata"); boost::shared_ptr msg = boost::make_shared(); if (msg->ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE)) - recvLedger(msg); + recvLedger(msg, sl); else cLog(lsWARNING) << "parse error: " << type; } @@ -1663,8 +1663,9 @@ void Peer::recvGetLedger(ripple::TMGetLedger& packet, ScopedLock& MasterLockHold sendPacket(oPacket, true); } -void Peer::recvLedger(const boost::shared_ptr& packet_ptr) +void Peer::recvLedger(const boost::shared_ptr& packet_ptr, ScopedLock& MasterLockHolder) { + MasterLockHolder.unlock(); ripple::TMLedgerData& packet = *packet_ptr; if (packet.nodes().size() <= 0) { diff --git a/src/cpp/ripple/Peer.h b/src/cpp/ripple/Peer.h index 8d279583d..cfd39595a 100644 --- a/src/cpp/ripple/Peer.h +++ b/src/cpp/ripple/Peer.h @@ -101,7 +101,7 @@ protected: void recvGetAccount(ripple::TMGetAccount& packet); void recvAccount(ripple::TMAccount& packet); void recvGetLedger(ripple::TMGetLedger& packet, ScopedLock& MasterLockHolder); - void recvLedger(const boost::shared_ptr& packet); + void recvLedger(const boost::shared_ptr& packet, ScopedLock& MasterLockHolder); void recvStatus(ripple::TMStatusChange& packet); void recvPropose(const boost::shared_ptr& packet); void recvHaveTxSet(ripple::TMHaveTransactionSet& packet); From c6594bfd28b000b5cfdd7e97e874e2ec220354b2 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Thu, 23 May 2013 04:12:40 -0700 Subject: [PATCH 30/39] Mark closed ledgers immutable. --- src/cpp/ripple/LedgerConsensus.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/cpp/ripple/LedgerConsensus.cpp b/src/cpp/ripple/LedgerConsensus.cpp index 479a2d220..6d94f141d 100644 --- a/src/cpp/ripple/LedgerConsensus.cpp +++ b/src/cpp/ripple/LedgerConsensus.cpp @@ -1206,6 +1206,7 @@ void LedgerConsensus::accept(SHAMap::ref set, LoadEvent::pointer) newLCL->setAccepted(closeTime, mCloseResolution, closeTimeCorrect); newLCL->updateHash(); + newLCL->setImmutable(); cLog(lsDEBUG) << "Report: NewL = " << newLCL->getHash() << ":" << newLCL->getLedgerSeq(); uint256 newLCLHash = newLCL->getHash(); From e958972c10606a1c8604574b8481c96a25a54dbd Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Thu, 23 May 2013 04:28:47 -0700 Subject: [PATCH 31/39] Cleanup. --- src/cpp/ripple/HashedObject.cpp | 8 ++++---- src/cpp/ripple/HashedObject.h | 6 ++++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/cpp/ripple/HashedObject.cpp b/src/cpp/ripple/HashedObject.cpp index 5ff173307..03bb62415 100644 --- a/src/cpp/ripple/HashedObject.cpp +++ b/src/cpp/ripple/HashedObject.cpp @@ -86,14 +86,14 @@ bool HashedObjectStore::storeLevelDB(HashedObjectType type, uint32 index, { mWritePending = true; theApp->getJobQueue().addJob(jtWRITE, "HashedObject::store", - BIND_TYPE(&HashedObjectStore::bulkWriteLevelDB, this)); + BIND_TYPE(&HashedObjectStore::bulkWriteLevelDB, this, P_1)); } } mNegativeCache.del(hash); return true; } -void HashedObjectStore::bulkWriteLevelDB() +void HashedObjectStore::bulkWriteLevelDB(Job &) { assert(mLevelDB); int setSize = 0; @@ -205,7 +205,7 @@ bool HashedObjectStore::storeSQLite(HashedObjectType type, uint32 index, { mWritePending = true; theApp->getJobQueue().addJob(jtWRITE, "HashedObject::store", - BIND_TYPE(&HashedObjectStore::bulkWriteSQLite, this)); + BIND_TYPE(&HashedObjectStore::bulkWriteSQLite, this, P_1)); } } // else @@ -214,7 +214,7 @@ bool HashedObjectStore::storeSQLite(HashedObjectType type, uint32 index, return true; } -void HashedObjectStore::bulkWriteSQLite() +void HashedObjectStore::bulkWriteSQLite(Job&) { assert(!mLevelDB); while (1) diff --git a/src/cpp/ripple/HashedObject.h b/src/cpp/ripple/HashedObject.h index 7c2ac27f1..c1df75b2c 100644 --- a/src/cpp/ripple/HashedObject.h +++ b/src/cpp/ripple/HashedObject.h @@ -15,6 +15,8 @@ DEFINE_INSTANCE(HashedObject); +class Job; + enum HashedObjectType { hotUNKNOWN = 0, @@ -91,13 +93,13 @@ public: bool storeSQLite(HashedObjectType type, uint32 index, const std::vector& data, const uint256& hash); HashedObject::pointer retrieveSQLite(const uint256& hash); - void bulkWriteSQLite(); + void bulkWriteSQLite(Job&); #ifdef USE_LEVELDB bool storeLevelDB(HashedObjectType type, uint32 index, const std::vector& data, const uint256& hash); HashedObject::pointer retrieveLevelDB(const uint256& hash); - void bulkWriteLevelDB(); + void bulkWriteLevelDB(Job&); #endif From 7f593328c2b46190fad7985d8c0124db1d5bd297 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Thu, 23 May 2013 11:06:44 -0700 Subject: [PATCH 32/39] Assert on incorrect closed/immutable states. --- src/cpp/ripple/RPCHandler.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/cpp/ripple/RPCHandler.cpp b/src/cpp/ripple/RPCHandler.cpp index cf94b0099..525aeb6a2 100644 --- a/src/cpp/ripple/RPCHandler.cpp +++ b/src/cpp/ripple/RPCHandler.cpp @@ -2618,11 +2618,13 @@ Json::Value RPCHandler::lookupLedger(Json::Value jvRequest, Ledger::pointer& lpL case LEDGER_CLOSED: lpLedger = theApp->getLedgerMaster().getClosedLedger(); iLedgerIndex = lpLedger->getLedgerSeq(); + assert(lpLedger->isImmutable() && lpLedger->isClosed()); break; case LEDGER_VALIDATED: lpLedger = mNetOps->getValidatedLedger(); iLedgerIndex = lpLedger->getLedgerSeq(); + assert(lpLedger->isImmutable() && lpLedger->isClosed()); break; } From c3d1951c56a78e9926092539ae06cd5b643521ed Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Thu, 23 May 2013 11:08:17 -0700 Subject: [PATCH 33/39] Ledgers fetched by SQL are immutable. --- src/cpp/ripple/Ledger.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/cpp/ripple/Ledger.cpp b/src/cpp/ripple/Ledger.cpp index 33344bcfd..428134258 100644 --- a/src/cpp/ripple/Ledger.cpp +++ b/src/cpp/ripple/Ledger.cpp @@ -699,6 +699,7 @@ Ledger::pointer Ledger::getSQL1(SqliteStatement *stmt) void Ledger::getSQL2(Ledger::ref ret) { ret->setClosed(); + ret->setImmutable(); if (theApp->getOPs().haveLedger(ret->getLedgerSeq())) ret->setAccepted(); cLog(lsTRACE) << "Loaded ledger: " << ret->getHash().GetHex(); From 68c8162a8775d25c243752631b0f2e821083da4f Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Thu, 23 May 2013 11:32:14 -0700 Subject: [PATCH 34/39] Release the master lock sooner. --- src/cpp/ripple/Peer.cpp | 18 ++++++++++-------- src/cpp/ripple/Peer.h | 6 +++--- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/cpp/ripple/Peer.cpp b/src/cpp/ripple/Peer.cpp index 3c557b567..3cd739ba3 100644 --- a/src/cpp/ripple/Peer.cpp +++ b/src/cpp/ripple/Peer.cpp @@ -512,7 +512,7 @@ void Peer::processReadBuffer() ripple::TMGetPeers msg; if (msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE)) - recvGetPeers(msg); + recvGetPeers(msg, sl); else cLog(lsWARNING) << "parse error: " << type; } @@ -568,7 +568,7 @@ void Peer::processReadBuffer() event->reName("Peer::transaction"); ripple::TMTransaction msg; if (msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE)) - recvTransaction(msg); + recvTransaction(msg, sl); else cLog(lsWARNING) << "parse error: " << type; } @@ -634,7 +634,7 @@ void Peer::processReadBuffer() event->reName("Peer::validation"); boost::shared_ptr msg = boost::make_shared(); if (msg->ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE)) - recvValidation(msg); + recvValidation(msg, sl); else cLog(lsWARNING) << "parse error: " << type; } @@ -864,15 +864,15 @@ static void checkTransaction(Job&, int flags, SerializedTransaction::pointer stx #endif } -void Peer::recvTransaction(ripple::TMTransaction& packet) +void Peer::recvTransaction(ripple::TMTransaction& packet, ScopedLock& MasterLockHolder) { + MasterLockHolder.unlock(); Transaction::pointer tx; #ifndef TRUST_NETWORK try { #endif - std::string rawTx = packet.rawtransaction(); - Serializer s(rawTx); + Serializer s(packet.rawtransaction()); SerializerIterator sit(s); SerializedTransaction::pointer stx = boost::make_shared(boost::ref(sit)); @@ -1084,8 +1084,9 @@ static void checkValidation(Job&, SerializedValidation::pointer val, uint256 sig #endif } -void Peer::recvValidation(const boost::shared_ptr& packet) +void Peer::recvValidation(const boost::shared_ptr& packet, ScopedLock& MasterLockHolder) { + MasterLockHolder.unlock(); if (packet->validation().size() < 50) { cLog(lsWARNING) << "Too small validation from peer"; @@ -1137,8 +1138,9 @@ void Peer::recvGetContacts(ripple::TMGetContacts& packet) // Return a list of your favorite people // TODO: filter out all the LAN peers // TODO: filter out the peer you are talking to -void Peer::recvGetPeers(ripple::TMGetPeers& packet) +void Peer::recvGetPeers(ripple::TMGetPeers& packet, ScopedLock& MasterLockHolder) { + MasterLockHolder.unlock(); std::vector addrs; theApp->getConnectionPool().getTopNAddrs(30, addrs); diff --git a/src/cpp/ripple/Peer.h b/src/cpp/ripple/Peer.h index cfd39595a..67279a10f 100644 --- a/src/cpp/ripple/Peer.h +++ b/src/cpp/ripple/Peer.h @@ -87,12 +87,12 @@ protected: void sendHello(); void recvHello(ripple::TMHello& packet); - void recvTransaction(ripple::TMTransaction& packet); - void recvValidation(const boost::shared_ptr& packet); + void recvTransaction(ripple::TMTransaction& packet, ScopedLock& MasterLockHolder); + void recvValidation(const boost::shared_ptr& packet, ScopedLock& MasterLockHolder); void recvGetValidation(ripple::TMGetValidations& packet); void recvContact(ripple::TMContact& packet); void recvGetContacts(ripple::TMGetContacts& packet); - void recvGetPeers(ripple::TMGetPeers& packet); + void recvGetPeers(ripple::TMGetPeers& packet, ScopedLock& MasterLockHolder); void recvPeers(ripple::TMPeers& packet); void recvGetObjectByHash(const boost::shared_ptr& packet); void recvPing(ripple::TMPing& packet); From 68510178c23e16c77e2a582d47ffb136d3b263e5 Mon Sep 17 00:00:00 2001 From: Arthur Britto Date: Thu, 23 May 2013 16:01:15 -0700 Subject: [PATCH 35/39] Add support for strict to CLI for account_info. --- src/cpp/ripple/CallRPC.cpp | 18 ++++++++++++++++-- src/cpp/ripple/main.cpp | 2 +- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/cpp/ripple/CallRPC.cpp b/src/cpp/ripple/CallRPC.cpp index 78fc2579c..a347f7a63 100644 --- a/src/cpp/ripple/CallRPC.cpp +++ b/src/cpp/ripple/CallRPC.cpp @@ -437,7 +437,18 @@ Json::Value RPCParser::parseAccountLines(const Json::Value& jvParams) Json::Value RPCParser::parseAccountRaw(const Json::Value& jvParams, bool bPeer) { std::string strIdent = jvParams[0u].asString(); - std::string strPeer = bPeer && jvParams.size() >= 2 ? jvParams[1u].asString() : ""; + unsigned int iCursor = jvParams.size(); + bool bStrict = false; + std::string strPeer; + + if (!bPeer && iCursor >= 2 && jvParams[iCursor-1] == "strict") + { + bStrict = true; + --iCursor; + } + + if (bPeer && iCursor >= 2) + strPeer = jvParams[iCursor].asString(); int iIndex = 0; // int iIndex = jvParams.size() >= 2 ? lexical_cast_s(jvParams[1u].asString()) : 0; @@ -452,6 +463,9 @@ Json::Value RPCParser::parseAccountRaw(const Json::Value& jvParams, bool bPeer) jvRequest["account"] = strIdent; + if (bStrict) + jvRequest["strict"] = 1; + if (iIndex) jvRequest["account_index"] = iIndex; @@ -465,7 +479,7 @@ Json::Value RPCParser::parseAccountRaw(const Json::Value& jvParams, bool bPeer) jvRequest["peer"] = strPeer; } - if (jvParams.size() == (2+bPeer) && !jvParseLedger(jvRequest, jvParams[1u+bPeer].asString())) + if (iCursor == (2+bPeer) && !jvParseLedger(jvRequest, jvParams[1u+bPeer].asString())) return rpcError(rpcLGR_IDX_MALFORMED); return jvRequest; diff --git a/src/cpp/ripple/main.cpp b/src/cpp/ripple/main.cpp index 15a23767d..7cfb5cb0b 100644 --- a/src/cpp/ripple/main.cpp +++ b/src/cpp/ripple/main.cpp @@ -70,7 +70,7 @@ void printHelp(const po::options_description& desc) cerr << desc << endl; cerr << "Commands: " << endl; - cerr << " account_info |||| []" << endl; + cerr << " account_info |||| [] [strict]" << endl; cerr << " account_lines |\"\" []" << endl; cerr << " account_offers || []" << endl; cerr << " account_tx accountID [ledger_min [ledger_max [limit [offset]]]] [binary] [count] [descending]" << endl; From 576ee472bf6b2124698aaa021c3a132efbe4e597 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Thu, 23 May 2013 18:46:39 -0700 Subject: [PATCH 36/39] Add "syncing" state. --- src/cpp/ripple/LedgerMaster.cpp | 16 ++++++++++++++++ src/cpp/ripple/LedgerMaster.h | 1 + src/cpp/ripple/NetworkOPs.cpp | 17 +++++++++-------- src/cpp/ripple/NetworkOPs.h | 5 +++-- src/cpp/ripple/RPCHandler.cpp | 4 +--- 5 files changed, 30 insertions(+), 13 deletions(-) diff --git a/src/cpp/ripple/LedgerMaster.cpp b/src/cpp/ripple/LedgerMaster.cpp index df3f3b15c..7ba2dcd22 100644 --- a/src/cpp/ripple/LedgerMaster.cpp +++ b/src/cpp/ripple/LedgerMaster.cpp @@ -26,6 +26,22 @@ Ledger::ref LedgerMaster::getCurrentSnapshot() return mCurrentSnapshot; } +int LedgerMaster::getValidatedLedgerAge() +{ + if (!mValidLedger) + { + cLog(lsINFO) << "No validated ledger"; + return 999999; + } + + int64 ret = theApp->getOPs().getCloseTimeNC(); + ret -= static_cast(mValidLedger->getCloseTimeNC()); + ret = std::max(0LL, ret); + + cLog(lsINFO) << "Validated ledger age is " << ret; + return static_cast(ret); +} + void LedgerMaster::addHeldTransaction(Transaction::ref transaction) { // returns true if transaction was added boost::recursive_mutex::scoped_lock ml(mLock); diff --git a/src/cpp/ripple/LedgerMaster.h b/src/cpp/ripple/LedgerMaster.h index 33b634493..37c3a9630 100644 --- a/src/cpp/ripple/LedgerMaster.h +++ b/src/cpp/ripple/LedgerMaster.h @@ -83,6 +83,7 @@ public: // The published ledger is the last fully validated ledger Ledger::ref getValidatedLedger() { return mPubLedger; } + int getValidatedLedgerAge(); TER doTransaction(SerializedTransaction::ref txn, TransactionEngineParams params, bool& didApply); diff --git a/src/cpp/ripple/NetworkOPs.cpp b/src/cpp/ripple/NetworkOPs.cpp index 0e206bd72..a5adad261 100644 --- a/src/cpp/ripple/NetworkOPs.cpp +++ b/src/cpp/ripple/NetworkOPs.cpp @@ -49,6 +49,7 @@ std::string NetworkOPs::strOperatingMode() static const char* paStatusToken[] = { "disconnected", "connected", + "syncing", "tracking", "full" }; @@ -654,12 +655,6 @@ void NetworkOPs::tryStartConsensus() setMode(omFULL); } - if (mMode == omFULL) - { - // WRITEME - // check if the ledger is bad enough to go to omTRACKING - } - if ((!mConsensus) && (mMode != omDISCONNECTED)) beginConsensus(networkClosed, mLedgerMaster->getCurrentLedger()); } @@ -1038,6 +1033,12 @@ void NetworkOPs::setMode(OperatingMode om) { if (mMode == om) return; + if (om == omCONNECTED) + { + if (theApp->getLedgerMaster().getValidatedLedgerAge() < 60) + om = omSYNCING; + } + if ((om >= omCONNECTED) && (mMode == omDISCONNECTED)) mConnectTime = boost::posix_time::second_clock::universal_time(); @@ -1398,7 +1399,7 @@ void NetworkOPs::pubLedger(Ledger::ref accepted) jvObj["txn_count"] = Json::UInt(alpAccepted->getTxnCount()); - if ((mMode == omFULL) || (mMode == omTRACKING)) + if (mMode >= omSYNCING) jvObj["validated_ledgers"] = theApp->getLedgerMaster().getCompleteLedgers(); NetworkOPs::subMapType::const_iterator it = mSubLedger.begin(); @@ -1731,7 +1732,7 @@ bool NetworkOPs::subLedger(InfoSub::ref isrListener, Json::Value& jvResult) jvResult["reserve_inc"] = Json::UInt(lpClosed->getReserveInc()); } - if (((mMode == omFULL) || (mMode == omTRACKING)) && !isNeedNetworkLedger()) + if ((mMode >= omSYNCING) && !isNeedNetworkLedger()) jvResult["validated_ledgers"] = theApp->getLedgerMaster().getCompleteLedgers(); boost::recursive_mutex::scoped_lock sl(mMonitorLock); diff --git a/src/cpp/ripple/NetworkOPs.h b/src/cpp/ripple/NetworkOPs.h index 45499c08e..76a6cd939 100644 --- a/src/cpp/ripple/NetworkOPs.h +++ b/src/cpp/ripple/NetworkOPs.h @@ -98,8 +98,9 @@ public: { // how we process transactions or account balance requests omDISCONNECTED = 0, // not ready to process requests omCONNECTED = 1, // convinced we are talking to the network - omTRACKING = 2, // convinced we agree with the network - omFULL = 3 // we have the ledger and can even validate + omSYNCING = 2, // fallen slightly behind + omTRACKING = 3, // convinced we agree with the network + omFULL = 4 // we have the ledger and can even validate }; typedef boost::unordered_map subMapType; diff --git a/src/cpp/ripple/RPCHandler.cpp b/src/cpp/ripple/RPCHandler.cpp index 525aeb6a2..a350ae65c 100644 --- a/src/cpp/ripple/RPCHandler.cpp +++ b/src/cpp/ripple/RPCHandler.cpp @@ -3545,9 +3545,7 @@ Json::Value RPCHandler::doCommand(const Json::Value& jvRequest, int iRole, int & ScopedLock MasterLockHolder(theApp->getMasterLock()); - if (commandsA[i].iOptions & optNetwork - && mNetOps->getOperatingMode() != NetworkOPs::omTRACKING - && mNetOps->getOperatingMode() != NetworkOPs::omFULL) + if ((commandsA[i].iOptions & optNetwork) && (mNetOps->getOperatingMode() < NetworkOPs::omSYNCING)) { cLog(lsINFO) << "Insufficient network mode for RPC: " << mNetOps->strOperatingMode(); From 7f5a81fee5255e0165ac2dfa5e71a49a732f0a9d Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Thu, 23 May 2013 18:56:16 -0700 Subject: [PATCH 37/39] Fix some operating mode state transition rules. --- src/cpp/ripple/NetworkOPs.cpp | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/cpp/ripple/NetworkOPs.cpp b/src/cpp/ripple/NetworkOPs.cpp index a5adad261..3d6ec1519 100644 --- a/src/cpp/ripple/NetworkOPs.cpp +++ b/src/cpp/ripple/NetworkOPs.cpp @@ -616,6 +616,12 @@ void NetworkOPs::checkState(const boost::system::error_code& result) cLog(lsINFO) << "Node count (" << peerList.size() << ") is sufficient."; } + // Check if the last validated ledger forces a change between these states + if (mMode == omSYNCING) + setMode(omSYNCING); + else if (mMode == omCONNECTED) + setMode(omCONNECTED); + if (!mConsensus) tryStartConsensus(); @@ -639,14 +645,14 @@ void NetworkOPs::tryStartConsensus() // there shouldn't be a newer LCL. We need this information to do the next three // tests. - if ((mMode == omCONNECTED) && !ledgerChange) + if (((mMode == omCONNECTED) || (mMode == omSYNCING)) && !ledgerChange) { // count number of peers that agree with us and UNL nodes whose validations we have for LCL // if the ledger is good enough, go to omTRACKING - TODO if (!mNeedNetworkLedger) setMode(omTRACKING); } - if ((mMode == omTRACKING) && !ledgerChange ) + if (((mMode == omCONNECTED) || (mMode == omTRACKING)) && !ledgerChange) { // check if the ledger is good enough to go to omFULL // Note: Do not go to omFULL if we don't have the previous ledger @@ -1031,7 +1037,6 @@ void NetworkOPs::pubServer() void NetworkOPs::setMode(OperatingMode om) { - if (mMode == om) return; if (om == omCONNECTED) { @@ -1039,6 +1044,15 @@ void NetworkOPs::setMode(OperatingMode om) om = omSYNCING; } + if (om == omSYNCING) + { + if (theApp->getLedgerMaster().getValidatedLedgerAge() >= 60) + om = omCONNECTED; + } + + if (mMode == om) + return; + if ((om >= omCONNECTED) && (mMode == omDISCONNECTED)) mConnectTime = boost::posix_time::second_clock::universal_time(); From 3d4d6068ab1bb0f2572d2845789c70fe5837d450 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Thu, 23 May 2013 20:15:13 -0700 Subject: [PATCH 38/39] Reduce debug. --- src/cpp/ripple/LedgerMaster.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cpp/ripple/LedgerMaster.cpp b/src/cpp/ripple/LedgerMaster.cpp index 7ba2dcd22..91520c938 100644 --- a/src/cpp/ripple/LedgerMaster.cpp +++ b/src/cpp/ripple/LedgerMaster.cpp @@ -30,7 +30,7 @@ int LedgerMaster::getValidatedLedgerAge() { if (!mValidLedger) { - cLog(lsINFO) << "No validated ledger"; + cLog(lsDEBUG) << "No validated ledger"; return 999999; } @@ -38,7 +38,7 @@ int LedgerMaster::getValidatedLedgerAge() ret -= static_cast(mValidLedger->getCloseTimeNC()); ret = std::max(0LL, ret); - cLog(lsINFO) << "Validated ledger age is " << ret; + cLog(lsTRACE) << "Validated ledger age is " << ret; return static_cast(ret); } From e958a04abe2b49fa88f4efac76eb647e343c21c3 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Thu, 23 May 2013 20:19:05 -0700 Subject: [PATCH 39/39] Bump up the size of the ALCache. --- src/cpp/ripple/AcceptedLedger.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cpp/ripple/AcceptedLedger.cpp b/src/cpp/ripple/AcceptedLedger.cpp index 770d0e874..cb1bcf07a 100644 --- a/src/cpp/ripple/AcceptedLedger.cpp +++ b/src/cpp/ripple/AcceptedLedger.cpp @@ -2,7 +2,7 @@ #include -TaggedCache AcceptedLedger::ALCache("AcceptedLedger", 4, 60); +TaggedCache AcceptedLedger::ALCache("AcceptedLedger", 8, 120); ALTransaction::ALTransaction(uint32 seq, SerializerIterator& sit) {