From eae066efb1e94d6c5f09c55dc63d2d886dbcea6a Mon Sep 17 00:00:00 2001 From: Marcin Sobczyk <msobczyk@syncad.com> Date: Thu, 13 Mar 2025 13:45:55 +0100 Subject: [PATCH] Suppress WorkerCancelled exception of update node/alarms data when entering dashboard --- clive/__private/ui/app.py | 18 ++++++++++++++---- .../finish_profile_creation_mixin.py | 3 ++- clive/__private/ui/screens/unlock/unlock.py | 2 +- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/clive/__private/ui/app.py b/clive/__private/ui/app.py index 9a25ab2a5d..eac92904ba 100644 --- a/clive/__private/ui/app.py +++ b/clive/__private/ui/app.py @@ -13,6 +13,7 @@ from textual.app import App from textual.binding import Binding from textual.notifications import Notification, Notify, SeverityLevel from textual.reactive import var +from textual.worker import WorkerCancelled from clive.__private.core.constants.terminal import TERMINAL_HEIGHT, TERMINAL_WIDTH from clive.__private.core.constants.tui.bindings import APP_QUIT_KEY_BINDING @@ -242,12 +243,21 @@ class Clive(App[int]): def trigger_app_state_watchers(self) -> None: self.world.mutate_reactive(TUIWorld.app_state) # type: ignore[arg-type] - def update_alarms_data_asap_on_newest_node_data(self) -> Worker[None]: + def update_alarms_data_asap_on_newest_node_data(self, *, suppress_cancelled_error: bool = False) -> Worker[None]: """Update alarms on the newest possible node data.""" + async def update_alarms_data_on_newest_node_data() -> None: - await self.update_data_from_node().wait() - await self.update_alarms_data().wait() - return self.run_worker(update_alarms_data_on_newest_node_data()) + try: + await self.update_data_from_node().wait() + await self.update_alarms_data().wait() + except WorkerCancelled as error: + logger.warning("Update alarms data on newest node data cancelled.") + if not suppress_cancelled_error: + logger.warning(f"Re-raising exception: {error}") + raise + logger.warning(f"Ignoring exception: {error}") + + return self.run_worker(update_alarms_data_on_newest_node_data(), exclusive=True) @work(name="alarms data update worker", group="alarms_data", exclusive=True) async def update_alarms_data(self) -> None: diff --git a/clive/__private/ui/forms/create_profile/finish_profile_creation_mixin.py b/clive/__private/ui/forms/create_profile/finish_profile_creation_mixin.py index ad69c5f655..52fd14c8a5 100644 --- a/clive/__private/ui/forms/create_profile/finish_profile_creation_mixin.py +++ b/clive/__private/ui/forms/create_profile/finish_profile_creation_mixin.py @@ -14,7 +14,8 @@ class FinishProfileCreationMixin(FormScreenBase[CreateProfileContext]): async def _finish(self) -> None: self._owner.add_post_action( - self.app.update_alarms_data_asap_on_newest_node_data, self.app.resume_refresh_alarms_data_interval + lambda: self.app.update_alarms_data_asap_on_newest_node_data(suppress_cancelled_error=True), + self.app.resume_refresh_alarms_data_interval, ) profile = self.context.profile diff --git a/clive/__private/ui/screens/unlock/unlock.py b/clive/__private/ui/screens/unlock/unlock.py index 194b55e9ca..44f1eff6eb 100644 --- a/clive/__private/ui/screens/unlock/unlock.py +++ b/clive/__private/ui/screens/unlock/unlock.py @@ -123,7 +123,7 @@ class Unlock(BaseScreen): await self.world.load_profile_based_on_beekepeer() await self.app.switch_mode("dashboard") self._remove_welcome_modes() - self.app.update_alarms_data_asap_on_newest_node_data() + self.app.update_alarms_data_asap_on_newest_node_data(suppress_cancelled_error=True) self.app.resume_refresh_node_data_interval() self.app.resume_refresh_alarms_data_interval() -- GitLab