|
@@ -27,19 +27,27 @@ import java.util.stream.Collectors;
|
|
|
|
|
|
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
|
|
|
import org.apache.hadoop.hdds.protocol.DatanodeDetails;
|
|
|
+import org.apache.hadoop.hdds.protocol.proto.StorageContainerDatanodeProtocolProtos.NodeReportProto;
|
|
|
+import org.apache.hadoop.hdds.protocol.proto.StorageContainerDatanodeProtocolProtos.StorageReportProto;
|
|
|
import org.apache.hadoop.hdds.scm.TestUtils;
|
|
|
import org.apache.hadoop.hdds.scm.container.ContainerID;
|
|
|
import org.apache.hadoop.hdds.scm.container.ContainerStateManager;
|
|
|
import org.apache.hadoop.hdds.scm.container.Mapping;
|
|
|
import org.apache.hadoop.hdds.scm.container.common.helpers.ContainerInfo;
|
|
|
+import org.apache.hadoop.hdds.scm.container.placement.metrics.SCMNodeMetric;
|
|
|
import org.apache.hadoop.hdds.scm.container.replication.ReplicationRequest;
|
|
|
import org.apache.hadoop.hdds.scm.events.SCMEvents;
|
|
|
+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.states.Node2ContainerMap;
|
|
|
import org.apache.hadoop.hdds.scm.pipelines.PipelineSelector;
|
|
|
+import org.apache.hadoop.hdds.scm.server.SCMDatanodeHeartbeatDispatcher.NodeReportFromDatanode;
|
|
|
import org.apache.hadoop.hdds.server.events.EventPublisher;
|
|
|
|
|
|
+import org.apache.hadoop.hdds.server.events.EventQueue;
|
|
|
+import org.apache.hadoop.test.GenericTestUtils;
|
|
|
import org.junit.Assert;
|
|
|
+import org.junit.Before;
|
|
|
import org.junit.Test;
|
|
|
import org.mockito.ArgumentCaptor;
|
|
|
import static org.mockito.Matchers.eq;
|
|
@@ -51,6 +59,29 @@ import org.mockito.Mockito;
|
|
|
public class TestDeadNodeHandler {
|
|
|
|
|
|
private List<ReplicationRequest> sentEvents = new ArrayList<>();
|
|
|
+ private SCMNodeManager nodeManager;
|
|
|
+ private Node2ContainerMap node2ContainerMap;
|
|
|
+ private ContainerStateManager containerStateManager;
|
|
|
+ private NodeReportHandler nodeReportHandler;
|
|
|
+ private DeadNodeHandler deadNodeHandler;
|
|
|
+ private EventPublisher publisher;
|
|
|
+ private EventQueue eventQueue;
|
|
|
+
|
|
|
+ @Before
|
|
|
+ public void setup() throws IOException {
|
|
|
+ OzoneConfiguration conf = new OzoneConfiguration();
|
|
|
+ node2ContainerMap = new Node2ContainerMap();
|
|
|
+ containerStateManager = new ContainerStateManager(conf,
|
|
|
+ Mockito.mock(Mapping.class),
|
|
|
+ Mockito.mock(PipelineSelector.class));
|
|
|
+ eventQueue = new EventQueue();
|
|
|
+ nodeManager = new SCMNodeManager(conf, "cluster1", null, eventQueue);
|
|
|
+ deadNodeHandler = new DeadNodeHandler(node2ContainerMap,
|
|
|
+ containerStateManager, nodeManager);
|
|
|
+ eventQueue.addHandler(SCMEvents.DEAD_NODE, deadNodeHandler);
|
|
|
+ publisher = Mockito.mock(EventPublisher.class);
|
|
|
+ nodeReportHandler = new NodeReportHandler(nodeManager);
|
|
|
+ }
|
|
|
|
|
|
@Test
|
|
|
public void testOnMessage() throws IOException {
|
|
@@ -58,13 +89,6 @@ public class TestDeadNodeHandler {
|
|
|
DatanodeDetails datanode1 = TestUtils.randomDatanodeDetails();
|
|
|
DatanodeDetails datanode2 = TestUtils.randomDatanodeDetails();
|
|
|
|
|
|
- Node2ContainerMap node2ContainerMap = new Node2ContainerMap();
|
|
|
- ContainerStateManager containerStateManager = new ContainerStateManager(
|
|
|
- new OzoneConfiguration(),
|
|
|
- Mockito.mock(Mapping.class),
|
|
|
- Mockito.mock(PipelineSelector.class)
|
|
|
- );
|
|
|
-
|
|
|
ContainerInfo container1 =
|
|
|
TestUtils.allocateContainer(containerStateManager);
|
|
|
ContainerInfo container2 =
|
|
@@ -72,9 +96,6 @@ public class TestDeadNodeHandler {
|
|
|
ContainerInfo container3 =
|
|
|
TestUtils.allocateContainer(containerStateManager);
|
|
|
|
|
|
- DeadNodeHandler handler =
|
|
|
- new DeadNodeHandler(node2ContainerMap, containerStateManager);
|
|
|
-
|
|
|
registerReplicas(node2ContainerMap, datanode1, container1, container2);
|
|
|
registerReplicas(node2ContainerMap, datanode2, container1, container3);
|
|
|
|
|
@@ -84,10 +105,8 @@ public class TestDeadNodeHandler {
|
|
|
|
|
|
TestUtils.closeContainer(containerStateManager, container1);
|
|
|
|
|
|
- EventPublisher publisher = Mockito.mock(EventPublisher.class);
|
|
|
-
|
|
|
//WHEN datanode1 is dead
|
|
|
- handler.onMessage(datanode1, publisher);
|
|
|
+ deadNodeHandler.onMessage(datanode1, publisher);
|
|
|
|
|
|
//THEN
|
|
|
//node2ContainerMap has not been changed
|
|
@@ -128,22 +147,76 @@ public class TestDeadNodeHandler {
|
|
|
replicationRequestParameter.getValue().getExpecReplicationCount());
|
|
|
}
|
|
|
|
|
|
- private void registerReplicas(ContainerStateManager containerStateManager,
|
|
|
+ @Test
|
|
|
+ public void testStatisticsUpdate() throws Exception {
|
|
|
+ //GIVEN
|
|
|
+ DatanodeDetails datanode1 = TestUtils.randomDatanodeDetails();
|
|
|
+ DatanodeDetails datanode2 = TestUtils.randomDatanodeDetails();
|
|
|
+ String storagePath1 = GenericTestUtils.getRandomizedTempPath()
|
|
|
+ .concat("/" + datanode1.getUuidString());
|
|
|
+ String storagePath2 = GenericTestUtils.getRandomizedTempPath()
|
|
|
+ .concat("/" + datanode2.getUuidString());
|
|
|
+
|
|
|
+ StorageReportProto storageOne = TestUtils.createStorageReport(
|
|
|
+ datanode1.getUuid(), storagePath1, 100, 10, 90, null);
|
|
|
+ StorageReportProto storageTwo = TestUtils.createStorageReport(
|
|
|
+ datanode2.getUuid(), storagePath2, 200, 20, 180, null);
|
|
|
+ nodeReportHandler.onMessage(getNodeReport(datanode1, storageOne),
|
|
|
+ Mockito.mock(EventPublisher.class));
|
|
|
+ nodeReportHandler.onMessage(getNodeReport(datanode2, storageTwo),
|
|
|
+ Mockito.mock(EventPublisher.class));
|
|
|
+
|
|
|
+ ContainerInfo container1 =
|
|
|
+ TestUtils.allocateContainer(containerStateManager);
|
|
|
+ registerReplicas(node2ContainerMap, datanode1, container1);
|
|
|
+
|
|
|
+ SCMNodeStat stat = nodeManager.getStats();
|
|
|
+ Assert.assertTrue(stat.getCapacity().get() == 300);
|
|
|
+ Assert.assertTrue(stat.getRemaining().get() == 270);
|
|
|
+ Assert.assertTrue(stat.getScmUsed().get() == 30);
|
|
|
+
|
|
|
+ SCMNodeMetric nodeStat = nodeManager.getNodeStat(datanode1);
|
|
|
+ Assert.assertTrue(nodeStat.get().getCapacity().get() == 100);
|
|
|
+ Assert.assertTrue(nodeStat.get().getRemaining().get() == 90);
|
|
|
+ Assert.assertTrue(nodeStat.get().getScmUsed().get() == 10);
|
|
|
+
|
|
|
+ //WHEN datanode1 is dead.
|
|
|
+ eventQueue.fireEvent(SCMEvents.DEAD_NODE, datanode1);
|
|
|
+ Thread.sleep(100);
|
|
|
+
|
|
|
+ //THEN statistics in SCM should changed.
|
|
|
+ stat = nodeManager.getStats();
|
|
|
+ Assert.assertTrue(stat.getCapacity().get() == 200);
|
|
|
+ Assert.assertTrue(stat.getRemaining().get() == 180);
|
|
|
+ Assert.assertTrue(stat.getScmUsed().get() == 20);
|
|
|
+
|
|
|
+ nodeStat = nodeManager.getNodeStat(datanode1);
|
|
|
+ Assert.assertTrue(nodeStat.get().getCapacity().get() == 0);
|
|
|
+ Assert.assertTrue(nodeStat.get().getRemaining().get() == 0);
|
|
|
+ Assert.assertTrue(nodeStat.get().getScmUsed().get() == 0);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void registerReplicas(ContainerStateManager csm,
|
|
|
ContainerInfo container, DatanodeDetails... datanodes) {
|
|
|
- containerStateManager.getContainerStateMap()
|
|
|
+ csm.getContainerStateMap()
|
|
|
.addContainerReplica(new ContainerID(container.getContainerID()),
|
|
|
datanodes);
|
|
|
}
|
|
|
|
|
|
- private void registerReplicas(Node2ContainerMap node2ContainerMap,
|
|
|
+ private void registerReplicas(Node2ContainerMap node2ConMap,
|
|
|
DatanodeDetails datanode,
|
|
|
ContainerInfo... containers)
|
|
|
throws SCMException {
|
|
|
- node2ContainerMap
|
|
|
+ node2ConMap
|
|
|
.insertNewDatanode(datanode.getUuid(),
|
|
|
Arrays.stream(containers)
|
|
|
.map(container -> new ContainerID(container.getContainerID()))
|
|
|
.collect(Collectors.toSet()));
|
|
|
}
|
|
|
|
|
|
-}
|
|
|
+ private NodeReportFromDatanode getNodeReport(DatanodeDetails dn,
|
|
|
+ StorageReportProto... reports) {
|
|
|
+ NodeReportProto nodeReportProto = TestUtils.createNodeReport(reports);
|
|
|
+ return new NodeReportFromDatanode(dn, nodeReportProto);
|
|
|
+ }
|
|
|
+}
|