|
|
|
|
@ -268,7 +268,7 @@ class Network(Logger):
|
|
|
|
|
if not self.default_server: |
|
|
|
|
self.default_server = pick_random_server() |
|
|
|
|
|
|
|
|
|
self.main_taskgroup = None # type: TaskGroup |
|
|
|
|
self.taskgroup = None # type: TaskGroup |
|
|
|
|
|
|
|
|
|
# locks |
|
|
|
|
self.restart_lock = asyncio.Lock() |
|
|
|
|
@ -661,7 +661,7 @@ class Network(Logger):
|
|
|
|
|
old_server = old_interface.server if old_interface else None |
|
|
|
|
|
|
|
|
|
# Stop any current interface in order to terminate subscriptions, |
|
|
|
|
# and to cancel tasks in interface.group. |
|
|
|
|
# and to cancel tasks in interface.taskgroup. |
|
|
|
|
# However, for headers sub, give preference to this interface |
|
|
|
|
# over unknown ones, i.e. start it again right away. |
|
|
|
|
if old_server and old_server != server: |
|
|
|
|
@ -680,7 +680,7 @@ class Network(Logger):
|
|
|
|
|
assert i.ready.done(), "interface we are switching to is not ready yet" |
|
|
|
|
blockchain_updated = i.blockchain != self.blockchain() |
|
|
|
|
self.interface = i |
|
|
|
|
await i.group.spawn(self._request_server_info(i)) |
|
|
|
|
await i.taskgroup.spawn(self._request_server_info(i)) |
|
|
|
|
self.trigger_callback('default_server_changed') |
|
|
|
|
self.default_server_changed_event.set() |
|
|
|
|
self.default_server_changed_event.clear() |
|
|
|
|
@ -1118,8 +1118,8 @@ class Network(Logger):
|
|
|
|
|
f.write(json.dumps(cp, indent=4)) |
|
|
|
|
|
|
|
|
|
async def _start(self): |
|
|
|
|
assert not self.main_taskgroup |
|
|
|
|
self.main_taskgroup = main_taskgroup = SilentTaskGroup() |
|
|
|
|
assert not self.taskgroup |
|
|
|
|
self.taskgroup = taskgroup = SilentTaskGroup() |
|
|
|
|
assert not self.interface and not self.interfaces |
|
|
|
|
assert not self.connecting and not self.server_queue |
|
|
|
|
self.logger.info('starting network') |
|
|
|
|
@ -1135,11 +1135,11 @@ class Network(Logger):
|
|
|
|
|
await self._init_headers_file() |
|
|
|
|
# note: if a task finishes with CancelledError, that |
|
|
|
|
# will NOT raise, and the group will keep the other tasks running |
|
|
|
|
async with main_taskgroup as group: |
|
|
|
|
async with taskgroup as group: |
|
|
|
|
await group.spawn(self._maintain_sessions()) |
|
|
|
|
[await group.spawn(job) for job in self._jobs] |
|
|
|
|
except BaseException as e: |
|
|
|
|
self.logger.exception('main_taskgroup died.') |
|
|
|
|
self.logger.exception('taskgroup died.') |
|
|
|
|
raise e |
|
|
|
|
asyncio.run_coroutine_threadsafe(main(), self.asyncio_loop) |
|
|
|
|
|
|
|
|
|
@ -1158,10 +1158,10 @@ class Network(Logger):
|
|
|
|
|
async def _stop(self, full_shutdown=False): |
|
|
|
|
self.logger.info("stopping network") |
|
|
|
|
try: |
|
|
|
|
await asyncio.wait_for(self.main_taskgroup.cancel_remaining(), timeout=2) |
|
|
|
|
await asyncio.wait_for(self.taskgroup.cancel_remaining(), timeout=2) |
|
|
|
|
except (asyncio.TimeoutError, asyncio.CancelledError) as e: |
|
|
|
|
self.logger.info(f"exc during main_taskgroup cancellation: {repr(e)}") |
|
|
|
|
self.main_taskgroup = None # type: TaskGroup |
|
|
|
|
self.taskgroup = None # type: TaskGroup |
|
|
|
|
self.interface = None # type: Interface |
|
|
|
|
self.interfaces = {} # type: Dict[str, Interface] |
|
|
|
|
self.connecting.clear() |
|
|
|
|
@ -1196,7 +1196,7 @@ class Network(Logger):
|
|
|
|
|
async def launch_already_queued_up_new_interfaces(): |
|
|
|
|
while self.server_queue.qsize() > 0: |
|
|
|
|
server = self.server_queue.get() |
|
|
|
|
await self.main_taskgroup.spawn(self._run_new_interface(server)) |
|
|
|
|
await self.taskgroup.spawn(self._run_new_interface(server)) |
|
|
|
|
async def maybe_queue_new_interfaces_to_be_launched_later(): |
|
|
|
|
now = time.time() |
|
|
|
|
for i in range(self.num_server - len(self.interfaces) - len(self.connecting)): |
|
|
|
|
@ -1218,7 +1218,7 @@ class Network(Logger):
|
|
|
|
|
await self._ensure_there_is_a_main_interface() |
|
|
|
|
if self.is_connected(): |
|
|
|
|
if self.config.is_fee_estimates_update_required(): |
|
|
|
|
await self.interface.group.spawn(self._request_fee_estimates, self.interface) |
|
|
|
|
await self.interface.taskgroup.spawn(self._request_fee_estimates, self.interface) |
|
|
|
|
|
|
|
|
|
while True: |
|
|
|
|
try: |
|
|
|
|
@ -1228,7 +1228,7 @@ class Network(Logger):
|
|
|
|
|
await maintain_main_interface() |
|
|
|
|
except asyncio.CancelledError: |
|
|
|
|
# suppress spurious cancellations |
|
|
|
|
group = self.main_taskgroup |
|
|
|
|
group = self.taskgroup |
|
|
|
|
if not group or group.closed(): |
|
|
|
|
raise |
|
|
|
|
await asyncio.sleep(0.1) |
|
|
|
|
|