Track failed acquires. Fix a case where an acquire both succeeds and fails.

This commit is contained in:
JoelKatz
2013-01-04 15:21:31 -08:00
parent bb6b72fea4
commit d57b5a9797
3 changed files with 63 additions and 2 deletions

View File

@@ -175,18 +175,21 @@ void LedgerAcquire::done()
#endif
std::vector< boost::function<void (LedgerAcquire::pointer)> > triggers;
setComplete();
assert(isComplete() || isFailed());
mLock.lock();
triggers = mOnComplete;
mOnComplete.clear();
mLock.unlock();
if (mLedger)
if (isComplete() && mLedger)
{
if (mAccept)
mLedger->setAccepted();
theApp->getLedgerMaster().storeLedger(mLedger);
}
else if (isFailed())
theApp->getMasterLedgerAcquire().logFailure(mHash);
for (unsigned int i = 0; i < triggers.size(); ++i)
triggers[i](shared_from_this());
@@ -528,6 +531,21 @@ LedgerAcquire::pointer LedgerAcquireMaster::find(const uint256& hash)
return LedgerAcquire::pointer();
}
std::vector<uint256> LedgerAcquire::getNeededHashes()
{
std::vector<uint256> ret;
if (!mHaveBase)
{
ret.push_back(mHash);
return ret;
}
if (!mHaveState)
mLedger->peekAccountStateMap()->getNeededHashes(ret, 16);
if (!mHaveTransactions)
mLedger->peekTransactionMap()->getNeededHashes(ret, 16);
return ret;
}
bool LedgerAcquireMaster::hasLedger(const uint256& hash)
{
assert(hash.isNonZero());
@@ -621,4 +639,36 @@ SMAddNode LedgerAcquireMaster::gotLedgerData(ripple::TMLedgerData& packet, Peer:
return SMAddNode::invalid();
}
void LedgerAcquireMaster::logFailure(const uint256& hash)
{
time_t now = time(NULL);
boost::mutex::scoped_lock sl(mLock);
std::map<uint256, time_t>::iterator it = mRecentFailures.begin();
while (it != mRecentFailures.end())
{
if (it->first == hash)
{
it->second = now;
return;
}
if (it->second > now)
{ // time jump or discontinuity
it->second = now;
++it;
}
else if ((it->second + 180) < now)
mRecentFailures.erase(it++);
else
++it;
}
mRecentFailures[hash] = now;
}
bool LedgerAcquireMaster::isFailure(const uint256& hash)
{
boost::mutex::scoped_lock sl(mLock);
return mRecentFailures.find(hash) != mRecentFailures.end();
}
// vim:ts=4

View File

@@ -108,6 +108,8 @@ public:
void trigger(Peer::ref, bool timer);
bool tryLocal();
void addPeers();
std::vector<uint256> getNeededHashes();
};
class LedgerAcquireMaster
@@ -115,6 +117,7 @@ class LedgerAcquireMaster
protected:
boost::mutex mLock;
std::map<uint256, LedgerAcquire::pointer> mLedgers;
std::map<uint256, time_t> mRecentFailures;
public:
LedgerAcquireMaster() { ; }
@@ -124,6 +127,9 @@ public:
bool hasLedger(const uint256& ledgerHash);
void dropLedger(const uint256& ledgerHash);
SMAddNode gotLedgerData(ripple::TMLedgerData& packet, Peer::ref);
void logFailure(const uint256&);
bool isFailure(const uint256&);
};
#endif

View File

@@ -170,6 +170,11 @@ void LedgerMaster::acquireMissingLedger(const uint256& ledgerHash, uint32 ledger
mMissingLedger.reset();
return;
}
else if (mMissingLedger->isDone())
{
mMissingLedger.reset();
return;
}
mMissingSeq = ledgerSeq;
if (mMissingLedger->setAccept())
mMissingLedger->addOnComplete(boost::bind(&LedgerMaster::missingAcquireComplete, this, _1));