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

Reply via email to