Skip to content

Commit 1c0b445

Browse files
ashishkumar50ashishk
and
ashishk
authored
HDDS-12426. SCM replication should check double of container size. (apache#8080)
Co-authored-by: ashishk <[email protected]>
1 parent 157cca4 commit 1c0b445

File tree

4 files changed

+22
-2
lines changed

4 files changed

+22
-2
lines changed

hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/replication/ContainerImporter.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos;
3232
import org.apache.hadoop.hdds.scm.ScmConfigKeys;
3333
import org.apache.hadoop.hdds.scm.container.common.helpers.StorageContainerException;
34+
import org.apache.hadoop.hdds.utils.HddsServerUtil;
3435
import org.apache.hadoop.ozone.container.common.helpers.ContainerUtils;
3536
import org.apache.hadoop.ozone.container.common.impl.ContainerDataYaml;
3637
import org.apache.hadoop.ozone.container.common.impl.ContainerSet;
@@ -149,7 +150,7 @@ HddsVolume chooseNextVolume() throws IOException {
149150
// Choose volume that can hold both container in tmp and dest directory
150151
return volumeChoosingPolicy.chooseVolume(
151152
StorageVolumeUtil.getHddsVolumesList(volumeSet.getVolumesList()),
152-
containerSize * 2);
153+
HddsServerUtil.requiredReplicationSpace(containerSize));
153154
}
154155

155156
public static Path getUntarDirectory(HddsVolume hddsVolume)

hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/HddsServerUtil.java

+5
Original file line numberDiff line numberDiff line change
@@ -403,6 +403,11 @@ public static Collection<String> getOzoneDatanodeRatisDirectory(
403403
return rawLocations;
404404
}
405405

