This is an automated email from the ASF dual-hosted git repository.
szetszwo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone.git
The following commit(s) were added to refs/heads/master by this push:
new de73c00a8d HDDS-12738. Refactor AbstractContainerReportHandler and its
subclasses. (#8207)
de73c00a8d is described below
commit de73c00a8d4526ec5ddf7609327ea9646ad84ffb
Author: Tsz-Wo Nicholas Sze <[email protected]>
AuthorDate: Wed Apr 2 13:54:00 2025 -0700
HDDS-12738. Refactor AbstractContainerReportHandler and its subclasses.
(#8207)
---
.../container/AbstractContainerReportHandler.java | 31 ++++------
.../hdds/scm/container/ContainerReportHandler.java | 68 +++++++++++-----------
.../IncrementalContainerReportHandler.java | 44 ++++++--------
.../scm/container/TestUnknownContainerReport.java | 2 +-
.../recon/scm/ReconContainerReportHandler.java | 8 +++
.../ReconIncrementalContainerReportHandler.java | 5 ++
6 files changed, 76 insertions(+), 82 deletions(-)
diff --git
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/AbstractContainerReportHandler.java
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/AbstractContainerReportHandler.java
index 17029a915e..e3c903da2d 100644
---
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/AbstractContainerReportHandler.java
+++
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/AbstractContainerReportHandler.java
@@ -33,6 +33,7 @@
import
org.apache.hadoop.hdds.protocol.proto.StorageContainerDatanodeProtocolProtos.ContainerReplicaProto.State;
import org.apache.hadoop.hdds.scm.events.SCMEvents;
import org.apache.hadoop.hdds.scm.ha.SCMContext;
+import org.apache.hadoop.hdds.scm.node.NodeManager;
import org.apache.hadoop.hdds.server.events.EventPublisher;
import
org.apache.hadoop.ozone.common.statemachine.InvalidStateTransitionException;
import org.apache.hadoop.ozone.protocol.commands.CommandForDatanode;
@@ -46,30 +47,18 @@
/**
* Base class for all the container report handlers.
*/
-public class AbstractContainerReportHandler {
-
+abstract class AbstractContainerReportHandler {
+ private final NodeManager nodeManager;
private final ContainerManager containerManager;
private final SCMContext scmContext;
- private final Logger logger;
- /**
- * Constructs AbstractContainerReportHandler instance with the
- * given ContainerManager instance.
- *
- * @param containerManager ContainerManager
- * @param logger Logger to be used for logging
- */
- AbstractContainerReportHandler(final ContainerManager containerManager,
- final SCMContext scmContext,
- final Logger logger) {
+ AbstractContainerReportHandler(NodeManager nodeManager, ContainerManager
containerManager, SCMContext scmContext) {
+ this.nodeManager = Objects.requireNonNull(nodeManager, "nodeManager ==
null");
this.containerManager = Objects.requireNonNull(containerManager,
"containerManager == null");
this.scmContext = Objects.requireNonNull(scmContext, "scmContext == null");
- this.logger = Objects.requireNonNull(logger, "logger == null");
}
- protected Logger getLogger() {
- return logger;
- }
+ protected abstract Logger getLogger();
/** @return the container in SCM and the replica from a datanode details for
logging. */
static Object getDetailsForLogging(ContainerInfo container,
ContainerReplicaProto replica, DatanodeDetails datanode) {
@@ -414,10 +403,10 @@ private boolean isHealthy(final State replicaState) {
&& replicaState != State.DELETED;
}
- /**
- * Return ContainerManager.
- * @return {@link ContainerManager}
- */
+ protected NodeManager getNodeManager() {
+ return nodeManager;
+ }
+
protected ContainerManager getContainerManager() {
return containerManager;
}
diff --git
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerReportHandler.java
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerReportHandler.java
index 4e41f962e2..288c479ba2 100644
---
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerReportHandler.java
+++
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerReportHandler.java
@@ -47,16 +47,15 @@ public class ContainerReportHandler extends
AbstractContainerReportHandler
private static final Logger LOG =
LoggerFactory.getLogger(ContainerReportHandler.class);
- private final NodeManager nodeManager;
- private final ContainerManager containerManager;
- private final String unknownContainerHandleAction;
+ enum UnknownContainerAction {
+ WARN, DELETE;
- /**
- * The action taken by ContainerReportHandler to handle
- * unknown containers.
- */
- static final String UNKNOWN_CONTAINER_ACTION_WARN = "WARN";
- static final String UNKNOWN_CONTAINER_ACTION_DELETE = "DELETE";
+ static UnknownContainerAction parse(String s) {
+ return s.equals(DELETE.name()) ? DELETE : WARN;
+ }
+ }
+
+ private final UnknownContainerAction unknownContainerHandleAction;
/**
* Constructs ContainerReportHandler instance with the
@@ -70,18 +69,21 @@ public ContainerReportHandler(final NodeManager nodeManager,
final ContainerManager containerManager,
final SCMContext scmContext,
OzoneConfiguration conf) {
- super(containerManager, scmContext, LOG);
- this.nodeManager = nodeManager;
- this.containerManager = containerManager;
+ super(nodeManager, containerManager, scmContext);
if (conf != null) {
ScmConfig scmConfig = conf.getObject(ScmConfig.class);
- unknownContainerHandleAction = scmConfig.getUnknownContainerAction();
+ unknownContainerHandleAction =
UnknownContainerAction.parse(scmConfig.getUnknownContainerAction());
} else {
- unknownContainerHandleAction = UNKNOWN_CONTAINER_ACTION_WARN;
+ unknownContainerHandleAction = UnknownContainerAction.WARN;
}
}
+ @Override
+ protected Logger getLogger() {
+ return LOG;
+ }
+
public ContainerReportHandler(final NodeManager nodeManager,
final ContainerManager containerManager) {
this(nodeManager, containerManager, SCMContext.emptyContext(), null);
@@ -142,10 +144,9 @@ public void onMessage(final ContainerReportFromDatanode
reportFromDatanode,
final DatanodeDetails dnFromReport =
reportFromDatanode.getDatanodeDetails();
- final DatanodeDetails datanodeDetails =
nodeManager.getNode(dnFromReport.getID());
+ final DatanodeDetails datanodeDetails =
getNodeManager().getNode(dnFromReport.getID());
if (datanodeDetails == null) {
- LOG.warn("Received container report from unknown datanode {}",
- dnFromReport);
+ getLogger().warn("Datanode not found: {}", dnFromReport);
return;
}
final ContainerReportsProto containerReport =
@@ -159,7 +160,7 @@ public void onMessage(final ContainerReportFromDatanode
reportFromDatanode,
final List<ContainerReplicaProto> replicas =
containerReport.getReportsList();
final Set<ContainerID> expectedContainersInDatanode =
- nodeManager.getContainers(datanodeDetails);
+ getNodeManager().getContainers(datanodeDetails);
for (ContainerReplicaProto replica : replicas) {
ContainerID cid = ContainerID.valueOf(replica.getContainerID());
@@ -169,7 +170,7 @@ public void onMessage(final ContainerReportFromDatanode
reportFromDatanode,
// from protobuf. However we don't want to store that object if
// there is already an instance for the same ContainerID we can
// reuse.
- container = containerManager.getContainer(cid);
+ container = getContainerManager().getContainer(cid);
cid = container.containerID();
} catch (ContainerNotFoundException e) {
// Ignore this for now. It will be handled later with a null check
@@ -181,7 +182,7 @@ public void onMessage(final ContainerReportFromDatanode
reportFromDatanode,
boolean alreadyInDn = expectedContainersInDatanode.remove(cid);
if (!alreadyInDn) {
// This is a new Container not in the nodeManager -> dn map yet
- nodeManager.addContainer(datanodeDetails, cid);
+ getNodeManager().addContainer(datanodeDetails, cid);
}
if (container == null || ContainerReportValidator
.validate(container, datanodeDetails, replica)) {
@@ -193,7 +194,7 @@ public void onMessage(final ContainerReportFromDatanode
reportFromDatanode,
// report, so it is now missing on the DN. We need to remove it from
the
// list
processMissingReplicas(datanodeDetails, expectedContainersInDatanode);
- containerManager.notifyContainerReportProcessing(true, true);
+ getContainerManager().notifyContainerReportProcessing(true, true);
if (reportFromDatanode.isRegister()) {
publisher.fireEvent(SCMEvents.CONTAINER_REGISTRATION_REPORT,
new
SCMDatanodeProtocolServer.NodeRegistrationContainerReport(datanodeDetails,
@@ -201,9 +202,8 @@ public void onMessage(final ContainerReportFromDatanode
reportFromDatanode,
}
}
} catch (NodeNotFoundException ex) {
- containerManager.notifyContainerReportProcessing(true, false);
- LOG.error("Received container report from unknown datanode {}.",
- datanodeDetails, ex);
+ getContainerManager().notifyContainerReportProcessing(true, false);
+ getLogger().warn("Datanode not found: {}", datanodeDetails, ex);
}
}
@@ -224,11 +224,9 @@ private void processSingleReplica(final DatanodeDetails
datanodeDetails,
final EventPublisher publisher) {
final Object detailsForLogging = getDetailsForLogging(container,
replicaProto, datanodeDetails);
if (container == null) {
- if (unknownContainerHandleAction.equals(
- UNKNOWN_CONTAINER_ACTION_WARN)) {
+ if (unknownContainerHandleAction == UnknownContainerAction.WARN) {
getLogger().error("CONTAINER_NOT_FOUND for {}", detailsForLogging);
- } else if (unknownContainerHandleAction.equals(
- UNKNOWN_CONTAINER_ACTION_DELETE)) {
+ } else if (unknownContainerHandleAction ==
UnknownContainerAction.DELETE) {
final ContainerID containerId = ContainerID
.valueOf(replicaProto.getContainerID());
deleteReplica(containerId, datanodeDetails, publisher,
"CONTAINER_NOT_FOUND", true, detailsForLogging);
@@ -253,26 +251,26 @@ private void processMissingReplicas(final DatanodeDetails
datanodeDetails,
final Set<ContainerID> missingReplicas) {
for (ContainerID id : missingReplicas) {
try {
- nodeManager.removeContainer(datanodeDetails, id);
+ getNodeManager().removeContainer(datanodeDetails, id);
} catch (NodeNotFoundException e) {
- LOG.warn("Failed to remove container {} from a node which does not " +
- "exist {}", id, datanodeDetails, e);
+ getLogger().warn("Failed to remove missing container {}: datanode {}
not found",
+ id, datanodeDetails, e);
}
try {
- containerManager.getContainerReplicas(id).stream()
+ getContainerManager().getContainerReplicas(id).stream()
.filter(replica -> replica.getDatanodeDetails()
.equals(datanodeDetails)).findFirst()
.ifPresent(replica -> {
try {
- containerManager.removeContainerReplica(id, replica);
+ getContainerManager().removeContainerReplica(id, replica);
} catch (ContainerNotFoundException |
ContainerReplicaNotFoundException ignored) {
// This should not happen, but even if it happens, not an issue
}
});
} catch (ContainerNotFoundException e) {
- LOG.warn("Cannot remove container replica, container {} not found.",
- id, e);
+ getLogger().warn("Failed to remove container replica: container {} not
found in datanode {}",
+ id, datanodeDetails, e);
}
}
}
diff --git
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/IncrementalContainerReportHandler.java
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/IncrementalContainerReportHandler.java
index a1bd9010f8..72722153b9 100644
---
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/IncrementalContainerReportHandler.java
+++
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/IncrementalContainerReportHandler.java
@@ -20,6 +20,7 @@
import java.io.IOException;
import org.apache.hadoop.hdds.protocol.DatanodeDetails;
import
org.apache.hadoop.hdds.protocol.proto.StorageContainerDatanodeProtocolProtos.ContainerReplicaProto;
+import
org.apache.hadoop.hdds.protocol.proto.StorageContainerDatanodeProtocolProtos.ContainerReplicaProto.State;
import org.apache.hadoop.hdds.scm.container.report.ContainerReportValidator;
import org.apache.hadoop.hdds.scm.exceptions.SCMException;
import org.apache.hadoop.hdds.scm.ha.SCMContext;
@@ -42,27 +43,26 @@ public class IncrementalContainerReportHandler extends
private static final Logger LOG = LoggerFactory.getLogger(
IncrementalContainerReportHandler.class);
- private final NodeManager nodeManager;
-
public IncrementalContainerReportHandler(
final NodeManager nodeManager,
final ContainerManager containerManager,
final SCMContext scmContext) {
- super(containerManager, scmContext, LOG);
- this.nodeManager = nodeManager;
+ super(nodeManager, containerManager, scmContext);
+ }
+
+ @Override
+ protected Logger getLogger() {
+ return LOG;
}
@Override
public void onMessage(final IncrementalContainerReportFromDatanode report,
final EventPublisher publisher) {
final DatanodeDetails dnFromReport = report.getDatanodeDetails();
- if (LOG.isDebugEnabled()) {
- LOG.debug("Processing incremental container report from data node {}",
dnFromReport);
- }
- final DatanodeDetails dd = nodeManager.getNode(dnFromReport.getID());
+ getLogger().debug("Processing incremental container report from datanode
{}", dnFromReport);
+ final DatanodeDetails dd = getNodeManager().getNode(dnFromReport.getID());
if (dd == null) {
- LOG.warn("Received container report from unknown datanode {}",
- dnFromReport);
+ getLogger().warn("Datanode not found: {}", dnFromReport);
return;
}
@@ -82,11 +82,10 @@ public void onMessage(final
IncrementalContainerReportFromDatanode report,
// Ensure we reuse the same ContainerID instance in containerInfo
id = container.containerID();
} finally {
- if (replicaProto.getState().equals(
- ContainerReplicaProto.State.DELETED)) {
- nodeManager.removeContainer(dd, id);
+ if (replicaProto.getState() == State.DELETED) {
+ getNodeManager().removeContainer(dd, id);
} else {
- nodeManager.addContainer(dd, id);
+ getNodeManager().addContainer(dd, id);
}
}
if (ContainerReportValidator.validate(container, dd, replicaProto)) {
@@ -94,23 +93,22 @@ public void onMessage(final
IncrementalContainerReportFromDatanode report,
}
success = true;
} catch (ContainerNotFoundException e) {
- LOG.warn("Container {} not found!", replicaProto.getContainerID());
+ getLogger().warn("Container {} not found!",
replicaProto.getContainerID());
} catch (NodeNotFoundException ex) {
- LOG.error("Received ICR from unknown datanode {}",
- report.getDatanodeDetails(), ex);
+ getLogger().error("Datanode not found {}",
report.getDatanodeDetails(), ex);
} catch (ContainerReplicaNotFoundException e) {
- LOG.warn("Container {} replica not found!",
+ getLogger().warn("Container {} replica not found!",
replicaProto.getContainerID());
} catch (SCMException ex) {
if (ex.getResult() == SCMException.ResultCodes.SCM_NOT_LEADER) {
- LOG.info("Failed to process {} container {}: {}",
+ getLogger().info("Failed to process {} container {}: {}",
replicaProto.getState(), id, ex.getMessage());
} else {
- LOG.error("Exception while processing ICR for container {}",
+ getLogger().error("Exception while processing ICR for container
{}",
replicaProto.getContainerID(), ex);
}
} catch (IOException | InvalidStateTransitionException e) {
- LOG.error("Exception while processing ICR for container {}",
+ getLogger().error("Exception while processing ICR for container {}",
replicaProto.getContainerID(), e);
}
}
@@ -118,8 +116,4 @@ public void onMessage(final
IncrementalContainerReportFromDatanode report,
getContainerManager().notifyContainerReportProcessing(false, success);
}
-
- protected NodeManager getNodeManager() {
- return this.nodeManager;
- }
}
diff --git
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestUnknownContainerReport.java
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestUnknownContainerReport.java
index bfb08322a8..369d1142ea 100644
---
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestUnknownContainerReport.java
+++
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestUnknownContainerReport.java
@@ -115,7 +115,7 @@ public void testUnknownContainerDeleted() {
OzoneConfiguration conf = new OzoneConfiguration();
conf.set(
ScmConfig.HDDS_SCM_UNKNOWN_CONTAINER_ACTION,
- ContainerReportHandler.UNKNOWN_CONTAINER_ACTION_DELETE);
+ ContainerReportHandler.UnknownContainerAction.DELETE.name());
sendContainerReport(conf);
verify(publisher, times(1)).fireEvent(
diff --git
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/scm/ReconContainerReportHandler.java
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/scm/ReconContainerReportHandler.java
index adbe00b8fb..6b0f5f86b0 100644
---
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/scm/ReconContainerReportHandler.java
+++
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/scm/ReconContainerReportHandler.java
@@ -24,17 +24,25 @@
import org.apache.hadoop.hdds.scm.node.NodeManager;
import
org.apache.hadoop.hdds.scm.server.SCMDatanodeHeartbeatDispatcher.ContainerReportFromDatanode;
import org.apache.hadoop.hdds.server.events.EventPublisher;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
* Recon's container report handler.
*/
public class ReconContainerReportHandler extends ContainerReportHandler {
+ private static final Logger LOG =
LoggerFactory.getLogger(ReconContainerReportHandler.class);
public ReconContainerReportHandler(NodeManager nodeManager,
ContainerManager containerManager) {
super(nodeManager, containerManager);
}
+ @Override
+ protected Logger getLogger() {
+ return LOG;
+ }
+
@Override
public void onMessage(final ContainerReportFromDatanode reportFromDatanode,
final EventPublisher publisher) {
diff --git
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/scm/ReconIncrementalContainerReportHandler.java
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/scm/ReconIncrementalContainerReportHandler.java
index 3d3160c80a..c6f10c9b5b 100644
---
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/scm/ReconIncrementalContainerReportHandler.java
+++
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/scm/ReconIncrementalContainerReportHandler.java
@@ -47,6 +47,11 @@ public ReconIncrementalContainerReportHandler(NodeManager
nodeManager,
super(nodeManager, containerManager, scmContext);
}
+ @Override
+ protected Logger getLogger() {
+ return LOG;
+ }
+
@Override
public void onMessage(final IncrementalContainerReportFromDatanode report,
final EventPublisher publisher) {
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]