cancel all long-running tasks (#1793)

* add centralized task management

in order to properly cleanup all long-running tasks we have to keep a list of them

* use new task management functions

* unify shutdown events

* vlads suggestions

rename variable for create_task
wrap cancel() with try/catch

fixup

* rename func to coro

---------

Co-authored-by: dni  <office@dnilabs.com>
This commit is contained in:
jackstar12
2023-08-18 10:25:33 +01:00
committed by GitHub
co-authored by dni ⚡
parent 65db43ace4
commit 1fd4d9d514
3 changed files with 46 additions and 52 deletions
+10 -16
View File
@@ -28,9 +28,9 @@ from lnbits.core.services import websocketUpdater
from lnbits.core.tasks import ( # register_watchdog,; unregister_watchdog,
register_killswitch,
register_task_listeners,
unregister_killswitch,
)
from lnbits.settings import settings
from lnbits.tasks import cancel_all_tasks, create_permanent_task
from lnbits.wallets import get_wallet_class, set_wallet_class
from .commands import db_versions, load_disabled_extension_list, migrate_databases
@@ -52,7 +52,6 @@ from .middleware import (
)
from .requestvars import g
from .tasks import (
catch_everything_and_restart,
check_pending_payments,
internal_invoice_listener,
invoice_listener,
@@ -366,6 +365,9 @@ def register_startup(app: FastAPI):
def register_shutdown(app: FastAPI):
@app.on_event("shutdown")
async def on_shutdown():
cancel_all_tasks()
# wait a bit to allow them to finish, so that cleanup can run without problems
await asyncio.sleep(0.1)
WALLET = get_wallet_class()
await WALLET.cleanup()
@@ -380,7 +382,7 @@ def initialize_server_logger():
msg = await serverlog_queue.get()
await websocketUpdater(super_user_hash, msg)
asyncio.create_task(update_websocket_serverlog())
create_permanent_task(update_websocket_serverlog)
logger.add(
lambda msg: serverlog_queue.put_nowait(msg),
@@ -421,21 +423,13 @@ def register_async_tasks(app):
@app.on_event("startup")
async def listeners():
loop = asyncio.get_event_loop()
loop.create_task(catch_everything_and_restart(check_pending_payments))
loop.create_task(catch_everything_and_restart(invoice_listener))
loop.create_task(catch_everything_and_restart(internal_invoice_listener))
await register_task_listeners()
# await register_watchdog()
await register_killswitch()
create_permanent_task(check_pending_payments)
create_permanent_task(invoice_listener)
create_permanent_task(internal_invoice_listener)
register_task_listeners()
register_killswitch()
# await run_deferred_async() # calle: doesn't do anyting?
@app.on_event("shutdown")
async def stop_listeners():
# await unregister_watchdog()
await unregister_killswitch()
pass
def register_exception_handlers(app: FastAPI):
@app.exception_handler(Exception)