Changeset View
Changeset View
Standalone View
Standalone View
qa/rpc-tests/maxblocksinflight.py
Show All 10 Lines | |||||
''' | ''' | ||||
In this test we connect to one node over p2p, send it numerous inv's, and | In this test we connect to one node over p2p, send it numerous inv's, and | ||||
compare the resulting number of getdata requests to a max allowed value. We | compare the resulting number of getdata requests to a max allowed value. We | ||||
test for exceeding 128 blocks in flight, which was the limit an 0.9 client will | test for exceeding 128 blocks in flight, which was the limit an 0.9 client will | ||||
reach. [0.10 clients shouldn't request more than 16 from a single peer.] | reach. [0.10 clients shouldn't request more than 16 from a single peer.] | ||||
''' | ''' | ||||
MAX_REQUESTS = 128 | MAX_REQUESTS = 128 | ||||
class TestManager(NodeConnCB): | class TestManager(NodeConnCB): | ||||
# set up NodeConnCB callbacks, overriding base class | # set up NodeConnCB callbacks, overriding base class | ||||
def on_getdata(self, conn, message): | def on_getdata(self, conn, message): | ||||
self.log.debug("got getdata %s" % repr(message)) | self.log.debug("got getdata %s" % repr(message)) | ||||
# Log the requests | # Log the requests | ||||
for inv in message.inv: | for inv in message.inv: | ||||
if inv.hash not in self.blockReqCounts: | if inv.hash not in self.blockReqCounts: | ||||
self.blockReqCounts[inv.hash] = 0 | self.blockReqCounts[inv.hash] = 0 | ||||
self.blockReqCounts[inv.hash] += 1 | self.blockReqCounts[inv.hash] += 1 | ||||
Show All 27 Lines | def run(self): | ||||
# Wait and see how many blocks were requested | # Wait and see how many blocks were requested | ||||
time.sleep(2) | time.sleep(2) | ||||
total_requests = 0 | total_requests = 0 | ||||
with mininode_lock: | with mininode_lock: | ||||
for key in self.blockReqCounts: | for key in self.blockReqCounts: | ||||
total_requests += self.blockReqCounts[key] | total_requests += self.blockReqCounts[key] | ||||
if self.blockReqCounts[key] > 1: | if self.blockReqCounts[key] > 1: | ||||
raise AssertionError("Error, test failed: block %064x requested more than once" % key) | raise AssertionError( | ||||
"Error, test failed: block %064x requested more than once" % key) | |||||
if total_requests > MAX_REQUESTS: | if total_requests > MAX_REQUESTS: | ||||
raise AssertionError("Error, too many blocks (%d) requested" % total_requests) | raise AssertionError( | ||||
print("Round %d: success (total requests: %d)" % (count, total_requests)) | "Error, too many blocks (%d) requested" % total_requests) | ||||
print("Round %d: success (total requests: %d)" % | |||||
(count, total_requests)) | |||||
self.disconnectOkay = True | self.disconnectOkay = True | ||||
self.connection.disconnect_node() | self.connection.disconnect_node() | ||||
class MaxBlocksInFlightTest(BitcoinTestFramework): | class MaxBlocksInFlightTest(BitcoinTestFramework): | ||||
def add_options(self, parser): | def add_options(self, parser): | ||||
parser.add_option("--testbinary", dest="testbinary", | parser.add_option("--testbinary", dest="testbinary", | ||||
default=os.getenv("BITCOIND", "bitcoind"), | default=os.getenv("BITCOIND", "bitcoind"), | ||||
help="Binary to test max block requests behavior") | help="Binary to test max block requests behavior") | ||||
def __init__(self): | def __init__(self): | ||||
super().__init__() | super().__init__() | ||||
self.setup_clean_chain = True | self.setup_clean_chain = True | ||||
self.num_nodes = 1 | self.num_nodes = 1 | ||||
def setup_network(self): | def setup_network(self): | ||||
self.nodes = start_nodes(self.num_nodes, self.options.tmpdir, | self.nodes = start_nodes(self.num_nodes, self.options.tmpdir, | ||||
extra_args=[['-debug', '-whitelist=127.0.0.1']], | extra_args=[ | ||||
['-debug', '-whitelist=127.0.0.1']], | |||||
binary=[self.options.testbinary]) | binary=[self.options.testbinary]) | ||||
def run_test(self): | def run_test(self): | ||||
test = TestManager() | test = TestManager() | ||||
test.add_new_connection(NodeConn('127.0.0.1', p2p_port(0), self.nodes[0], test)) | test.add_new_connection( | ||||
NodeConn('127.0.0.1', p2p_port(0), self.nodes[0], test)) | |||||
NetworkThread().start() # Start up network handling in another thread | NetworkThread().start() # Start up network handling in another thread | ||||
test.run() | test.run() | ||||
if __name__ == '__main__': | if __name__ == '__main__': | ||||
MaxBlocksInFlightTest().main() | MaxBlocksInFlightTest().main() |