This is an automated email from the ASF dual-hosted git repository. sebb pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-ponymail-foal.git
commit 2c79a9cc19a59f36b7319e248b842a160d0aa919 Author: Sebb <[email protected]> AuthorDate: Wed Jan 26 13:58:10 2022 +0000 Allow refresh to wait for completion --- server/main.py | 9 +++------ server/plugins/background.py | 37 ++++++++++++++++++++++--------------- server/plugins/server.py | 3 +-- 3 files changed, 26 insertions(+), 23 deletions(-) diff --git a/server/main.py b/server/main.py index bc5a014..3fae16c 100644 --- a/server/main.py +++ b/server/main.py @@ -107,9 +107,7 @@ class Server(plugins.server.BaseServer): self.api_logger.setLevel(args.apilog) self.api_logger.addHandler(logging.StreamHandler()) self.stoppable = args.stoppable - self.refreshable = args.refreshable - self.running = True # for background task - + self.refreshable = args.refreshable async def handle_request( self, request: aiohttp.web.BaseRequest @@ -132,11 +130,10 @@ class Server(plugins.server.BaseServer): # handle test requests if self.stoppable and handler == 'stop': self.background_event.set() - self.running = False return aiohttp.web.Response(headers=headers, status=200, text='Stop requested\n') if self.refreshable and handler == 'refresh': - self.background_event.set() - return aiohttp.web.Response(headers=headers, status=200, text='Refresh requested\n') + await plugins.background.get_data(self) + return aiohttp.web.Response(headers=headers, status=200, text='Refresh performed\n') if handler.endswith(".lua"): body_type = "form" diff --git a/server/plugins/background.py b/server/plugins/background.py index 152fa7f..f7d52ba 100644 --- a/server/plugins/background.py +++ b/server/plugins/background.py @@ -208,6 +208,25 @@ async def get_public_activity(database: plugins.configuration.DBConfig) -> dict: return activity +async def get_data(server: plugins.server.BaseServer): + """ + Fetches the data once. + This is a separate function so it can be invoked on demand. + """ + async with ProgTimer("Gathering list of archived mailing lists"): + try: + server.data.lists = await get_lists(server.config.database) + print(f"Found {len(server.data.lists)} lists") + except plugins.database.DBError as e: + print("Could not fetch lists - database down or not connected: %s" % e) + async with ProgTimer("Gathering bi-weekly activity stats"): + try: + server.data.activity = await get_public_activity(server.config.database) + except plugins.database.DBError as e: + print( + "Could not fetch activity data - database down or not connected: %s" + % e + ) async def run_tasks(server: plugins.server.BaseServer) -> None: """ @@ -222,22 +241,10 @@ async def run_tasks(server: plugins.server.BaseServer) -> None: db = plugins.database.Database(server.config.database) server.engine_version = (await db.info())['version']['number'] - while server.running: - async with ProgTimer("Gathering list of archived mailing lists"): - try: - server.data.lists = await get_lists(server.config.database) - except plugins.database.DBError as e: - print("Could not fetch lists - database down or not connected: %s" % e) - async with ProgTimer("Gathering bi-weekly activity stats"): - try: - server.data.activity = await get_public_activity(server.config.database) - except plugins.database.DBError as e: - print( - "Could not fetch activity data - database down or not connected: %s" - % e - ) + while True: + await get_data(server) try: await asyncio.wait_for(server.background_event.wait(), timeout=server.config.tasks.refresh_rate) - server.background_event.clear() # needed for refresh + break # if the event is set, then we have been asked to stop except asyncio.TimeoutError: pass # This is normal diff --git a/server/plugins/server.py b/server/plugins/server.py index d8b047d..2e9598f 100644 --- a/server/plugins/server.py +++ b/server/plugins/server.py @@ -55,5 +55,4 @@ class BaseServer: # provided by background.py library_version: str engine_version: str - running: bool - background_event: asyncio.Event + background_event: asyncio.Event # tell background.py to stop
