diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/SCMNodeManager.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/SCMNodeManager.java index d3559a7d9747..3790214f5268 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/SCMNodeManager.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/SCMNodeManager.java @@ -691,6 +691,11 @@ public void processLayoutVersionReport(DatanodeDetails datanodeDetails, return; } + sendFinalizeToDatanodeIfNeeded(datanodeDetails, layoutVersionReport); + } + + protected void sendFinalizeToDatanodeIfNeeded(DatanodeDetails datanodeDetails, + LayoutVersionProto layoutVersionReport) { // Software layout version is hardcoded to the SCM. int scmSlv = scmLayoutVersionManager.getSoftwareLayoutVersion(); int dnSlv = layoutVersionReport.getSoftwareLayoutVersion(); diff --git a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/scm/ReconNodeManager.java b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/scm/ReconNodeManager.java index ec86db678fa5..65a9530c5cac 100644 --- a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/scm/ReconNodeManager.java +++ b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/scm/ReconNodeManager.java @@ -377,4 +377,33 @@ public ReconContext getReconContext() { return reconContext; } + @Override + protected void sendFinalizeToDatanodeIfNeeded(DatanodeDetails datanodeDetails, + LayoutVersionProto layoutVersionReport) { + // Recon should do nothing here. + int scmSlv = getLayoutVersionManager().getSoftwareLayoutVersion(); + int scmMlv = getLayoutVersionManager().getMetadataLayoutVersion(); + int dnSlv = layoutVersionReport.getSoftwareLayoutVersion(); + int dnMlv = layoutVersionReport.getMetadataLayoutVersion(); + + if (dnSlv > scmSlv) { + LOG.error("Invalid data node reporting to Recon : {}. " + + "DataNode SoftwareLayoutVersion = {}, Recon/SCM " + + "SoftwareLayoutVersion = {}", + datanodeDetails.getHostName(), dnSlv, scmSlv); + } + + if (scmMlv == scmSlv) { + // Recon metadata is finalised. + if (dnMlv < scmMlv) { + if (LOG.isDebugEnabled()) { + LOG.debug("Data node {} reports a lower MLV than Recon " + + "DataNode MetadataLayoutVersion = {}, Recon/SCM " + + "MetadataLayoutVersion = {}. SCM needs to finalize this DN", + datanodeDetails.getHostName(), dnMlv, scmMlv); + } + } + } + + } }