1
0

Unify message IDs between network and interfaces

Previously network.py had its own idea of request IDs,
and each interface had its own which was sent on the wire.
The interface would jump through hoops to translate one
to the other.

This unifies them so that a message ID is passed when
queueing a request, in addition to the method and params.
network.py is now solely responsible for message ID management.

Apart from being simpler and clearer, this also should be faster
as there is much less data structure manipulation and rebuilding
happening.
This commit is contained in:
Neil Booth
2015-09-09 20:41:08 +09:00
parent ec9eccd0dd
commit 6f1367fea6
7 changed files with 98 additions and 110 deletions

View File

@@ -1,9 +1,5 @@
#!/usr/bin/env python
import util, json
peers = util.get_peers()
results = util.send_request(peers, {'method':'blockchain.estimatefee','params':[2]})
results = util.send_request(peers, 'blockchain.estimatefee', [2])
print json.dumps(results, indent=4)

View File

@@ -31,12 +31,9 @@ def analyze(results):
peers = util.get_peers()
results = util.send_request(peers, {'method':'blockchain.headers.subscribe','params':[]})
results = util.send_request(peers, 'blockchain.headers.subscribe', [])
errors = analyze(results).keys()
for n,v in sorted(results.items(), key=lambda x:x[1].get('block_height')):
print "%40s"%n, v.get('block_height'), v.get('utxo_root'), "error" if n in errors else "ok"

View File

@@ -10,7 +10,7 @@ set_verbosity(False)
config = SimpleConfig()
servers = filter_protocol(protocol = 't')
results = util.send_request(servers, {'method':'blockchain.headers.subscribe', 'params':[]})
results = util.send_request(servers, 'blockchain.headers.subscribe', [])
d = defaultdict(int)

View File

@@ -7,7 +7,7 @@ except:
sys.exit(1)
peers = util.get_peers()
results = util.send_request(peers, {'method':'blockchain.transaction.get','params':[tx]})
results = util.send_request(peers, 'blockchain.transaction.get', [tx])
r1 = []
r2 = []
@@ -17,4 +17,3 @@ for k, v in results.items():
print "Received %d answers"%len(results)
print "Propagation rate: %.1f percent" % (len(r1) *100./(len(r1)+ len(r2)))

View File

@@ -16,13 +16,15 @@ def get_interfaces(servers, timeout=10):
connecting[server] = Connection(server, socket_queue, config.path)
interfaces = {}
timeout = time.time() + timeout
while time.time() < timeout:
count = 0
while time.time() < timeout and count < len(servers):
try:
server, socket = socket_queue.get(True, 1)
server, socket = socket_queue.get(True, 0.3)
except Queue.Empty:
continue
if socket:
interfaces[server] = Interface(server, socket)
count += 1
return interfaces
def wait_on_interfaces(interfaces, timeout=10):
@@ -37,7 +39,7 @@ def wait_on_interfaces(interfaces, timeout=10):
for interface in wout:
interface.send_requests()
for interface in rout:
notifications, responses = interface.get_responses()
responses = interface.get_responses()
if responses:
result[interface.server].extend(responses)
return result
@@ -52,25 +54,23 @@ def get_peers():
return []
# 2. get list of peers
interface = interfaces[server]
interface.queue_request({'id':0, 'method': 'server.peers.subscribe',
'params': []})
responses = wait_on_interfaces(interfaces)
responses = responses.get(server)
interface.queue_request('server.peers.subscribe', [], 0)
responses = wait_on_interfaces(interfaces).get(server)
if responses:
response = responses[0][1] # One response, (req, response) tuple
peers = parse_servers(response.get('result'))
peers = filter_protocol(peers,'s')
return peers
def send_request(peers, request):
def send_request(peers, method, params):
print "Contacting %d servers"%len(peers)
interfaces = get_interfaces(peers)
print "%d servers could be reached" % len(interfaces)
for peer in peers:
if not peer in interfaces:
print "Connection failed:", peer
for i in interfaces.values():
i.queue_request(request)
for msg_id, i in enumerate(interfaces.values()):
i.queue_request(method, params, msg_id)
responses = wait_on_interfaces(interfaces)
for peer in interfaces:
if not peer in responses: