Browse Source

blocks no longer stuck in verifying state

cl-refactor
arkpar 10 years ago
parent
commit
a586e2cafe
  1. 41
      libethereum/BlockQueue.cpp
  2. 1
      libethereum/BlockQueue.h

41
libethereum/BlockQueue.cpp

@ -114,15 +114,11 @@ void BlockQueue::verifierBody()
catch (...)
{
// bad block.
{
// has to be this order as that's how invariants() assumes.
WriteGuard l2(m_lock);
unique_lock<Mutex> l(m_verification);
m_readySet.erase(work.hash);
m_knownBad.insert(work.hash);
}
// has to be this order as that's how invariants() assumes.
WriteGuard l2(m_lock);
unique_lock<Mutex> l(m_verification);
m_readySet.erase(work.hash);
m_knownBad.insert(work.hash);
for (auto it = m_verifying.begin(); it != m_verifying.end(); ++it)
if (it->verified.info.mixHash == work.hash)
{
@ -131,6 +127,7 @@ void BlockQueue::verifierBody()
}
cwarn << "BlockQueue missing our job: was there a GM?";
OK1:;
drainVerified();
continue;
}
@ -149,17 +146,8 @@ void BlockQueue::verifierBody()
}
else
m_verified.emplace_back(move(res));
while (m_verifying.size() && !m_verifying.front().blockData.empty())
{
if (m_knownBad.count(m_verifying.front().verified.info.parentHash))
{
m_readySet.erase(m_verifying.front().verified.info.hash());
m_knownBad.insert(res.verified.info.hash());
}
else
m_verified.emplace_back(move(m_verifying.front()));
m_verifying.pop_front();
}
drainVerified();
ready = true;
}
else
@ -179,6 +167,21 @@ void BlockQueue::verifierBody()
}
}
void BlockQueue::drainVerified()
{
while (m_verifying.size() && !m_verifying.front().blockData.empty())
{
if (m_knownBad.count(m_verifying.front().verified.info.parentHash))
{
m_readySet.erase(m_verifying.front().verified.info.hash());
m_knownBad.insert(m_verifying.front().verified.info.hash());
}
else
m_verified.emplace_back(move(m_verifying.front()));
m_verifying.pop_front();
}
}
ImportResult BlockQueue::import(bytesConstRef _block, BlockChain const& _bc, bool _isOurs)
{
// Check if we already know this block.

1
libethereum/BlockQueue.h

@ -134,6 +134,7 @@ private:
bool invariants() const override;
void verifierBody();
void drainVerified();
void collectUnknownBad(h256 const& _bad);
void updateBad(h256 const& _bad);

Loading…
Cancel
Save