You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@ozone.apache.org by "Chu Cheng Li (Jira)" <ji...@apache.org> on 2026/10/06 05:27:00 UTC
[jira] [Assigned] (HDDS-16632) SCM loses a datanode's container list when the datanode re-registers with a new address, ports or version
[ https://issues.apache.org/jira/browse/HDDS-16632?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Chu Cheng Li reassigned HDDS-16632:
-----------------------------------
Assignee: Chu Cheng Li
> SCM loses a datanode's container list when the datanode re-registers with a new address, ports or version
> ---------------------------------------------------------------------------------------------------------
>
> Key: HDDS-16632
> URL: https://issues.apache.org/jira/browse/HDDS-16632
> Project: Apache Ozone
> Issue Type: Bug
> Components: SCM
> Reporter: Chu Cheng Li
> Assignee: Chu Cheng Li
> Priority: Major
>
> When a registered datanode registers again with a new IP address, hostname, ports or version, {{SCMNodeManager#register}} calls {{NodeStateManager#updateNode}}. {{NodeStateMap#updateNode}} then replaces the node's {{DatanodeEntry}} with a new one, which starts with an empty container list. A rolling upgrade changes the version of every datanode, so each restart during the upgrade takes this path, and so does any restart that changes a datanode's IP address.
> SCM uses this list to find replicas that disappeared from a datanode:
> * {{ContainerReportHandler}} compares each full container report with {{nodeManager.getContainers(dn)}}, and removes the replicas of containers that are in the list but not in the report.
> * {{DeadNodeHandler#removeContainerReplicas}} removes a dead datanode's replicas using the same list.
> So if a datanode loses a replica while it is down, for example on a failed disk, and then registers again with one of these changes, SCM never removes that replica. The report sent with the registration no longer includes it, and neither does the emptied list. SCM keeps counting the replica, so {{ReplicationManager}} does not treat the container as under-replicated. The replica is not removed when the datanode goes DEAD either.
> {{DatanodeAdminMonitorImpl#checkContainersReplicatedOnNode}} reads the same list. Until the container report sent with the registration has been processed, a datanode that is decommissioning or entering maintenance looks like it has no containers to wait for. This part was found by reading the code and has not been reproduced.
> A unit test with the real {{SCMNodeManager}} and {{ContainerReportHandler}} reproduces it:
> # Register a datanode and process a full container report from it with a CLOSED container that also has replicas on two other datanodes.
> # Register the datanode again with a different Ratis port.
> # Process full container reports from it that no longer include the container.
> SCM still lists 3 replicas, also after the datanode goes DEAD and {{DeadNodeHandler}} runs. Without the port change, the same reports bring it down to 2.
> Found while working on HDDS-16630.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)
---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscribe@ozone.apache.org
For additional commands, e-mail: issues-help@ozone.apache.org