diff --git a/src/cpp/ripple/Ledger.cpp b/src/cpp/ripple/Ledger.cpp index 0d85bf1579..90593d45f3 100644 --- a/src/cpp/ripple/Ledger.cpp +++ b/src/cpp/ripple/Ledger.cpp @@ -516,10 +516,7 @@ void Ledger::saveAcceptedLedger(Job&, bool fromConsensus) } if (!fromConsensus) - { dropCache(); - return; - } if (theApp->getJobQueue().getJobCount(jtPUBOLDLEDGER) == 0) theApp->getLedgerMaster().resumeAcquiring(); diff --git a/src/cpp/ripple/LedgerConsensus.cpp b/src/cpp/ripple/LedgerConsensus.cpp index dcb7f14712..15b03e8784 100644 --- a/src/cpp/ripple/LedgerConsensus.cpp +++ b/src/cpp/ripple/LedgerConsensus.cpp @@ -379,7 +379,8 @@ void LedgerConsensus::checkLCL() typedef std::map::value_type u256_cvc_pair; BOOST_FOREACH(u256_cvc_pair& it, vals) - if (it.second.first > netLgrCount) + if ((it.second.first > netLgrCount) || + ((it.second.first == netLgrCount) && (it.first == mPrevLedgerHash))) { netLgr = it.first; netLgrCount = it.second.first; diff --git a/src/cpp/ripple/LedgerMaster.cpp b/src/cpp/ripple/LedgerMaster.cpp index 508db1dea0..4d79e51668 100644 --- a/src/cpp/ripple/LedgerMaster.cpp +++ b/src/cpp/ripple/LedgerMaster.cpp @@ -46,6 +46,7 @@ void LedgerMaster::pushLedger(Ledger::pointer newLCL, Ledger::pointer newOL, boo assert(newLCL->isClosed() && newLCL->isAccepted()); assert(!newOL->isClosed() && !newOL->isAccepted()); + boost::recursive_mutex::scoped_lock ml(mLock); if (newLCL->isAccepted()) { assert(newLCL->isClosed()); @@ -191,14 +192,10 @@ void LedgerMaster::asyncAccept(Ledger::pointer ledger) bool LedgerMaster::acquireMissingLedger(Ledger::ref origLedger, const uint256& ledgerHash, uint32 ledgerSeq) { // return: false = already gave up recently - if (mTooFast) - return true; - Ledger::pointer ledger = mLedgerHistory.getLedgerBySeq(ledgerSeq); if (ledger && (Ledger::getHashByIndex(ledgerSeq) == ledgerHash)) { cLog(lsTRACE) << "Ledger hash found in database"; - mTooFast = true; theApp->getJobQueue().addJob(jtPUBOLDLEDGER, "LedgerMaster::asyncAccept", boost::bind(&LedgerMaster::asyncAccept, this, ledger)); return true; @@ -293,9 +290,6 @@ bool LedgerMaster::shouldAcquire(uint32 currentLedger, uint32 ledgerHistory, uin void LedgerMaster::resumeAcquiring() { boost::recursive_mutex::scoped_lock ml(mLock); - if (!mTooFast) - return; - mTooFast = false; if (mMissingLedger && mMissingLedger->isDone()) mMissingLedger.reset(); @@ -396,7 +390,6 @@ void LedgerMaster::setFullLedger(Ledger::pointer ledger) if (theApp->getJobQueue().getJobCount(jtPUBOLDLEDGER) > 2) { - mTooFast = true; cLog(lsDEBUG) << "Too many pending ledger saves"; return; } @@ -556,7 +549,6 @@ void LedgerMaster::tryPublish() } } - mTooFast = false; if (!mPubLedgers.empty() && !mPubThread) { theApp->getOPs().clearNeedNetworkLedger(); diff --git a/src/cpp/ripple/LedgerMaster.h b/src/cpp/ripple/LedgerMaster.h index d00825441a..dfc8ef3aad 100644 --- a/src/cpp/ripple/LedgerMaster.h +++ b/src/cpp/ripple/LedgerMaster.h @@ -37,7 +37,6 @@ protected: RangeSet mCompleteLedgers; LedgerAcquire::pointer mMissingLedger; uint32 mMissingSeq; - bool mTooFast; // We are acquiring faster than we're writing int mMinValidations; // The minimum validations to publish a ledger uint256 mLastValidateHash; @@ -58,7 +57,7 @@ protected: public: - LedgerMaster() : mHeldTransactions(uint256()), mMissingSeq(0), mTooFast(false), + LedgerMaster() : mHeldTransactions(uint256()), mMissingSeq(0), mMinValidations(0), mLastValidateSeq(0), mPubThread(false) { ; } diff --git a/src/cpp/ripple/NetworkOPs.cpp b/src/cpp/ripple/NetworkOPs.cpp index 95cfdc2170..44bee343e5 100644 --- a/src/cpp/ripple/NetworkOPs.cpp +++ b/src/cpp/ripple/NetworkOPs.cpp @@ -674,11 +674,13 @@ bool NetworkOPs::checkLastClosedLedger(const std::vector& peerLis cLog(lsTRACE) << "NetworkOPs::checkLastClosedLedger"; Ledger::pointer ourClosed = mLedgerMaster->getClosedLedger(); - if(!ourClosed) + if (!ourClosed) return false; uint256 closedLedger = ourClosed->getHash(); uint256 prevClosedLedger = ourClosed->getParentHash(); + cLog(lsTRACE) << "OurClosed: " << closedLedger; + cLog(lsTRACE) << "PrevClosed: " << prevClosedLedger; boost::unordered_map ledgers; { @@ -1063,9 +1065,10 @@ std::vector< std::pair > std::vector< std::pair > ret; std::string sql = - str(boost::format("SELECT LedgerSeq,Status,RawTxn,TxnMeta FROM Transactions where TransID in " - "(SELECT TransID from AccountTransactions " - " WHERE Account = '%s' AND LedgerSeq <= '%u' AND LedgerSeq >= '%u' ) ORDER BY LedgerSeq DESC LIMIT 200;") + str(boost::format("SELECT AccountTransactions.LedgerSeq,Status,RawTxn,TxnMeta FROM " + "AccountTransactions INNER JOIN Transactions ON Transactions.TransID = AccountTransactions.TransID " + "WHERE Account = '%s' AND AccountTransactions.LedgerSeq <= '%u' AND AccountTransactions.LedgerSeq >= '%u' " + "ORDER BY AccountTransactions.LedgerSeq DESC LIMIT 200;") % account.humanAccountID() % maxLedger % minLedger); { @@ -1099,9 +1102,10 @@ std::vector NetworkOPs::getAccountTxsB( { // can be called with no locks std::vector< txnMetaLedgerType> ret; - std::string sql = - str(boost::format("SELECT LedgerSeq, RawTxn,TxnMeta FROM Transactions where TransID in (SELECT TransID from AccountTransactions " - " WHERE Account = '%s' AND LedgerSeq <= '%u' AND LedgerSeq >= '%u' ) ORDER BY LedgerSeq DESC LIMIT 500;") + std::string sql = str(boost::format("SELECT AccountTransactions.LedgerSeq,Status,RawTxn,TxnMeta FROM " + "AccountTransactions INNER JOIN Transactions ON Transactions.TransID = AccountTransactions.TransID " + "WHERE Account = '%s' AND AccountTransactions.LedgerSeq <= '%u' AND AccountTransactions.LedgerSeq >= '%u' " + "ORDER BY AccountTransactions.LedgerSeq DESC LIMIT 500;") % account.humanAccountID() % maxLedger % minLedger); { diff --git a/src/cpp/ripple/ValidationCollection.cpp b/src/cpp/ripple/ValidationCollection.cpp index 6f10bcca9e..032ff4066c 100644 --- a/src/cpp/ripple/ValidationCollection.cpp +++ b/src/cpp/ripple/ValidationCollection.cpp @@ -251,9 +251,10 @@ ValidationCollection::getCurrentValidations(uint256 currentLedger) else { // contains a live record bool countPreferred = valCurrentLedger && it->second->isPreviousHash(currentLedger); + tLog(countPreferred, lsDEBUG) << "Counting for " << currentLedger << " not " << it->second->getLedgerHash(); currentValidationCount& p = countPreferred ? ret[currentLedger] : ret[it->second->getLedgerHash()]; - ++(p.first); // count for the favored ledger + ++(p.first); uint160 ni = it->second->getNodeID(); if (ni > p.second) p.second = ni;