Skip to content

Commit

Permalink
network.best_effort_reliable: force DC if req times out; retry on new…
Browse files Browse the repository at this point in the history
… iface
  • Loading branch information
SomberNight committed Sep 27, 2018
1 parent 4984890 commit 3e2c5e8
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 9 deletions.
1 change: 0 additions & 1 deletion electrum/interface.py
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,6 @@ def serialize_server(host: str, port: Union[str, int], protocol: str) -> str:
class Interface(PrintError):

def __init__(self, network, server, config_path, proxy):
self.exception = None
self.ready = asyncio.Future()
self.got_disconnected = asyncio.Future()
self.server = server
Expand Down
27 changes: 19 additions & 8 deletions electrum/network.py
Original file line number Diff line number Diff line change
Expand Up @@ -642,17 +642,28 @@ def best_effort_reliable(func):
async def make_reliable_wrapper(self, *args, **kwargs):
for i in range(10):
iface = self.interface
session = iface.session if iface else None
if not session:
# no main interface; try again
# retry until there is a main interface
if not iface:
await asyncio.sleep(0.1)
continue
continue # try again
# wait for it to be usable
iface_ready = iface.ready
iface_disconnected = iface.got_disconnected
await asyncio.wait([iface_ready, iface_disconnected], return_when=asyncio.FIRST_COMPLETED)
if not iface_ready.done() or iface_ready.cancelled():
await asyncio.sleep(0.1)
continue # try again
# try actual request
success_fut = asyncio.ensure_future(func(self, *args, **kwargs))
disconnected_fut = asyncio.shield(iface.got_disconnected)
await asyncio.wait([success_fut, disconnected_fut], return_when=asyncio.FIRST_COMPLETED)
if success_fut.done():
await asyncio.wait([success_fut, iface_disconnected], return_when=asyncio.FIRST_COMPLETED)
if success_fut.done() and not success_fut.cancelled():
if success_fut.exception():
raise success_fut.exception()
try:
raise success_fut.exception()
except RequestTimedOut:
await iface.close()
await iface_disconnected
continue # try again
return success_fut.result()
# otherwise; try again
raise Exception('no interface to do request on... gave up.')
Expand Down

0 comments on commit 3e2c5e8

Please sign in to comment.