devmadhuu commented on code in PR #10074:
URL: https://github.com/apache/ozone/pull/10074#discussion_r3258089684
##########
hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/scm/ReconContainerManager.java:
##########
@@ -179,33 +185,157 @@ public void checkAndAddNewContainerBatch(
}
/**
- * Check if container state is not open. In SCM, container state
- * changes to CLOSING first, and then the close command is pushed down
- * to Datanodes. Recon 'learns' this from DN, and hence replica state
- * will move container state to 'CLOSING'.
+ * Transitions a container from OPEN to CLOSING, keeping the per-pipeline
+ * open-container count in {@link #pipelineToOpenContainer} accurate.
*
- * @param containerID containerID to check
- * @param state state to be compared
+ * <p>Must be called whenever an OPEN container is moved to CLOSING so that
+ * the pipeline's open-container count stays consistent. Both the DN-report
+ * driven path ({@link #checkContainerStateAndUpdate}) and the periodic sync
+ * passes ({@code processSyncedClosedContainer}, {@code
syncQuasiClosedContainers})
+ * use this method to avoid divergence in the count exposed to the Recon
Node API.
+ *
+ * <p>If the container was recorded without a pipeline (null pipeline at
+ * {@code addNewContainer} time) the count decrement is safely skipped.
+ *
+ * @param containerID container to advance from OPEN to CLOSING
+ * @param containerInfo already-fetched {@code ContainerInfo} for the
container
+ * (avoids a redundant lookup inside this method)
+ * @throws IOException if the state update fails
+ * @throws InvalidStateTransitionException if the container is not in OPEN
state
*/
-
- private void checkContainerStateAndUpdate(ContainerID containerID,
- ContainerReplicaProto.State state)
- throws IOException, InvalidStateTransitionException {
- ContainerInfo containerInfo = getContainer(containerID);
- if (containerInfo.getState().equals(HddsProtos.LifeCycleState.OPEN)
- && !state.equals(ContainerReplicaProto.State.OPEN)
- && isHealthy(state)) {
- LOG.info("Container {} has state OPEN, but given state is {}.",
- containerID, state);
- final PipelineID pipelineID = containerInfo.getPipelineID();
- // subtract open container count from the map
+ void transitionOpenToClosing(ContainerID containerID, ContainerInfo
containerInfo)
+ throws IOException, InvalidStateTransitionException {
+ PipelineID pipelineID = containerInfo.getPipelineID();
+ if (pipelineID != null) {
int curCnt = pipelineToOpenContainer.getOrDefault(pipelineID, 0);
if (curCnt == 1) {
pipelineToOpenContainer.remove(pipelineID);
} else if (curCnt > 0) {
pipelineToOpenContainer.put(pipelineID, curCnt - 1);
}
- updateContainerState(containerID, FINALIZE);
+ }
+ updateContainerState(containerID, FINALIZE); // OPEN → CLOSING
Review Comment:
It is using SCM code only. UpdateContainerState call is from SCM code , not
recon code.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]