From 00562927fc5ba55f084aef59f2253dd00a60bffa Mon Sep 17 00:00:00 2001 From: "Mathias L. Baumann" Date: Tue, 21 Jan 2025 18:42:02 +0100 Subject: [PATCH 1/2] Fix last_id in fake service when setting dispatches Signed-off-by: Mathias L. Baumann --- RELEASE_NOTES.md | 2 ++ src/frequenz/client/dispatch/test/client.py | 10 ++++++++++ 2 files changed, 12 insertions(+) diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index 79d20755..ba5b3735 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -3,3 +3,5 @@ ## Bug Fixes * Fix missing dependency in last release +* The `FakeClient.set_dispatches()` method now correctly updates `FakeService._last_id` which is used to generate unique dispatch IDs. + diff --git a/src/frequenz/client/dispatch/test/client.py b/src/frequenz/client/dispatch/test/client.py index 66dd0d9c..b5148a67 100644 --- a/src/frequenz/client/dispatch/test/client.py +++ b/src/frequenz/client/dispatch/test/client.py @@ -54,6 +54,16 @@ def set_dispatches(self, microgrid_id: int, value: list[Dispatch]) -> None: """ self._service.dispatches[microgrid_id] = value + if len(value) == 0: + return + + # Max between last id and the max id in the list + # pylint: disable=protected-access + self._service._last_id = max( + self._service._last_id, max(dispatch.id for dispatch in value) + ) + # pylint: enable=protected-access + @property def _service(self) -> FakeService: """The fake service. From a1bfc1115aa399d2bf9e714217f40aae4a9773fa Mon Sep 17 00:00:00 2001 From: "Mathias L. Baumann" Date: Wed, 22 Jan 2025 11:59:45 +0100 Subject: [PATCH 2/2] Fix: Make streams local, not global Signed-off-by: Mathias L. Baumann --- RELEASE_NOTES.md | 3 ++- src/frequenz/client/dispatch/_client.py | 15 +++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index ba5b3735..3b27ef26 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -2,6 +2,7 @@ ## Bug Fixes -* Fix missing dependency in last release +* Fix missing dependency in last release. * The `FakeClient.set_dispatches()` method now correctly updates `FakeService._last_id` which is used to generate unique dispatch IDs. +* Fix that streams were globally shared between all clients. diff --git a/src/frequenz/client/dispatch/_client.py b/src/frequenz/client/dispatch/_client.py index 1e64a028..c777bba1 100644 --- a/src/frequenz/client/dispatch/_client.py +++ b/src/frequenz/client/dispatch/_client.py @@ -55,11 +55,6 @@ class Client(BaseApiClient[dispatch_pb2_grpc.MicrogridDispatchServiceStub]): """Dispatch API client.""" - streams: dict[ - int, GrpcStreamBroadcaster[StreamMicrogridDispatchesResponse, DispatchEvent] - ] = {} - """A dictionary of streamers, keyed by microgrid_id.""" - def __init__( self, *, @@ -91,6 +86,10 @@ def __init__( ), ) self._metadata = (("key", key),) + self._streams: dict[ + int, GrpcStreamBroadcaster[StreamMicrogridDispatchesResponse, DispatchEvent] + ] = {} + """A dictionary of streamers, keyed by microgrid_id.""" @property def stub(self) -> dispatch_pb2_grpc.MicrogridDispatchServiceAsyncStub: @@ -225,11 +224,11 @@ def _get_stream( self, microgrid_id: int ) -> GrpcStreamBroadcaster[StreamMicrogridDispatchesResponse, DispatchEvent]: """Get an instance to the streaming helper.""" - broadcaster = self.streams.get(microgrid_id) + broadcaster = self._streams.get(microgrid_id) # pylint: disable=protected-access if broadcaster is not None and broadcaster._channel.is_closed: # pylint: enable=protected-access - del self.streams[microgrid_id] + del self._streams[microgrid_id] broadcaster = None if broadcaster is None: request = StreamMicrogridDispatchesRequest(microgrid_id=microgrid_id) @@ -244,7 +243,7 @@ def _get_stream( transform=DispatchEvent.from_protobuf, retry_strategy=LinearBackoff(interval=1, limit=0), ) - self.streams[microgrid_id] = broadcaster + self._streams[microgrid_id] = broadcaster return broadcaster