Skip to content
Snippets Groups Projects
Commit 8fcba07f authored by Marcin Sobczyk's avatar Marcin Sobczyk
Browse files

Make data_provider update works exclusive

parent 33fe6563
No related branches found
No related tags found
2 merge requests!600v1.27.5.21 Release,!588Suppress exceptions on updating node/alarm data canceled
......@@ -319,13 +319,13 @@ class Clive(App[int]):
for signal_number in [signal.SIGHUP, signal.SIGINT, signal.SIGQUIT, signal.SIGTERM]:
loop.add_signal_handler(signal_number, callback)
def _is_worker_group_empty(self, group: str) -> bool:
def is_worker_group_empty(self, group: str) -> bool:
return not bool([worker for worker in self.workers if worker.group == group])
def _retrigger_update_data_from_node(self) -> None:
if self._is_worker_group_empty("node_data"):
if self.is_worker_group_empty("node_data"):
self.update_data_from_node()
def _retrigger_update_alarms_data(self) -> None:
if self._is_worker_group_empty("alarms_data"):
if self.is_worker_group_empty("alarms_data"):
self.update_alarms_data()
......@@ -3,7 +3,8 @@ from __future__ import annotations
from abc import abstractmethod
from typing import Final, Generic, TypeVar
from textual import on, work
from inflection import underscore
from textual import on
from textual.containers import Container
from textual.reactive import var
from textual.worker import Worker, WorkerState
......@@ -63,15 +64,20 @@ class DataProvider(Container, CliveWidget, Generic[ProviderContentT], AbstractCl
if not paused and init_update:
self.update()
self.interval = self.set_interval(safe_settings.node.refresh_rate_secs, self.update, pause=paused)
self.interval = self.set_interval(
safe_settings.node.refresh_rate_secs, self._update_if_not_ongoing, pause=paused
)
def update(self) -> Worker[None]:
name = self.get_worker_name()
return self.run_worker(self._update(), name=name, group=name, exclusive=True)
@abstractmethod
@work
async def update(self) -> None:
async def _update(self) -> None:
"""
Define the logic to update the provider data.
The name of the worker can be included by overriding the work decorator, e.g.: @work("my work").
The name and group of the worker is inferred from the class name.
"""
@on(Worker.StateChanged)
......@@ -106,3 +112,11 @@ class DataProvider(Container, CliveWidget, Generic[ProviderContentT], AbstractCl
self.interval.resume()
return worker
def get_worker_name(self) -> str:
return f"{underscore(self.__class__.__name__)} update worker"
def _update_if_not_ongoing(self) -> None:
name = self.get_worker_name()
if self.app.is_worker_group_empty(name):
self.update()
from __future__ import annotations
from textual import work
from textual.reactive import var
from clive.__private.core.commands.data_retrieval.hive_power_data import HivePowerData
......@@ -13,8 +12,7 @@ class HivePowerDataProvider(DataProvider[HivePowerData]):
def __init__(self, *, paused: bool = False, init_update: bool = True) -> None:
super().__init__(paused=paused, init_update=init_update)
@work(name="hive power data update worker")
async def update(self) -> None:
async def _update(self) -> None:
account_name = self.profile.accounts.working.name
wrapper = await self.commands.retrieve_hp_data(account_name=account_name)
......
......@@ -2,7 +2,6 @@ from __future__ import annotations
from typing import TYPE_CHECKING
from textual import work
from textual.reactive import var
from clive.__private.core.commands.data_retrieval.proposals_data import ProposalsData, ProposalsDataRetrieval
......@@ -21,8 +20,7 @@ class ProposalsDataProvider(DataProvider[ProposalsData]):
self.__order_direction: ProposalsDataRetrieval.OrderDirections = ProposalsDataRetrieval.DEFAULT_ORDER_DIRECTION
self.__status: ProposalsDataRetrieval.Statuses = ProposalsDataRetrieval.DEFAULT_STATUS
@work(name="proposals data update worker")
async def update(self) -> None:
async def _update(self) -> None:
proxy = self.profile.accounts.working.data.proxy
account_name = proxy if proxy else self.profile.accounts.working.name
......
from __future__ import annotations
from textual import work
from textual.reactive import var
from clive.__private.core.commands.data_retrieval.savings_data import SavingsData
......@@ -13,8 +12,7 @@ class SavingsDataProvider(DataProvider[SavingsData]):
_content: SavingsData | None = var(None, init=False) # type: ignore[assignment]
"""It is used to check whether savings data has been refreshed and to store savings data."""
@work(name="savings data update worker")
async def update(self) -> None:
async def _update(self) -> None:
account_name = self.profile.accounts.working.name
wrapper = await self.commands.retrieve_savings_data(account_name=account_name)
......
......@@ -2,7 +2,6 @@ from __future__ import annotations
from typing import TYPE_CHECKING
from textual import work
from textual.reactive import var
from clive.__private.core.commands.data_retrieval.witnesses_data import WitnessesData, WitnessesDataRetrieval
......@@ -26,8 +25,7 @@ class WitnessesDataProvider(DataProvider[WitnessesData]):
self.__mode: WitnessesDataRetrieval.Modes = WitnessesDataRetrieval.DEFAULT_MODE
self.__witness_name_pattern: str | None = None
@work(name="witnesses data update worker")
async def update(self) -> None:
async def _update(self) -> None:
proxy = self.profile.accounts.working.data.proxy
account_name = proxy if proxy else self.profile.accounts.working.name
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment