Merge pull request #1287 from kyuupichan/requeue

Fix request handling.
This commit is contained in:
ThomasV 2015-06-11 01:36:39 +02:00
commit c7945f4199
1 changed files with 20 additions and 9 deletions

View File

@ -436,14 +436,20 @@ class Network(util.DaemonThread):
self.response_queue.put(response) self.response_queue.put(response)
def handle_requests(self): def handle_requests(self):
while self.is_running(): '''Some requests require connectivity, others we handle locally in
try: process_request() and must do so in order to e.g. prevent the
request = self.requests_queue.get_nowait() daemon seeming unresponsive.
except Queue.Empty: '''
break unhandled = []
self.process_request(request) while not self.requests_queue.empty():
request = self.requests_queue.get()
if not self.process_request(request):
unhandled.append(request)
for request in unhandled:
self.requests_queue.put(request)
def process_request(self, request): def process_request(self, request):
'''Returns true if the request was processed.'''
method = request['method'] method = request['method']
params = request['params'] params = request['params']
_id = request['id'] _id = request['id']
@ -460,18 +466,23 @@ class Network(util.DaemonThread):
traceback.print_exc(file=sys.stdout) traceback.print_exc(file=sys.stdout)
self.print_error("network error", str(e)) self.print_error("network error", str(e))
self.response_queue.put(out) self.response_queue.put(out)
return return True
if method == 'blockchain.address.subscribe': if method == 'blockchain.address.subscribe':
addr = params[0] addr = params[0]
self.subscribed_addresses.add(addr) self.subscribed_addresses.add(addr)
if addr in self.addr_responses: if addr in self.addr_responses:
self.response_queue.put({'id':_id, 'result':self.addr_responses[addr]}) self.response_queue.put({'id':_id, 'result':self.addr_responses[addr]})
return return True
# This request needs connectivity. If we don't have an
# interface, we cannot process it.
if not self.interface:
return False
# store unanswered request
self.unanswered_requests[_id] = request self.unanswered_requests[_id] = request
self.interface.send_request(request) self.interface.send_request(request)
return True
def check_interfaces(self): def check_interfaces(self):
now = time.time() now = time.time()