|
@@ -19,9 +19,14 @@ package org.apache.hadoop.hdds.scm.container;
|
|
|
import org.apache.hadoop.hdds.protocol.proto
|
|
|
.StorageContainerDatanodeProtocolProtos.PipelineReportsProto;
|
|
|
import org.apache.hadoop.hdds.scm.TestUtils;
|
|
|
+import org.apache.hadoop.hdds.scm.container.common.helpers.Pipeline;
|
|
|
+import org.apache.hadoop.hdds.scm.container.common.helpers.PipelineID;
|
|
|
import org.apache.hadoop.hdds.scm.container.placement.metrics.SCMNodeMetric;
|
|
|
import org.apache.hadoop.hdds.scm.container.placement.metrics.SCMNodeStat;
|
|
|
+import org.apache.hadoop.hdds.scm.exceptions.SCMException;
|
|
|
import org.apache.hadoop.hdds.scm.node.NodeManager;
|
|
|
+import org.apache.hadoop.hdds.scm.node.states.Node2ContainerMap;
|
|
|
+import org.apache.hadoop.hdds.scm.node.states.Node2PipelineMap;
|
|
|
import org.apache.hadoop.hdds.scm.node.states.NodeNotFoundException;
|
|
|
import org.apache.hadoop.hdds.protocol.DatanodeDetails;
|
|
|
import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
|
|
@@ -29,6 +34,7 @@ import org.apache.hadoop.hdds.protocol.proto
|
|
|
.StorageContainerDatanodeProtocolProtos.NodeReportProto;
|
|
|
import org.apache.hadoop.hdds.protocol.proto
|
|
|
.StorageContainerDatanodeProtocolProtos.SCMVersionRequestProto;
|
|
|
+import org.apache.hadoop.hdds.scm.node.states.ReportResult;
|
|
|
import org.apache.hadoop.hdds.server.events.EventPublisher;
|
|
|
import org.apache.hadoop.ozone.OzoneConsts;
|
|
|
import org.apache.hadoop.ozone.protocol.VersionResponse;
|
|
@@ -42,6 +48,7 @@ import java.util.HashMap;
|
|
|
import java.util.LinkedList;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
+import java.util.Set;
|
|
|
import java.util.UUID;
|
|
|
|
|
|
import static org.apache.hadoop.hdds.protocol.proto.HddsProtos.NodeState.DEAD;
|
|
@@ -73,12 +80,16 @@ public class MockNodeManager implements NodeManager {
|
|
|
private final SCMNodeStat aggregateStat;
|
|
|
private boolean chillmode;
|
|
|
private final Map<UUID, List<SCMCommand>> commandMap;
|
|
|
+ private final Node2PipelineMap node2PipelineMap;
|
|
|
+ private final Node2ContainerMap node2ContainerMap;
|
|
|
|
|
|
public MockNodeManager(boolean initializeFakeNodes, int nodeCount) {
|
|
|
this.healthyNodes = new LinkedList<>();
|
|
|
this.staleNodes = new LinkedList<>();
|
|
|
this.deadNodes = new LinkedList<>();
|
|
|
this.nodeMetricMap = new HashMap<>();
|
|
|
+ this.node2PipelineMap = new Node2PipelineMap();
|
|
|
+ this.node2ContainerMap = new Node2ContainerMap();
|
|
|
aggregateStat = new SCMNodeStat();
|
|
|
if (initializeFakeNodes) {
|
|
|
for (int x = 0; x < nodeCount; x++) {
|
|
@@ -289,6 +300,34 @@ public class MockNodeManager implements NodeManager {
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Get set of pipelines a datanode is part of.
|
|
|
+ * @param dnId - datanodeID
|
|
|
+ * @return Set of PipelineID
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public Set<PipelineID> getPipelineByDnID(UUID dnId) {
|
|
|
+ return node2PipelineMap.getPipelines(dnId);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Add pipeline information in the NodeManager.
|
|
|
+ * @param pipeline - Pipeline to be added
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void addPipeline(Pipeline pipeline) {
|
|
|
+ node2PipelineMap.addPipeline(pipeline);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Remove a pipeline information from the NodeManager.
|
|
|
+ * @param pipeline - Pipeline to be removed
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void removePipeline(Pipeline pipeline) {
|
|
|
+ node2PipelineMap.removePipeline(pipeline);
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
public void addDatanodeCommand(UUID dnId, SCMCommand command) {
|
|
|
if(commandMap.containsKey(dnId)) {
|
|
@@ -313,6 +352,54 @@ public class MockNodeManager implements NodeManager {
|
|
|
// do nothing
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Update set of containers available on a datanode.
|
|
|
+ * @param uuid - DatanodeID
|
|
|
+ * @param containerIds - Set of containerIDs
|
|
|
+ * @throws SCMException - if datanode is not known. For new datanode use
|
|
|
+ * addDatanodeInContainerMap call.
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void setContainersForDatanode(UUID uuid, Set<ContainerID> containerIds)
|
|
|
+ throws SCMException {
|
|
|
+ node2ContainerMap.setContainersForDatanode(uuid, containerIds);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Process containerReport received from datanode.
|
|
|
+ * @param uuid - DataonodeID
|
|
|
+ * @param containerIds - Set of containerIDs
|
|
|
+ * @return The result after processing containerReport
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public ReportResult<ContainerID> processContainerReport(UUID uuid,
|
|
|
+ Set<ContainerID> containerIds) {
|
|
|
+ return node2ContainerMap.processReport(uuid, containerIds);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Return set of containerIDs available on a datanode.
|
|
|
+ * @param uuid - DatanodeID
|
|
|
+ * @return - set of containerIDs
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public Set<ContainerID> getContainers(UUID uuid) {
|
|
|
+ return node2ContainerMap.getContainers(uuid);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Insert a new datanode with set of containerIDs for containers available
|
|
|
+ * on it.
|
|
|
+ * @param uuid - DatanodeID
|
|
|
+ * @param containerIDs - Set of ContainerIDs
|
|
|
+ * @throws SCMException - if datanode already exists
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void addDatanodeInContainerMap(UUID uuid,
|
|
|
+ Set<ContainerID> containerIDs) throws SCMException {
|
|
|
+ node2ContainerMap.insertNewDatanode(uuid, containerIDs);
|
|
|
+ }
|
|
|
+
|
|
|
// Returns the number of commands that is queued to this node manager.
|
|
|
public int getCommandCount(DatanodeDetails dd) {
|
|
|
List<SCMCommand> list = commandMap.get(dd.getUuid());
|