Redesign the way the acquire timer is (re)set so that we won't have bugs

where we fail to arm it.
This commit is contained in:
JoelKatz
2013-01-03 21:25:40 -08:00
parent b7fe1424fb
commit d4f4d9bf78
3 changed files with 22 additions and 28 deletions

View File

@@ -37,7 +37,7 @@ void PeerSet::badPeer(Peer::ref ptr)
mPeers.erase(ptr->getPeerId());
}
void PeerSet::resetTimer()
void PeerSet::setTimer()
{
mTimer.expires_from_now(boost::posix_time::milliseconds(mTimerInterval));
mTimer.async_wait(boost::bind(&PeerSet::TimerEntry, pmDowncast(), boost::asio::placeholders::error));
@@ -45,6 +45,9 @@ void PeerSet::resetTimer()
void PeerSet::invokeOnTimer()
{
if (isDone())
return;
if (!mProgress)
{
++mTimeouts;
@@ -56,6 +59,9 @@ void PeerSet::invokeOnTimer()
mProgress = false;
onTimer(true);
}
if (!isDone())
setTimer();
}
void PeerSet::TimerEntry(boost::weak_ptr<PeerSet> wptr, const boost::system::error_code& result)
@@ -120,19 +126,16 @@ void LedgerAcquire::onTimer(bool progress)
{
setFailed();
done();
return;
}
else if (!progress)
if (!progress)
{
if (!getPeerCount())
{
addPeers();
resetTimer();
}
else
trigger(Peer::pointer(), true);
}
else
resetTimer();
}
void LedgerAcquire::addPeers()
@@ -226,8 +229,6 @@ void LedgerAcquire::trigger(Peer::ref peer, bool timer)
tmGL.set_itype(ripple::liBASE);
cLog(lsTRACE) << "Sending base request to " << (peer ? "selected peer" : "all peers");
sendRequest(tmGL, peer);
if (timer)
resetTimer();
return;
}
@@ -319,8 +320,6 @@ void LedgerAcquire::trigger(Peer::ref peer, bool timer)
cLog(lsDEBUG) << "Done:" << (mComplete ? " complete" : "") << (mFailed ? " failed" : "");
done();
}
else if (timer)
resetTimer();
}
void PeerSet::sendRequest(const ripple::TMGetLedger& tmGL, Peer::ref peer)
@@ -512,7 +511,7 @@ LedgerAcquire::pointer LedgerAcquireMaster::findCreate(const uint256& hash)
return ptr;
ptr = boost::make_shared<LedgerAcquire>(hash);
ptr->addPeers();
ptr->resetTimer(); // Cannot call in constructor
ptr->setTimer(); // Cannot call in constructor
return ptr;
}

View File

@@ -47,10 +47,11 @@ public:
void peerHas(Peer::ref);
void badPeer(Peer::ref);
void resetTimer();
void setTimer();
int takePeerSetFrom(const PeerSet& s);
int getPeerCount() const;
virtual bool isDone() const { return mComplete || mFailed; }
protected:
virtual void newPeer(Peer::ref) = 0;

View File

@@ -67,7 +67,6 @@ void TransactionAcquire::onTimer(bool progress)
BOOST_FOREACH(Peer::ref peer, peerList)
peerHas(peer);
}
resetTimer();
}
else if (!progress)
trigger(Peer::pointer(), true);
@@ -111,20 +110,15 @@ void TransactionAcquire::trigger(Peer::ref peer, bool timer)
done();
return;
}
else
{
ripple::TMGetLedger tmGL;
tmGL.set_ledgerhash(mHash.begin(), mHash.size());
tmGL.set_itype(ripple::liTS_CANDIDATE);
if (getTimeouts() != 0)
tmGL.set_querytype(ripple::qtINDIRECT);
BOOST_FOREACH(SHAMapNode& it, nodeIDs)
*(tmGL.add_nodeids()) = it.getRawString();
sendRequest(tmGL, peer);
}
ripple::TMGetLedger tmGL;
tmGL.set_ledgerhash(mHash.begin(), mHash.size());
tmGL.set_itype(ripple::liTS_CANDIDATE);
if (getTimeouts() != 0)
tmGL.set_querytype(ripple::qtINDIRECT);
BOOST_FOREACH(SHAMapNode& it, nodeIDs)
*(tmGL.add_nodeids()) = it.getRawString();
sendRequest(tmGL, peer);
}
if (timer)
resetTimer();
}
SMAddNode TransactionAcquire::takeNodes(const std::list<SHAMapNode>& nodeIDs,
@@ -882,7 +876,7 @@ void LedgerConsensus::startAcquiring(const TransactionAcquire::pointer& acquire)
acquire->peerHas(peer);
}
acquire->resetTimer();
acquire->setTimer();
}
void LedgerConsensus::propose()