From e273b5c7c64f8d90ffff8138f213c8e28367a0f4 Mon Sep 17 00:00:00 2001 From: Alexander Kozlovsky Date: Thu, 19 Aug 2021 10:09:16 +0200 Subject: [PATCH] Fixes #6262, fixes #6268: correct delayed initialization of endpoints --- .../components/implementation/libtorrent.py | 7 +++---- .../components/implementation/metadata_store.py | 7 ++----- .../components/implementation/torrent_checker.py | 5 +++-- .../components/interfaces/metadata_store.py | 2 +- .../tribler_core/restapi/rest_manager.py | 12 ++++++++++++ 5 files changed, 21 insertions(+), 12 deletions(-) diff --git a/src/tribler-core/tribler_core/components/implementation/libtorrent.py b/src/tribler-core/tribler_core/components/implementation/libtorrent.py index 1d5eaaebe81..89a9824b416 100644 --- a/src/tribler-core/tribler_core/components/implementation/libtorrent.py +++ b/src/tribler-core/tribler_core/components/implementation/libtorrent.py @@ -44,8 +44,7 @@ async def run(self): self.download_manager = download_manager - for endpoint in self.endpoints: - rest_manager.get_endpoint(endpoint).download_manager = download_manager + rest_manager.set_attr_for_endpoints(self.endpoints, 'download_manager', download_manager, skip_missing=True) if config.gui_test_mode: uri = "magnet:?xt=urn:btih:0000000000000000000000000000000000000000" @@ -53,8 +52,8 @@ async def run(self): async def shutdown(self): # Release endpoints - for endpoint in self.endpoints: - self.rest_manager.get_endpoint(endpoint).download_manager = None + self.rest_manager.set_attr_for_endpoints(self.endpoints, 'download_manager', None, skip_missing=True) + await self.release(RESTComponent) self.download_manager.stop_download_states_callback() diff --git a/src/tribler-core/tribler_core/components/implementation/metadata_store.py b/src/tribler-core/tribler_core/components/implementation/metadata_store.py index 525718a03bf..4f051cb60e9 100644 --- a/src/tribler-core/tribler_core/components/implementation/metadata_store.py +++ b/src/tribler-core/tribler_core/components/implementation/metadata_store.py @@ -38,17 +38,14 @@ async def run(self): disable_sync=config.gui_test_mode, ) self.mds = metadata_store - - for endpoint in self.endpoints: - rest_manager.get_endpoint(endpoint).mds = metadata_store + rest_manager.set_attr_for_endpoints(self.endpoints, 'mds', metadata_store, skip_missing=True) if config.gui_test_mode: generate_test_channels(metadata_store) async def shutdown(self): # Release endpoints - for endpoint in self.endpoints: - self.rest_manager.get_endpoint(endpoint).mds = None + self.rest_manager.set_attr_for_endpoints(self.endpoints, 'mds', None, skip_missing=True) await self.release(RESTComponent) await self.unused.wait() diff --git a/src/tribler-core/tribler_core/components/implementation/torrent_checker.py b/src/tribler-core/tribler_core/components/implementation/torrent_checker.py index 0556c87a2fe..35bed60c1ab 100644 --- a/src/tribler-core/tribler_core/components/implementation/torrent_checker.py +++ b/src/tribler-core/tribler_core/components/implementation/torrent_checker.py @@ -36,11 +36,12 @@ async def run(self): rest_manager.get_endpoint('state').readable_status = STATE_START_TORRENT_CHECKER await torrent_checker.initialize() - rest_manager.get_endpoint('metadata').torrent_checker = torrent_checker + rest_manager.set_attr_for_endpoints(['metadata'], 'torrent_checker', torrent_checker, skip_missing=True) async def shutdown(self): self.session.notifier.notify_shutdown_state("Shutting down Torrent Checker...") - self.rest_manager.get_endpoint('metadata').torrent_checker = None + self.rest_manager.set_attr_for_endpoints(['metadata'], 'torrent_checker', None, skip_missing=True) + await self.release(RESTComponent) await self.torrent_checker.shutdown() diff --git a/src/tribler-core/tribler_core/components/interfaces/metadata_store.py b/src/tribler-core/tribler_core/components/interfaces/metadata_store.py index c29ee93cd53..c5360e2157e 100644 --- a/src/tribler-core/tribler_core/components/interfaces/metadata_store.py +++ b/src/tribler-core/tribler_core/components/interfaces/metadata_store.py @@ -12,7 +12,7 @@ class MetadataStoreComponent(Component): @classmethod def should_be_enabled(cls, config: TriblerConfig): - return config.chant.enabled + return config.chant.enabled or config.torrent_checking.enabled @classmethod def make_implementation(cls, config: TriblerConfig, enable: bool): diff --git a/src/tribler-core/tribler_core/restapi/rest_manager.py b/src/tribler-core/tribler_core/restapi/rest_manager.py index ff4b937f8e6..da32821fb84 100644 --- a/src/tribler-core/tribler_core/restapi/rest_manager.py +++ b/src/tribler-core/tribler_core/restapi/rest_manager.py @@ -2,6 +2,7 @@ import os import ssl import traceback +from typing import List from aiohttp import web from aiohttp.web_exceptions import HTTPNotFound @@ -97,6 +98,17 @@ def __init__(self, config: APISettings, root_endpoint: RootEndpoint, state_dir=N def get_endpoint(self, name): return self.root_endpoint.endpoints['/' + name] + def set_attr_for_endpoints(self, endpoints: List[str], attr_name: str, attr_value, skip_missing=False): + """ + Set attribute value for each endpoint in the list. Can be used for delayed initialization of endpoints. + """ + for endpoint_name in endpoints: + endpoint = self.root_endpoint.endpoints.get('/' + endpoint_name) + if endpoint is not None: + setattr(endpoint, attr_name, attr_value) + elif not skip_missing: + raise KeyError(f'Endpoint not found: /{endpoint_name}') + async def start(self): """ Starts the HTTP API with the listen port as specified in the session configuration.