Browse Source

Backoff to attempt to deal with non-conformant clients.

Reduce verbosity.
cl-refactor
Gav Wood 10 years ago
parent
commit
210c86bb02
  1. 10
      libethereum/Client.cpp
  2. 2
      libethereum/EthereumHost.cpp
  3. 31
      libethereum/EthereumPeer.cpp

10
libethereum/Client.cpp

@ -673,10 +673,10 @@ void Client::onChainChanged(ImportRoute const& _ir)
// insert transactions that we are declaring the dead part of the chain // insert transactions that we are declaring the dead part of the chain
for (auto const& h: _ir.deadBlocks) for (auto const& h: _ir.deadBlocks)
{ {
clog(ClientNote) << "Dead block:" << h; clog(ClientTrace) << "Dead block:" << h;
for (auto const& t: m_bc.transactions(h)) for (auto const& t: m_bc.transactions(h))
{ {
clog(ClientNote) << "Resubmitting dead-block transaction " << Transaction(t, CheckTransaction::None); clog(ClientTrace) << "Resubmitting dead-block transaction " << Transaction(t, CheckTransaction::None);
m_tq.import(t, TransactionQueue::ImportCallback(), IfDropped::Retry); m_tq.import(t, TransactionQueue::ImportCallback(), IfDropped::Retry);
} }
} }
@ -684,10 +684,10 @@ void Client::onChainChanged(ImportRoute const& _ir)
// remove transactions from m_tq nicely rather than relying on out of date nonce later on. // remove transactions from m_tq nicely rather than relying on out of date nonce later on.
for (auto const& h: _ir.liveBlocks) for (auto const& h: _ir.liveBlocks)
{ {
clog(ClientChat) << "Live block:" << h; clog(ClientTrace) << "Live block:" << h;
for (auto const& th: m_bc.transactionHashes(h)) for (auto const& th: m_bc.transactionHashes(h))
{ {
clog(ClientNote) << "Safely dropping transaction " << th; clog(ClientTrace) << "Safely dropping transaction " << th;
m_tq.drop(th); m_tq.drop(th);
} }
} }
@ -723,7 +723,7 @@ void Client::onChainChanged(ImportRoute const& _ir)
DEV_READ_GUARDED(x_postMine) DEV_READ_GUARDED(x_postMine)
for (auto const& t: m_postMine.pending()) for (auto const& t: m_postMine.pending())
{ {
clog(ClientNote) << "Resubmitting post-mine transaction " << t; clog(ClientTrace) << "Resubmitting post-mine transaction " << t;
auto ir = m_tq.import(t, TransactionQueue::ImportCallback(), IfDropped::Retry); auto ir = m_tq.import(t, TransactionQueue::ImportCallback(), IfDropped::Retry);
if (ir != ImportResult::Success) if (ir != ImportResult::Success)
onTransactionQueueReady(); onTransactionQueueReady();

2
libethereum/EthereumHost.cpp

@ -296,7 +296,7 @@ void EthereumHost::onPeerTransactions(EthereumPeer* _peer, RLP const& _r)
unsigned itemCount = _r.itemCount(); unsigned itemCount = _r.itemCount();
clog(NetAllDetail) << "Transactions (" << dec << itemCount << "entries)"; clog(NetAllDetail) << "Transactions (" << dec << itemCount << "entries)";
Guard l(_peer->x_knownTransactions); Guard l(_peer->x_knownTransactions);
for (unsigned i = 0; i < itemCount; ++i) for (unsigned i = 0; i < min<unsigned>(itemCount, 256); ++i) // process 256 transactions at most. TODO: much better solution.
{ {
auto h = sha3(_r[i].data()); auto h = sha3(_r[i].data());
_peer->m_knownTransactions.insert(h); _peer->m_knownTransactions.insert(h);

31
libethereum/EthereumPeer.cpp

@ -37,6 +37,18 @@ using namespace dev;
using namespace dev::eth; using namespace dev::eth;
using namespace p2p; using namespace p2p;
string toString(Asking _a)
{
switch (_a)
{
case Asking::Blocks: return "Blocks";
case Asking::Hashes: return "Hashes";
case Asking::Nothing: return "Nothing";
case Asking::State: return "State";
}
return "?";
}
EthereumPeer::EthereumPeer(Session* _s, HostCapabilityFace* _h, unsigned _i, CapDesc const& _cap): EthereumPeer::EthereumPeer(Session* _s, HostCapabilityFace* _h, unsigned _i, CapDesc const& _cap):
Capability(_s, _h, _i), Capability(_s, _h, _i),
m_sub(host()->downloadMan()), m_sub(host()->downloadMan()),
@ -49,6 +61,11 @@ EthereumPeer::EthereumPeer(Session* _s, HostCapabilityFace* _h, unsigned _i, Cap
EthereumPeer::~EthereumPeer() EthereumPeer::~EthereumPeer()
{ {
if (m_asking != Asking::Nothing)
{
cnote << "Peer aborting while being asked for " << ::toString(m_asking);
setRude();
}
abortSync(); abortSync();
} }
@ -65,7 +82,9 @@ unsigned EthereumPeer::askOverride() const
void EthereumPeer::setRude() void EthereumPeer::setRude()
{ {
auto old = askOverride();
repMan().setData(*session(), name(), rlp(askOverride() / 2 + 1)); repMan().setData(*session(), name(), rlp(askOverride() / 2 + 1));
cnote << "Rude behaviour; askOverride now" << askOverride() << ", was" << old;
repMan().noteRude(*session(), name()); repMan().noteRude(*session(), name());
session()->addNote("manners", "RUDE"); session()->addNote("manners", "RUDE");
} }
@ -84,18 +103,6 @@ EthereumHost* EthereumPeer::host() const
* Possible asking/syncing states for two peers: * Possible asking/syncing states for two peers:
*/ */
string toString(Asking _a)
{
switch (_a)
{
case Asking::Blocks: return "Blocks";
case Asking::Hashes: return "Hashes";
case Asking::Nothing: return "Nothing";
case Asking::State: return "State";
}
return "?";
}
void EthereumPeer::setIdle() void EthereumPeer::setIdle()
{ {
setAsking(Asking::Nothing); setAsking(Asking::Nothing);

Loading…
Cancel
Save