406+
public static long requiredReplicationSpace(long defaultContainerSize) {
407+
// During container import it requires double the container size to hold container in tmp and dest directory
408+
return 2 * defaultContainerSize;
409+
}
410+
406411
public static Collection<String> getDatanodeStorageDirs(ConfigurationSource conf) {
407412
Collection<String> rawLocations = conf.getTrimmedStringCollection(HDDS_DATANODE_DIR_KEY);
408413
if (rawLocations.isEmpty()) {

hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/ReplicationManagerUtil.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import org.apache.hadoop.hdds.scm.exceptions.SCMException;
3838
import org.apache.hadoop.hdds.scm.node.NodeStatus;
3939
import org.apache.hadoop.hdds.scm.node.states.NodeNotFoundException;
40+
import org.apache.hadoop.hdds.utils.HddsServerUtil;
4041
import org.slf4j.Logger;
4142
import org.slf4j.LoggerFactory;
4243

@@ -78,7 +79,7 @@ public static List<DatanodeDetails> getTargetDatanodes(PlacementPolicy policy,
7879
// Ensure that target datanodes have enough space to hold a complete
7980
// container.
8081
final long dataSizeRequired =
81-
Math.max(container.getUsedBytes(), defaultContainerSize);
82+
HddsServerUtil.requiredReplicationSpace(Math.max(container.getUsedBytes(), defaultContainerSize));
8283

8384
int mutableRequiredNodes = requiredNodes;
8485
while (mutableRequiredNodes > 0) {

hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/ReplicationTestUtil.java

+13
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import static org.apache.hadoop.hdds.protocol.proto.HddsProtos.NodeOperationalState.IN_SERVICE;
2121
import static org.apache.hadoop.hdds.protocol.proto.StorageContainerDatanodeProtocolProtos.ContainerReplicaProto.State.CLOSED;
2222
import static org.apache.hadoop.hdds.scm.exceptions.SCMException.ResultCodes.FAILED_TO_FIND_SUITABLE_NODE;
23+
import static org.junit.jupiter.api.Assertions.assertEquals;
2324
import static org.mockito.Mockito.any;
2425
import static org.mockito.Mockito.anyBoolean;
2526
import static org.mockito.Mockito.anyInt;
@@ -36,13 +37,15 @@
3637
import org.apache.commons.lang3.tuple.Pair;
3738
import org.apache.hadoop.hdds.client.ReplicationConfig;
3839
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
40+
import org.apache.hadoop.hdds.conf.StorageUnit;
3941
import org.apache.hadoop.hdds.protocol.DatanodeDetails;
4042
import org.apache.hadoop.hdds.protocol.MockDatanodeDetails;
4143
import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
4244
import org.apache.hadoop.hdds.protocol.proto.StorageContainerDatanodeProtocolProtos.ContainerReplicaProto;
4345
import org.apache.hadoop.hdds.scm.ContainerPlacementStatus;
4446
import org.apache.hadoop.hdds.scm.PlacementPolicy;
4547
import org.apache.hadoop.hdds.scm.SCMCommonPlacementPolicy;
48+
import org.apache.hadoop.hdds.scm.ScmConfigKeys;
4649
import org.apache.hadoop.hdds.scm.container.ContainerID;
4750
import org.apache.hadoop.hdds.scm.container.ContainerInfo;
4851
import org.apache.hadoop.hdds.scm.container.ContainerReplica;
@@ -51,6 +54,7 @@
5154
import org.apache.hadoop.hdds.scm.exceptions.SCMException;
5255
import org.apache.hadoop.hdds.scm.net.Node;
5356
import org.apache.hadoop.hdds.scm.node.NodeManager;
57+
import org.apache.hadoop.hdds.utils.HddsServerUtil;
5458
import org.apache.hadoop.ozone.protocol.commands.DeleteContainerCommand;
5559
import org.apache.hadoop.ozone.protocol.commands.ReconstructECContainersCommand;
5660
import org.apache.hadoop.ozone.protocol.commands.ReplicateContainerCommand;
@@ -328,6 +332,9 @@ protected List<DatanodeDetails> chooseDatanodesInternal(
328332
List<DatanodeDetails> favoredNodes, int nodesRequiredToChoose,
329333
long metadataSizeRequired, long dataSizeRequired)
330334
throws SCMException {
335+
long containerSize = (long) conf.getStorageSize(ScmConfigKeys.OZONE_SCM_CONTAINER_SIZE,
336+
ScmConfigKeys.OZONE_SCM_CONTAINER_SIZE_DEFAULT, StorageUnit.BYTES);
337+
assertEquals(HddsServerUtil.requiredReplicationSpace(containerSize), dataSizeRequired);
331338
if (nodesRequiredToChoose > 1) {
332339
throw new IllegalArgumentException("Only one node is allowed");
333340
}
@@ -356,6 +363,9 @@ protected List<DatanodeDetails> chooseDatanodesInternal(
356363
List<DatanodeDetails> favoredNodes, int nodesRequiredToChoose,
357364
long metadataSizeRequired, long dataSizeRequired)
358365
throws SCMException {
366+
long containerSize = (long) conf.getStorageSize(ScmConfigKeys.OZONE_SCM_CONTAINER_SIZE,
367+
ScmConfigKeys.OZONE_SCM_CONTAINER_SIZE_DEFAULT, StorageUnit.BYTES);
368+
assertEquals(HddsServerUtil.requiredReplicationSpace(containerSize), dataSizeRequired);
359369
throw new SCMException("No nodes available",
360370
FAILED_TO_FIND_SUITABLE_NODE);
361371
}
@@ -383,6 +393,9 @@ protected List<DatanodeDetails> chooseDatanodesInternal(
383393
List<DatanodeDetails> favoredNodes, int nodesRequiredToChoose,
384394
long metadataSizeRequired, long dataSizeRequired)
385395
throws SCMException {
396+
long containerSize = (long) conf.getStorageSize(ScmConfigKeys.OZONE_SCM_CONTAINER_SIZE,
397+
ScmConfigKeys.OZONE_SCM_CONTAINER_SIZE_DEFAULT, StorageUnit.BYTES);
398+
assertEquals(HddsServerUtil.requiredReplicationSpace(containerSize), dataSizeRequired);
386399
if (nodesRequiredToChoose >= throwWhenThisOrMoreNodesRequested) {
387400
throw new SCMException("No nodes available",
388401
FAILED_TO_FIND_SUITABLE_NODE);

0 commit comments

Comments
 (0)