Skip to content

Commit d5b7828

Browse files
committed
fix: actor waits for beamline state to become available
1 parent 3ca7c8d commit d5b7828

2 files changed

Lines changed: 15 additions & 2 deletions

File tree

bec_lib/bec_lib/bl_state_manager.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,11 +114,18 @@ def __init__(self, client: BECClient) -> None:
114114
self._connector.register(
115115
MessageEndpoints.available_beamline_states(), cb=self._on_state_update, from_start=True
116116
)
117+
self._ready = False
118+
119+
@property
120+
def ready(self) -> bool:
121+
"""Returns true after beamline states have been loaded from Redis."""
122+
return self._ready
117123

118124
def _on_state_update(self, msg_dict: dict, **_kwargs) -> None:
119125
# type: ignore ; we know it's an AvailableBeamlineStatesMessage
120126
msg: messages.AvailableBeamlineStatesMessage = msg_dict["data"]
121127
self._update_states(msg.states) # pylint: disable=protected-access
128+
self._ready = True
122129

123130
def _update_state(self, state: BeamlineStateConfig) -> None:
124131
if state.name in self._states:

bec_server/bec_server/actors/actor.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,8 +128,6 @@ def __init__(self, client: BECClient, name: str, exec_id: str):
128128
}
129129
super().__init__(client, name, exec_id)
130130
self.state_cache: dict[str, BlStateStatus] = {}
131-
self._update_cache()
132-
self.evaluate()
133131

134132
def _update_cache(self):
135133
with self.state_table_lock:
@@ -164,6 +162,14 @@ def all_match_action(self, client: BECClient):
164162
def some_mismatch_action(self, client: BECClient):
165163
pass
166164

165+
def run(self):
166+
while not self.client.beamline_states.ready:
167+
logger.warning(f"{self.__class__.__name__} waiting for beamline states to become ready")
168+
time.sleep(0.1)
169+
self._update_cache()
170+
self.evaluate()
171+
return super().run()
172+
167173
def default_monitor_endpoints(self) -> set[EndpointInfo]:
168174
return {MessageEndpoints.beamline_state(state) for state in self.state_table}
169175

0 commit comments

Comments
 (0)