Skip to content

Commit 956823f

Browse files
authored
Fix exit-on-timeout issue in PowerDistributor (#1035)
This is a backport of #1020 to 1.0.0-rc-6xx
2 parents aa259ec + c8cf967 commit 956823f

File tree

3 files changed

+43
-40
lines changed

3 files changed

+43
-40
lines changed

RELEASE_NOTES.md

+2
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,5 @@
33
## Bug Fixes
44

55
- Fixes a bug in the ring buffer in case the updated value is missing and creates a gap in time.
6+
7+
- Fixed a bug that was causing the `PowerDistributor` to exit if power requests to PV inverters or EV chargers timeout.

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

+20-20
Original file line numberDiff line numberDiff line change
@@ -323,29 +323,29 @@ async def _set_api_power(
323323
succeeded_components: set[int] = set()
324324
failed_power = Power.zero()
325325
for component_id, task in tasks.items():
326-
exc = task.exception()
327-
if exc is not None:
328-
failed_components.add(component_id)
329-
failed_power += target_power_changes[component_id]
326+
try:
327+
task.result()
328+
except asyncio.CancelledError:
329+
_logger.warning(
330+
"Timeout while setting power to EV charger %s", component_id
331+
)
332+
except grpc.aio.AioRpcError as exc:
333+
_logger.warning(
334+
"Error while setting power to EV charger %s: %s",
335+
component_id,
336+
exc,
337+
)
338+
except Exception: # pylint: disable=broad-except
339+
_logger.exception(
340+
"Unknown error while setting power to EV charger: %s", component_id
341+
)
330342
else:
331343
succeeded_components.add(component_id)
344+
continue
345+
346+
failed_components.add(component_id)
347+
failed_power += target_power_changes[component_id]
332348

333-
match task.exception():
334-
case asyncio.CancelledError():
335-
_logger.warning(
336-
"Timeout while setting power to EV charger %s", component_id
337-
)
338-
case grpc.aio.AioRpcError() as err:
339-
_logger.warning(
340-
"Error while setting power to EV charger %s: %s",
341-
component_id,
342-
err,
343-
)
344-
case Exception():
345-
_logger.exception(
346-
"Unknown error while setting power to EV charger: %s",
347-
component_id,
348-
)
349349
if failed_components:
350350
return PartialFailure(
351351
failed_components=failed_components,

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

+21-20
Original file line numberDiff line numberDiff line change
@@ -196,29 +196,30 @@ async def _set_api_power( # pylint: disable=too-many-locals
196196
succeeded_components: set[int] = set()
197197
failed_power = Power.zero()
198198
for component_id, task in tasks.items():
199-
exc = task.exception()
200-
if exc is not None:
201-
failed_components.add(component_id)
202-
failed_power += allocations[component_id]
199+
try:
200+
task.result()
201+
except asyncio.CancelledError:
202+
_logger.warning(
203+
"Timeout while setting power to PV inverter %s", component_id
204+
)
205+
except grpc.aio.AioRpcError as exc:
206+
_logger.warning(
207+
"Error while setting power to PV inverter %s: %s",
208+
component_id,
209+
exc,
210+
)
211+
except Exception: # pylint: disable=broad-except
212+
_logger.exception(
213+
"Unknown error while setting power to PV inverter: %s",
214+
component_id,
215+
)
203216
else:
204217
succeeded_components.add(component_id)
218+
continue
219+
220+
failed_components.add(component_id)
221+
failed_power += allocations[component_id]
205222

206-
match task.exception():
207-
case asyncio.CancelledError():
208-
_logger.warning(
209-
"Timeout while setting power to PV inverter %s", component_id
210-
)
211-
case grpc.aio.AioRpcError() as err:
212-
_logger.warning(
213-
"Error while setting power to PV inverter %s: %s",
214-
component_id,
215-
err,
216-
)
217-
case Exception():
218-
_logger.exception(
219-
"Unknown error while setting power to PV inverter: %s",
220-
component_id,
221-
)
222223
if failed_components:
223224
await self._results_sender.send(
224225
PartialFailure(

0 commit comments

Comments
 (0)