merge bitcoin#26138: Avoid race in disconnect_nodes helper

This commit is contained in:
Kittywhiskers Van Gogh 2022-09-20 16:00:43 +02:00
parent d6ce037814
commit 892e329ada
No known key found for this signature in database
GPG Key ID: 30CD0C065E5C4AAD

View File

@ -716,24 +716,24 @@ class BitcoinTestFramework(metaclass=BitcoinTestMetaClass):
if (a == b): if (a == b):
return return
def disconnect_nodes_helper(from_connection, node_num): def disconnect_nodes_helper(node_a, node_b):
def get_peer_ids(): def get_peer_ids(from_connection, node_num):
result = [] result = []
for peer in from_connection.getpeerinfo(): for peer in from_connection.getpeerinfo():
if "testnode{}".format(node_num) in peer['subver']: if "testnode{}".format(node_num) in peer['subver']:
result.append(peer['id']) result.append(peer['id'])
return result return result
peer_ids = get_peer_ids() peer_ids = get_peer_ids(node_a, node_b.index)
if not peer_ids: if not peer_ids:
self.log.warning("disconnect_nodes: {} and {} were not connected".format( self.log.warning("disconnect_nodes: {} and {} were not connected".format(
from_connection.index, node_a.index,
node_num, node_b.index,
)) ))
return return
for peer_id in peer_ids: for peer_id in peer_ids:
try: try:
from_connection.disconnectnode(nodeid=peer_id) node_a.disconnectnode(nodeid=peer_id)
except JSONRPCException as e: except JSONRPCException as e:
# If this node is disconnected between calculating the peer id # If this node is disconnected between calculating the peer id
# and issuing the disconnect, don't worry about it. # and issuing the disconnect, don't worry about it.
@ -742,9 +742,10 @@ class BitcoinTestFramework(metaclass=BitcoinTestMetaClass):
raise raise
# wait to disconnect # wait to disconnect
self.wait_until(lambda: not get_peer_ids(), timeout=5) self.wait_until(lambda: not get_peer_ids(node_a, node_b.index), timeout=5)
self.wait_until(lambda: not get_peer_ids(node_b, node_a.index), timeout=5)
disconnect_nodes_helper(self.nodes[a], b) disconnect_nodes_helper(self.nodes[a], self.nodes[b])
def isolate_node(self, node_num, timeout=5): def isolate_node(self, node_num, timeout=5):
self.nodes[node_num].setnetworkactive(False) self.nodes[node_num].setnetworkactive(False)