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