Browse Source

Merge #9058: Fixes for p2p-compactblocks.py test timeouts on travis (#8842)

dac53b5 Modify getblocktxn handler not to drop requests for old blocks (Russell Yanofsky)
55bfddc [qa] Fix stale data bug in test_compactblocks_not_at_tip (Russell Yanofsky)
47e9659 [qa] Fix bug in compactblocks v2 merge (Russell Yanofsky)
0.14
Wladimir J. van der Laan 8 years ago
parent
commit
7977a1157a
No known key found for this signature in database
GPG Key ID: 74810B012346C9A6
  1. 18
      qa/rpc-tests/p2p-compactblocks.py
  2. 12
      src/main.cpp

18
qa/rpc-tests/p2p-compactblocks.py

@ -300,8 +300,8 @@ class CompactBlocksTest(BitcoinTestFramework):
assert(segwit_tx_generated) # check that our test is not broken assert(segwit_tx_generated) # check that our test is not broken
# Wait until we've seen the block announcement for the resulting tip # Wait until we've seen the block announcement for the resulting tip
tip = int(self.nodes[0].getbestblockhash(), 16) tip = int(node.getbestblockhash(), 16)
assert(self.test_node.wait_for_block_announcement(tip)) assert(test_node.wait_for_block_announcement(tip))
# Now mine a block, and look at the resulting compact block. # Now mine a block, and look at the resulting compact block.
test_node.clear_block_announcement() test_node.clear_block_announcement()
@ -589,8 +589,8 @@ class CompactBlocksTest(BitcoinTestFramework):
assert_equal(int(node.getbestblockhash(), 16), block.sha256) assert_equal(int(node.getbestblockhash(), 16), block.sha256)
def test_getblocktxn_handler(self, node, test_node, version): def test_getblocktxn_handler(self, node, test_node, version):
# bitcoind won't respond for blocks whose height is more than 15 blocks # bitcoind will not send blocktxn responses for blocks whose height is
# deep. # more than 10 blocks deep.
MAX_GETBLOCKTXN_DEPTH = 10 MAX_GETBLOCKTXN_DEPTH = 10
chain_height = node.getblockcount() chain_height = node.getblockcount()
current_height = chain_height current_height = chain_height
@ -623,11 +623,17 @@ class CompactBlocksTest(BitcoinTestFramework):
test_node.last_blocktxn = None test_node.last_blocktxn = None
current_height -= 1 current_height -= 1
# Next request should be ignored, as we're past the allowed depth. # Next request should send a full block response, as we're past the
# allowed depth for a blocktxn response.
block_hash = node.getblockhash(current_height) block_hash = node.getblockhash(current_height)
msg.block_txn_request = BlockTransactionsRequest(int(block_hash, 16), [0]) msg.block_txn_request = BlockTransactionsRequest(int(block_hash, 16), [0])
with mininode_lock:
test_node.last_block = None
test_node.last_blocktxn = None
test_node.send_and_ping(msg) test_node.send_and_ping(msg)
with mininode_lock: with mininode_lock:
test_node.last_block.block.calc_sha256()
assert_equal(test_node.last_block.block.sha256, int(block_hash, 16))
assert_equal(test_node.last_blocktxn, None) assert_equal(test_node.last_blocktxn, None)
def test_compactblocks_not_at_tip(self, node, test_node): def test_compactblocks_not_at_tip(self, node, test_node):
@ -648,6 +654,8 @@ class CompactBlocksTest(BitcoinTestFramework):
node.generate(1) node.generate(1)
wait_until(test_node.received_block_announcement, timeout=30) wait_until(test_node.received_block_announcement, timeout=30)
test_node.clear_block_announcement() test_node.clear_block_announcement()
with mininode_lock:
test_node.last_block = None
test_node.send_message(msg_getdata([CInv(4, int(new_blocks[0], 16))])) test_node.send_message(msg_getdata([CInv(4, int(new_blocks[0], 16))]))
success = wait_until(lambda: test_node.last_block is not None, timeout=30) success = wait_until(lambda: test_node.last_block is not None, timeout=30)
assert(success) assert(success)

12
src/main.cpp

@ -5495,7 +5495,19 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
} }
if (it->second->nHeight < chainActive.Height() - MAX_BLOCKTXN_DEPTH) { if (it->second->nHeight < chainActive.Height() - MAX_BLOCKTXN_DEPTH) {
// If an older block is requested (should never happen in practice,
// but can happen in tests) send a block response instead of a
// blocktxn response. Sending a full block response instead of a
// small blocktxn response is preferable in the case where a peer
// might maliciously send lots of getblocktxn requests to trigger
// expensive disk reads, because it will require the peer to
// actually receive all the data read from disk over the network.
LogPrint("net", "Peer %d sent us a getblocktxn for a block > %i deep", pfrom->id, MAX_BLOCKTXN_DEPTH); LogPrint("net", "Peer %d sent us a getblocktxn for a block > %i deep", pfrom->id, MAX_BLOCKTXN_DEPTH);
CInv vInv;
vInv.type = State(pfrom->GetId())->fWantsCmpctWitness ? MSG_WITNESS_BLOCK : MSG_BLOCK;
vInv.hash = req.blockhash;
pfrom->vRecvGetData.push_back(vInv);
ProcessGetData(pfrom, chainparams.GetConsensus(), connman);
return true; return true;
} }

Loading…
Cancel
Save