From 853136b2a5f39de5aefc4f4b2e1d504303c5397f Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Wed, 24 Oct 2012 11:17:00 -0700 Subject: [PATCH 1/9] Trigger the history acquire code under the correct conditions. Advance the "last full ledger" tracking correctly. --- src/Ledger.cpp | 4 +--- src/LedgerAcquire.cpp | 1 + src/LedgerAcquire.h | 4 ++-- src/LedgerMaster.cpp | 37 ++++++++++++++++++++++++++++++------- src/LedgerMaster.h | 3 +++ 5 files changed, 37 insertions(+), 12 deletions(-) diff --git a/src/Ledger.cpp b/src/Ledger.cpp index c93b905323..eb82d387f2 100644 --- a/src/Ledger.cpp +++ b/src/Ledger.cpp @@ -434,9 +434,7 @@ void Ledger::saveAcceptedLedger(bool fromConsensus) theApp->getOPs().pubLedger(shared_from_this()); if(theConfig.FULL_HISTORY) - { - // WRITEME: check for seamless ledger history - } + theApp->getMasterLedger().checkLedgerGap(shared_from_this()); } diff --git a/src/LedgerAcquire.cpp b/src/LedgerAcquire.cpp index 9cc09b2ee5..71c631eb06 100644 --- a/src/LedgerAcquire.cpp +++ b/src/LedgerAcquire.cpp @@ -647,6 +647,7 @@ void LedgerAcquireSet::onComplete(boost::weak_ptr set, LedgerA { Ledger::pointer ledger = acquired->getLedger(); ledger->setAccepted(); + theApp->getMasterLedger().checkLedgerGap(ledger); lSet->updateCurrentLedger(ledger); } else diff --git a/src/LedgerAcquire.h b/src/LedgerAcquire.h index cbd0459dc3..dc717efee3 100644 --- a/src/LedgerAcquire.h +++ b/src/LedgerAcquire.h @@ -137,8 +137,8 @@ public: void dropLedger(const uint256& ledgerHash); bool gotLedgerData(ripple::TMLedgerData& packet, Peer::ref); - void killSet(const LedgerAcquireSet&) - { mAcquireSet = LedgerAcquireSet::pointer(); } + bool hasSet() { return !!mAcquireSet; } + void killSet(const LedgerAcquireSet&) { mAcquireSet = LedgerAcquireSet::pointer(); } void makeSet(Ledger::ref target, Ledger::ref current) { mAcquireSet = boost::make_shared(boost::ref(target), boost::ref(current)); } }; diff --git a/src/LedgerMaster.cpp b/src/LedgerMaster.cpp index 773e98dbed..83e2cdc3b6 100644 --- a/src/LedgerMaster.cpp +++ b/src/LedgerMaster.cpp @@ -23,7 +23,7 @@ void LedgerMaster::pushLedger(Ledger::ref newLedger) // Caller should already have properly assembled this ledger into "ready-to-close" form -- // all candidate transactions must already be applied Log(lsINFO) << "PushLedger: " << newLedger->getHash(); - ScopedLock sl(mLock); + boost::recursive_mutex::scoped_lock ml(mLock); if (!!mFinalizedLedger) { mFinalizedLedger->setClosed(); @@ -51,8 +51,8 @@ void LedgerMaster::pushLedger(Ledger::ref newLCL, Ledger::ref newOL) Log(lsINFO) << "StashAccepted: " << newLCL->getHash(); } + boost::recursive_mutex::scoped_lock ml(mLock); mFinalizedLedger = newLCL; - ScopedLock sl(mLock); mCurrentLedger = newOL; mEngine.setLedger(newOL); } @@ -60,11 +60,15 @@ void LedgerMaster::pushLedger(Ledger::ref newLCL, Ledger::ref newOL) void LedgerMaster::switchLedgers(Ledger::ref lastClosed, Ledger::ref current) { assert(lastClosed && current); - mFinalizedLedger = lastClosed; - mFinalizedLedger->setClosed(); - mFinalizedLedger->setAccepted(); - mCurrentLedger = current; + { + boost::recursive_mutex::scoped_lock ml(mLock); + mFinalizedLedger = lastClosed; + mFinalizedLedger->setClosed(); + mFinalizedLedger->setAccepted(); + mCurrentLedger = current; + } + assert(!mCurrentLedger->isClosed()); mEngine.setLedger(mCurrentLedger); } @@ -77,7 +81,6 @@ void LedgerMaster::storeLedger(Ledger::ref ledger) } - Ledger::pointer LedgerMaster::closeLedger() { boost::recursive_mutex::scoped_lock sl(mLock); @@ -94,5 +97,25 @@ TER LedgerMaster::doTransaction(const SerializedTransaction& txn, TransactionEng return result; } +void LedgerMaster::checkLedgerGap(Ledger::ref ledger) +{ + boost::recursive_mutex::scoped_lock sl(mLock); + + if (ledger->getParentHash() == mLastFullLedger->getHash()) + { + mLastFullLedger = ledger; + return; + } + + if (theApp->getMasterLedgerAcquire().hasSet()) + return; + + if (ledger->getLedgerSeq() < mLastFullLedger->getLedgerSeq()) + return; + + // we have a gap or discontinuity + theApp->getMasterLedgerAcquire().makeSet(mLastFullLedger, ledger); + +} // vim:ts=4 diff --git a/src/LedgerMaster.h b/src/LedgerMaster.h index 36f9339db5..47cf394b50 100644 --- a/src/LedgerMaster.h +++ b/src/LedgerMaster.h @@ -52,9 +52,12 @@ public: void setLastFullLedger(Ledger::ref ledger) { + boost::recursive_mutex::scoped_lock ml(mLock); mLastFullLedger = ledger; } + void checkLedgerGap(Ledger::ref ledger); + void switchLedgers(Ledger::ref lastClosed, Ledger::ref newCurrent); Ledger::pointer closeLedger(); From 23263c9a2150b176f7454a89b0f08cd45d4c0cfb Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Wed, 24 Oct 2012 12:13:18 -0700 Subject: [PATCH 2/9] Ledger::getLastFullLedger shouldn't throw. --- src/Ledger.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/Ledger.cpp b/src/Ledger.cpp index eb82d387f2..e22eac7963 100644 --- a/src/Ledger.cpp +++ b/src/Ledger.cpp @@ -507,7 +507,15 @@ Ledger::pointer Ledger::loadByHash(const uint256& ledgerHash) Ledger::pointer Ledger::getLastFullLedger() { - return getSQL("SELECT * from Ledgers order by LedgerSeq desc limit 1;"); + try + { + return getSQL("SELECT * from Ledgers order by LedgerSeq desc limit 1;"); + } + catch (SHAMapMissingNode&) + { + cLog(lsWARNING) << "Database contains ledger with missing nodes"; + return Ledger::pointer(); + } } void Ledger::addJson(Json::Value& ret, int options) From 60fb93054650e9c77f7458e327344fd6ef3c60a8 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Wed, 24 Oct 2012 12:23:09 -0700 Subject: [PATCH 3/9] Wrong header file included. --- src/UniqueNodeList.cpp | 216 ++++++++++++++++++++--------------------- 1 file changed, 105 insertions(+), 111 deletions(-) diff --git a/src/UniqueNodeList.cpp b/src/UniqueNodeList.cpp index cd55c89c0d..b5b8b90198 100644 --- a/src/UniqueNodeList.cpp +++ b/src/UniqueNodeList.cpp @@ -1,13 +1,10 @@ // XXX Dynamically limit fetching by distance. // XXX Want a limit of 2000 validators. -#include "Application.h" -#include "HttpsClient.h" -#include "Log.h" -#include "ParseSection.h" -#include "Serializer.h" #include "UniqueNodeList.h" -#include "utils.h" + +#include +#include #include #include @@ -17,8 +14,14 @@ #include #include -#include -#include +#include "Application.h" +#include "HttpsClient.h" +#include "Log.h" +#include "ParseSection.h" +#include "Serializer.h" +#include "utils.h" + +SETUP_LOG(); #define VALIDATORS_FETCH_SECONDS 30 #define VALIDATORS_FILE_PATH "/" VALIDATORS_FILE_NAME @@ -57,8 +60,8 @@ void UniqueNodeList::start() { miscLoad(); - std::cerr << "Validator fetch updated: " << mtpFetchUpdated << std::endl; - std::cerr << "Validator score updated: " << mtpScoreUpdated << std::endl; + Log(lsDEBUG) << "Validator fetch updated: " << mtpFetchUpdated + Log(lsDEBOG) << "Validator score updated: " << mtpScoreUpdated; fetchNext(); // Start fetching. scoreNext(false); // Start scoring. @@ -136,18 +139,18 @@ bool UniqueNodeList::scoreRound(std::vector& vsnNodes) } } - std::cerr << "midway: " << std::endl; + cLog(lsTRACE) << "midway: "; - BOOST_FOREACH(scoreNode& sn, vsnNodes) - { - std::cerr << str(boost::format("%s| %d, %d, %d: [%s]") - % sn.strValidator - % sn.iScore - % sn.iRoundScore - % sn.iRoundSeed - % strJoin(sn.viReferrals.begin(), sn.viReferrals.end(), ",")) - << std::endl; - } + if (sLog(lsTRACE)) + BOOST_FOREACH(scoreNode& sn, vsnNodes) + { + Log(lsTRACE) << str(boost::format("%s| %d, %d, %d: [%s]") + % sn.strValidator + % sn.iScore + % sn.iRoundScore + % sn.iRoundSeed + % strJoin(sn.viReferrals.begin(), sn.viReferrals.end(), ",")); + } // Add roundScore to score. // Make roundScore new roundSeed. @@ -160,18 +163,17 @@ bool UniqueNodeList::scoreRound(std::vector& vsnNodes) sn.iRoundScore = 0; } - std::cerr << "finish: " << std::endl; - - BOOST_FOREACH(scoreNode& sn, vsnNodes) - { - std::cerr << str(boost::format("%s| %d, %d, %d: [%s]") - % sn.strValidator - % sn.iScore - % sn.iRoundScore - % sn.iRoundSeed - % strJoin(sn.viReferrals.begin(), sn.viReferrals.end(), ",")) - << std::endl; - } + cLog(lsTRACE) << "finish: "; + if (sLog(lsTRACE)) + BOOST_FOREACH(scoreNode& sn, vsnNodes) + { + Log(lsTRACE) << str(boost::format("%s| %d, %d, %d: [%s]") + % sn.strValidator + % sn.iScore + % sn.iRoundScore + % sn.iRoundSeed + % strJoin(sn.viReferrals.begin(), sn.viReferrals.end(), ",")); + } return bDist; } @@ -283,17 +285,17 @@ void UniqueNodeList::scoreCompute() } // For debugging, print out initial scores. - BOOST_FOREACH(scoreNode& sn, vsnNodes) - { - std::cerr << str(boost::format("%s| %d, %d, %d") - % sn.strValidator - % sn.iScore - % sn.iRoundScore - % sn.iRoundSeed) - << std::endl; - } + if (sLog(lsTRACE) + BOOST_FOREACH(scoreNode& sn, vsnNodes) + { + Log(lsTRACE) << str(boost::format("%s| %d, %d, %d") + % sn.strValidator + % sn.iScore + % sn.iRoundScore + % sn.iRoundSeed); + } - // std::cerr << str(boost::format("vsnNodes.size=%d") % vsnNodes.size()) << std::endl; + // cLog(lsTRACE) << str(boost::format("vsnNodes.size=%d") % vsnNodes.size()); // Step through growing list of nodes adding each validation list. // - Each validator may have provided referals. Add those referals as validators. @@ -342,7 +344,7 @@ void UniqueNodeList::scoreCompute() iReferral = itEntry->second; } - // std::cerr << str(boost::format("%s: Public=%s iReferral=%d") % strValidator % strReferral % iReferral) << std::endl; + // cLog(lsTRACE) << str(boost::format("%s: Public=%s iReferral=%d") % strValidator % strReferral % iReferral); } else @@ -353,7 +355,7 @@ void UniqueNodeList::scoreCompute() ? -1 // We ignore domains we can't find entires for. : itEntry->second; - // std::cerr << str(boost::format("%s: Domain=%s iReferral=%d") % strValidator % strReferral % iReferral) << std::endl; + // cLog(lsTRACE) << str(boost::format("%s: Domain=%s iReferral=%d") % strValidator % strReferral % iReferral); } if (iReferral >= 0 && iNode != iReferral) @@ -369,18 +371,17 @@ void UniqueNodeList::scoreCompute() for (int i = SCORE_ROUNDS; bDist && i--;) bDist = scoreRound(vsnNodes); - std::cerr << "Scored:" << std::endl; - - BOOST_FOREACH(scoreNode& sn, vsnNodes) - { - std::cerr << str(boost::format("%s| %d, %d, %d: [%s]") - % sn.strValidator - % sn.iScore - % sn.iRoundScore - % sn.iRoundSeed - % strJoin(sn.viReferrals.begin(), sn.viReferrals.end(), ",")) - << std::endl; - } + Log(lsTRACE) << "Scored:"; + if (sLog(lsTRACE) + BOOST_FOREACH(scoreNode& sn, vsnNodes) + { + Log(lsTRACE) << str(boost::format("%s| %d, %d, %d: [%s]") + % sn.strValidator + % sn.iScore + % sn.iRoundScore + % sn.iRoundSeed + % strJoin(sn.viReferrals.begin(), sn.viReferrals.end(), ",")); + } // Persist validator scores. ScopedLock sl(theApp->getWalletDB()->getDBLock()); @@ -454,7 +455,7 @@ void UniqueNodeList::scoreCompute() { umValidators[db->getStrBinary("Validator")] = db->getInt("Count"); - // std::cerr << strValidator << ":" << db->getInt("Count") << std::endl; + // cLog(lsTRACE) << strValidator << ":" << db->getInt("Count"); } } @@ -529,11 +530,11 @@ void UniqueNodeList::scoreTimerHandler(const boost::system::error_code& err) mtpScoreNext = boost::posix_time::ptime(boost::posix_time::not_a_date_time); // Timer not set. mtpScoreStart = boost::posix_time::second_clock::universal_time(); // Scoring. - std::cerr << "Scoring: Start" << std::endl; + cLog(lsTRACE) << "Scoring: Start"; scoreCompute(); - std::cerr << "Scoring: End" << std::endl; + cLog(lsTRACE) << "Scoring: End"; // Save update time. mtpScoreUpdated = mtpScoreStart; @@ -553,7 +554,7 @@ void UniqueNodeList::scoreTimerHandler(const boost::system::error_code& err) // <-- bNow: true, to force scoring for debugging. void UniqueNodeList::scoreNext(bool bNow) { - // std::cerr << str(boost::format("scoreNext: mtpFetchUpdated=%s mtpScoreStart=%s mtpScoreUpdated=%s mtpScoreNext=%s") % mtpFetchUpdated % mtpScoreStart % mtpScoreUpdated % mtpScoreNext) << std::endl; + // cLog(lsTRACE) << str(boost::format("scoreNext: mtpFetchUpdated=%s mtpScoreStart=%s mtpScoreUpdated=%s mtpScoreNext=%s") % mtpFetchUpdated % mtpScoreStart % mtpScoreUpdated % mtpScoreNext); bool bCanScore = mtpScoreStart.is_not_a_date_time() // Not scoring. && !mtpFetchUpdated.is_not_a_date_time(); // Something to score. @@ -572,7 +573,7 @@ void UniqueNodeList::scoreNext(bool bNow) mtpScoreNext = boost::posix_time::second_clock::universal_time() // Past now too. + boost::posix_time::seconds(bNow ? 0 : SCORE_DELAY_SECONDS); - // std::cerr << str(boost::format("scoreNext: @%s") % mtpScoreNext) << std::endl; + // cLog(lsTRACE) << str(boost::format("scoreNext: @%s") % mtpScoreNext); mdtScoreTimer.expires_at(mtpScoreNext); mdtScoreTimer.async_wait(boost::bind(&UniqueNodeList::scoreTimerHandler, this, _1)); } @@ -652,10 +653,9 @@ void UniqueNodeList::processIps(const std::string& strSite, const NewcoinAddress } else { - std::cerr + cLog(lsTRACE) << str(boost::format("Validator: '%s' ["SECTION_IPS"]: rejecting '%s'") - % strSite % strReferral) - << std::endl; + % strSite % strReferral); } } @@ -684,12 +684,11 @@ int UniqueNodeList::processValidators(const std::string& strSite, const std::str std::string strNodePublic = naNodePublic.isValid() ? naNodePublic.humanNodePublic() : strValidatorsSrc; int iValues = 0; - std::cerr + cLog(lsTRACE) << str(boost::format("Validator: '%s' : '%s' : processing %d validators.") % strSite % strValidatorsSrc - % ( pmtVecStrValidators ? pmtVecStrValidators->size() : 0)) - << std::endl; + % ( pmtVecStrValidators ? pmtVecStrValidators->size() : 0)); // Remove all current Validator's entries in ValidatorReferrals { @@ -876,7 +875,7 @@ void UniqueNodeList::processFile(const std::string& strDomain, const NewcoinAddr if ((pvCurrencies = sectionEntries(secSite, SECTION_CURRENCIES)) && pvCurrencies->size()) { // XXX Process currencies. - std::cerr << "Ignoring currencies: not implemented." << std::endl; + cLog(lsWARNING) << "Ignoring currencies: not implemented."; } getValidatorsUrl(naNodePublic, secSite); @@ -890,15 +889,14 @@ void UniqueNodeList::responseFetch(const std::string& strDomain, const boost::sy if (bGood) { - std::cerr << boost::format("Validator: '%s' received " NODE_FILE_NAME ".") % strDomain << std::endl; + cLog(lsTRACE) << boost::format("Validator: '%s' received " NODE_FILE_NAME ".") % strDomain; } else { - std::cerr + cLog(lsTRACE) << boost::format("Validator: '%s' unable to retrieve " NODE_FILE_NAME ": %s") % strDomain - % err.message() - << std::endl; + % err.message(); } // @@ -910,21 +908,19 @@ void UniqueNodeList::responseFetch(const std::string& strDomain, const boost::sy { bGood = false; - std::cerr + cLog(lsTRACE) << boost::format("Validator: '%s' bad " NODE_FILE_NAME " missing single entry for " SECTION_DOMAIN ".") - % strDomain - << std::endl; + % strDomain; } if (bGood && strSite != strDomain) { bGood = false; - std::cerr + cLog(lsTRACE) << boost::format("Validator: '%s' bad " NODE_FILE_NAME " " SECTION_DOMAIN " does not match: %s") % strDomain - % strSite - << std::endl; + % strSite; } // @@ -937,10 +933,9 @@ void UniqueNodeList::responseFetch(const std::string& strDomain, const boost::sy // Bad [validation_public_key] section. bGood = false; - std::cerr + cLog(lsTRACE) << boost::format("Validator: '%s' bad " NODE_FILE_NAME " " SECTION_PUBLIC_KEY " does not have single entry.") - % strDomain - << std::endl; + % strDomain; } NewcoinAddress naNodePublic; @@ -950,16 +945,15 @@ void UniqueNodeList::responseFetch(const std::string& strDomain, const boost::sy // Bad public key. bGood = false; - std::cerr + cLog(lsTRACE) << boost::format("Validator: '%s' bad " NODE_FILE_NAME " " SECTION_PUBLIC_KEY " is bad: ") % strDomain - % strNodePublicKey - << std::endl; + % strNodePublicKey; } if (bGood) { -// std::cerr << boost::format("naNodePublic: '%s'") % naNodePublic.humanNodePublic() << std::endl; +// cLog(lsTRACE) << boost::format("naNodePublic: '%s'") % naNodePublic.humanNodePublic(); seedDomain sdCurrent; @@ -975,7 +969,7 @@ void UniqueNodeList::responseFetch(const std::string& strDomain, const boost::sy // XXX Only if no other refs to keep it arround, other wise we have an attack vector. sdCurrent.naPublicKey = naNodePublic; -// std::cerr << boost::format("sdCurrent.naPublicKey: '%s'") % sdCurrent.naPublicKey.humanNodePublic() << std::endl; +// cLog(lsTRACE) << boost::format("sdCurrent.naPublicKey: '%s'") % sdCurrent.naPublicKey.humanNodePublic(); sdCurrent.tpFetch = boost::posix_time::second_clock::universal_time(); sdCurrent.iSha256 = iSha256; @@ -984,12 +978,12 @@ void UniqueNodeList::responseFetch(const std::string& strDomain, const boost::sy if (bChangedB) { - std::cerr << boost::format("Validator: '%s' processing new " NODE_FILE_NAME ".") % strDomain << std::endl; + cLog(lsTRACE) << boost::format("Validator: '%s' processing new " NODE_FILE_NAME ".") % strDomain; processFile(strDomain, naNodePublic, secSite); } else { - std::cerr << boost::format("Validator: '%s' no change for " NODE_FILE_NAME ".") % strDomain << std::endl; + cLog(lsTRACE) << boost::format("Validator: '%s' no change for " NODE_FILE_NAME ".") % strDomain; fetchFinish(); } } @@ -1005,7 +999,7 @@ void UniqueNodeList::responseFetch(const std::string& strDomain, const boost::sy // Get the ripple.txt and process it. void UniqueNodeList::fetchProcess(std::string strDomain) { - std::cerr << "Fetching '" NODE_FILE_NAME "' from '" << strDomain << "'." << std::endl; + cLog(lsTRACE) << "Fetching '" NODE_FILE_NAME "' from '" << strDomain << "'."; std::deque deqSites; @@ -1030,7 +1024,7 @@ void UniqueNodeList::fetchTimerHandler(const boost::system::error_code& err) if (!err) { // Time to check for another fetch. - std::cerr << "fetchTimerHandler" << std::endl; + cLog(lsTRACE) << "fetchTimerHandler"; fetchNext(); } } @@ -1064,7 +1058,7 @@ void UniqueNodeList::fetchNext() tpNext = ptFromSeconds(iNext); tpNow = boost::posix_time::second_clock::universal_time(); - std::cerr << str(boost::format("fetchNext: iNext=%s tpNext=%s tpNow=%s") % iNext % tpNext % tpNow) << std::endl; + cLog(lsTRACE) << str(boost::format("fetchNext: iNext=%s tpNext=%s tpNow=%s") % iNext % tpNext % tpNow); strDomain = db->getStrBinary("Domain"); db->endIterRows(); @@ -1083,13 +1077,13 @@ void UniqueNodeList::fetchNext() if (strDomain.empty() || bFull) { - std::cerr << str(boost::format("fetchNext: strDomain=%s bFull=%d") % strDomain % bFull) << std::endl; + cLog(lsTRACE) << str(boost::format("fetchNext: strDomain=%s bFull=%d") % strDomain % bFull); nothing(); } else if (tpNext > tpNow) { - std::cerr << str(boost::format("fetchNext: set timer : strDomain=%s") % strDomain) << std::endl; + cLog(lsTRACE) << str(boost::format("fetchNext: set timer : strDomain=%s") % strDomain); // Fetch needs to happen in the future. Set a timer to wake us. mtpFetchNext = tpNext; @@ -1098,7 +1092,7 @@ void UniqueNodeList::fetchNext() } else { - std::cerr << str(boost::format("fetchNext: fetch now: strDomain=%s tpNext=%s tpNow=%s") % strDomain % tpNext %tpNow) << std::endl; + cLog(lsTRACE) << str(boost::format("fetchNext: fetch now: strDomain=%s tpNext=%s tpNow=%s") % strDomain % tpNext %tpNow); // Fetch needs to happen now. mtpFetchNext = boost::posix_time::ptime(boost::posix_time::not_a_date_time); @@ -1115,7 +1109,7 @@ void UniqueNodeList::fetchNext() setSeedDomains(sdCurrent, false); - std::cerr << "Validator: '" << strDomain << "' fetching " NODE_FILE_NAME "." << std::endl; + cLog(lsTRACE) << "Validator: '" << strDomain << "' fetching " NODE_FILE_NAME "."; fetchProcess(strDomain); // Go get it. @@ -1210,7 +1204,7 @@ void UniqueNodeList::setSeedDomains(const seedDomain& sdSource, bool bNext) int iScan = iToSeconds(sdSource.tpScan); int iFetch = iToSeconds(sdSource.tpFetch); - // std::cerr << str(boost::format("setSeedDomains: iNext=%s tpNext=%s") % iNext % sdSource.tpNext) << std::endl; + // cLog(lsTRACE) << str(boost::format("setSeedDomains: iNext=%s tpNext=%s") % iNext % sdSource.tpNext); std::string strSql = str(boost::format("REPLACE INTO SeedDomains (Domain,PublicKey,Source,Next,Scan,Fetch,Sha256,Comment) VALUES (%s, %s, %s, %d, %d, %d, '%s', %s);") % db->escape(sdSource.strDomain) @@ -1228,7 +1222,7 @@ void UniqueNodeList::setSeedDomains(const seedDomain& sdSource, bool bNext) if (!db->executeSQL(strSql)) { // XXX Check result. - std::cerr << "setSeedDomains: failed." << std::endl; + cLog(lsWARNING) << "setSeedDomains: failed."; } if (bNext && (mtpFetchNext.is_not_a_date_time() || mtpFetchNext > sdSource.tpNext)) @@ -1247,10 +1241,10 @@ void UniqueNodeList::nodeAddDomain(std::string strDomain, validatorSource vsWhy, boost::to_lower(strDomain); // YYY Would be best to verify strDomain is a valid domain. - // std::cerr << str(boost::format("nodeAddDomain: '%s' %c '%s'") + // cLog(lsTRACE) << str(boost::format("nodeAddDomain: '%s' %c '%s'") // % strDomain // % vsWhy - // % strComment) << std::endl; + // % strComment); seedDomain sdCurrent; @@ -1348,7 +1342,7 @@ void UniqueNodeList::setSeedNodes(const seedNode& snSource, bool bNext) int iScan = iToSeconds(snSource.tpScan); int iFetch = iToSeconds(snSource.tpFetch); - // std::cerr << str(boost::format("setSeedNodes: iNext=%s tpNext=%s") % iNext % sdSource.tpNext) << std::endl; + // cLog(lsTRACE) << str(boost::format("setSeedNodes: iNext=%s tpNext=%s") % iNext % sdSource.tpNext); assert(snSource.naPublicKey.isValid()); @@ -1368,7 +1362,7 @@ void UniqueNodeList::setSeedNodes(const seedNode& snSource, bool bNext) if (!db->executeSQL(strSql)) { // XXX Check result. - std::cerr << "setSeedNodes: failed." << std::endl; + cLog(lsTRACE) << "setSeedNodes: failed."; } } @@ -1485,21 +1479,21 @@ bool UniqueNodeList::nodeLoad(boost::filesystem::path pConfig) { if (pConfig.empty()) { - std::cerr << VALIDATORS_FILE_NAME " path not specified." << std::endl; + cLog(lsINFO) << VALIDATORS_FILE_NAME " path not specified."; return false; } if (!boost::filesystem::exists(pConfig)) { - std::cerr << str(boost::format(VALIDATORS_FILE_NAME " not found: %s") % pConfig) << std::endl; + cLog(lsWARNING) << str(boost::format(VALIDATORS_FILE_NAME " not found: %s") % pConfig); return false; } if (!boost::filesystem::is_regular_file(pConfig)) { - std::cerr << str(boost::format(VALIDATORS_FILE_NAME " not regular file: %s") % pConfig) << std::endl; + cLog(lsWARNING) << str(boost::format(VALIDATORS_FILE_NAME " not regular file: %s") % pConfig); return false; } @@ -1508,7 +1502,7 @@ bool UniqueNodeList::nodeLoad(boost::filesystem::path pConfig) if (!ifsDefault) { - std::cerr << str(boost::format(VALIDATORS_FILE_NAME " failed to open: %s") % pConfig) << std::endl; + cLog(lsFATAL) << str(boost::format(VALIDATORS_FILE_NAME " failed to open: %s") % pConfig); return false; } @@ -1520,21 +1514,21 @@ bool UniqueNodeList::nodeLoad(boost::filesystem::path pConfig) if (ifsDefault.bad()) { - std::cerr << str(boost::format("Failed to read: %s") % pConfig) << std::endl; + cLog(lsFATAL) << str(boost::format("Failed to read: %s") % pConfig); return false; } nodeProcess("local", strValidators, pConfig.string()); - std::cerr << str(boost::format("Processing: %s") % pConfig) << std::endl; + cLog(lsTRACE) << str(boost::format("Processing: %s") % pConfig); return true; } void UniqueNodeList::validatorsResponse(const boost::system::error_code& err, std::string strResponse) { - std::cerr << "Fetch '" VALIDATORS_FILE_NAME "' complete." << std::endl; + cLog(lsTRACE) << "Fetch '" VALIDATORS_FILE_NAME "' complete."; if (!err) { @@ -1542,7 +1536,7 @@ void UniqueNodeList::validatorsResponse(const boost::system::error_code& err, st } else { - std::cerr << "Error: " << err.message() << std::endl; + cLog(lsWARNING) << "Error: " << err.message(); } } @@ -1657,7 +1651,7 @@ void UniqueNodeList::nodeProcess(const std::string& strSite, const std::string& } else { - std::cerr << "WARNING: '" VALIDATORS_FILE_NAME "' missing [" SECTION_VALIDATORS "]." << std::endl; + cLog(lsWARNING) << "'" VALIDATORS_FILE_NAME "' missing [" SECTION_VALIDATORS "]."; } } From ab5afd223e57512ecf8ab39dafb6d4b333fbb5ad Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Wed, 24 Oct 2012 12:26:50 -0700 Subject: [PATCH 4/9] Clean up some klogging annoyances. --- src/Application.cpp | 1 - src/Log.cpp | 5 +++-- src/Log.h | 2 +- src/Peer.cpp | 2 +- src/RPCServer.cpp | 6 +++--- src/main.cpp | 11 ++++++----- 6 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/Application.cpp b/src/Application.cpp index 489b33a7de..c1b80e4ca9 100644 --- a/src/Application.cpp +++ b/src/Application.cpp @@ -72,7 +72,6 @@ void Application::run() if (!theConfig.DEBUG_LOGFILE.empty()) { // Let DEBUG messages go to the file but only WARNING or higher to regular output Log::setLogFile(theConfig.DEBUG_LOGFILE); - Log::setMinSeverity(lsWARNING); LogPartition::setSeverity(lsDEBUG); } diff --git a/src/Log.cpp b/src/Log.cpp index c2314dd778..c4cf54ea20 100644 --- a/src/Log.cpp +++ b/src/Log.cpp @@ -101,11 +101,12 @@ std::string Log::rotateLog(void) } -void Log::setMinSeverity(LogSeverity s) +void Log::setMinSeverity(LogSeverity s, bool all) { boost::recursive_mutex::scoped_lock sl(sLock); sMinSeverity = s; - LogPartition::setSeverity(s); + if (all) + LogPartition::setSeverity(s); } LogSeverity Log::getMinSeverity() diff --git a/src/Log.h b/src/Log.h index a0521f9097..7dbc2c8338 100644 --- a/src/Log.h +++ b/src/Log.h @@ -96,7 +96,7 @@ public: static LogSeverity stringToSeverity(const std::string&); static LogSeverity getMinSeverity(); - static void setMinSeverity(LogSeverity); + static void setMinSeverity(LogSeverity, bool all); static void setLogFile(boost::filesystem::path); static std::string rotateLog(void); }; diff --git a/src/Peer.cpp b/src/Peer.cpp index f115db2784..9c5664ed32 100644 --- a/src/Peer.cpp +++ b/src/Peer.cpp @@ -219,7 +219,7 @@ void Peer::handleConnect(const boost::system::error_code& error, boost::asio::ip } else { - std::cerr << "Connect peer: success." << std::endl; + cLog(lsINFO) << "Connect peer: success."; mSocketSsl.set_verify_mode(boost::asio::ssl::verify_none); diff --git a/src/RPCServer.cpp b/src/RPCServer.cpp index 46a59852e8..c246c8eb9e 100644 --- a/src/RPCServer.cpp +++ b/src/RPCServer.cpp @@ -1390,7 +1390,7 @@ Json::Value RPCServer::doProfile(const Json::Value ¶ms) if (iArgs >= 8 && "false" != params[7u].asString()) bSubmit = true; - Log::setMinSeverity(lsFATAL); + Log::setMinSeverity(lsFATAL, true); boost::posix_time::ptime ptStart(boost::posix_time::microsec_clock::local_time()); @@ -2700,7 +2700,7 @@ Json::Value RPCServer::doLogLevel(const Json::Value& params) LogSeverity sv = Log::stringToSeverity(params[0u].asString()); if (sv == lsINVALID) return RPCError(rpcINVALID_PARAMS); - Log::setMinSeverity(sv); + Log::setMinSeverity(sv, true); return RPCError(rpcSUCCESS); } @@ -2710,7 +2710,7 @@ Json::Value RPCServer::doLogLevel(const Json::Value& params) if (sv == lsINVALID) return RPCError(rpcINVALID_PARAMS); if (params[2u].asString() == "base") - Log::setMinSeverity(sv); + Log::setMinSeverity(sv, false); else if (!LogPartition::setSeverity(params[0u].asString(), sv)) return RPCError(rpcINVALID_PARAMS); return RPCError(rpcSUCCESS); diff --git a/src/main.cpp b/src/main.cpp index d06f8838cb..6c6356160a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -121,9 +121,10 @@ int main(int argc, char* argv[]) { nothing(); } - else if (argc >= 2 && !strcmp(argv[1], "--test")) { + else if (argc >= 2 && !strcmp(argv[1], "--test")) + { bTest = true; - Log::setMinSeverity(lsTRACE); + Log::setMinSeverity(lsTRACE, true); } else { @@ -143,9 +144,9 @@ int main(int argc, char* argv[]) } if (vm.count("verbose")) - { - Log::setMinSeverity(lsTRACE); - } + Log::setMinSeverity(lsTRACE, true); + else if (!bTest) + Log::setMinSeverity(lsWARNING, true); if (!iResult) { From bdc6e9b854a842f259092c8ad91ea3242045b5f8 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Wed, 24 Oct 2012 12:27:06 -0700 Subject: [PATCH 5/9] Wrong header file. --- src/UniqueNodeList.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/UniqueNodeList.h b/src/UniqueNodeList.h index 4040fe0f39..be8942fc5b 100644 --- a/src/UniqueNodeList.h +++ b/src/UniqueNodeList.h @@ -10,7 +10,7 @@ #include "HttpsClient.h" #include "ParseSection.h" -#include +#include #include #include @@ -48,7 +48,7 @@ private: boost::posix_time::ptime mtpScoreUpdated; boost::posix_time::ptime mtpFetchUpdated; - boost::recursive_mutex mUNLLock; + boost::recursive_mutex mUNLLock; // XXX Make this faster, make this the contents vector unsigned char or raw public key. // XXX Contents needs to based on score. boost::unordered_set mUNL; From 2aec337c1b8be0e98f5498a262f38e8d54b789d0 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Wed, 24 Oct 2012 12:27:22 -0700 Subject: [PATCH 6/9] Modernize logging. --- src/UniqueNodeList.cpp | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/src/UniqueNodeList.cpp b/src/UniqueNodeList.cpp index b5b8b90198..cfd1e764ef 100644 --- a/src/UniqueNodeList.cpp +++ b/src/UniqueNodeList.cpp @@ -45,8 +45,6 @@ SETUP_LOG(); #define MIN(x,y) ((x)<(y)?(x):(y)) #endif -SETUP_LOG(); - UniqueNodeList::UniqueNodeList(boost::asio::io_service& io_service) : mdtScoreTimer(io_service), mFetchActive(0), @@ -60,8 +58,8 @@ void UniqueNodeList::start() { miscLoad(); - Log(lsDEBUG) << "Validator fetch updated: " << mtpFetchUpdated - Log(lsDEBOG) << "Validator score updated: " << mtpScoreUpdated; + Log(lsDEBUG) << "Validator fetch updated: " << mtpFetchUpdated; + Log(lsDEBUG) << "Validator score updated: " << mtpScoreUpdated; fetchNext(); // Start fetching. scoreNext(false); // Start scoring. @@ -139,9 +137,9 @@ bool UniqueNodeList::scoreRound(std::vector& vsnNodes) } } - cLog(lsTRACE) << "midway: "; - if (sLog(lsTRACE)) + { + Log(lsTRACE) << "midway: "; BOOST_FOREACH(scoreNode& sn, vsnNodes) { Log(lsTRACE) << str(boost::format("%s| %d, %d, %d: [%s]") @@ -151,6 +149,7 @@ bool UniqueNodeList::scoreRound(std::vector& vsnNodes) % sn.iRoundSeed % strJoin(sn.viReferrals.begin(), sn.viReferrals.end(), ",")); } + } // Add roundScore to score. // Make roundScore new roundSeed. @@ -163,8 +162,9 @@ bool UniqueNodeList::scoreRound(std::vector& vsnNodes) sn.iRoundScore = 0; } - cLog(lsTRACE) << "finish: "; if (sLog(lsTRACE)) + { + Log(lsTRACE) << "finish: "; BOOST_FOREACH(scoreNode& sn, vsnNodes) { Log(lsTRACE) << str(boost::format("%s| %d, %d, %d: [%s]") @@ -174,6 +174,7 @@ bool UniqueNodeList::scoreRound(std::vector& vsnNodes) % sn.iRoundSeed % strJoin(sn.viReferrals.begin(), sn.viReferrals.end(), ",")); } + } return bDist; } @@ -285,7 +286,8 @@ void UniqueNodeList::scoreCompute() } // For debugging, print out initial scores. - if (sLog(lsTRACE) + if (sLog(lsTRACE)) + { BOOST_FOREACH(scoreNode& sn, vsnNodes) { Log(lsTRACE) << str(boost::format("%s| %d, %d, %d") @@ -294,12 +296,13 @@ void UniqueNodeList::scoreCompute() % sn.iRoundScore % sn.iRoundSeed); } + } // cLog(lsTRACE) << str(boost::format("vsnNodes.size=%d") % vsnNodes.size()); // Step through growing list of nodes adding each validation list. // - Each validator may have provided referals. Add those referals as validators. - for (int iNode=0; iNode != vsnNodes.size(); iNode++) + for (int iNode = 0; iNode != vsnNodes.size(); ++iNode) { scoreNode& sn = vsnNodes[iNode]; std::string& strValidator = sn.strValidator; @@ -371,8 +374,9 @@ void UniqueNodeList::scoreCompute() for (int i = SCORE_ROUNDS; bDist && i--;) bDist = scoreRound(vsnNodes); - Log(lsTRACE) << "Scored:"; - if (sLog(lsTRACE) + if (sLog(lsTRACE)) + { + Log(lsTRACE) << "Scored:"; BOOST_FOREACH(scoreNode& sn, vsnNodes) { Log(lsTRACE) << str(boost::format("%s| %d, %d, %d: [%s]") @@ -382,6 +386,7 @@ void UniqueNodeList::scoreCompute() % sn.iRoundSeed % strJoin(sn.viReferrals.begin(), sn.viReferrals.end(), ",")); } + } // Persist validator scores. ScopedLock sl(theApp->getWalletDB()->getDBLock()); From b44ef500397c40e813d50e48ed2981ddfe27edbb Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Wed, 24 Oct 2012 12:27:45 -0700 Subject: [PATCH 7/9] Small bugfixes and logging improvements. --- src/LedgerAcquire.cpp | 2 ++ src/LedgerMaster.cpp | 16 +++++++++++----- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/LedgerAcquire.cpp b/src/LedgerAcquire.cpp index 71c631eb06..67faba317f 100644 --- a/src/LedgerAcquire.cpp +++ b/src/LedgerAcquire.cpp @@ -646,6 +646,8 @@ void LedgerAcquireSet::onComplete(boost::weak_ptr set, LedgerA if (acquired->isComplete()) { Ledger::pointer ledger = acquired->getLedger(); + assert(ledger); + cLog(lsDEBUG) << "LedgerAcquireSet::onComplete " << ledger->getLedgerSeq(); ledger->setAccepted(); theApp->getMasterLedger().checkLedgerGap(ledger); lSet->updateCurrentLedger(ledger); diff --git a/src/LedgerMaster.cpp b/src/LedgerMaster.cpp index 83e2cdc3b6..603ab30fe0 100644 --- a/src/LedgerMaster.cpp +++ b/src/LedgerMaster.cpp @@ -7,6 +7,8 @@ #include "NewcoinAddress.h" #include "Log.h" +SETUP_LOG(); + uint32 LedgerMaster::getCurrentLedgerIndex() { return mCurrentLedger->getLedgerSeq(); @@ -22,12 +24,12 @@ void LedgerMaster::pushLedger(Ledger::ref newLedger) { // Caller should already have properly assembled this ledger into "ready-to-close" form -- // all candidate transactions must already be applied - Log(lsINFO) << "PushLedger: " << newLedger->getHash(); + cLog(lsINFO) << "PushLedger: " << newLedger->getHash(); boost::recursive_mutex::scoped_lock ml(mLock); if (!!mFinalizedLedger) { mFinalizedLedger->setClosed(); - Log(lsTRACE) << "Finalizes: " << mFinalizedLedger->getHash(); + cLog(lsTRACE) << "Finalizes: " << mFinalizedLedger->getHash(); } mFinalizedLedger = mCurrentLedger; mCurrentLedger = newLedger; @@ -48,7 +50,7 @@ void LedgerMaster::pushLedger(Ledger::ref newLCL, Ledger::ref newOL) mLedgerHistory.addAcceptedLedger(newLCL, false); if (mLastFullLedger && (newLCL->getParentHash() == mLastFullLedger->getHash())) mLastFullLedger = newLCL; - Log(lsINFO) << "StashAccepted: " << newLCL->getHash(); + cLog(lsINFO) << "StashAccepted: " << newLCL->getHash(); } boost::recursive_mutex::scoped_lock ml(mLock); @@ -99,21 +101,25 @@ TER LedgerMaster::doTransaction(const SerializedTransaction& txn, TransactionEng void LedgerMaster::checkLedgerGap(Ledger::ref ledger) { + cLog(lsTRACE) << "Checking for ledger gap"; boost::recursive_mutex::scoped_lock sl(mLock); - if (ledger->getParentHash() == mLastFullLedger->getHash()) + if (mLastFullLedger && (ledger->getParentHash() == mLastFullLedger->getHash())) { mLastFullLedger = ledger; + cLog(lsTRACE) << "Perfect fit, no gap"; return; } if (theApp->getMasterLedgerAcquire().hasSet()) return; - if (ledger->getLedgerSeq() < mLastFullLedger->getLedgerSeq()) + if (mLastFullLedger && (ledger->getLedgerSeq() < mLastFullLedger->getLedgerSeq())) return; // we have a gap or discontinuity + cLog(lsWARNING) << "Ledger gap found " << + (mLastFullLedger ? mLastFullLedger->getLedgerSeq() : 0) << " - " << ledger->getLedgerSeq(); theApp->getMasterLedgerAcquire().makeSet(mLastFullLedger, ledger); } From 806a02552334e288bec145345be2a32ba9221786 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Wed, 24 Oct 2012 12:56:49 -0700 Subject: [PATCH 8/9] Small bugfixes. --- src/Application.cpp | 2 +- src/LedgerAcquire.cpp | 33 +++++++++++++++++---------------- src/LedgerConsensus.cpp | 2 +- src/LedgerMaster.cpp | 4 ++-- src/LedgerMaster.h | 2 +- 5 files changed, 22 insertions(+), 21 deletions(-) diff --git a/src/Application.cpp b/src/Application.cpp index c1b80e4ca9..6000fe40e6 100644 --- a/src/Application.cpp +++ b/src/Application.cpp @@ -211,7 +211,7 @@ void Application::startNewLedger() Ledger::pointer secondLedger = boost::make_shared(true, boost::ref(*firstLedger)); secondLedger->setClosed(); secondLedger->setAccepted(); - mMasterLedger.pushLedger(secondLedger, boost::make_shared(true, boost::ref(*secondLedger))); + mMasterLedger.pushLedger(secondLedger, boost::make_shared(true, boost::ref(*secondLedger)), false); assert(!!secondLedger->getAccountState(rootAddress)); mNetOps.setLastCloseTime(secondLedger->getCloseTimeNC()); } diff --git a/src/LedgerAcquire.cpp b/src/LedgerAcquire.cpp index 67faba317f..a7e13f23bf 100644 --- a/src/LedgerAcquire.cpp +++ b/src/LedgerAcquire.cpp @@ -580,10 +580,9 @@ bool LedgerAcquireMaster::gotLedgerData(ripple::TMLedgerData& packet, Peer::ref return false; } -LedgerAcquireSet::LedgerAcquireSet(Ledger::ref targetLedger, Ledger::ref currentLedger) : +LedgerAcquireSet::LedgerAcquireSet(Ledger::ref targetLedger) : mTargetLedger(targetLedger), mCheckComplete(true) { - updateCurrentLedger(currentLedger); } void LedgerAcquireSet::updateCurrentLedger(Ledger::pointer currentLedger) @@ -591,23 +590,25 @@ void LedgerAcquireSet::updateCurrentLedger(Ledger::pointer currentLedger) while (1) { - - if ((currentLedger->getHash() == mTargetLedger->getHash()) || - (currentLedger->getParentHash() == mTargetLedger->getHash())) - { // We have completed acquiring the set - done(); - return; - } - - while (mTargetLedger->getLedgerSeq() >= currentLedger->getLedgerSeq()) - { // We need to back up our target - mTargetLedger = theApp->getMasterLedger().getLedgerByHash(mTargetLedger->getParentHash()); - if (!mTargetLedger) - { - cLog(lsWARNING) << "LedgerAcquireSet encountered a non-present target ledger"; + if (mTargetLedger) + { + if ((currentLedger->getHash() == mTargetLedger->getHash()) || + (currentLedger->getParentHash() == mTargetLedger->getHash())) + { // We have completed acquiring the set done(); return; } + + while (mTargetLedger->getLedgerSeq() >= currentLedger->getLedgerSeq()) + { // We need to back up our target + mTargetLedger = theApp->getMasterLedger().getLedgerByHash(mTargetLedger->getParentHash()); + if (!mTargetLedger) + { + cLog(lsWARNING) << "LedgerAcquireSet encountered a non-present target ledger"; + done(); + return; + } + } } Ledger::pointer nextLedger = diff --git a/src/LedgerConsensus.cpp b/src/LedgerConsensus.cpp index afaf29cfe8..7a655a5b4e 100644 --- a/src/LedgerConsensus.cpp +++ b/src/LedgerConsensus.cpp @@ -1186,7 +1186,7 @@ void LedgerConsensus::accept(SHAMap::ref set) cLog(lsINFO) << "Applying transactions from current ledger"; applyTransactions(theApp->getMasterLedger().getCurrentLedger()->peekTransactionMap(), newOL, newLCL, failedTransactions, true); - theApp->getMasterLedger().pushLedger(newLCL, newOL); + theApp->getMasterLedger().pushLedger(newLCL, newOL, true); mNewLedgerHash = newLCL->getHash(); mState = lcsACCEPTED; sl.unlock(); diff --git a/src/LedgerMaster.cpp b/src/LedgerMaster.cpp index 603ab30fe0..87d52e4f7b 100644 --- a/src/LedgerMaster.cpp +++ b/src/LedgerMaster.cpp @@ -38,7 +38,7 @@ void LedgerMaster::pushLedger(Ledger::ref newLedger) mLastFullLedger = newLedger; } -void LedgerMaster::pushLedger(Ledger::ref newLCL, Ledger::ref newOL) +void LedgerMaster::pushLedger(Ledger::ref newLCL, Ledger::ref newOL, bool fromConsensus) { assert(newLCL->isClosed() && newLCL->isAccepted()); assert(!newOL->isClosed() && !newOL->isAccepted()); @@ -47,7 +47,7 @@ void LedgerMaster::pushLedger(Ledger::ref newLCL, Ledger::ref newOL) { assert(newLCL->isClosed()); assert(newLCL->isImmutable()); - mLedgerHistory.addAcceptedLedger(newLCL, false); + mLedgerHistory.addAcceptedLedger(newLCL, fromConsensus); if (mLastFullLedger && (newLCL->getParentHash() == mLastFullLedger->getHash())) mLastFullLedger = newLCL; cLog(lsINFO) << "StashAccepted: " << newLCL->getHash(); diff --git a/src/LedgerMaster.h b/src/LedgerMaster.h index 47cf394b50..8382f60b67 100644 --- a/src/LedgerMaster.h +++ b/src/LedgerMaster.h @@ -47,7 +47,7 @@ public: TER doTransaction(const SerializedTransaction& txn, TransactionEngineParams params); void pushLedger(Ledger::ref newLedger); - void pushLedger(Ledger::ref newLCL, Ledger::ref newOL); + void pushLedger(Ledger::ref newLCL, Ledger::ref newOL, bool fromConsensus); void storeLedger(Ledger::ref); void setLastFullLedger(Ledger::ref ledger) From 1cc42517da717beeebd703752f5aa3c6f7dfdb6d Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Wed, 24 Oct 2012 12:57:00 -0700 Subject: [PATCH 9/9] Improve debugability. --- src/Ledger.cpp | 1 + src/LedgerAcquire.h | 9 ++++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/Ledger.cpp b/src/Ledger.cpp index e22eac7963..31ee8a8a97 100644 --- a/src/Ledger.cpp +++ b/src/Ledger.cpp @@ -339,6 +339,7 @@ uint256 Ledger::getHash() void Ledger::saveAcceptedLedger(bool fromConsensus) { // can be called in a different thread + cLog(lsTRACE) << "saveAcceptedLedger " << (fromConsensus ? "fromConsensus" : "fromAcquire") << getLedgerSeq(); static boost::format ledgerExists("SELECT LedgerSeq FROM Ledgers where LedgerSeq = %d;"); static boost::format deleteLedger("DELETE FROM Ledgers WHERE LedgerSeq = %d;"); static boost::format AcctTransExists("SELECT LedgerSeq FROM AccountTransactions WHERE TransId = '%s';"); diff --git a/src/LedgerAcquire.h b/src/LedgerAcquire.h index dc717efee3..c2a3c6b2dd 100644 --- a/src/LedgerAcquire.h +++ b/src/LedgerAcquire.h @@ -111,14 +111,14 @@ protected: LedgerAcquire::pointer mCurrentLedger; // ledger we are acquiring bool mCheckComplete; // should we check to make sure we have all nodes - void updateCurrentLedger(Ledger::pointer currentLedger); void done(); void addPeers(); static void onComplete(boost::weak_ptr, LedgerAcquire::pointer); public: - LedgerAcquireSet(Ledger::ref targetLedger, Ledger::ref currentLedger); + LedgerAcquireSet(Ledger::ref targetLedger); + void updateCurrentLedger(Ledger::pointer currentLedger); }; class LedgerAcquireMaster @@ -140,7 +140,10 @@ public: bool hasSet() { return !!mAcquireSet; } void killSet(const LedgerAcquireSet&) { mAcquireSet = LedgerAcquireSet::pointer(); } void makeSet(Ledger::ref target, Ledger::ref current) - { mAcquireSet = boost::make_shared(boost::ref(target), boost::ref(current)); } + { + mAcquireSet = boost::make_shared(boost::ref(target)); + mAcquireSet->updateCurrentLedger(current); + } }; #endif