This is an automated email from the ASF dual-hosted git repository.
ivandika3 pushed a commit to branch HDDS-11233
in repository https://gitbox.apache.org/repos/asf/ozone.git
The following commit(s) were added to refs/heads/HDDS-11233 by this push:
new d89c19ec28c HDDS-15242. Container report support StorageType (#10380)
d89c19ec28c is described below
commit d89c19ec28cc1797a63ed7682d5b7d74136967ee
Author: XiChen <[email protected]>
AuthorDate: Thu Jun 4 13:30:08 2026 +0800
HDDS-15242. Container report support StorageType (#10380)
---
.../container/keyvalue/KeyValueContainerData.java | 10 +-
.../proto/ScmServerDatanodeHeartbeatProtocol.proto | 1 +
.../container/AbstractContainerReportHandler.java | 14 +-
.../hdds/scm/container/ContainerReplica.java | 17 ++
.../scm/container/TestContainerReportHandler.java | 201 ++++++++++++++-------
.../TestIncrementalContainerReportHandler.java | 85 +++++++--
6 files changed, 242 insertions(+), 86 deletions(-)
diff --git
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/KeyValueContainerData.java
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/KeyValueContainerData.java
index b7804a7e8b0..34c7b23be8a 100644
---
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/KeyValueContainerData.java
+++
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/KeyValueContainerData.java
@@ -48,6 +48,7 @@
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
+import org.apache.hadoop.hdds.client.StorageTypeUtils;
import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos;
import
org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.ContainerDataProto;
import
org.apache.hadoop.hdds.protocol.proto.StorageContainerDatanodeProtocolProtos.ContainerReplicaProto;
@@ -275,7 +276,7 @@ public long getDeleteTransactionId() {
}
ContainerReplicaProto buildContainerReplicaProto() throws
StorageContainerException {
- return
getStatistics().setContainerReplicaProto(ContainerReplicaProto.newBuilder())
+ ContainerReplicaProto.Builder builder =
getStatistics().setContainerReplicaProto(ContainerReplicaProto.newBuilder())
.setContainerID(getContainerID())
.setState(getContainerReplicaProtoState(getState()))
.setIsEmpty(isEmpty())
@@ -283,8 +284,11 @@ ContainerReplicaProto buildContainerReplicaProto() throws
StorageContainerExcept
.setReplicaIndex(getReplicaIndex())
.setBlockCommitSequenceId(getBlockCommitSequenceId())
.setDeleteTransactionId(getDeleteTransactionId())
- .setDataChecksum(getDataChecksum())
- .build();
+ .setDataChecksum(getDataChecksum());
+ if (getStorageType() != null) {
+
builder.setStorageType(StorageTypeUtils.getStorageTypeProto(getStorageType()));
+ }
+ return builder.build();
}
// TODO remove one of the State from proto
diff --git
a/hadoop-hdds/interface-server/src/main/proto/ScmServerDatanodeHeartbeatProtocol.proto
b/hadoop-hdds/interface-server/src/main/proto/ScmServerDatanodeHeartbeatProtocol.proto
index 3cc92e6b996..c7440e6d0df 100644
---
a/hadoop-hdds/interface-server/src/main/proto/ScmServerDatanodeHeartbeatProtocol.proto
+++
b/hadoop-hdds/interface-server/src/main/proto/ScmServerDatanodeHeartbeatProtocol.proto
@@ -235,6 +235,7 @@ message ContainerReplicaProto {
optional int32 replicaIndex = 14;
optional bool isEmpty = 15 [default = false];
optional int64 dataChecksum = 16;
+ optional StorageTypeProto storageType = 17;
}
message CommandStatusReportsProto {
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 57234889dcb..1b331f63cd4 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
@@ -25,6 +25,7 @@
import java.util.Set;
import java.util.function.Supplier;
import org.apache.hadoop.hdds.client.ECReplicationConfig;
+import org.apache.hadoop.hdds.client.StorageTypeUtils;
import org.apache.hadoop.hdds.protocol.DatanodeDetails;
import org.apache.hadoop.hdds.protocol.DatanodeID;
import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
@@ -338,14 +339,14 @@ private boolean updateContainerState(final
DatanodeDetails datanode,
targetState = LifeCycleState.CLOSED;
getLogger().info("Resurrecting container {} from {} to CLOSED due to
non-empty CLOSED replica " +
"(keyCount={}, BCSID={}) from {}",
- containerId, container.getState(), replica.getKeyCount(),
replica.getBlockCommitSequenceId(),
+ containerId, container.getState(), replica.getKeyCount(),
replica.getBlockCommitSequenceId(),
detailsForLogging);
} else {
// For OPEN, CLOSING, UNHEALTHY, QUASI_CLOSED replicas, transition
to QUASI_CLOSED state
targetState = LifeCycleState.QUASI_CLOSED;
getLogger().info("Resurrecting container {} from {} to QUASI_CLOSED
due to non-empty {} replica " +
"(keyCount={}, BCSID={}) from {}",
- containerId, container.getState(), replica.getState(),
replica.getKeyCount(),
+ containerId, container.getState(), replica.getState(),
replica.getKeyCount(),
replica.getBlockCommitSequenceId(), detailsForLogging);
}
containerManager.transitionDeletingOrDeletedToTargetState(containerId,
targetState);
@@ -379,7 +380,7 @@ private void updateContainerReplica(final DatanodeDetails
datanodeDetails,
final ContainerReplicaProto replicaProto)
throws ContainerNotFoundException, ContainerReplicaNotFoundException {
- final ContainerReplica replica = ContainerReplica.newBuilder()
+ final ContainerReplica.ContainerReplicaBuilder replicaBuilder =
ContainerReplica.newBuilder()
.setContainerID(containerId)
.setContainerState(replicaProto.getState())
.setDatanodeDetails(datanodeDetails)
@@ -388,8 +389,11 @@ private void updateContainerReplica(final DatanodeDetails
datanodeDetails,
.setKeyCount(replicaProto.getKeyCount())
.setReplicaIndex(replicaProto.getReplicaIndex())
.setBytesUsed(replicaProto.getUsed())
- .setEmpty(replicaProto.getIsEmpty())
- .setChecksums(ContainerChecksums.of(replicaProto.getDataChecksum()))
+ .setEmpty(replicaProto.getIsEmpty());
+ if (replicaProto.hasStorageType()) {
+
replicaBuilder.setStorageType(StorageTypeUtils.getFromProtobuf(replicaProto.getStorageType()));
+ }
+ ContainerReplica replica =
replicaBuilder.setChecksums(ContainerChecksums.of(replicaProto.getDataChecksum()))
.build();
if (replica.getState().equals(State.DELETED)) {
diff --git
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerReplica.java
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerReplica.java
index 5c9bd57cd88..a08d627ff81 100644
---
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerReplica.java
+++
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerReplica.java
@@ -17,10 +17,12 @@
package org.apache.hadoop.hdds.scm.container;
+import jakarta.annotation.Nullable;
import java.util.Objects;
import org.apache.commons.lang3.builder.CompareToBuilder;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.hadoop.fs.StorageType;
import org.apache.hadoop.hdds.protocol.DatanodeDetails;
import org.apache.hadoop.hdds.protocol.DatanodeID;
import
org.apache.hadoop.hdds.protocol.proto.StorageContainerDatanodeProtocolProtos.ContainerReplicaProto;
@@ -46,6 +48,7 @@ public final class ContainerReplica implements
Comparable<ContainerReplica> {
private final long bytesUsed;
private final boolean isEmpty;
private final ContainerChecksums checksums;
+ private final StorageType storageType;
private ContainerReplica(ContainerReplicaBuilder b) {
this.containerID = Objects.requireNonNull(b.containerID, "containerID ==
null");
@@ -58,6 +61,7 @@ private ContainerReplica(ContainerReplicaBuilder b) {
this.isEmpty = b.isEmpty;
this.sequenceId = b.sequenceId;
this.checksums = Objects.requireNonNull(b.checksums, "checksums == null");
+ this.storageType = b.storageType;
}
public ContainerID getContainerID() {
@@ -130,6 +134,11 @@ public long getDataChecksum() {
return checksums.getDataChecksum();
}
+ @Nullable
+ public StorageType getStorageType() {
+ return storageType;
+ }
+
@Override
public int hashCode() {
return new HashCodeBuilder(61, 71)
@@ -185,6 +194,7 @@ public ContainerReplicaBuilder toBuilder() {
.setReplicaIndex(replicaIndex)
.setSequenceId(sequenceId)
.setEmpty(isEmpty)
+ .setStorageType(storageType)
.setChecksums(checksums);
}
@@ -200,6 +210,7 @@ public String toString() {
+ ", bytesUsed=" + bytesUsed
+ ", " + (isEmpty ? "empty" : "non-empty")
+ ", checksums=" + checksums
+ + ", storageType=" + storageType
+ '}';
}
@@ -218,6 +229,7 @@ public static class ContainerReplicaBuilder {
private int replicaIndex;
private boolean isEmpty;
private ContainerChecksums checksums;
+ private StorageType storageType;
/**
* Set Container Id.
@@ -297,6 +309,11 @@ public ContainerReplicaBuilder
setChecksums(ContainerChecksums checksums) {
return this;
}
+ public ContainerReplicaBuilder setStorageType(StorageType storageType) {
+ this.storageType = storageType;
+ return this;
+ }
+
/**
* Constructs new ContainerReplicaBuilder.
*
diff --git
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestContainerReportHandler.java
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestContainerReportHandler.java
index c13deefff2a..92398e8dfcb 100644
---
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestContainerReportHandler.java
+++
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestContainerReportHandler.java
@@ -23,6 +23,7 @@
import static org.apache.hadoop.hdds.scm.HddsTestUtils.getECContainer;
import static org.apache.hadoop.hdds.scm.HddsTestUtils.getReplicas;
import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.fail;
import static org.mockito.ArgumentMatchers.eq;
@@ -48,8 +49,10 @@
import java.util.concurrent.TimeoutException;
import java.util.stream.Collectors;
import java.util.stream.Stream;
+import org.apache.hadoop.fs.StorageType;
import org.apache.hadoop.hdds.client.ECReplicationConfig;
import org.apache.hadoop.hdds.client.RatisReplicationConfig;
+import org.apache.hadoop.hdds.client.StorageTypeUtils;
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
import org.apache.hadoop.hdds.protocol.DatanodeDetails;
import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
@@ -230,7 +233,7 @@ private void testReplicaIndexUpdate(ContainerInfo container,
Map<DatanodeDetails, Integer> expectedReplicaMap) {
final ContainerReportsProto containerReport = getContainerReportsProto(
container.containerID(), ContainerReplicaProto.State.CLOSED,
- dn.getUuidString(), 2000000000L, 100000000L, 10000L, replicaIndex);
+ dn.getUuidString(), 2000000000L, 100000000L, 10000L, replicaIndex,
null);
final ContainerReportFromDatanode containerReportFromDatanode =
new ContainerReportFromDatanode(dn, containerReport);
final ContainerReportHandler reportHandler = new ContainerReportHandler(
@@ -323,7 +326,7 @@ public void testUnderReplicatedContainer()
// containerOne becomes under replicated.
final ContainerReportsProto containerReport = getContainerReportsProto(
containerTwo.containerID(), ContainerReplicaProto.State.CLOSED,
- datanodeOne.getUuidString());
+ datanodeOne.getUuidString(), null);
final ContainerReportFromDatanode containerReportFromDatanode =
new ContainerReportFromDatanode(datanodeOne, containerReport);
reportHandler.onMessage(containerReportFromDatanode, publisher);
@@ -379,7 +382,7 @@ public void testOverReplicatedContainer() throws
NodeNotFoundException,
final ContainerReportsProto containerReport = getContainerReportsProto(
containerOne.containerID(), ContainerReplicaProto.State.CLOSED,
- datanodeFour.getUuidString());
+ datanodeFour.getUuidString(), null);
final ContainerReportFromDatanode containerReportFromDatanode =
new ContainerReportFromDatanode(datanodeFour, containerReport);
reportHandler.onMessage(containerReportFromDatanode, publisher);
@@ -440,10 +443,9 @@ public void testClosingToClosed() throws
NodeNotFoundException, IOException,
containerOneReplicas.forEach(containerStateManager::updateContainerReplica);
containerTwoReplicas.forEach(containerStateManager::updateContainerReplica);
-
final ContainerReportsProto containerReport = getContainerReportsProto(
containerOne.containerID(), ContainerReplicaProto.State.CLOSED,
- datanodeOne.getUuidString());
+ datanodeOne.getUuidString(), null);
final ContainerReportFromDatanode containerReportFromDatanode =
new ContainerReportFromDatanode(datanodeOne, containerReport);
reportHandler.onMessage(containerReportFromDatanode, publisher);
@@ -672,7 +674,7 @@ private void createAndHandleContainerReport(ContainerID
containerID,
int replicaIndex) {
final ContainerReportFromDatanode containerReportFromDatanode =
getContainerReportFromDatanode(containerID, state,
- datanodeDetails, 2000000000L, 100000L, replicaIndex);
+ datanodeDetails, 2000000000L, 100000L, replicaIndex, null);
final ContainerReportHandler reportHandler = new ContainerReportHandler(
nodeManager, containerManager);
reportHandler.onMessage(containerReportFromDatanode, publisher);
@@ -731,7 +733,7 @@ public void testClosingToQuasiClosed()
final ContainerReportsProto containerReport = getContainerReportsProto(
containerOne.containerID(), ContainerReplicaProto.State.QUASI_CLOSED,
- datanodeOne.getUuidString());
+ datanodeOne.getUuidString(), null);
final ContainerReportFromDatanode containerReportFromDatanode =
new ContainerReportFromDatanode(datanodeOne, containerReport);
reportHandler.onMessage(containerReportFromDatanode, publisher);
@@ -795,7 +797,7 @@ public void testQuasiClosedToClosed()
final ContainerReportsProto containerReport = getContainerReportsProto(
containerOne.containerID(), ContainerReplicaProto.State.CLOSED,
- datanodeOne.getUuidString());
+ datanodeOne.getUuidString(), null);
final ContainerReportFromDatanode containerReportFromDatanode =
new ContainerReportFromDatanode(datanodeOne, containerReport);
@@ -835,7 +837,7 @@ public void
testContainerStateTransitionToClosedWithMismatchingBCSID(LifeCycleSt
final ContainerReportsProto containerReport = getContainerReportsProto(
container1.containerID(), ContainerReplicaProto.State.CLOSED,
dn1.getUuidString(),
- 2000L);
+ 2000L, StorageType.DISK);
final ContainerReportFromDatanode containerReportFromDatanode =
new ContainerReportFromDatanode(dn1, containerReport);
@@ -880,7 +882,7 @@ public void
openContainerKeyAndBytesUsedUpdatedToMinimumOfAllReplicas()
reportHandler.onMessage(getContainerReportFromDatanode(
containerOne.containerID(), replicaState,
- datanodeOne, 50L, 60L), publisher);
+ datanodeOne, 50L, 60L, null), publisher);
// Single replica reported - ensure values are updated
assertEquals(50L, containerManager.getContainer(containerOne.containerID())
@@ -890,10 +892,10 @@ public void
openContainerKeyAndBytesUsedUpdatedToMinimumOfAllReplicas()
reportHandler.onMessage(getContainerReportFromDatanode(
containerOne.containerID(), replicaState,
- datanodeTwo, 50L, 60L), publisher);
+ datanodeTwo, 50L, 60L, null), publisher);
reportHandler.onMessage(getContainerReportFromDatanode(
containerOne.containerID(), replicaState,
- datanodeThree, 50L, 60L), publisher);
+ datanodeThree, 50L, 60L, null), publisher);
// All 3 DNs are reporting the same values. Counts should be as expected.
assertEquals(50L, containerManager.getContainer(containerOne.containerID())
@@ -905,13 +907,13 @@ public void
openContainerKeyAndBytesUsedUpdatedToMinimumOfAllReplicas()
// reported.
reportHandler.onMessage(getContainerReportFromDatanode(
containerOne.containerID(), replicaState,
- datanodeOne, 1L, 10L), publisher);
+ datanodeOne, 1L, 10L, null), publisher);
reportHandler.onMessage(getContainerReportFromDatanode(
containerOne.containerID(), replicaState,
- datanodeTwo, 2L, 11L), publisher);
+ datanodeTwo, 2L, 11L, null), publisher);
reportHandler.onMessage(getContainerReportFromDatanode(
containerOne.containerID(), replicaState,
- datanodeThree, 3L, 12L), publisher);
+ datanodeThree, 3L, 12L, null), publisher);
// All 3 DNs are reporting different values. The actual value should be the
// minimum.
@@ -924,7 +926,7 @@ public void
openContainerKeyAndBytesUsedUpdatedToMinimumOfAllReplicas()
// is the minimum
reportHandler.onMessage(getContainerReportFromDatanode(
containerOne.containerID(), replicaState,
- datanodeOne, 3L, 12L), publisher);
+ datanodeOne, 3L, 12L, null), publisher);
assertEquals(2L, containerManager.getContainer(containerOne.containerID())
.getUsedBytes());
@@ -956,7 +958,7 @@ public void
notOpenContainerKeyAndBytesUsedUpdatedToMaximumOfAllReplicas()
reportHandler.onMessage(getContainerReportFromDatanode(
containerOne.containerID(), replicaState,
- datanodeOne, 50L, 60L), publisher);
+ datanodeOne, 50L, 60L, null), publisher);
// Single replica reported - ensure values are updated
assertEquals(50L, containerManager.getContainer(containerOne.containerID())
@@ -966,10 +968,10 @@ public void
notOpenContainerKeyAndBytesUsedUpdatedToMaximumOfAllReplicas()
reportHandler.onMessage(getContainerReportFromDatanode(
containerOne.containerID(), replicaState,
- datanodeTwo, 50L, 60L), publisher);
+ datanodeTwo, 50L, 60L, null), publisher);
reportHandler.onMessage(getContainerReportFromDatanode(
containerOne.containerID(), replicaState,
- datanodeThree, 50L, 60L), publisher);
+ datanodeThree, 50L, 60L, null), publisher);
// All 3 DNs are reporting the same values. Counts should be as expected.
assertEquals(50L, containerManager.getContainer(containerOne.containerID())
@@ -981,13 +983,13 @@ public void
notOpenContainerKeyAndBytesUsedUpdatedToMaximumOfAllReplicas()
// reported.
reportHandler.onMessage(getContainerReportFromDatanode(
containerOne.containerID(), replicaState,
- datanodeOne, 1L, 10L), publisher);
+ datanodeOne, 1L, 10L, null), publisher);
reportHandler.onMessage(getContainerReportFromDatanode(
containerOne.containerID(), replicaState,
- datanodeTwo, 2L, 11L), publisher);
+ datanodeTwo, 2L, 11L, null), publisher);
reportHandler.onMessage(getContainerReportFromDatanode(
containerOne.containerID(), replicaState,
- datanodeThree, 3L, 12L), publisher);
+ datanodeThree, 3L, 12L, null), publisher);
// All 3 DNs are reporting different values. The actual value should be the
// maximum.
@@ -1000,7 +1002,7 @@ public void
notOpenContainerKeyAndBytesUsedUpdatedToMaximumOfAllReplicas()
// is the new maximumu
reportHandler.onMessage(getContainerReportFromDatanode(
containerOne.containerID(), replicaState,
- datanodeThree, 1L, 10L), publisher);
+ datanodeThree, 1L, 10L, null), publisher);
assertEquals(2L, containerManager.getContainer(containerOne.containerID())
.getUsedBytes());
@@ -1034,11 +1036,10 @@ public void
openECContainerKeyAndBytesUsedUpdatedToMinimumOfAllReplicas()
.getUsedBytes());
assertEquals(0L, containerManager.getContainer(containerOne.containerID())
.getNumberOfKeys());
-
// Report from data index 2 - should not update stats
reportHandler.onMessage(getContainerReportFromDatanode(
containerOne.containerID(), replicaState,
- dns.get(2), 50L, 60L, 2), publisher);
+ dns.get(2), 50L, 60L, 2, null), publisher);
assertEquals(0L, containerManager.getContainer(containerOne.containerID())
.getUsedBytes());
assertEquals(0L, containerManager.getContainer(containerOne.containerID())
@@ -1047,7 +1048,7 @@ public void
openECContainerKeyAndBytesUsedUpdatedToMinimumOfAllReplicas()
// Report from replica 1, it should update
reportHandler.onMessage(getContainerReportFromDatanode(
containerOne.containerID(), replicaState,
- dns.get(1), 50L, 60L, 1), publisher);
+ dns.get(1), 50L, 60L, 1, null), publisher);
assertEquals(50L, containerManager.getContainer(containerOne.containerID())
.getUsedBytes());
assertEquals(60L, containerManager.getContainer(containerOne.containerID())
@@ -1058,7 +1059,7 @@ public void
openECContainerKeyAndBytesUsedUpdatedToMinimumOfAllReplicas()
// Report from replica 1, it should update
reportHandler.onMessage(getContainerReportFromDatanode(
containerOne.containerID(), replicaState,
- dns.get(4), 80L, 90L, 4), publisher);
+ dns.get(4), 80L, 90L, 4, null), publisher);
assertEquals(50L, containerManager.getContainer(containerOne.containerID())
.getUsedBytes());
assertEquals(60L, containerManager.getContainer(containerOne.containerID())
@@ -1067,7 +1068,7 @@ public void
openECContainerKeyAndBytesUsedUpdatedToMinimumOfAllReplicas()
// Parity 2 reports a lesser value, so the stored values should update
reportHandler.onMessage(getContainerReportFromDatanode(
containerOne.containerID(), replicaState,
- dns.get(5), 40, 30, 5), publisher);
+ dns.get(5), 40, 30, 5, null), publisher);
assertEquals(40L, containerManager.getContainer(containerOne.containerID())
.getUsedBytes());
assertEquals(30L, containerManager.getContainer(containerOne.containerID())
@@ -1077,7 +1078,7 @@ public void
openECContainerKeyAndBytesUsedUpdatedToMinimumOfAllReplicas()
// lesser values
reportHandler.onMessage(getContainerReportFromDatanode(
containerOne.containerID(), replicaState,
- dns.get(2), 10L, 10L, 2), publisher);
+ dns.get(2), 10L, 10L, 2, null), publisher);
assertEquals(40L, containerManager.getContainer(containerOne.containerID())
.getUsedBytes());
assertEquals(30L, containerManager.getContainer(containerOne.containerID())
@@ -1114,7 +1115,7 @@ public void
closedECContainerKeyAndBytesUsedUpdatedToMinimumOfAllReplicas()
// Report from data index 2 - should not update stats
reportHandler.onMessage(getContainerReportFromDatanode(
containerOne.containerID(), replicaState,
- dns.get(2), 50L, 60L, 2), publisher);
+ dns.get(2), 50L, 60L, 2, null), publisher);
assertEquals(0L, containerManager.getContainer(containerOne.containerID())
.getUsedBytes());
assertEquals(0L, containerManager.getContainer(containerOne.containerID())
@@ -1123,7 +1124,7 @@ public void
closedECContainerKeyAndBytesUsedUpdatedToMinimumOfAllReplicas()
// Report from replica 1, it should update
reportHandler.onMessage(getContainerReportFromDatanode(
containerOne.containerID(), replicaState,
- dns.get(1), 50L, 60L, 1), publisher);
+ dns.get(1), 50L, 60L, 1, null), publisher);
assertEquals(50L, containerManager.getContainer(containerOne.containerID())
.getUsedBytes());
assertEquals(60L, containerManager.getContainer(containerOne.containerID())
@@ -1134,7 +1135,7 @@ public void
closedECContainerKeyAndBytesUsedUpdatedToMinimumOfAllReplicas()
// Report from replica 1, it should update
reportHandler.onMessage(getContainerReportFromDatanode(
containerOne.containerID(), replicaState,
- dns.get(4), 80L, 90L, 4), publisher);
+ dns.get(4), 80L, 90L, 4, null), publisher);
assertEquals(80L, containerManager.getContainer(containerOne.containerID())
.getUsedBytes());
assertEquals(90L, containerManager.getContainer(containerOne.containerID())
@@ -1143,7 +1144,7 @@ public void
closedECContainerKeyAndBytesUsedUpdatedToMinimumOfAllReplicas()
// Parity 2 reports a lesser value, so the stored values should not update
reportHandler.onMessage(getContainerReportFromDatanode(
containerOne.containerID(), replicaState,
- dns.get(5), 40, 30, 5), publisher);
+ dns.get(5), 40, 30, 5, null), publisher);
assertEquals(80L, containerManager.getContainer(containerOne.containerID())
.getUsedBytes());
assertEquals(90L, containerManager.getContainer(containerOne.containerID())
@@ -1153,7 +1154,7 @@ public void
closedECContainerKeyAndBytesUsedUpdatedToMinimumOfAllReplicas()
// greater values
reportHandler.onMessage(getContainerReportFromDatanode(
containerOne.containerID(), replicaState,
- dns.get(2), 110L, 120L, 2), publisher);
+ dns.get(2), 110L, 120L, 2, null), publisher);
assertEquals(80L, containerManager.getContainer(containerOne.containerID())
.getUsedBytes());
assertEquals(90L, containerManager.getContainer(containerOne.containerID())
@@ -1178,7 +1179,7 @@ public void testStaleReplicaOfDeletedContainer() throws
NodeNotFoundException, I
final ContainerReportsProto containerReport = getContainerReportsProto(
containerOne.containerID(), ContainerReplicaProto.State.CLOSED,
- datanodeOne.getUuidString(), 0, true);
+ datanodeOne.getUuidString(), 0, true, null);
final ContainerReportFromDatanode containerReportFromDatanode =
new ContainerReportFromDatanode(datanodeOne, containerReport);
reportHandler.onMessage(containerReportFromDatanode, publisher);
@@ -1207,14 +1208,15 @@ public void
testDeletedContainerWithStaleQuasiClosedReplicaDoesNotResurrect()
// Report non-empty QUASI_CLOSED replica with matching bcsId
final ContainerReportsProto containerReport = getContainerReportsProto(
- containerOne.containerID(),
+ containerOne.containerID(),
ContainerReplicaProto.State.QUASI_CLOSED,
- datanodeOne.getUuidString(),
+ datanodeOne.getUuidString(),
200L, // usedBytes
10L, // keyCount (non-empty)
10000L, // bcsId (matches container)
0, // replicaIndex
- false); // isEmpty=false
+ false, // isEmpty=false
+ StorageType.DISK);
final ContainerReportFromDatanode containerReportFromDatanode =
new ContainerReportFromDatanode(datanodeOne, containerReport);
@@ -1224,7 +1226,7 @@ public void
testDeletedContainerWithStaleQuasiClosedReplicaDoesNotResurrect()
final ContainerInfo container =
containerManager.getContainer(containerOne.containerID());
assertEquals(LifeCycleState.DELETED, container.getState(),
"Container should not resurrect when a stale QUASI_CLOSED replica is
reported");
-
+
// A delete command should be sent for the stale replica
verify(publisher, times(1)).fireEvent(eq(SCMEvents.DATANODE_COMMAND),
any(CommandForDatanode.class));
}
@@ -1234,7 +1236,7 @@ public void
testDeletedContainerWithStaleQuasiClosedReplicaDoesNotResurrect()
* OPEN replicas should trigger resurrection to QUASI_CLOSED state.
*/
@Test
- public void testDeletingContainerResurrectionToQuasiClosedWithOpenReplica()
+ public void testDeletingContainerResurrectionToQuasiClosedWithOpenReplica()
throws NodeNotFoundException, IOException {
final ContainerReportHandler reportHandler = new
ContainerReportHandler(nodeManager, containerManager);
final DatanodeDetails datanodeOne = nodeManager.getNodes(
@@ -1248,14 +1250,15 @@ public void
testDeletingContainerResurrectionToQuasiClosedWithOpenReplica()
// Report non-empty OPEN replica (e.g., stale DN that came back online)
final ContainerReportsProto containerReport = getContainerReportsProto(
- containerOne.containerID(),
+ containerOne.containerID(),
ContainerReplicaProto.State.OPEN,
datanodeOne.getUuidString(),
200L, // usedBytes
10L, // keyCount (non-empty)
10000L, // bcsId
0, // replicaIndex
- false); // isEmpty=false
+ false, // isEmpty=false
+ StorageType.DISK);
final ContainerReportFromDatanode containerReportFromDatanode =
new ContainerReportFromDatanode(datanodeOne, containerReport);
@@ -1265,7 +1268,7 @@ public void
testDeletingContainerResurrectionToQuasiClosedWithOpenReplica()
final ContainerInfo resurrectedContainer =
containerManager.getContainer(containerOne.containerID());
assertEquals(LifeCycleState.QUASI_CLOSED, resurrectedContainer.getState(),
"Container should resurrect to QUASI_CLOSED when OPEN replica is
reported");
-
+
// Replica should be updated in SCM
assertEquals(1,
containerManager.getContainerReplicas(containerOne.containerID()).size());
}
@@ -1305,7 +1308,7 @@ public void testWithNoContainerDataChecksum() throws
Exception {
int numReportsSent = 0;
for (DatanodeDetails dn: datanodes) {
final ContainerReportsProto dnReportProto = getContainerReportsProto(
- contID, ContainerReplicaProto.State.CLOSED, dn.getUuidString());
+ contID, ContainerReplicaProto.State.CLOSED, dn.getUuidString(),
StorageType.DISK);
final ContainerReportFromDatanode dnReport = new
ContainerReportFromDatanode(dn, dnReportProto);
reportHandler.onMessage(dnReport, publisher);
numReportsSent++;
@@ -1353,7 +1356,7 @@ public void testWithContainerDataChecksum() throws
Exception {
// For each datanode, send a container report with a mismatched checksum.
for (DatanodeDetails dn: datanodes) {
ContainerReportsProto dnReportProto = getContainerReportsProto(
- contID, ContainerReplicaProto.State.CLOSED, dn.getUuidString());
+ contID, ContainerReplicaProto.State.CLOSED, dn.getUuidString(),
StorageType.DISK);
ContainerReplicaProto replicaWithChecksum =
dnReportProto.getReports(0).toBuilder()
.setDataChecksum(createUniqueDataChecksumForReplica(contID,
dn.getUuidString()))
.build();
@@ -1380,7 +1383,7 @@ public void testWithContainerDataChecksum() throws
Exception {
// This simulates reconciliation running.
for (DatanodeDetails dn: datanodes) {
ContainerReportsProto dnReportProto = getContainerReportsProto(
- contID, ContainerReplicaProto.State.CLOSED, dn.getUuidString());
+ contID, ContainerReplicaProto.State.CLOSED, dn.getUuidString(),
StorageType.DISK);
ContainerReplicaProto replicaWithChecksum =
dnReportProto.getReports(0).toBuilder()
.setDataChecksum(createMatchingDataChecksumForReplica(contID))
.build();
@@ -1417,74 +1420,138 @@ protected static long
createMatchingDataChecksumForReplica(ContainerID container
return Objects.hashCode(containerID);
}
+ @Test
+ public void testReplicaStorageTypeValidation() throws IOException {
+ // Prepare env
+ final ContainerReportHandler reportHandler = new ContainerReportHandler(
+ nodeManager, containerManager);
+ final Iterator<DatanodeDetails> nodeIterator = nodeManager.getNodes(
+ NodeStatus.inServiceHealthy()).iterator();
+ Map<StorageType, DatanodeDetails> storageTypeToDn = new HashMap<>();
+ final DatanodeDetails datanodeOne = nodeIterator.next();
+ final DatanodeDetails datanodeTwo = nodeIterator.next();
+ final DatanodeDetails datanodeThree = nodeIterator.next();
+ final ContainerReplicaProto.State replicaState
+ = ContainerReplicaProto.State.CLOSED;
+ final ContainerInfo containerOne = getContainer(LifeCycleState.CLOSED);
+
+ // Add Container Report
+ containerStateManager.addContainer(containerOne.getProtobuf());
+ reportHandler.onMessage(getContainerReportFromDatanode(
+ containerOne.containerID(), replicaState,
+ datanodeOne, 50L, 60L, StorageType.DISK), publisher);
+ storageTypeToDn.put(StorageType.DISK, datanodeOne);
+ reportHandler.onMessage(getContainerReportFromDatanode(
+ containerOne.containerID(), replicaState,
+ datanodeTwo, 50L, 60L, StorageType.SSD), publisher);
+ storageTypeToDn.put(StorageType.SSD, datanodeTwo);
+ reportHandler.onMessage(getContainerReportFromDatanode(
+ containerOne.containerID(), replicaState,
+ datanodeThree, 50L, 60L, StorageType.ARCHIVE), publisher);
+ storageTypeToDn.put(StorageType.ARCHIVE, datanodeThree);
+
+ // Assert the StorageType is valid
+ assertEquals(3, containerManager.getContainerReplicas(
+ containerOne.containerID()).size());
+ for (ContainerReplica containerReplica :
containerManager.getContainerReplicas(
+ containerOne.containerID())) {
+ assertEquals(storageTypeToDn.get(containerReplica.getStorageType()),
+ containerReplica.getDatanodeDetails());
+ }
+
+ storageTypeToDn.clear();
+ reportHandler.onMessage(getContainerReportFromDatanode(
+ containerOne.containerID(), replicaState,
+ datanodeOne, 50L, 60L, StorageType.SSD), publisher);
+ storageTypeToDn.put(StorageType.SSD, datanodeOne);
+ reportHandler.onMessage(getContainerReportFromDatanode(
+ containerOne.containerID(), replicaState,
+ datanodeTwo, 50L, 60L, StorageType.ARCHIVE), publisher);
+ storageTypeToDn.put(StorageType.ARCHIVE, datanodeTwo);
+ reportHandler.onMessage(getContainerReportFromDatanode(
+ containerOne.containerID(), replicaState,
+ datanodeThree, 50L, 60L, null), publisher);
+ for (ContainerReplica containerReplica :
containerManager.getContainerReplicas(
+ containerOne.containerID())) {
+ if (containerReplica.getDatanodeDetails().equals(datanodeThree)) {
+ assertNull(containerReplica.getStorageType());
+ } else {
+ assertEquals(storageTypeToDn.get(containerReplica.getStorageType()),
+ containerReplica.getDatanodeDetails());
+ }
+ }
+ }
+
private ContainerReportFromDatanode getContainerReportFromDatanode(
ContainerID containerId, ContainerReplicaProto.State state,
- DatanodeDetails dn, long bytesUsed, long keyCount) {
+ DatanodeDetails dn, long bytesUsed, long keyCount, StorageType
storageType) {
return getContainerReportFromDatanode(containerId, state, dn, bytesUsed,
- keyCount, 0);
+ keyCount, 0, storageType);
}
private ContainerReportFromDatanode getContainerReportFromDatanode(
ContainerID containerId, ContainerReplicaProto.State state,
- DatanodeDetails dn, long bytesUsed, long keyCount, int replicaIndex) {
+ DatanodeDetails dn, long bytesUsed, long keyCount, int replicaIndex,
StorageType storageType) {
ContainerReportsProto containerReport = getContainerReportsProto(
containerId, state, dn.getUuidString(), bytesUsed, keyCount,
- 10000L, replicaIndex);
+ 10000L, replicaIndex, storageType);
return new ContainerReportFromDatanode(dn, containerReport);
}
protected static ContainerReportsProto getContainerReportsProto(
final ContainerID containerId, final ContainerReplicaProto.State state,
- final String originNodeId) {
+ final String originNodeId, StorageType storageType) {
return getContainerReportsProto(containerId, state, originNodeId,
- 2000000000L, 100000000L, 10000L, 0);
+ 2000000000L, 100000000L, 10000L, 0, storageType);
}
protected static ContainerReportsProto getContainerReportsProto(
final ContainerID containerId, final ContainerReplicaProto.State state,
- final String originNodeId, final long bcsId) {
+ final String originNodeId, final long bcsId, StorageType storageType) {
return getContainerReportsProto(containerId, state, originNodeId,
- 2000000000L, 100000000L, bcsId, 0);
+ 2000000000L, 100000000L, bcsId, 0, storageType);
}
protected static ContainerReportsProto getContainerReportsProto(
final ContainerID containerId, final ContainerReplicaProto.State state,
- final String originNodeId, int replicaIndex) {
+ final String originNodeId, int replicaIndex, StorageType storageType) {
return getContainerReportsProto(containerId, state, originNodeId,
- 2000000000L, 100000000L, 10000L, replicaIndex, false);
+ 2000000000L, 100000000L, 10000L, replicaIndex, false, storageType);
}
protected static ContainerReportsProto getContainerReportsProto(
final ContainerID containerId, final ContainerReplicaProto.State state,
- final String originNodeId, int replicaIndex, boolean isEmpty) {
+ final String originNodeId, int replicaIndex, boolean isEmpty,
StorageType storageType) {
return getContainerReportsProto(containerId, state, originNodeId,
- 2000000000L, 100000000L, 10000L, replicaIndex, isEmpty);
+ 2000000000L, 100000000L, 10000L, replicaIndex, isEmpty, storageType);
}
protected static ContainerReportsProto getContainerReportsProto(
final ContainerID containerId, final ContainerReplicaProto.State state,
- final String originNodeId, final long bcsId, int replicaIndex) {
+ final String originNodeId, final long bcsId, int replicaIndex,
StorageType storageType) {
return getContainerReportsProto(containerId, state, originNodeId,
- 2000000000L, 100000000L, bcsId, replicaIndex);
+ 2000000000L, 100000000L, bcsId, replicaIndex, storageType);
}
+ @SuppressWarnings("checkstyle:ParameterNumber")
protected static ContainerReportsProto getContainerReportsProto(
final ContainerID containerId, final ContainerReplicaProto.State state,
final String originNodeId, final long usedBytes, final long keyCount,
- final long bcsId, final int replicaIndex) {
+ final long bcsId, final int replicaIndex, StorageType storageType) {
return getContainerReportsProto(containerId, state, originNodeId,
usedBytes,
- keyCount, bcsId, replicaIndex, false);
+ keyCount, bcsId, replicaIndex, false, storageType);
}
@SuppressWarnings("checkstyle:ParameterNumber")
protected static ContainerReportsProto getContainerReportsProto(
final ContainerID containerId, final ContainerReplicaProto.State state,
final String originNodeId, final long usedBytes, final long keyCount,
- final long bcsId, final int replicaIndex, final boolean isEmpty) {
+ final long bcsId, final int replicaIndex, final boolean isEmpty,
+ final StorageType storageType) {
final ContainerReportsProto.Builder crBuilder =
ContainerReportsProto.newBuilder();
- final ContainerReplicaProto replicaProto =
+ final ContainerReplicaProto.Builder replicaProto =
ContainerReplicaProto.newBuilder()
.setContainerID(containerId.getId())
.setState(state)
@@ -1499,8 +1566,10 @@ protected static ContainerReportsProto
getContainerReportsProto(
.setBlockCommitSequenceId(bcsId)
.setDeleteTransactionId(0)
.setReplicaIndex(replicaIndex)
- .setIsEmpty(isEmpty)
- .build();
+ .setIsEmpty(isEmpty);
+ if (storageType != null) {
+
replicaProto.setStorageType(StorageTypeUtils.getStorageTypeProto(storageType));
+ }
return crBuilder.addReports(replicaProto).build();
}
}
diff --git
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestIncrementalContainerReportHandler.java
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestIncrementalContainerReportHandler.java
index 8e87cc5d88d..9bb1491c090 100644
---
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestIncrementalContainerReportHandler.java
+++
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestIncrementalContainerReportHandler.java
@@ -43,6 +43,7 @@
import java.time.Clock;
import java.time.ZoneId;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -53,9 +54,11 @@
import java.util.concurrent.TimeoutException;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
+import org.apache.hadoop.fs.StorageType;
import org.apache.hadoop.hdds.HddsConfigKeys;
import org.apache.hadoop.hdds.client.ECReplicationConfig;
import org.apache.hadoop.hdds.client.RatisReplicationConfig;
+import org.apache.hadoop.hdds.client.StorageTypeUtils;
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
import org.apache.hadoop.hdds.protocol.DatanodeDetails;
import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
@@ -284,7 +287,7 @@ private void createAndHandleICR(ContainerID containerID,
int replicaIndex) {
final IncrementalContainerReportProto containerReport =
getIncrementalContainerReportProto(containerID, state,
- datanodeDetails.getUuidString(), true, replicaIndex);
+ datanodeDetails.getUuidString(), true, replicaIndex, null);
final IncrementalContainerReportFromDatanode icrFromDatanode =
new IncrementalContainerReportFromDatanode(datanodeDetails,
containerReport);
@@ -439,7 +442,7 @@ public void
testContainerStateTransitionToClosedWithMismatchingBCSID(LifeCycleSt
final IncrementalContainerReportProto containerReport =
getIncrementalContainerReportProto(container.containerID(),
CLOSED, datanodeThree.getUuidString(), false, 0,
- 2000L);
+ 2000L, StorageType.DISK);
final IncrementalContainerReportFromDatanode icr =
new IncrementalContainerReportFromDatanode(
datanodeOne, containerReport);
@@ -571,7 +574,7 @@ public void testICRFCRRace() throws IOException,
NodeNotFoundException,
datanode, containerReport);
final ContainerReportsProto fullReport = getContainerReportsProto(
- containerTwo.containerID(), CLOSED, datanode.getUuidString());
+ containerTwo.containerID(), CLOSED, datanode.getUuidString(),
null);
final ContainerReportFromDatanode fcr = new ContainerReportFromDatanode(
datanode, fullReport);
@@ -752,6 +755,59 @@ public void testWithContainerDataChecksum() throws
Exception {
assertEquals(numNodes, numReplicasChecked);
}
+ @Test
+ public void testReplicaStorageTypeValidation() throws IOException {
+ // Prepare env
+ Map<StorageType, DatanodeDetails> storageTypeToDn = new HashMap<>();
+ final IncrementalContainerReportHandler reportHandler =
+ new IncrementalContainerReportHandler(
+ nodeManager, containerManager, scmContext);
+ final ContainerInfo container = getContainer(LifeCycleState.CLOSING);
+ final DatanodeDetails datanodeOne = randomDatanodeDetails();
+ final DatanodeDetails datanodeTwo = randomDatanodeDetails();
+ final DatanodeDetails datanodeThree = randomDatanodeDetails();
+ nodeManager.register(datanodeOne, null, null);
+ nodeManager.register(datanodeTwo, null, null);
+ nodeManager.register(datanodeThree, null, null);
+ final Set<ContainerReplica> containerReplicas = getReplicas(
+ container.containerID(),
+ ContainerReplicaProto.State.CLOSING,
+ datanodeOne, datanodeTwo, datanodeThree);
+ containerStateManager.addContainer(container.getProtobuf());
+ containerReplicas.forEach(replica -> {
+ containerStateManager.updateContainerReplica(replica);
+ });
+
+ // Add Container Report
+ addIncrContainerReport(container, datanodeOne, reportHandler,
StorageType.DISK);
+ storageTypeToDn.put(StorageType.DISK, datanodeOne);
+ addIncrContainerReport(container, datanodeTwo, reportHandler,
StorageType.SSD);
+ storageTypeToDn.put(StorageType.SSD, datanodeTwo);
+ addIncrContainerReport(container, datanodeThree, reportHandler,
StorageType.RAM_DISK);
+ storageTypeToDn.put(StorageType.RAM_DISK, datanodeThree);
+
+ // Assert the StorageType is valid
+ assertEquals(3, containerStateManager
+ .getContainerReplicas(container.containerID()).size());
+ for (ContainerReplica containerReplica : containerStateManager
+ .getContainerReplicas(container.containerID())) {
+ assertEquals(storageTypeToDn.get(containerReplica.getStorageType()),
+ containerReplica.getDatanodeDetails());
+ }
+ }
+
+ private void addIncrContainerReport(ContainerInfo container, DatanodeDetails
datanode,
+ IncrementalContainerReportHandler reportHandler, StorageType
storageType) {
+ final IncrementalContainerReportProto containerReport1 =
+ getIncrementalContainerReportProto(container.containerID(),
+ ContainerReplicaProto.State.CLOSED,
+ datanode.getUuidString(), true, 0, storageType);
+ final IncrementalContainerReportFromDatanode icrFromDatanode1 =
+ new IncrementalContainerReportFromDatanode(
+ datanode, containerReport1);
+ reportHandler.onMessage(icrFromDatanode1, publisher);
+ }
+
private static IncrementalContainerReportProto
getIncrementalContainerReportProto(ContainerReplicaProto replicaProto) {
final IncrementalContainerReportProto.Builder crBuilder =
@@ -765,9 +821,10 @@ public void testWithContainerDataChecksum() throws
Exception {
final ContainerReplicaProto.State state,
final String originNodeId,
final boolean hasReplicaIndex,
- final int replicaIndex) {
+ final int replicaIndex,
+ final StorageType storageType) {
return getIncrementalContainerReportProto(containerId, state, originNodeId,
- hasReplicaIndex, replicaIndex, 10000L);
+ hasReplicaIndex, replicaIndex, 10000L, storageType);
}
private static IncrementalContainerReportProto
@@ -777,7 +834,8 @@ public void testWithContainerDataChecksum() throws
Exception {
final String originNodeId,
final boolean hasReplicaIndex,
final int replicaIndex,
- final long bcsId) {
+ final long bcsId,
+ final StorageType storageType) {
final ContainerReplicaProto.Builder replicaProto =
ContainerReplicaProto.newBuilder()
.setContainerID(containerId.getId())
@@ -795,6 +853,9 @@ public void testWithContainerDataChecksum() throws
Exception {
if (hasReplicaIndex) {
replicaProto.setReplicaIndex(replicaIndex);
}
+ if (storageType != null) {
+
replicaProto.setStorageType(StorageTypeUtils.getStorageTypeProto(storageType));
+ }
return getIncrementalContainerReportProto(replicaProto.build());
}
@@ -804,16 +865,16 @@ public void testWithContainerDataChecksum() throws
Exception {
final ContainerReplicaProto.State state,
final String originNodeId) {
return getIncrementalContainerReportProto(containerId, state, originNodeId,
- false, 0);
+ false, 0, null);
}
private void testReplicaIndexUpdate(ContainerInfo container,
DatanodeDetails dn, int replicaIndex,
- Map<DatanodeDetails, Integer> expectedReplicaMap) {
+ Map<DatanodeDetails, Integer> expectedReplicaMap, StorageType
storageType) {
final IncrementalContainerReportProto containerReport =
getIncrementalContainerReportProto(container.containerID(),
ContainerReplicaProto.State.CLOSED, dn.getUuidString(),
- true, replicaIndex);
+ true, replicaIndex, storageType);
final IncrementalContainerReportFromDatanode containerReportFromDatanode =
new IncrementalContainerReportFromDatanode(dn, containerReport);
final IncrementalContainerReportHandler reportHandler =
@@ -852,9 +913,9 @@ public void testECReplicaIndexValidation() throws
NodeNotFoundException,
.collect(Collectors.toMap(ContainerReplica::getDatanodeDetails,
ContainerReplica::getReplicaIndex));
replicas.forEach(containerStateManager::updateContainerReplica);
- testReplicaIndexUpdate(container, dns.get(0), 0, replicaMap);
- testReplicaIndexUpdate(container, dns.get(0), 6, replicaMap);
+ testReplicaIndexUpdate(container, dns.get(0), 0, replicaMap, null);
+ testReplicaIndexUpdate(container, dns.get(0), 6, replicaMap, null);
replicaMap.put(dns.get(0), 2);
- testReplicaIndexUpdate(container, dns.get(0), 2, replicaMap);
+ testReplicaIndexUpdate(container, dns.get(0), 2, replicaMap, null);
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]