Skip to content

Commit 5b5e4f8

Browse files
TheBlueMatttheuni
authored andcommitted
qa: mininode learns when a socket connects, not its first action
1 parent cbfc5a6 commit 5b5e4f8

File tree

1 file changed

+24
-12
lines changed

1 file changed

+24
-12
lines changed

qa/rpc-tests/test_framework/mininode.py

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1614,7 +1614,7 @@ class NodeConn(asyncore.dispatcher):
16141614
"regtest": b"\xfa\xbf\xb5\xda", # regtest
16151615
}
16161616

1617-
def __init__(self, dstaddr, dstport, rpc, callback, net="regtest", services=NODE_NETWORK):
1617+
def __init__(self, dstaddr, dstport, rpc, callback, net="regtest", services=NODE_NETWORK, send_version=True):
16181618
asyncore.dispatcher.__init__(self, map=mininode_socket_map)
16191619
self.log = logging.getLogger("NodeConn(%s:%d)" % (dstaddr, dstport))
16201620
self.dstaddr = dstaddr
@@ -1631,14 +1631,16 @@ def __init__(self, dstaddr, dstport, rpc, callback, net="regtest", services=NODE
16311631
self.disconnect = False
16321632
self.nServices = 0
16331633

1634-
# stuff version msg into sendbuf
1635-
vt = msg_version()
1636-
vt.nServices = services
1637-
vt.addrTo.ip = self.dstaddr
1638-
vt.addrTo.port = self.dstport
1639-
vt.addrFrom.ip = "0.0.0.0"
1640-
vt.addrFrom.port = 0
1641-
self.send_message(vt, True)
1634+
if send_version:
1635+
# stuff version msg into sendbuf
1636+
vt = msg_version()
1637+
vt.nServices = services
1638+
vt.addrTo.ip = self.dstaddr
1639+
vt.addrTo.port = self.dstport
1640+
vt.addrFrom.ip = "0.0.0.0"
1641+
vt.addrFrom.port = 0
1642+
self.send_message(vt, True)
1643+
16421644
print('MiniNode: Connecting to Bitcoin Node IP # ' + dstaddr + ':' \
16431645
+ str(dstport))
16441646

@@ -1652,8 +1654,9 @@ def show_debug_msg(self, msg):
16521654
self.log.debug(msg)
16531655

16541656
def handle_connect(self):
1655-
self.show_debug_msg("MiniNode: Connected & Listening: \n")
1656-
self.state = "connected"
1657+
if self.state != "connected":
1658+
self.show_debug_msg("MiniNode: Connected & Listening: \n")
1659+
self.state = "connected"
16571660

16581661
def handle_close(self):
16591662
self.show_debug_msg("MiniNode: Closing Connection to %s:%d... "
@@ -1681,11 +1684,20 @@ def readable(self):
16811684

16821685
def writable(self):
16831686
with mininode_lock:
1687+
pre_connection = self.state == "connecting"
16841688
length = len(self.sendbuf)
1685-
return (length > 0)
1689+
return (length > 0 or pre_connection)
16861690

16871691
def handle_write(self):
16881692
with mininode_lock:
1693+
# asyncore does not expose socket connection, only the first read/write
1694+
# event, thus we must check connection manually here to know when we
1695+
# actually connect
1696+
if self.state == "connecting":
1697+
self.handle_connect()
1698+
if not self.writable():
1699+
return
1700+
16891701
try:
16901702
sent = self.send(self.sendbuf)
16911703
except:

0 commit comments

Comments
 (0)