Skip to content

Commit 77d1cea

Browse files
committed
!feat(formula): Use report type to pusher actor mapping for actor
Change the `pushers` argument of the `FormulaActor` class from a dict mapping the actor name to a pusher actor to a dict mapping the report type to a list of pusher actors. This allow to have a more efficient dispatch of the generated reports to theirs corresponding pushers in the formula report handlers.
1 parent 0e3a043 commit 77d1cea

File tree

5 files changed

+19
-12
lines changed

5 files changed

+19
-12
lines changed

src/powerapi/dispatcher/dispatcher_actor.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class DispatcherState(State):
4646
Dispatcher actor state.
4747
"""
4848

49-
def __init__(self, actor, pushers: dict[str, PusherActor], route_table: RouteTable):
49+
def __init__(self, actor, pushers: dict[type[Report], list[PusherActor]], route_table: RouteTable):
5050
"""
5151
:param actor: Dispatcher actor instance
5252
:param pushers: List of pushers
@@ -90,8 +90,8 @@ class DispatcherActor(Actor):
9090
provided routing table. When a report doesn't have any formula assigned, the dispatcher will create a new formula.
9191
"""
9292

93-
def __init__(self, name: str, formula_init_function: Callable, pushers: [], route_table: RouteTable,
94-
level_logger: Literal = logging.WARNING, timeout=None):
93+
def __init__(self, name: str, formula_init_function: Callable, pushers: dict[type[Report], list[PusherActor]],
94+
route_table: RouteTable, level_logger: int = logging.WARNING, timeout=None):
9595
"""
9696
:param name: Actor name
9797
:param formula_init_function: Factory function for creating Formula

src/powerapi/formula/formula_actor.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232

3333
from powerapi.actor import Actor, State
3434
from powerapi.pusher import PusherActor
35+
from powerapi.report import Report
3536

3637

3738
class FormulaState(State):
@@ -53,7 +54,7 @@ class FormulaActor(Actor):
5354
Abstract actor class used to implement formula actor that compute power consumption of a device from Reports
5455
"""
5556

56-
def __init__(self, name, pushers: dict[str, PusherActor], level_logger=logging.WARNING, timeout=None):
57+
def __init__(self, name, pushers: dict[type[Report], PusherActor], level_logger=logging.WARNING, timeout=None):
5758
"""
5859
Initialize a new Formula actor.
5960
:param name: Actor name
@@ -86,5 +87,6 @@ def setup(self):
8687
"""
8788
Setup the Formula actor.
8889
"""
89-
for _, pusher in self.state.pushers.items():
90-
pusher.connect_data()
90+
for pushers in self.state.pushers.values():
91+
for pusher in pushers:
92+
pusher.connect_data()

src/powerapi/formula/handlers.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,5 +35,6 @@ class FormulaPoisonPillMessageHandler(PoisonPillMessageHandler):
3535
Default Handler for dealing with PoisonPillMessage
3636
"""
3737
def teardown(self, soft=False):
38-
for _, pusher in self.state.pushers.items():
39-
pusher.socket_interface.close()
38+
for pushers in self.state.pushers.values():
39+
for pusher in pushers:
40+
pusher.socket_interface.close()

tests/unit/dispatcher/test_dispatcher_actor.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,7 @@ def actor(request, dispatch_rules, started_fake_pusher_power_report):
290290
def formula_factory(name, pushers):
291291
return DummyFormulaActor(name, pushers, 0, 0)
292292

293-
reports_pusher = {PUSHER_NAME_POWER_REPORT: started_fake_pusher_power_report}
293+
reports_pusher = {Report: [started_fake_pusher_power_report]}
294294
name = f'{request.node.name}_dispatcher'
295295
actor = DispatcherActor(name, formula_factory, reports_pusher, route_table)
296296

tests/utils/formula/dummy/dummy_handlers.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,10 @@ def handle(self, msg):
5858
:param powerapi.Report msg: Received message
5959
"""
6060
results = self._estimate(msg)
61-
for _, actor_pusher in self.state.pushers.items():
62-
for result in results:
63-
actor_pusher.send_data(result)
61+
62+
# Send the reports to every available pusher because a lot of unit tests don't set up their test actor correctly.
63+
# FIXME: Reports should only be sent to theirs corresponding pusher(s)
64+
for pushers in self.state.pushers.values():
65+
for pusher in pushers:
66+
for result in results:
67+
pusher.send_data(result)

0 commit comments

Comments
 (0)