sodonnel commented on code in PR #3990:
URL: https://github.com/apache/ozone/pull/3990#discussion_r1029885962


##########
hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestReplicationManager.java:
##########
@@ -341,6 +352,168 @@ public void testUnderReplicationQueuePopulated() {
     Assert.assertNull(res);
   }
 
+  @Test
+  public void testSendDatanodeDeleteCommand() throws NotLeaderException {
+    ECReplicationConfig ecRepConfig = new ECReplicationConfig(3, 2);
+    ContainerInfo containerInfo =
+        ReplicationTestUtil.createContainerInfo(ecRepConfig, 1,
+        HddsProtos.LifeCycleState.CLOSED, 10, 20);
+    DatanodeDetails target = MockDatanodeDetails.randomDatanodeDetails();
+
+    DeleteContainerCommand deleteContainerCommand = new DeleteContainerCommand(
+        containerInfo.getContainerID());
+    deleteContainerCommand.setReplicaIndex(1);
+
+    replicationManager.sendDatanodeCommand(deleteContainerCommand,
+        containerInfo, target);
+
+    List<ContainerReplicaOp> ops = containerReplicaPendingOps.getPendingOps(
+        containerInfo.containerID());
+    Mockito.verify(eventPublisher).fireEvent(any(), any());
+    Assertions.assertEquals(1, ops.size());
+    Assertions.assertEquals(ContainerReplicaOp.PendingOpType.DELETE,
+        ops.get(0).getOpType());
+    Assertions.assertEquals(target, ops.get(0).getTarget());
+    Assertions.assertEquals(1, ops.get(0).getReplicaIndex());
+    Assertions.assertEquals(1, replicationManager.getMetrics()
+            .getEcDeletionCmdsSentTotal());
+    Assertions.assertEquals(0, replicationManager.getMetrics()
+        .getNumDeletionCmdsSent());
+
+    // Repeat with Ratis container, as different metrics should be incremented
+    Mockito.clearInvocations(eventPublisher);
+    RatisReplicationConfig ratisRepConfig =
+        RatisReplicationConfig.getInstance(THREE);
+    containerInfo = ReplicationTestUtil.createContainerInfo(ratisRepConfig, 2,
+            HddsProtos.LifeCycleState.CLOSED, 10, 20);
+
+    deleteContainerCommand = new DeleteContainerCommand(
+        containerInfo.getContainerID());
+    replicationManager.sendDatanodeCommand(deleteContainerCommand,
+        containerInfo, target);
+
+    ops = 
containerReplicaPendingOps.getPendingOps(containerInfo.containerID());
+    Mockito.verify(eventPublisher).fireEvent(any(), any());
+    Assertions.assertEquals(1, ops.size());
+    Assertions.assertEquals(ContainerReplicaOp.PendingOpType.DELETE,
+        ops.get(0).getOpType());
+    Assertions.assertEquals(target, ops.get(0).getTarget());
+    Assertions.assertEquals(0, ops.get(0).getReplicaIndex());
+    Assertions.assertEquals(1, replicationManager.getMetrics()
+        .getEcDeletionCmdsSentTotal());
+    Assertions.assertEquals(1, replicationManager.getMetrics()
+        .getNumDeletionCmdsSent());
+    Assertions.assertEquals(20, replicationManager.getMetrics()
+        .getNumDeletionBytesTotal());
+  }
+
+  @Test
+  public void testSendDatanodeReconstructCommand() throws NotLeaderException {
+    ECReplicationConfig ecRepConfig = new ECReplicationConfig(3, 2);
+    ContainerInfo containerInfo =
+        ReplicationTestUtil.createContainerInfo(ecRepConfig, 1,
+            HddsProtos.LifeCycleState.CLOSED, 10, 20);
+
+    List<ReconstructECContainersCommand.DatanodeDetailsAndReplicaIndex>
+        sourceNodes = new ArrayList<>();
+    for (int i = 1; i <= 3; i++) {
+      sourceNodes.add(
+          new ReconstructECContainersCommand.DatanodeDetailsAndReplicaIndex(
+              MockDatanodeDetails.randomDatanodeDetails(), i));
+    }
+    List<DatanodeDetails> targetNodes = new ArrayList<>();
+    DatanodeDetails target4 = MockDatanodeDetails.randomDatanodeDetails();
+    DatanodeDetails target5 = MockDatanodeDetails.randomDatanodeDetails();
+    targetNodes.add(target4);
+    targetNodes.add(target5);
+    byte[] missingIndexes = {4, 5};
+
+    ReconstructECContainersCommand command = new 
ReconstructECContainersCommand(
+        containerInfo.getContainerID(), sourceNodes, targetNodes,
+        missingIndexes, ecRepConfig);
+
+    replicationManager.sendDatanodeCommand(command, containerInfo, target4);
+
+    List<ContainerReplicaOp> ops = containerReplicaPendingOps.getPendingOps(
+        containerInfo.containerID());
+    Mockito.verify(eventPublisher).fireEvent(any(), any());
+    Assertions.assertEquals(2, ops.size());
+    Set<DatanodeDetails> cmdTargets = new HashSet<>();
+    Set<Integer> cmdIndexes = new HashSet<>();
+    for (ContainerReplicaOp op : ops) {
+      Assertions.assertEquals(ADD, op.getOpType());
+      cmdTargets.add(op.getTarget());
+      cmdIndexes.add(op.getReplicaIndex());
+    }
+    Assertions.assertEquals(2, cmdTargets.size());
+    for (DatanodeDetails dn : targetNodes) {
+      Assertions.assertTrue(cmdTargets.contains(dn));
+    }
+
+    Assertions.assertEquals(2, cmdIndexes.size());
+    for (int i : missingIndexes) {
+      Assertions.assertTrue(cmdIndexes.contains(i));
+    }
+    Assertions.assertEquals(1, replicationManager.getMetrics()
+        .getEcReconstructionCmdsSentTotal());
+  }
+
+  @Test
+  public void testSendDatanodeRewplicateCommand() throws NotLeaderException {

Review Comment:
   Well spotted!



-- 
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]

Reply via email to