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


The following commit(s) were added to refs/heads/master by this push:
     new 997b96f  Better stop handling; add refresh option
997b96f is described below

commit 997b96f2f0f99051ae4fb48f123a5794f2a29362
Author: Sebb <[email protected]>
AuthorDate: Wed Jan 26 11:29:13 2022 +0000

    Better stop handling; add refresh option
---
 server/main.py               | 18 +++++++++++++++++-
 server/plugins/background.py |  8 ++++++--
 2 files changed, 23 insertions(+), 3 deletions(-)

diff --git a/server/main.py b/server/main.py
index c2a2992..bc5a014 100644
--- a/server/main.py
+++ b/server/main.py
@@ -23,6 +23,7 @@ import importlib
 import json
 import os
 import sys
+from time import sleep
 import traceback
 import typing
 
@@ -69,6 +70,7 @@ class Server(plugins.server.BaseServer):
         self.foal_version = PONYMAIL_FOAL_VERSION
         self.server_version = PONYMAIL_SERVER_VERSION
         self.stoppable = False # allow remote stop for tests
+        self.background_event = asyncio.Event() # for background task to wait 
on
 
         # Make a pool of database connections for async queries
         pool_size = self.config.database.pool_size
@@ -105,6 +107,8 @@ 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
             
 
     async def handle_request(
@@ -125,8 +129,15 @@ class Server(plugins.server.BaseServer):
         body_type = "form"
         # Support URLs of form /api/handler/extra?query
         handler = request.path.split("/")[2]
+        # handle test requests
         if self.stoppable and handler == 'stop':
-            raise KeyboardInterrupt # TODO find tidier solution ...
+            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')
+
         if handler.endswith(".lua"):
             body_type = "form"
             handler = handler[:-4]
@@ -248,5 +259,10 @@ if __name__ == "__main__":
         action='store_true',
         help="Allow remote stop for testing",
     )
+    parser.add_argument(
+        "--refreshable",
+        action='store_true',
+        help="Allow remote refresh for testing",
+    )
     cliargs = parser.parse_args()
     Server(cliargs).run()
diff --git a/server/plugins/background.py b/server/plugins/background.py
index cc08052..152fa7f 100644
--- a/server/plugins/background.py
+++ b/server/plugins/background.py
@@ -222,7 +222,7 @@ 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 True:
+    while server.running:
         async with ProgTimer("Gathering list of archived mailing lists"):
             try:
                 server.data.lists = await get_lists(server.config.database)
@@ -236,4 +236,8 @@ async def run_tasks(server: plugins.server.BaseServer) -> 
None:
                     "Could not fetch activity data - database down or not 
connected: %s"
                     % e
                 )
-        await asyncio.sleep(server.config.tasks.refresh_rate)
+        try:
+            await asyncio.wait_for(server.background_event.wait(), 
timeout=server.config.tasks.refresh_rate)
+            server.background_event.clear() # needed for refresh
+        except asyncio.TimeoutError:
+            pass # This is normal

Reply via email to