Skip to content

Commit 8b2e546

Browse files
committed
Add a unique_id to LatestValueCache
When debugging and having some task in the stack coming from a `LastValueCache` it is very difficult to identify which one is it. This commit add a new `unique_id` that's used to create the task name. Signed-off-by: Leandro Lucarella <[email protected]>
1 parent bfc8de2 commit 8b2e546

File tree

5 files changed

+30
-7
lines changed

5 files changed

+30
-7
lines changed

src/frequenz/sdk/_internal/_channels.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,15 +36,28 @@ class _Sentinel:
3636
class LatestValueCache(typing.Generic[T_co]):
3737
"""A cache that stores the latest value in a receiver."""
3838

39-
def __init__(self, receiver: Receiver[T_co]) -> None:
39+
def __init__(
40+
self, receiver: Receiver[T_co], *, unique_id: str | None = None
41+
) -> None:
4042
"""Create a new cache.
4143
4244
Args:
4345
receiver: The receiver to cache.
46+
unique_id: A string to help uniquely identify this instance. If not
47+
provided, a unique identifier will be generated from the object's
48+
[`id()`][]. It is used mostly for debugging purposes.
4449
"""
4550
self._receiver = receiver
51+
self._unique_id: str = hex(id(self)) if unique_id is None else unique_id
4652
self._latest_value: T_co | _Sentinel = _Sentinel()
47-
self._task = asyncio.create_task(self._run())
53+
self._task = asyncio.create_task(
54+
self._run(), name=f"LatestValueCache«{self._unique_id}»"
55+
)
56+
57+
@property
58+
def unique_id(self) -> str:
59+
"""The unique identifier of this instance."""
60+
return self._unique_id
4861

4962
def get(self) -> T_co:
5063
"""Return the latest value that has been received.

src/frequenz/sdk/actor/power_distributing/_component_managers/_battery_manager.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -315,13 +315,19 @@ async def _distribute_power(
315315
async def _create_channels(self) -> None:
316316
"""Create channels to get data of components in microgrid."""
317317
api = connection_manager.get().api_client
318+
manager_id = f"{type(self).__name__}»{hex(id(self))}»"
318319
for battery_id, inverter_ids in self._bat_invs_map.items():
319320
bat_recv: Receiver[BatteryData] = await api.battery_data(battery_id)
320-
self._battery_caches[battery_id] = LatestValueCache(bat_recv)
321+
self._battery_caches[battery_id] = LatestValueCache(
322+
bat_recv,
323+
unique_id=f"{manager_id}:battery«{battery_id}»",
324+
)
321325

322326
for inverter_id in inverter_ids:
323327
inv_recv: Receiver[InverterData] = await api.inverter_data(inverter_id)
324-
self._inverter_caches[inverter_id] = LatestValueCache(inv_recv)
328+
self._inverter_caches[inverter_id] = LatestValueCache(
329+
inv_recv, unique_id=f"{manager_id}:inverter«{inverter_id}»"
330+
)
325331

326332
def _get_bounds(
327333
self,

src/frequenz/sdk/actor/power_distributing/_component_managers/_ev_charger_manager/_ev_charger_manager.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@ def __init__(
5555
self._ev_charger_ids = self._get_ev_charger_ids()
5656
self._evc_states = EvcStates()
5757
self._voltage_cache: LatestValueCache[Sample3Phase[Voltage]] = LatestValueCache(
58-
microgrid.voltage().new_receiver()
58+
microgrid.voltage().new_receiver(),
59+
unique_id=f"{type(self).__name__}«{hex(id(self))}»:voltage_cache",
5960
)
6061
self._config = EVDistributionConfig(component_ids=self._ev_charger_ids)
6162
self._component_pool_status_tracker = ComponentPoolStatusTracker(

src/frequenz/sdk/actor/power_distributing/_component_managers/_pv_inverter_manager/_pv_inverter_manager.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,8 @@ async def start(self) -> None:
7676
"""Start the PV inverter manager."""
7777
self._component_data_caches = {
7878
inv_id: LatestValueCache(
79-
await connection_manager.get().api_client.inverter_data(inv_id)
79+
await connection_manager.get().api_client.inverter_data(inv_id),
80+
unique_id=f"{type(self).__name__}«{hex(id(self))}»:inverter«{inv_id}»",
8081
)
8182
for inv_id in self._pv_inverter_ids
8283
}

src/frequenz/sdk/timeseries/ev_charger_pool/_set_current_bounds.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,10 @@ async def _run(self) -> None:
9999
_logger.error(err)
100100
raise RuntimeError(err)
101101

102+
meter_id = next(iter(meters)).component_id
102103
self._meter_data_cache = LatestValueCache(
103-
await api_client.meter_data(next(iter(meters)).component_id)
104+
await api_client.meter_data(meter_id),
105+
unique_id=f"{type(self).__name__}«{hex(id(self))}»:meter«{meter_id}»",
104106
)
105107
latest_bound: dict[int, ComponentCurrentLimit] = {}
106108

0 commit comments

Comments
 (0)