From c98a3e3895368deed80804581c0613b3dcee9871 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Thu, 16 May 2013 11:23:40 -0700 Subject: [PATCH 1/7] 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 2/7] 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 3/7] 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 4/7] 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 5/7] 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 6/7] 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 7/7] 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)