Skip to content

Commit 396a2ea

Browse files
committed
fix: add request registration for early failures in device instructions handling
1 parent 16ecccd commit 396a2ea

2 files changed

Lines changed: 28 additions & 4 deletions

File tree

bec_server/bec_server/device_server/device_server.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -506,6 +506,18 @@ def _get_metadata_for_alarm(
506506
metadata["scan_number"] = msg.scan_number
507507
return metadata
508508

509+
def _ensure_request_registered(
510+
self, instruction: messages.DeviceInstructionMessage | None
511+
) -> None:
512+
"""Register a placeholder request so early failures can still resolve."""
513+
if instruction is None:
514+
return
515+
instr_id = instruction.metadata.get("device_instr_id")
516+
if instr_id is None:
517+
return
518+
if self.requests_handler.get_request(instr_id) is None:
519+
self.requests_handler.add_request(instruction, num_status_objects=0)
520+
509521
def handle_device_instructions(self, msg: messages.DeviceInstructionMessage) -> None:
510522
"""Parse a device instruction message and handle the requested action. Action
511523
types are set, read, rpc, kickoff or trigger.
@@ -555,6 +567,7 @@ def handle_device_instructions(self, msg: messages.DeviceInstructionMessage) ->
555567
exception_type=limit_error.__class__.__name__,
556568
device=self.get_device_from_exception(limit_error),
557569
)
570+
self._ensure_request_registered(instructions)
558571
self.requests_handler.set_finished(
559572
instructions.metadata["device_instr_id"], success=False, error_info=error_info
560573
)
@@ -569,8 +582,9 @@ def handle_device_instructions(self, msg: messages.DeviceInstructionMessage) ->
569582
exception_type=exc.__class__.__name__,
570583
device=self.get_device_from_exception(exc),
571584
)
585+
self._ensure_request_registered(instructions)
572586
if action == "rpc":
573-
self.rpc_handler._send_rpc_exception(exc, instructions)
587+
self.rpc_handler.send_rpc_exception(exc, instructions)
574588
else:
575589
logger.error(content)
576590
self.requests_handler.set_finished(

bec_server/tests/tests_device_server/test_device_server.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -390,10 +390,20 @@ def test_handle_device_instruction_disabled_device(device_server_mock, instructi
390390
"""
391391
device_server = device_server_mock
392392
with mock.patch.object(device_server, "assert_device_is_enabled", side_effect=RuntimeError):
393-
with mock.patch.object(device_server.requests_handler, "set_finished") as set_finished_mock:
393+
with mock.patch.object(device_server.connector, "send") as send_mock:
394394
device_server.handle_device_instructions(instructions)
395-
set_finished_mock.assert_called_once_with(
396-
instructions.metadata["device_instr_id"], success=False, error_info=ANY
395+
assert send_mock.call_count == 2
396+
pending_msg = send_mock.call_args_list[0].args[1]
397+
error_msg = send_mock.call_args_list[1].args[1]
398+
399+
assert pending_msg.instruction_id == instructions.metadata["device_instr_id"]
400+
assert pending_msg.status == "running"
401+
assert error_msg.instruction_id == instructions.metadata["device_instr_id"]
402+
assert error_msg.status == "error"
403+
assert error_msg.error_info is not None
404+
assert (
405+
device_server.requests_handler.get_request(instructions.metadata["device_instr_id"])
406+
is None
397407
)
398408

399409

0 commit comments

Comments
 (0)