Skip to content

Commit c466c47

Browse files
authored
Fix some bugs in resolve node function (#474)
1 parent 17020c0 commit c466c47

File tree

1 file changed

+5
-9
lines changed

1 file changed

+5
-9
lines changed

matter_server/server/device_controller.py

+5-9
Original file line numberDiff line numberDiff line change
@@ -366,7 +366,8 @@ async def interview_node(self, node_id: int) -> None:
366366
raise RuntimeError("Device Controller not initialized.")
367367

368368
try:
369-
await self._resolve_node(node_id=node_id)
369+
if not (node := self._nodes.get(node_id)) or not node.available:
370+
await self._resolve_node(node_id=node_id)
370371
async with self._get_node_lock(node_id):
371372
LOGGER.info("Interviewing node: %s", node_id)
372373
read_response: Attribute.AsyncReadTransaction.ReadResponse = (
@@ -455,7 +456,6 @@ async def read_attribute(
455456
if self.chip_controller is None:
456457
raise RuntimeError("Device Controller not initialized.")
457458
node_lock = self._get_node_lock(node_id)
458-
await self._resolve_node(node_id=node_id)
459459
endpoint_id, cluster_id, attribute_id = parse_attribute_path(attribute_path)
460460
async with node_lock:
461461
assert self.server.loop is not None
@@ -616,7 +616,6 @@ async def _subscribe_node(self, node_id: int) -> None:
616616
node_logger = LOGGER.getChild(f"[node {node_id}]")
617617
node_lock = self._get_node_lock(node_id)
618618
node = cast(MatterNodeData, self._nodes[node_id])
619-
await self._resolve_node(node_id=node_id)
620619

621620
# work out all (current) attribute subscriptions
622621
attr_subscriptions: list[Attribute.AttributePath] = []
@@ -973,10 +972,6 @@ async def _resolve_node(
973972
self, node_id: int, retries: int = 2, attempt: int = 1
974973
) -> DeviceProxyWrapper:
975974
"""Resolve a Node on the network."""
976-
if (node := self._nodes.get(node_id)) and node.available:
977-
# no need to resolve, the node is already available/connected
978-
return
979-
980975
log_level = logging.DEBUG if attempt == 1 else logging.INFO
981976
if self.chip_controller is None:
982977
raise RuntimeError("Device Controller not initialized.")
@@ -1001,10 +996,11 @@ async def _resolve_node(
1001996
if attempt >= retries:
1002997
# when we're out of retries, raise NodeNotResolving
1003998
raise NodeNotResolving(f"Unable to resolve Node {node_id}") from err
1004-
await self._resolve_node(
999+
await asyncio.sleep(2 + attempt)
1000+
# retry the resolve
1001+
return await self._resolve_node(
10051002
node_id=node_id, retries=retries, attempt=attempt + 1
10061003
)
1007-
await asyncio.sleep(2 + attempt)
10081004

10091005
def _handle_endpoints_removed(self, node_id: int, endpoints: Iterable[int]) -> None:
10101006
"""Handle callback for when bridge endpoint(s) get deleted."""

0 commit comments

Comments
 (0)