This is an automated email from the ASF dual-hosted git repository.
xichen01 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 2b371c6075a HDDS-15241. Datanode Support create Container use specific
StorageType (#10362)
2b371c6075a is described below
commit 2b371c6075a58d6140325b149105e77d09c37a20
Author: XiChen <[email protected]>
AuthorDate: Fri May 29 00:17:46 2026 +0800
HDDS-15241. Datanode Support create Container use specific StorageType
(#10362)
---
.../hadoop/hdds/scm/storage/BlockOutputStream.java | 5 +-
.../hadoop/hdds/client/StorageTypeUtils.java | 102 ++++++++
.../hdds/scm/storage/ContainerProtocolCalls.java | 58 +++--
.../ozone/container/common/impl/ContainerData.java | 1 +
.../container/common/impl/HddsDispatcher.java | 23 +-
.../container/common/interfaces/Container.java | 14 +-
.../common/interfaces/VolumeChoosingPolicy.java | 21 +-
.../volume/AbstractStorageTypeChoosingPolicy.java | 6 -
.../container/keyvalue/KeyValueContainer.java | 23 +-
.../ozone/container/keyvalue/KeyValueHandler.java | 18 +-
.../container/replication/ContainerImporter.java | 4 +-
.../ozone/container/common/ContainerTestUtils.java | 3 +-
.../container/common/TestBlockDeletingService.java | 3 +-
.../TestSchemaTwoBackwardsCompatibility.java | 3 +-
...stStaleRecoveringContainerScrubbingService.java | 6 +-
.../common/impl/TestContainerPersistence.java | 3 +-
.../container/common/impl/TestHddsDispatcher.java | 259 +++++++++++++++++++--
.../volume/TestCapacityVolumeChoosingPolicy.java | 7 +-
.../volume/TestRoundRobinVolumeChoosingPolicy.java | 15 +-
.../common/volume/TestVolumeSetDiskChecks.java | 5 +-
.../diskbalancer/TestDiskBalancerTask.java | 5 +-
.../keyvalue/TestKeyValueBlockIterator.java | 3 +-
.../container/keyvalue/TestKeyValueContainer.java | 48 ++--
.../TestKeyValueContainerIntegrityChecks.java | 3 +-
.../TestKeyValueContainerMarkUnhealthy.java | 8 +-
.../container/keyvalue/TestKeyValueHandler.java | 5 +-
.../keyvalue/impl/AbstractTestChunkManager.java | 6 +-
.../keyvalue/impl/TestBlockManagerImpl.java | 6 +-
.../container/ozoneimpl/TestContainerReader.java | 22 +-
.../container/ozoneimpl/TestOzoneContainer.java | 5 +-
.../replication/TestContainerImporter.java | 15 ++
.../replication/TestGrpcReplicationService.java | 3 +-
.../src/main/proto/DatanodeClientProtocol.proto | 6 +
.../schemaupgrade/TestUpgradeContainerSchema.java | 6 +-
.../hadoop/hdds/scm/TestContainerSmallFile.java | 9 +-
.../hadoop/ozone/freon/ChunkManagerDiskWrite.java | 3 +-
.../containergenerator/GeneratorDatanode.java | 3 +-
37 files changed, 559 insertions(+), 176 deletions(-)
diff --git
a/hadoop-hdds/client/src/main/java/org/apache/hadoop/hdds/scm/storage/BlockOutputStream.java
b/hadoop-hdds/client/src/main/java/org/apache/hadoop/hdds/scm/storage/BlockOutputStream.java
index d7076df3ba0..432fee81d19 100644
---
a/hadoop-hdds/client/src/main/java/org/apache/hadoop/hdds/scm/storage/BlockOutputStream.java
+++
b/hadoop-hdds/client/src/main/java/org/apache/hadoop/hdds/scm/storage/BlockOutputStream.java
@@ -963,8 +963,11 @@ private CompletableFuture<PutBlockResult>
writeChunkToContainer(
byteBufferList = null;
}
+ // TODO: Pass the requested storage type from allocation/storage policy
+ // once that context is wired through BlockOutputStream. Null preserves
+ // the current any-volume behavior.
asyncReply = writeChunkAsync(xceiverClient, chunkInfo,
- blockID.get(), data, tokenString, replicationIndex, blockData,
close);
+ blockID.get(), data, tokenString, replicationIndex, blockData,
close, null);
CompletableFuture<ContainerCommandResponseProto>
respFuture = asyncReply.getResponse();
validateFuture = respFuture.thenApplyAsync(e -> {
diff --git
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/client/StorageTypeUtils.java
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/client/StorageTypeUtils.java
new file mode 100644
index 00000000000..0956581ff87
--- /dev/null
+++
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/client/StorageTypeUtils.java
@@ -0,0 +1,102 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hdds.client;
+
+import jakarta.annotation.Nonnull;
+import org.apache.hadoop.fs.StorageType;
+import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
+import org.apache.hadoop.hdds.protocol.proto.HddsProtos.StorageTypeProto;
+
+/**
+ * Utility class for converting between Hadoop's {@link StorageType} and
+ * Ozone's protobuf representation {@link HddsProtos.StorageTypeProto}.
+ */
+public final class StorageTypeUtils {
+ private StorageTypeUtils() {
+ }
+
+ public static HddsProtos.StorageTypeProto getStorageTypeProto(@Nonnull
StorageType type)
+ throws IllegalArgumentException {
+ switch (type) {
+ case SSD:
+ return HddsProtos.StorageTypeProto.SSD;
+ case DISK:
+ return HddsProtos.StorageTypeProto.DISK;
+ case ARCHIVE:
+ return HddsProtos.StorageTypeProto.ARCHIVE;
+ case PROVIDED:
+ return HddsProtos.StorageTypeProto.PROVIDED;
+ case RAM_DISK:
+ return HddsProtos.StorageTypeProto.RAM_DISK;
+ default:
+ throw new IllegalArgumentException("Illegal Storage Type specified");
+ }
+ }
+
+ public static StorageType getFromProtobuf(@Nonnull
HddsProtos.StorageTypeProto proto) throws
+ IllegalArgumentException {
+ switch (proto) {
+ case SSD:
+ return StorageType.SSD;
+ case DISK:
+ return StorageType.DISK;
+ case ARCHIVE:
+ return StorageType.ARCHIVE;
+ case PROVIDED:
+ return StorageType.PROVIDED;
+ case RAM_DISK:
+ return StorageType.RAM_DISK;
+ default:
+ throw new IllegalArgumentException("Illegal Storage Type specified");
+ }
+ }
+
+ /**
+ * Returns Filesystem StorageType enum value corresponding to the int ID
value.
+ *
+ * @param storageTypeID StorageType int ID value
+ * @return StorageType
+ */
+ public static StorageType getStorageTypeFromID(int storageTypeID) throws
+ IllegalArgumentException {
+ if (StorageTypeProto.forNumber(storageTypeID) == null) {
+ throw new IllegalArgumentException("Illegal storageTypeID " +
storageTypeID);
+ }
+ return getFromProtobuf(StorageTypeProto.forNumber(storageTypeID));
+ }
+
+ /**
+ * Returns integer representation of protobuf StorageType.
+ *
+ * @return storageType int ID value
+ */
+ public static int getIDFromProtobuf(@Nonnull HddsProtos.StorageTypeProto
proto) throws
+ IllegalArgumentException {
+ switch (proto) {
+ case SSD:
+ case DISK:
+ case ARCHIVE:
+ case PROVIDED:
+ case RAM_DISK:
+ return proto.getNumber();
+ default:
+ throw new IllegalArgumentException("Illegal Storage Type specified");
+ }
+ }
+}
+
diff --git
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/storage/ContainerProtocolCalls.java
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/storage/ContainerProtocolCalls.java
index 15879fb4764..44363806255 100644
---
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/storage/ContainerProtocolCalls.java
+++
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/storage/ContainerProtocolCalls.java
@@ -33,6 +33,7 @@
import java.util.function.Function;
import org.apache.hadoop.hdds.annotation.InterfaceStability;
import org.apache.hadoop.hdds.client.BlockID;
+import org.apache.hadoop.hdds.client.StorageTypeUtils;
import org.apache.hadoop.hdds.protocol.DatanodeDetails;
import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos;
import
org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.BlockData;
@@ -62,6 +63,7 @@
import
org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.ReadContainerResponseProto;
import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.Type;
import
org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.WriteChunkRequestProto;
+import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
import org.apache.hadoop.hdds.scm.XceiverClientReply;
import org.apache.hadoop.hdds.scm.XceiverClientSpi;
import org.apache.hadoop.hdds.scm.XceiverClientSpi.Validator;
@@ -430,23 +432,23 @@ static long getLen(ReadChunkResponseProto response) {
* @param blockID ID of the block
* @param data the data of the chunk to write
* @param tokenString serialized block token
+ * @param storageType - the type of storage that is required, if the
storageType
+ * is null, any storageType will be considered.
* @throws IOException if there is an I/O error while performing the call
*/
@SuppressWarnings("parameternumber")
public static XceiverClientReply writeChunkAsync(
XceiverClientSpi xceiverClient, ChunkInfo chunk, BlockID blockID,
ByteString data, String tokenString,
- int replicationIndex, BlockData blockData, boolean close)
+ int replicationIndex, BlockData blockData, boolean close,
+ HddsProtos.StorageTypeProto storageType)
throws IOException, ExecutionException, InterruptedException {
+ DatanodeBlockID datanodeBlockID = getDatanodeBlockID(
+ blockID, replicationIndex, storageType);
WriteChunkRequestProto.Builder writeChunkRequest =
WriteChunkRequestProto.newBuilder()
- .setBlockID(DatanodeBlockID.newBuilder()
- .setContainerID(blockID.getContainerID())
- .setLocalID(blockID.getLocalID())
- .setBlockCommitSequenceId(blockID.getBlockCommitSequenceId())
- .setReplicaIndex(replicationIndex)
- .build())
+ .setBlockID(datanodeBlockID)
.setChunkData(chunk)
.setData(data);
if (blockData != null) {
@@ -477,18 +479,23 @@ public static XceiverClientReply writeChunkAsync(
* using a single RPC. This API is designed to be used for files which are
* smaller than 1 MB.
*
- * @param client - client that communicates with the container.
- * @param blockID - ID of the block
- * @param data - Data to be written into the container.
- * @param token a token for this block (may be null)
+ * @param client - client that communicates with the container.
+ * @param blockID - ID of the block
+ * @param data - Data to be written into the container.
+ * @param token a token for this block (may be null)
+ * @param storageType - the type of storage that is required, if the
storageType
+ * is null, any storageType will be considered.
* @return container protocol writeSmallFile response
*/
public static PutSmallFileResponseProto writeSmallFile(
XceiverClientSpi client, BlockID blockID, byte[] data,
- Token<OzoneBlockTokenIdentifier> token) throws IOException {
+ Token<OzoneBlockTokenIdentifier> token,
+ HddsProtos.StorageTypeProto storageType) throws IOException {
+ DatanodeBlockID datanodeBlockID = getDatanodeBlockID(
+ blockID, null, storageType);
BlockData containerBlockData =
- BlockData.newBuilder().setBlockID(blockID.getDatanodeBlockIDProtobuf())
+ BlockData.newBuilder().setBlockID(datanodeBlockID)
.build();
PutBlockRequestProto.Builder createBlockRequest =
PutBlockRequestProto.newBuilder()
@@ -509,10 +516,10 @@ public static PutSmallFileResponseProto writeSmallFile(
.setChecksumData(checksumData.getProtoBufMessage())
.build();
- PutSmallFileRequestProto putSmallFileRequest =
+ PutSmallFileRequestProto.Builder putSmallFileBuilder =
PutSmallFileRequestProto.newBuilder().setChunkInfo(chunk)
- .setBlock(createBlockRequest).setData(ByteString.copyFrom(data))
- .build();
+ .setBlock(createBlockRequest)
+ .setData(ByteString.copyFrom(data));
String id = client.getPipeline().getFirstNode().getUuidString();
ContainerCommandRequestProto.Builder builder =
@@ -520,7 +527,7 @@ public static PutSmallFileResponseProto writeSmallFile(
.setCmdType(Type.PutSmallFile)
.setContainerID(blockID.getContainerID())
.setDatanodeUuid(id)
- .setPutSmallFile(putSmallFileRequest);
+ .setPutSmallFile(putSmallFileBuilder);
if (token != null) {
builder.setEncodedToken(token.encodeToUrlString());
}
@@ -573,6 +580,7 @@ public static void createContainer(XceiverClientSpi client,
throws IOException {
ContainerProtos.CreateContainerRequestProto.Builder createRequest =
ContainerProtos.CreateContainerRequestProto.newBuilder();
+ // TODO StoragePolicy Support createContainer Command
createRequest
.setContainerType(ContainerProtos.ContainerType.KeyValueContainer);
if (state != null) {
@@ -937,4 +945,20 @@ static DatanodeBlockID getDatanodeBlockID(BlockID blockID,
DatanodeDetails datan
}
return b.build();
}
+
+ private static DatanodeBlockID getDatanodeBlockID(BlockID blockID,
+ Integer replicationIndex, HddsProtos.StorageTypeProto storageType) {
+ DatanodeBlockID.Builder blockIDBuilder = DatanodeBlockID.newBuilder()
+ .setContainerID(blockID.getContainerID())
+ .setLocalID(blockID.getLocalID())
+ .setBlockCommitSequenceId(blockID.getBlockCommitSequenceId());
+ if (replicationIndex != null) {
+ blockIDBuilder.setReplicaIndex(replicationIndex);
+ }
+ if (storageType != null) {
+ blockIDBuilder.setStorageTypeID(
+ StorageTypeUtils.getIDFromProtobuf(storageType));
+ }
+ return blockIDBuilder.build();
+ }
}
diff --git
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/impl/ContainerData.java
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/impl/ContainerData.java
index 5e6bba1189a..1d9c1f0ef20 100644
---
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/impl/ContainerData.java
+++
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/impl/ContainerData.java
@@ -292,6 +292,7 @@ public void setStorageType(StorageType type) {
storageType = type;
}
+ @Nullable
public StorageType getStorageType() {
return storageType;
}
diff --git
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/impl/HddsDispatcher.java
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/impl/HddsDispatcher.java
index a109c02e5a1..a095b7d2a28 100644
---
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/impl/HddsDispatcher.java
+++
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/impl/HddsDispatcher.java
@@ -45,6 +45,7 @@
import
org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.ContainerDataProto;
import
org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.ContainerDataProto.State;
import
org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.ContainerType;
+import
org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.DatanodeBlockID;
import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.Result;
import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.Type;
import
org.apache.hadoop.hdds.protocol.proto.StorageContainerDatanodeProtocolProtos.ContainerAction;
@@ -499,16 +500,28 @@ ContainerCommandResponseProto createContainer(
createRequest.setContainerType(containerType);
if (containerRequest.hasWriteChunk()) {
- createRequest.setReplicaIndex(
- containerRequest.getWriteChunk().getBlockID().getReplicaIndex());
+ DatanodeBlockID blockID = containerRequest.getWriteChunk().getBlockID();
+ createRequest.setReplicaIndex(blockID.getReplicaIndex());
+ if (blockID.hasStorageTypeID() && blockID.getStorageTypeID() > 0) {
+ createRequest.setStorageTypeID(blockID.getStorageTypeID());
+ }
}
if (containerRequest.hasPutBlock()) {
- createRequest.setReplicaIndex(
- containerRequest.getPutBlock().getBlockData().getBlockID()
- .getReplicaIndex());
+ DatanodeBlockID blockID =
containerRequest.getPutBlock().getBlockData().getBlockID();
+ createRequest.setReplicaIndex(blockID.getReplicaIndex());
+ if (blockID.hasStorageTypeID() && blockID.getStorageTypeID() > 0) {
+ createRequest.setStorageTypeID(blockID.getStorageTypeID());
+ }
}
+ if (containerRequest.hasPutSmallFile()) {
+ // PutSmallFile Not support EC yet
+ DatanodeBlockID blockID =
containerRequest.getPutSmallFile().getBlock().getBlockData().getBlockID();
+ if (blockID.hasStorageTypeID() && blockID.getStorageTypeID() > 0) {
+ createRequest.setStorageTypeID(blockID.getStorageTypeID());
+ }
+ }
ContainerCommandRequestProto.Builder requestBuilder =
ContainerCommandRequestProto.newBuilder()
.setCmdType(Type.CreateContainer)
diff --git
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/interfaces/Container.java
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/interfaces/Container.java
index ddb7de4140b..07d5db708c3 100644
---
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/interfaces/Container.java
+++
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/interfaces/Container.java
@@ -40,23 +40,13 @@
*/
public interface Container<CONTAINERDATA extends ContainerData> {
- /**
- * Creates a container.
- *
- * @throws StorageContainerException
- */
- void create(VolumeSet volumeSet, VolumeChoosingPolicy volumeChoosingPolicy,
- String scmId) throws StorageContainerException;
-
/**
* Creates a container and optionally constrains the destination volume to a
* specific storage type.
*/
- default void create(VolumeSet volumeSet,
+ void create(VolumeSet volumeSet,
VolumeChoosingPolicy volumeChoosingPolicy, String scmId,
- StorageType storageType) throws StorageContainerException {
- create(volumeSet, volumeChoosingPolicy, scmId);
- }
+ StorageType storageType) throws StorageContainerException;
/**
* Deletes the container.
diff --git
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/interfaces/VolumeChoosingPolicy.java
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/interfaces/VolumeChoosingPolicy.java
index 63d9dccc74b..0e80787510b 100644
---
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/interfaces/VolumeChoosingPolicy.java
+++
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/interfaces/VolumeChoosingPolicy.java
@@ -17,6 +17,7 @@
package org.apache.hadoop.ozone.container.common.interfaces;
+import jakarta.annotation.Nullable;
import java.io.IOException;
import java.util.List;
import org.apache.hadoop.fs.StorageType;
@@ -29,22 +30,6 @@
@InterfaceAudience.Private
public interface VolumeChoosingPolicy {
- /**
- * Choose a volume to place a container,
- * given a list of volumes and the max container size sought for storage.
- *
- * The implementations of this interface must be thread-safe.
- *
- * @param volumes - a list of available volumes.
- * @param maxContainerSize - the maximum size of the container for which a
- * volume is sought.
- * @return the chosen volume.
- * @throws IOException when disks are unavailable or are full.
- */
- @Deprecated
- HddsVolume chooseVolume(List<HddsVolume> volumes, long maxContainerSize)
- throws IOException;
-
/**
* Choose a volume to place a container, optionally constraining the choice
* to a specific storage type.
@@ -57,6 +42,6 @@ HddsVolume chooseVolume(List<HddsVolume> volumes, long
maxContainerSize)
* @return the chosen volume.
* @throws IOException when disks are unavailable or are full.
*/
- HddsVolume chooseVolume(List<HddsVolume> volumes,
- long maxContainerSize, StorageType storageType) throws IOException;
+ HddsVolume chooseVolume(List<HddsVolume> volumes, long maxContainerSize,
+ @Nullable StorageType storageType) throws IOException;
}
diff --git
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/AbstractStorageTypeChoosingPolicy.java
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/AbstractStorageTypeChoosingPolicy.java
index d73ab885e5f..5a013892760 100644
---
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/AbstractStorageTypeChoosingPolicy.java
+++
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/AbstractStorageTypeChoosingPolicy.java
@@ -31,12 +31,6 @@ public abstract class AbstractStorageTypeChoosingPolicy
@Override
@Deprecated
- public HddsVolume chooseVolume(List<HddsVolume> volumes,
- long maxContainerSize) throws IOException {
- return chooseVolume(volumes, maxContainerSize, null);
- }
-
- @Override
public HddsVolume chooseVolume(List<HddsVolume> volumes,
long maxContainerSize, StorageType storageType) throws IOException {
List<HddsVolume> candidates = volumes;
diff --git
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/KeyValueContainer.java
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/KeyValueContainer.java
index 727d7d14705..640d81df8ed 100644
---
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/KeyValueContainer.java
+++
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/KeyValueContainer.java
@@ -146,13 +146,6 @@ public void setCheckChunksFilePath(boolean
bCheckChunksDirFilePath) {
this.bCheckChunksFilePath = bCheckChunksDirFilePath;
}
- @Override
- @Deprecated
- public void create(VolumeSet volumeSet, VolumeChoosingPolicy
- volumeChoosingPolicy, String clusterId) throws StorageContainerException
{
- create(volumeSet, volumeChoosingPolicy, clusterId, null);
- }
-
@Override
public void create(VolumeSet volumeSet, VolumeChoosingPolicy
volumeChoosingPolicy, String clusterId, StorageType storageType)
@@ -172,11 +165,7 @@ public void create(VolumeSet volumeSet,
VolumeChoosingPolicy
HddsVolume containerVolume;
String hddsVolumeDir;
try {
- // TODO Use the `chooseVolume` that supports `storageType`
- containerVolume = storageType == null
- ? volumeChoosingPolicy.chooseVolume(volumes, maxSize)
- : volumeChoosingPolicy.chooseVolume(
- volumes, maxSize, storageType);
+ containerVolume = volumeChoosingPolicy.chooseVolume(volumes,
maxSize, storageType);
hddsVolumeDir = containerVolume.getHddsRootDir().toString();
// Set volume before getContainerDBFile(), because we may need the
// volume to deduce the db file.
@@ -186,10 +175,12 @@ public void create(VolumeSet volumeSet,
VolumeChoosingPolicy
containerData.setCommittedSpace(true);
} catch (DiskOutOfSpaceException ex) {
throw new StorageContainerException("Container creation failed, " +
- "due to disk out of space", ex, DISK_OUT_OF_SPACE);
+ "due to disk out of space" + storageTypeMessage(storageType),
+ ex, DISK_OUT_OF_SPACE);
} catch (IOException ex) {
throw new StorageContainerException(
- "Container creation failed. " + ex.getMessage(), ex,
+ "Container creation failed" + storageTypeMessage(storageType) +
+ ". " + ex.getMessage(), ex,
CONTAINER_INTERNAL_ERROR);
}
@@ -353,6 +344,10 @@ private void updateContainerFile(File containerFile)
writeToContainerFile(containerFile, false);
}
+ private static String storageTypeMessage(StorageType storageType) {
+ return storageType == null ? "" : " on StorageType: " + storageType;
+ }
+
@Override
public void delete() throws StorageContainerException {
try {
diff --git
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/KeyValueHandler.java
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/KeyValueHandler.java
index 6f93bcef4fd..bf7346014f9 100644
---
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/KeyValueHandler.java
+++
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/KeyValueHandler.java
@@ -94,8 +94,10 @@
import java.util.function.Function;
import java.util.stream.Collectors;
import org.apache.hadoop.fs.FileUtil;
+import org.apache.hadoop.fs.StorageType;
import org.apache.hadoop.hdds.HddsUtils;
import org.apache.hadoop.hdds.client.BlockID;
+import org.apache.hadoop.hdds.client.StorageTypeUtils;
import org.apache.hadoop.hdds.conf.ConfigurationSource;
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
import org.apache.hadoop.hdds.conf.StorageUnit;
@@ -469,6 +471,18 @@ ContainerCommandResponseProto handleCreateContainer(
}
newContainerData.setReplicaIndex(request.getCreateContainer()
.getReplicaIndex());
+ StorageType storageType = null;
+ if (request.getCreateContainer().hasStorageTypeID()) {
+ try {
+ storageType = StorageTypeUtils.getStorageTypeFromID(
+ request.getCreateContainer().getStorageTypeID());
+ } catch (IllegalArgumentException ex) {
+ return ContainerUtils.logAndReturnError(LOG,
+ new StorageContainerException(ex.getMessage(), ex,
+ INVALID_ARGUMENT), request);
+ }
+ }
+ newContainerData.setStorageType(storageType);
// TODO: Add support to add metadataList to ContainerData. Add metadata
// to container during creation.
@@ -480,7 +494,7 @@ ContainerCommandResponseProto handleCreateContainer(
containerIdLock.lock();
try {
if (containerSet.getContainer(containerID) == null) {
- newContainer.create(volumeSet, volumeChoosingPolicy, clusterId);
+ newContainer.create(volumeSet, volumeChoosingPolicy, clusterId,
storageType);
if (RECOVERING == newContainer.getContainerState()) {
created =
containerSet.addContainerByOverwriteMissingContainer(newContainer);
} else {
@@ -515,6 +529,7 @@ private void populateContainerPathFields(KeyValueContainer
container,
HddsVolume hddsVolume) throws IOException {
volumeSet.readLock();
try {
+ // TODO StoragePolicy Check whether need to adapt storageType
String idDir = VersionedDatanodeFeatures.ScmHA.chooseContainerPathID(
hddsVolume, clusterId);
container.populatePathFields(idDir, hddsVolume);
@@ -541,7 +556,6 @@ ContainerCommandResponseProto handleReadContainer(
request, containerData.getProtoBufMessage());
}
-
/**
* Handles Update Container Request. If successful, the container metadata
* is updated.
diff --git
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/replication/ContainerImporter.java
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/replication/ContainerImporter.java
index 7b42006b229..682e119c553 100644
---
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/replication/ContainerImporter.java
+++
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/replication/ContainerImporter.java
@@ -149,9 +149,11 @@ private static void deleteFileQuietely(Path tarFilePath) {
HddsVolume chooseNextVolume(long spaceToReserve) throws IOException {
// Choose volume that can hold both container in tmp and dest directory
LOG.debug("Choosing volume to reserve space : {}", spaceToReserve);
+ // TODO: Use the target container storage type once replication/import
+ // requests carry it. Null preserves the existing any-volume behavior.
return volumeChoosingPolicy.chooseVolume(
StorageVolumeUtil.getHddsVolumesList(volumeSet.getVolumesList()),
- spaceToReserve);
+ spaceToReserve, null);
}
public static Path getUntarDirectory(HddsVolume hddsVolume)
diff --git
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/ContainerTestUtils.java
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/ContainerTestUtils.java
index bdef642204f..15c5884900f 100644
---
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/ContainerTestUtils.java
+++
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/ContainerTestUtils.java
@@ -36,6 +36,7 @@
import java.util.concurrent.atomic.AtomicLong;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.StorageUnit;
+import org.apache.hadoop.fs.StorageType;
import org.apache.hadoop.hdds.client.BlockID;
import org.apache.hadoop.hdds.conf.ConfigurationSource;
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
@@ -384,7 +385,7 @@ public static KeyValueContainer addContainerToVolumeDir(
KeyValueContainer container =
new KeyValueContainer(keyValueContainerData, conf);
- container.create(volume.getVolumeSet(), volumeChoosingPolicy, clusterId);
+ container.create(volume.getVolumeSet(), volumeChoosingPolicy, clusterId,
StorageType.DISK);
container.close();
diff --git
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/TestBlockDeletingService.java
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/TestBlockDeletingService.java
index 4f885961b27..996226c92bf 100644
---
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/TestBlockDeletingService.java
+++
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/TestBlockDeletingService.java
@@ -58,6 +58,7 @@
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import org.apache.commons.lang3.StringUtils;
+import org.apache.hadoop.fs.StorageType;
import org.apache.hadoop.hdds.HddsConfigKeys;
import org.apache.hadoop.hdds.client.BlockID;
import org.apache.hadoop.hdds.conf.ConfigurationSource;
@@ -189,7 +190,7 @@ private KeyValueContainerData
createToDeleteBlocks(ContainerSet containerSet,
data.setSchemaVersion(schemaVersion);
KeyValueContainer container = new KeyValueContainer(data, conf);
container.create(volumeSet,
- new RoundRobinVolumeChoosingPolicy(), scmId);
+ new RoundRobinVolumeChoosingPolicy(), scmId, StorageType.DISK);
containerSet.addContainer(container);
data = (KeyValueContainerData) containerSet.getContainer(
containerID).getContainerData();
diff --git
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/TestSchemaTwoBackwardsCompatibility.java
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/TestSchemaTwoBackwardsCompatibility.java
index 1bdac646b73..a1b32ac15bd 100644
---
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/TestSchemaTwoBackwardsCompatibility.java
+++
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/TestSchemaTwoBackwardsCompatibility.java
@@ -37,6 +37,7 @@
import java.util.List;
import java.util.UUID;
import java.util.concurrent.TimeoutException;
+import org.apache.hadoop.fs.StorageType;
import org.apache.hadoop.hdds.HddsConfigKeys;
import org.apache.hadoop.hdds.client.BlockID;
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
@@ -272,7 +273,7 @@ private KeyValueContainer createTestContainer() throws
IOException {
cData.setSchemaVersion(OzoneConsts.SCHEMA_V2);
KeyValueContainer container = new KeyValueContainer(cData, conf);
container.create(volumeSet, new RoundRobinVolumeChoosingPolicy(),
- clusterID);
+ clusterID, StorageType.DISK);
// populate with some blocks
// metadata will be updated here, too
diff --git
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/TestStaleRecoveringContainerScrubbingService.java
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/TestStaleRecoveringContainerScrubbingService.java
index a21813956f5..a0064de6884 100644
---
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/TestStaleRecoveringContainerScrubbingService.java
+++
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/TestStaleRecoveringContainerScrubbingService.java
@@ -24,6 +24,7 @@
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.anyList;
import static org.mockito.Mockito.anyLong;
+import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -42,6 +43,7 @@
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import org.apache.hadoop.conf.StorageUnit;
+import org.apache.hadoop.fs.StorageType;
import org.apache.hadoop.hdds.HddsConfigKeys;
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos;
@@ -103,7 +105,7 @@ private void init() throws IOException {
volumeSet = mock(MutableVolumeSet.class);
volumeChoosingPolicy = mock(RoundRobinVolumeChoosingPolicy.class);
- when(volumeChoosingPolicy.chooseVolume(anyList(), anyLong()))
+ when(volumeChoosingPolicy.chooseVolume(anyList(), anyLong(),
eq(StorageType.DISK)))
.thenReturn(hddsVolume);
}
@@ -133,7 +135,7 @@ private List<Long> createTestContainers(
new KeyValueContainer(recoveringContainerData,
conf);
recoveringKeyValueContainer.create(
- volumeSet, volumeChoosingPolicy, clusterID);
+ volumeSet, volumeChoosingPolicy, clusterID, StorageType.DISK);
containerSet.addContainer(recoveringKeyValueContainer);
createdIds.add((long) containerIdNum);
}
diff --git
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/impl/TestContainerPersistence.java
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/impl/TestContainerPersistence.java
index 0498d849961..c2c2f1b7e89 100644
---
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/impl/TestContainerPersistence.java
+++
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/impl/TestContainerPersistence.java
@@ -52,6 +52,7 @@
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
import org.apache.commons.io.FileUtils;
+import org.apache.hadoop.fs.StorageType;
import org.apache.hadoop.hdds.client.BlockID;
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos;
@@ -205,7 +206,7 @@ private KeyValueContainer addContainer(ContainerSet cSet,
long cID)
KeyValueContainer container = new KeyValueContainer(data, conf);
commitBytesBefore =
StorageVolumeUtil.getHddsVolumesList(volumeSet.getVolumesList()).get(0).getCommittedBytes();
- container.create(volumeSet, volumeChoosingPolicy, SCM_ID);
+ container.create(volumeSet, volumeChoosingPolicy, SCM_ID,
StorageType.DISK);
cSet.addContainer(container);
commitBytesAfter = container.getContainerData()
diff --git
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/impl/TestHddsDispatcher.java
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/impl/TestHddsDispatcher.java
index da84d23d3e5..8dc29deb52a 100644
---
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/impl/TestHddsDispatcher.java
+++
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/impl/TestHddsDispatcher.java
@@ -19,6 +19,7 @@
import static java.nio.charset.StandardCharsets.UTF_8;
import static org.apache.hadoop.hdds.fs.MockSpaceUsagePersistence.inMemory;
+import static
org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.Result.DISK_OUT_OF_SPACE;
import static org.apache.hadoop.hdds.scm.ScmConfigKeys.HDDS_DATANODE_DIR_KEY;
import static
org.apache.hadoop.hdds.scm.protocolPB.ContainerCommandResponseBuilders.getContainerCommandResponse;
import static
org.apache.hadoop.ozone.container.common.ContainerTestUtils.COMMIT_STAGE;
@@ -40,10 +41,13 @@
import com.google.common.collect.Maps;
import java.io.File;
import java.io.IOException;
+import java.nio.file.Files;
import java.nio.file.Path;
import java.time.Duration;
+import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -51,6 +55,7 @@
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.RandomUtils;
import org.apache.hadoop.conf.StorageUnit;
+import org.apache.hadoop.fs.StorageType;
import org.apache.hadoop.hdds.client.BlockID;
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
import org.apache.hadoop.hdds.fs.MockSpaceUsageCheckFactory;
@@ -64,7 +69,9 @@
import
org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.ContainerCommandResponseProto;
import
org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.ContainerType;
import
org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.WriteChunkRequestProto;
+import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
import
org.apache.hadoop.hdds.protocol.proto.StorageContainerDatanodeProtocolProtos.ContainerAction;
+import org.apache.hadoop.hdds.scm.ScmConfigKeys;
import
org.apache.hadoop.hdds.scm.container.common.helpers.StorageContainerException;
import org.apache.hadoop.hdds.security.token.TokenVerifier;
import org.apache.hadoop.ozone.OzoneConfigKeys;
@@ -167,9 +174,9 @@ public void testContainerCloseActionWhenFull(
StorageVolumeUtil.getHddsVolumesList(volumeSet.getVolumesList())
.forEach(hddsVolume -> hddsVolume.setDbParentDir(tempDir.toFile()));
container.create(volumeSet, new RoundRobinVolumeChoosingPolicy(),
- scmId.toString());
+ scmId.toString(), StorageType.DISK);
container2.create(volumeSet, new RoundRobinVolumeChoosingPolicy(),
- scmId.toString());
+ scmId.toString(), StorageType.DISK);
containerSet.addContainer(container);
containerSet.addContainer(container2);
ContainerMetrics metrics = ContainerMetrics.create(conf);
@@ -185,7 +192,7 @@ public void testContainerCloseActionWhenFull(
conf, containerSet, volumeSet, handlers, context, metrics, null);
hddsDispatcher.setClusterId(scmId.toString());
ContainerCommandResponseProto responseOne = hddsDispatcher
- .dispatch(getWriteChunkRequest(dd.getUuidString(), 1L, 1L), null);
+ .dispatch(getWriteChunkRequest(dd.getUuidString(), 1L, 1L, null),
null);
assertEquals(ContainerProtos.Result.SUCCESS,
responseOne.getResult());
verify(context, times(0))
@@ -196,9 +203,9 @@ public void testContainerCloseActionWhenFull(
containerData2.getStatistics().setBlockBytesForTesting(Double.valueOf(
StorageUnit.MB.toBytes(950)).longValue());
ContainerCommandResponseProto responseTwo = hddsDispatcher
- .dispatch(getWriteChunkRequest(dd.getUuidString(), 1L, 2L), null);
+ .dispatch(getWriteChunkRequest(dd.getUuidString(), 1L, 2L, null),
null);
ContainerCommandResponseProto responseThree = hddsDispatcher
- .dispatch(getWriteChunkRequest(dd.getUuidString(), 2L, 1L), null);
+ .dispatch(getWriteChunkRequest(dd.getUuidString(), 2L, 1L, null),
null);
assertEquals(ContainerProtos.Result.SUCCESS,
responseTwo.getResult());
assertEquals(ContainerProtos.Result.SUCCESS, responseThree.getResult());
@@ -211,7 +218,7 @@ public void testContainerCloseActionWhenFull(
// if we write again to container 1, the container action should get
added but heartbeat should not get triggered
// again because of throttling
- hddsDispatcher.dispatch(getWriteChunkRequest(dd.getUuidString(), 1L,
3L), null);
+ hddsDispatcher.dispatch(getWriteChunkRequest(dd.getUuidString(), 1L, 3L,
null), null);
verify(context,
times(3)).addContainerActionIfAbsent(any(ContainerAction.class));
verify(stateMachine, times(2)).triggerHeartbeat(); // was called twice
before
} finally {
@@ -326,7 +333,7 @@ public void testContainerCloseActionWhenVolumeFull(
StorageVolumeUtil.getHddsVolumesList(volumeSet.getVolumesList())
.forEach(hddsVolume -> hddsVolume.setDbParentDir(tempDir.toFile()));
container.create(volumeSet, new RoundRobinVolumeChoosingPolicy(),
- scmId.toString());
+ scmId.toString(), StorageType.DISK);
containerSet.addContainer(container);
ContainerMetrics metrics = ContainerMetrics.create(conf);
Map<ContainerType, Handler> handlers = Maps.newHashMap();
@@ -343,15 +350,15 @@ public void testContainerCloseActionWhenVolumeFull(
containerData.getVolume().incrementUsedSpace(60);
usedSpace.addAndGet(60);
ContainerCommandResponseProto response = hddsDispatcher
- .dispatch(getWriteChunkRequest(dd.getUuidString(), 1L, 1L), null);
- assertEquals(ContainerProtos.Result.DISK_OUT_OF_SPACE,
response.getResult());
+ .dispatch(getWriteChunkRequest(dd.getUuidString(), 1L, 1L, null),
null);
+ assertEquals(DISK_OUT_OF_SPACE, response.getResult());
verify(context, times(1))
.addContainerActionIfAbsent(any(ContainerAction.class));
// verify that immediate heartbeat is triggered
verify(stateMachine, times(1)).triggerHeartbeat();
// the volume has reached the min free space boundary but this time the
heartbeat should not be triggered because
// of throttling
- hddsDispatcher.dispatch(getWriteChunkRequest(dd.getUuidString(), 1L,
2L), null);
+ hddsDispatcher.dispatch(getWriteChunkRequest(dd.getUuidString(), 1L, 2L,
null), null);
verify(context,
times(2)).addContainerActionIfAbsent(any(ContainerAction.class));
verify(stateMachine, times(1)).triggerHeartbeat(); // was called once
before
@@ -366,8 +373,8 @@ public void testContainerCloseActionWhenVolumeFull(
StorageContainerException scException =
assertThrows(StorageContainerException.class,
() -> container2.create(volumeSet,
- new RoundRobinVolumeChoosingPolicy(), scmId.toString()));
- assertEquals("Container creation failed, due to disk out of space",
+ new RoundRobinVolumeChoosingPolicy(), scmId.toString(),
StorageType.DISK));
+ assertEquals("Container creation failed, due to disk out of space on
StorageType: DISK",
scException.getMessage());
} finally {
volumeSet.shutdown();
@@ -386,7 +393,7 @@ public void testCreateContainerWithWriteChunk() throws
IOException {
DatanodeDetails dd = randomDatanodeDetails();
HddsDispatcher hddsDispatcher = createDispatcher(dd, scmId, conf);
ContainerCommandRequestProto writeChunkRequest =
- getWriteChunkRequest(dd.getUuidString(), 1L, 1L);
+ getWriteChunkRequest(dd.getUuidString(), 1L, 1L, null);
// send read chunk request and make sure container does not exist
ContainerCommandResponseProto response =
hddsDispatcher.dispatch(getReadChunkRequest(writeChunkRequest),
null);
@@ -428,6 +435,151 @@ public void testCreateContainerWithWriteChunk() throws
IOException {
}
}
+ @Test
+ public void testCreateContainerWithWriteChunkWithStorageType() throws
IOException {
+ int volumeNum = 2;
+ // Create two volume one is SSD volume another is DISK volume
+ StringBuilder hddsDirs = new StringBuilder();
+ File ssdVolume = Files.createTempDirectory(tempDir, "ssd").toFile();
+ File diskVolume = Files.createTempDirectory(tempDir, "disk").toFile();
+
hddsDirs.append("[SSD]").append(ssdVolume).append(',').append("[DISK]").append(diskVolume);
+ UUID scmId = UUID.randomUUID();
+ OzoneConfiguration conf = new OzoneConfiguration();
+ conf.set(ScmConfigKeys.HDDS_DATANODE_DIR_KEY, hddsDirs.toString());
+ DatanodeDetails dd = randomDatanodeDetails();
+ HddsDispatcher dispatcher = createDispatcher(dd, scmId, conf);
+ long containerID = 1L;
+ long localId = 1L;
+
+ ContainerCommandRequestProto writeSSDChunkReq1 =
+ getWriteChunkRequest(dd.getUuidString(), containerID++, localId++,
HddsProtos.StorageTypeProto.SSD);
+ ContainerCommandRequestProto writeSSDChunkReq2 =
+ getWriteChunkRequest(dd.getUuidString(), containerID++, localId++,
HddsProtos.StorageTypeProto.SSD);
+ ContainerCommandRequestProto writeDISKChunkReq1 =
+ getWriteChunkRequest(dd.getUuidString(), containerID++, localId++,
HddsProtos.StorageTypeProto.DISK);
+ ContainerCommandRequestProto writeDISKChunkReq2 =
+ getWriteChunkRequest(dd.getUuidString(), containerID++, localId++,
HddsProtos.StorageTypeProto.DISK);
+
+ assertContainerDoNotExist(dispatcher, writeSSDChunkReq1);
+ assertContainerDoNotExist(dispatcher, writeSSDChunkReq2);
+ assertContainerDoNotExist(dispatcher, writeDISKChunkReq1);
+ assertContainerDoNotExist(dispatcher, writeDISKChunkReq2);
+
+ assertContainerCreateAtSpecificVolume(dispatcher, writeSSDChunkReq1,
Collections.singletonList(ssdVolume));
+ assertContainerCreateAtSpecificVolume(dispatcher, writeSSDChunkReq2,
Collections.singletonList(ssdVolume));
+ assertContainerCreateAtSpecificVolume(dispatcher, writeDISKChunkReq1,
Collections.singletonList(diskVolume));
+ assertContainerCreateAtSpecificVolume(dispatcher, writeDISKChunkReq2,
Collections.singletonList(diskVolume));
+
+ // Except the DISK and SSD volume, cannot create Container on other
StorageType Volume,
+ // because there is no other StorageType Volume
+ ContainerCommandRequestProto writeToRAMDISKChunkRequest =
+ getWriteChunkRequest(dd.getUuidString(), containerID++, localId++,
HddsProtos.StorageTypeProto.RAM_DISK);
+ assertContainerDoNotExist(dispatcher, writeToRAMDISKChunkRequest);
+ ContainerCommandResponseProto response =
dispatcher.dispatch(writeToRAMDISKChunkRequest, null);
+ assertEquals(DISK_OUT_OF_SPACE, response.getResult());
+
+ // If set the StorageType to null, then the Container can be created on
any StorageType Volume
+ ContainerCommandRequestProto writeAnyStorageTypeChunkRequest1 =
+ getWriteChunkRequest(dd.getUuidString(), containerID++, localId++,
null);
+ ContainerCommandRequestProto writeAnyStorageTypeChunkRequest2 =
+ getWriteChunkRequest(dd.getUuidString(), containerID++, localId++,
null);
+ ContainerCommandRequestProto writeAnyStorageTypeChunkRequest3 =
+ getWriteChunkRequest(dd.getUuidString(), containerID++, localId++,
null);
+ ContainerCommandRequestProto writeAnyStorageTypeChunkRequest4 =
+ getWriteChunkRequest(dd.getUuidString(), containerID++, localId++,
null);
+
+ assertContainerCreateAtSpecificVolume(dispatcher,
writeAnyStorageTypeChunkRequest1,
+ Arrays.asList(ssdVolume, diskVolume));
+ assertContainerCreateAtSpecificVolume(dispatcher,
writeAnyStorageTypeChunkRequest2,
+ Arrays.asList(ssdVolume, diskVolume));
+ assertContainerCreateAtSpecificVolume(dispatcher,
writeAnyStorageTypeChunkRequest3,
+ Arrays.asList(ssdVolume, diskVolume));
+ assertContainerCreateAtSpecificVolume(dispatcher,
writeAnyStorageTypeChunkRequest4,
+ Arrays.asList(ssdVolume, diskVolume));
+ }
+
+ @Test
+ public void testCreateContainerWithPutSmallFileWithStorageType() throws
IOException {
+ StringBuilder hddsDirs = new StringBuilder();
+ File ssdVolume = Files.createTempDirectory(tempDir, "ssd").toFile();
+ File diskVolume = Files.createTempDirectory(tempDir, "disk").toFile();
+
hddsDirs.append("[SSD]").append(ssdVolume).append(',').append("[DISK]").append(diskVolume);
+ OzoneConfiguration conf = new OzoneConfiguration();
+ conf.set(ScmConfigKeys.HDDS_DATANODE_DIR_KEY, hddsDirs.toString());
+ HddsDispatcher dispatcher = createDispatcher(randomDatanodeDetails(),
UUID.randomUUID(), conf);
+ long containerID = 1L;
+ long localId = 1L;
+
+ ContainerCommandRequestProto putSmallFileToSSD =
+ newPutSmallFile(containerID++, localId++,
HddsProtos.StorageTypeProto.SSD);
+ ContainerCommandRequestProto putSmallFileToDISK =
+ newPutSmallFile(containerID++, localId++,
HddsProtos.StorageTypeProto.DISK);
+ ContainerCommandRequestProto putSmallFileToRAMDISK =
+ newPutSmallFile(containerID++, localId++,
HddsProtos.StorageTypeProto.RAM_DISK);
+
+ assertContainerDoNotExist(dispatcher, putSmallFileToSSD);
+ assertContainerDoNotExist(dispatcher, putSmallFileToDISK);
+ assertContainerDoNotExist(dispatcher, putSmallFileToRAMDISK);
+
+ assertContainerCreateAtSpecificVolume(dispatcher, putSmallFileToSSD,
+ Collections.singletonList(ssdVolume));
+ assertContainerCreateAtSpecificVolume(dispatcher, putSmallFileToDISK,
+ Collections.singletonList(diskVolume));
+
+ ContainerCommandResponseProto response =
dispatcher.dispatch(putSmallFileToRAMDISK, null);
+ assertEquals(DISK_OUT_OF_SPACE, response.getResult());
+ }
+
+ @Test
+ public void testCreateContainerRejectsInvalidStorageType() throws
IOException {
+ File diskVolume = Files.createTempDirectory(tempDir, "disk").toFile();
+ OzoneConfiguration conf = new OzoneConfiguration();
+ conf.set(ScmConfigKeys.HDDS_DATANODE_DIR_KEY,
diskVolume.getAbsolutePath());
+ DatanodeDetails dd = randomDatanodeDetails();
+ HddsDispatcher dispatcher = createDispatcher(dd, UUID.randomUUID(), conf);
+
+ ContainerCommandRequestProto writeChunkRequest =
+ getWriteChunkRequest(dd.getUuidString(), 1L, 1L, null);
+ WriteChunkRequestProto writeChunk = writeChunkRequest.getWriteChunk();
+ ContainerCommandRequestProto requestWithInvalidStorageType =
+ writeChunkRequest.toBuilder()
+ .setWriteChunk(writeChunk.toBuilder()
+ .setBlockID(writeChunk.getBlockID().toBuilder()
+ .setStorageTypeID(999)))
+ .build();
+
+ ContainerCommandResponseProto response =
+ dispatcher.dispatch(requestWithInvalidStorageType, null);
+ assertEquals(ContainerProtos.Result.INVALID_ARGUMENT,
response.getResult());
+ }
+
+ private void assertContainerDoNotExist(HddsDispatcher hddsDispatcher,
+ ContainerCommandRequestProto request) {
+ ContainerCommandResponseProto response =
+ hddsDispatcher.dispatch(getReadContainerRequest(request), null);
+ assertEquals(response.getResult(),
+ ContainerProtos.Result.CONTAINER_NOT_FOUND);
+ }
+
+ private void assertContainerCreateAtSpecificVolume(HddsDispatcher
hddsDispatcher,
+ ContainerCommandRequestProto request, List<File> exceptionVolumePaths) {
+
+ // Send data command without sending create container.
+ ContainerCommandResponseProto response = hddsDispatcher.dispatch(request,
null);
+ // Container should be created as part of the data command.
+ assertEquals(ContainerProtos.Result.SUCCESS, response.getResult());
+
+ response = hddsDispatcher.dispatch(getReadContainerRequest(request), null);
+ assertEquals(ContainerProtos.Result.SUCCESS, response.getResult());
+
+ // Check if any of the exceptionVolumePaths match
+ String containerPath =
response.getReadContainer().getContainerData().getContainerPath();
+ boolean isMatched = exceptionVolumePaths.stream()
+ .anyMatch(path -> containerPath.startsWith(path.getAbsolutePath()));
+
+ assertTrue(isMatched);
+ }
+
@Test
public void testContainerNotFoundWithCommitChunk() throws IOException {
String testDirPath = testDir.getPath();
@@ -439,7 +591,7 @@ public void testContainerNotFoundWithCommitChunk() throws
IOException {
DatanodeDetails dd = randomDatanodeDetails();
HddsDispatcher hddsDispatcher = createDispatcher(dd, scmId, conf);
ContainerCommandRequestProto writeChunkRequest =
- getWriteChunkRequest(dd.getUuidString(), 1L, 1L);
+ getWriteChunkRequest(dd.getUuidString(), 1L, 1L, null);
// send read chunk request and make sure container does not exist
ContainerCommandResponseProto response =
@@ -473,12 +625,12 @@ public void testWriteChunkWithCreateContainerFailure()
throws IOException {
DatanodeDetails dd = randomDatanodeDetails();
HddsDispatcher hddsDispatcher = createDispatcher(dd, scmId, conf);
ContainerCommandRequestProto writeChunkRequest = getWriteChunkRequest(
- dd.getUuidString(), 1L, 1L);
+ dd.getUuidString(), 1L, 1L, null);
HddsDispatcher mockDispatcher = spy(hddsDispatcher);
ContainerCommandResponseProto.Builder builder =
getContainerCommandResponse(writeChunkRequest,
- ContainerProtos.Result.DISK_OUT_OF_SPACE, "");
+ DISK_OUT_OF_SPACE, "");
// Return DISK_OUT_OF_SPACE response when writing chunk
// with container creation.
doReturn(builder.build()).when(mockDispatcher)
@@ -509,7 +661,7 @@ public void
testCreateContainerWhenAlreadyExistsDoesNotMarkUnhealthy() throws IO
// Create container via WriteChunk
ContainerCommandRequestProto writeChunkRequest =
- getWriteChunkRequest(dd.getUuidString(), 1L, 1L);
+ getWriteChunkRequest(dd.getUuidString(), 1L, 1L, null);
ContainerCommandResponseProto initialResponse =
hddsDispatcher.dispatch(writeChunkRequest, null);
assertEquals(ContainerProtos.Result.SUCCESS,
initialResponse.getResult());
@@ -549,7 +701,7 @@ public void testDuplicateWriteChunkAndPutBlockRequest()
throws IOException {
DatanodeDetails dd = randomDatanodeDetails();
HddsDispatcher hddsDispatcher = createDispatcher(dd, scmId, conf);
ContainerCommandRequestProto writeChunkRequest = getWriteChunkRequest(
- dd.getUuidString(), 1L, 1L);
+ dd.getUuidString(), 1L, 1L, null);
//Send same WriteChunkRequest
ContainerCommandResponseProto response;
hddsDispatcher.dispatch(writeChunkRequest, null);
@@ -657,7 +809,7 @@ private static DatanodeDetails randomDatanodeDetails() {
}
private ContainerCommandRequestProto getWriteChunkRequest(
- String datanodeId, Long containerId, Long localId) {
+ String datanodeId, Long containerId, Long localId,
HddsProtos.StorageTypeProto storageType) {
ByteString data = ByteString.copyFrom(
UUID.randomUUID().toString().getBytes(UTF_8));
@@ -671,10 +823,16 @@ private ContainerCommandRequestProto getWriteChunkRequest(
.setChecksumData(Checksum.getNoChecksumDataProto())
.build();
+ ContainerProtos.DatanodeBlockID.Builder blockID =
+ new BlockID(containerId, localId).getDatanodeBlockIDProtobufBuilder();
+ // TODO: Pass the real storage type from the write path once that BlockID
support StorageType
+ if (storageType != null) {
+ blockID.setStorageTypeID(storageType.getNumber());
+ }
+
WriteChunkRequestProto.Builder writeChunkRequest = WriteChunkRequestProto
.newBuilder()
- .setBlockID(new BlockID(containerId, localId)
- .getDatanodeBlockIDProtobuf())
+ .setBlockID(blockID)
.setChunkData(chunk)
.setData(data);
@@ -728,15 +886,50 @@ private ContainerCommandRequestProto
getWriteChunkRequest0(
}
static ContainerCommandRequestProto newPutSmallFile(Long containerId, Long
localId) {
+ return newPutSmallFile(containerId, localId, null);
+ }
+
+ static ContainerCommandRequestProto newPutBlock(Long containerId, Long
localId,
+ HddsProtos.StorageTypeProto storageType) {
+ BlockID blockID = new BlockID(containerId, localId);
+ ContainerProtos.DatanodeBlockID.Builder datanodeBlockID =
+ blockID.getDatanodeBlockIDProtobuf().toBuilder();
+ if (storageType != null) {
+ datanodeBlockID.setStorageTypeID(storageType.getNumber());
+ }
+ ContainerProtos.BlockData.Builder blockData =
+ ContainerProtos.BlockData.newBuilder()
+ .setBlockID(datanodeBlockID);
+ return ContainerCommandRequestProto.newBuilder()
+ .setCmdType(ContainerProtos.Type.PutBlock)
+ .setContainerID(containerId)
+ .setDatanodeUuid(UUID.randomUUID().toString())
+ .setPutBlock(ContainerProtos.PutBlockRequestProto.newBuilder()
+ .setBlockData(blockData))
+ .build();
+ }
+
+ static ContainerCommandRequestProto newPutSmallFile(Long containerId, Long
localId,
+ HddsProtos.StorageTypeProto storageType) {
ByteString chunkData =
ByteString.copyFrom(RandomUtils.secure().randomBytes(32));
- return newPutSmallFile(new BlockID(containerId, localId), chunkData);
+ return newPutSmallFile(new BlockID(containerId, localId), chunkData,
storageType);
}
static ContainerCommandRequestProto newPutSmallFile(
BlockID blockID, ByteString data) {
+ return newPutSmallFile(blockID, data, null);
+ }
+
+ static ContainerCommandRequestProto newPutSmallFile(
+ BlockID blockID, ByteString data, HddsProtos.StorageTypeProto
storageType) {
+ ContainerProtos.DatanodeBlockID.Builder datanodeBlockID =
+ blockID.getDatanodeBlockIDProtobuf().toBuilder();
+ if (storageType != null) {
+ datanodeBlockID.setStorageTypeID(storageType.getNumber());
+ }
final ContainerProtos.BlockData.Builder blockData
= ContainerProtos.BlockData.newBuilder()
- .setBlockID(blockID.getDatanodeBlockIDProtobuf());
+ .setBlockID(datanodeBlockID);
final ContainerProtos.PutBlockRequestProto.Builder putBlockRequest
= ContainerProtos.PutBlockRequestProto.newBuilder()
.setBlockData(blockData);
@@ -789,6 +982,24 @@ private ContainerCommandRequestProto getReadChunkRequest(
.build();
}
+ /**
+ * Creates container read chunk request using input container write chunk
+ * request.
+ *
+ * @param writeChunkRequest - Input container write chunk request
+ * @return container read chunk request
+ */
+ private ContainerCommandRequestProto getReadContainerRequest(
+ ContainerCommandRequestProto request) {
+ return ContainerCommandRequestProto.newBuilder()
+ .setCmdType(ContainerProtos.Type.ReadContainer)
+ .setContainerID(request.getContainerID())
+ .setTraceID(request.getTraceID())
+ .setDatanodeUuid(request.getDatanodeUuid())
+
.setReadContainer(ContainerProtos.ReadContainerRequestProto.newBuilder())
+ .build();
+ }
+
@Test
public void testValidateToken() throws Exception {
try {
@@ -819,7 +1030,7 @@ public void verify(Token<?> token,
};
final ContainerCommandRequestProto request = getWriteChunkRequest(
- dd.getUuidString(), 1L, 1L);
+ dd.getUuidString(), 1L, 1L, HddsProtos.StorageTypeProto.DISK);
final HddsDispatcher dispatcher = createDispatcher(
dd, scmId, conf, tokenVerifier);
diff --git
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/volume/TestCapacityVolumeChoosingPolicy.java
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/volume/TestCapacityVolumeChoosingPolicy.java
index deae4f83951..161aef6cefa 100644
---
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/volume/TestCapacityVolumeChoosingPolicy.java
+++
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/volume/TestCapacityVolumeChoosingPolicy.java
@@ -29,6 +29,7 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import org.apache.hadoop.fs.StorageType;
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
import org.apache.hadoop.hdds.fs.MockSpaceUsageCheckFactory;
import org.apache.hadoop.hdds.fs.MockSpaceUsageSource;
@@ -113,7 +114,7 @@ public void testCapacityVolumeChoosingPolicy() throws
Exception {
// Test 1000 rounds of volume choosing
for (int i = 0; i < 1000; i++) {
- HddsVolume volume = policy.chooseVolume(volumes, 0);
+ HddsVolume volume = policy.chooseVolume(volumes, 0, StorageType.DISK);
chooseCount.put(volume, chooseCount.get(volume) + 1);
}
@@ -124,7 +125,7 @@ public void testCapacityVolumeChoosingPolicy() throws
Exception {
@Test
public void throwsDiskOutOfSpaceIfRequestMoreThanAvailable() {
Exception e = assertThrows(DiskOutOfSpaceException.class,
- () -> policy.chooseVolume(volumes, 500));
+ () -> policy.chooseVolume(volumes, 500, StorageType.DISK));
String msg = e.getMessage();
assertThat(msg)
@@ -155,7 +156,7 @@ public void testVolumeCommittedSpace() throws Exception {
volumes.forEach(vol ->
initialCommittedSpace.put(vol, vol.getCommittedBytes()));
- HddsVolume selectedVolume = policy.chooseVolume(volumes, 50);
+ HddsVolume selectedVolume = policy.chooseVolume(volumes, 50,
StorageType.DISK);
assertEquals(initialCommittedSpace.get(selectedVolume) + 50,
selectedVolume.getCommittedBytes());
diff --git
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/volume/TestRoundRobinVolumeChoosingPolicy.java
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/volume/TestRoundRobinVolumeChoosingPolicy.java
index 36fabff1fe8..e101b43eb41 100644
---
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/volume/TestRoundRobinVolumeChoosingPolicy.java
+++
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/volume/TestRoundRobinVolumeChoosingPolicy.java
@@ -28,6 +28,7 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import org.apache.hadoop.fs.StorageType;
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
import org.apache.hadoop.hdds.fs.MockSpaceUsageCheckFactory;
import org.apache.hadoop.hdds.fs.MockSpaceUsageSource;
@@ -96,21 +97,21 @@ public void testRRVolumeChoosingPolicy() throws Exception {
assertEquals(200L, hddsVolume2.getCurrentUsage().getAvailable());
// Test two rounds of round-robin choosing
- assertEquals(hddsVolume1, policy.chooseVolume(volumes, 0));
- assertEquals(hddsVolume2, policy.chooseVolume(volumes, 0));
- assertEquals(hddsVolume1, policy.chooseVolume(volumes, 0));
- assertEquals(hddsVolume2, policy.chooseVolume(volumes, 0));
+ assertEquals(hddsVolume1, policy.chooseVolume(volumes, 0,
StorageType.DISK));
+ assertEquals(hddsVolume2, policy.chooseVolume(volumes, 0,
StorageType.DISK));
+ assertEquals(hddsVolume1, policy.chooseVolume(volumes, 0,
StorageType.DISK));
+ assertEquals(hddsVolume2, policy.chooseVolume(volumes, 0,
StorageType.DISK));
// The first volume has only 100L space, so the policy should
// choose the second one in case we ask for more.
assertEquals(hddsVolume2,
- policy.chooseVolume(volumes, 120));
+ policy.chooseVolume(volumes, 120, StorageType.DISK));
}
@Test
public void throwsDiskOutOfSpaceIfRequestMoreThanAvailable() {
Exception e = assertThrows(DiskOutOfSpaceException.class,
- () -> policy.chooseVolume(volumes, 300));
+ () -> policy.chooseVolume(volumes, 300, StorageType.DISK));
String msg = e.getMessage();
assertThat(msg).contains("No volumes have enough space for a new
container. " +
@@ -123,7 +124,7 @@ public void testVolumeCommittedSpace() throws Exception {
volumes.forEach(vol ->
initialCommittedSpace.put(vol, vol.getCommittedBytes()));
- HddsVolume selectedVolume = policy.chooseVolume(volumes, 50);
+ HddsVolume selectedVolume = policy.chooseVolume(volumes, 50,
StorageType.DISK);
assertEquals(initialCommittedSpace.get(selectedVolume) + 50,
selectedVolume.getCommittedBytes());
diff --git
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/volume/TestVolumeSetDiskChecks.java
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/volume/TestVolumeSetDiskChecks.java
index e310eaf3dea..02aa6d379f7 100644
---
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/volume/TestVolumeSetDiskChecks.java
+++
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/volume/TestVolumeSetDiskChecks.java
@@ -42,6 +42,7 @@
import java.util.Set;
import java.util.UUID;
import org.apache.commons.io.FileUtils;
+import org.apache.hadoop.fs.StorageType;
import org.apache.hadoop.hdds.HddsConfigKeys;
import org.apache.hadoop.hdds.conf.ConfigurationSource;
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
@@ -301,14 +302,14 @@ public void testVolumeFailure() throws IOException {
StorageVolumeUtil.getHddsVolumesList(volumeSet.getVolumesList())
.forEach(hddsVolume -> hddsVolume.setDbParentDir(tempDir.toFile()));
container.create(volumeSet,
- new RoundRobinVolumeChoosingPolicy(), UUID.randomUUID().toString());
+ new RoundRobinVolumeChoosingPolicy(), UUID.randomUUID().toString(),
StorageType.DISK);
conSet.addContainer(container);
KeyValueContainer container1 = new KeyValueContainer(data1, conf);
StorageVolumeUtil.getHddsVolumesList(volumeSet1.getVolumesList())
.forEach(hddsVolume -> hddsVolume.setDbParentDir(tempDir.toFile()));
container1.create(volumeSet1,
- new RoundRobinVolumeChoosingPolicy(), UUID.randomUUID().toString());
+ new RoundRobinVolumeChoosingPolicy(), UUID.randomUUID().toString(),
StorageType.DISK);
conSet.addContainer(container1);
DatanodeStateMachine datanodeStateMachineMock =
mock(DatanodeStateMachine.class);
diff --git
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/diskbalancer/TestDiskBalancerTask.java
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/diskbalancer/TestDiskBalancerTask.java
index dc2cd03655d..d1ff42b4906 100644
---
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/diskbalancer/TestDiskBalancerTask.java
+++
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/diskbalancer/TestDiskBalancerTask.java
@@ -49,6 +49,7 @@
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeoutException;
import org.apache.commons.io.FileUtils;
+import org.apache.hadoop.fs.StorageType;
import org.apache.hadoop.hdds.HddsConfigKeys;
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
import org.apache.hadoop.hdds.fs.MockSpaceUsageCheckFactory;
@@ -686,9 +687,9 @@ private KeyValueContainer createContainer(long containerId,
HddsVolume vol, Stat
KeyValueContainer container = new KeyValueContainer(containerData, conf);
VolumeChoosingPolicy policy = mock(VolumeChoosingPolicy.class);
- when(policy.chooseVolume(any(List.class), any(Long.class)))
+ when(policy.chooseVolume(any(List.class), any(Long.class),
any(StorageType.class)))
.thenReturn(vol);
- container.create((VolumeSet) volumeSet, policy, scmId);
+ container.create((VolumeSet) volumeSet, policy, scmId, StorageType.DISK);
containerSet.addContainer(container);
// Manually update volume usage for test purposes
diff --git
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/TestKeyValueBlockIterator.java
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/TestKeyValueBlockIterator.java
index 4d24f199581..d2cc55e55b4 100644
---
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/TestKeyValueBlockIterator.java
+++
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/TestKeyValueBlockIterator.java
@@ -35,6 +35,7 @@
import java.util.NoSuchElementException;
import java.util.UUID;
import org.apache.hadoop.conf.StorageUnit;
+import org.apache.hadoop.fs.StorageType;
import org.apache.hadoop.hdds.client.BlockID;
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos;
@@ -116,7 +117,7 @@ public void setup() throws Exception {
// Init the container.
KeyValueContainer container = new KeyValueContainer(containerData, conf);
container.create(volumeSet, new RoundRobinVolumeChoosingPolicy(),
- clusterID);
+ clusterID, StorageType.DISK);
db = BlockUtils.getDB(containerData, conf);
}
diff --git
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/TestKeyValueContainer.java
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/TestKeyValueContainer.java
index 7c14200e6c8..137b677ad0d 100644
---
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/TestKeyValueContainer.java
+++
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/TestKeyValueContainer.java
@@ -161,7 +161,7 @@ private void init(ContainerTestVersionInfo versionInfo)
throws Exception {
.map(v -> (StorageVolume) v)
.collect(Collectors.toList()));
when(volumeChoosingPolicy
- .chooseVolume(anyList(), anyLong())).thenAnswer(
+ .chooseVolume(anyList(), anyLong(), eq(StorageType.DISK))).thenAnswer(
invocation -> {
List<HddsVolume> volumes = invocation.getArgument(0);
return volumes.get(0);
@@ -458,7 +458,7 @@ public void
testContainerImportExport(ContainerTestVersionInfo versionInfo)
KeyValueContainer container = new KeyValueContainer(containerData, CONF);
HddsVolume containerVolume = volumeChoosingPolicy.chooseVolume(
- StorageVolumeUtil.getHddsVolumesList(volumeSet.getVolumesList()), 1);
+ StorageVolumeUtil.getHddsVolumesList(volumeSet.getVolumesList()), 1,
StorageType.DISK);
container.populatePathFields(scmId, containerVolume);
try (InputStream fis = Files.newInputStream(folderToExport.toPath())) {
@@ -504,7 +504,7 @@ public void
testContainerImportExport(ContainerTestVersionInfo versionInfo)
container = new KeyValueContainer(containerData, CONF);
containerVolume = volumeChoosingPolicy.chooseVolume(
- StorageVolumeUtil.getHddsVolumesList(volumeSet.getVolumesList()), 1);
+ StorageVolumeUtil.getHddsVolumesList(volumeSet.getVolumesList()), 1,
StorageType.DISK);
container.populatePathFields(scmId, containerVolume);
KeyValueContainer finalContainer1 = container;
assertThrows(IOException.class, () -> {
@@ -537,7 +537,7 @@ private void
checkContainerFilesPresent(KeyValueContainerData data,
* Create the container on disk.
*/
private void createContainer() throws StorageContainerException {
- keyValueContainer.create(volumeSet, volumeChoosingPolicy, scmId);
+ keyValueContainer.create(volumeSet, volumeChoosingPolicy, scmId,
StorageType.DISK);
keyValueContainerData = keyValueContainer.getContainerData();
}
@@ -635,9 +635,9 @@ public void concurrentExport(ContainerTestVersionInfo
versionInfo)
public void testDuplicateContainer(ContainerTestVersionInfo versionInfo)
throws Exception {
init(versionInfo);
- keyValueContainer.create(volumeSet, volumeChoosingPolicy, scmId);
+ keyValueContainer.create(volumeSet, volumeChoosingPolicy, scmId,
StorageType.DISK);
StorageContainerException exception =
assertThrows(StorageContainerException.class, () ->
- keyValueContainer.create(volumeSet, volumeChoosingPolicy, scmId));
+ keyValueContainer.create(volumeSet, volumeChoosingPolicy, scmId,
StorageType.DISK));
assertEquals(ContainerProtos.Result.CONTAINER_ALREADY_EXISTS,
exception.getResult());
assertThat(exception).hasMessage("Container creation failed because
ContainerFile already exists");
}
@@ -647,13 +647,13 @@ public void testDiskFullExceptionCreateContainer(
ContainerTestVersionInfo versionInfo) throws Exception {
init(versionInfo);
reset(volumeChoosingPolicy);
- when(volumeChoosingPolicy.chooseVolume(anyList(), anyLong()))
+ when(volumeChoosingPolicy.chooseVolume(anyList(), anyLong(),
eq(StorageType.DISK)))
.thenThrow(DiskChecker.DiskOutOfSpaceException.class);
StorageContainerException exception =
assertThrows(StorageContainerException.class, () ->
- keyValueContainer.create(volumeSet, volumeChoosingPolicy, scmId));
+ keyValueContainer.create(volumeSet, volumeChoosingPolicy, scmId,
StorageType.DISK));
assertEquals(ContainerProtos.Result.DISK_OUT_OF_SPACE,
exception.getResult());
- assertThat(exception).hasMessage("Container creation failed, due to disk
out of space");
+ assertThat(exception).hasMessage("Container creation failed, due to disk
out of space on StorageType: DISK");
}
@ContainerTestVersionInfo.ContainerTest
@@ -663,7 +663,7 @@ public void testDeleteContainer(ContainerTestVersionInfo
versionInfo)
closeContainer();
keyValueContainer = new KeyValueContainer(
keyValueContainerData, CONF);
- keyValueContainer.create(volumeSet, volumeChoosingPolicy, scmId);
+ keyValueContainer.create(volumeSet, volumeChoosingPolicy, scmId,
StorageType.DISK);
KeyValueContainerUtil.removeContainer(
keyValueContainer.getContainerData(), CONF);
keyValueContainer.delete();
@@ -690,7 +690,7 @@ public void testDeleteContainer(ContainerTestVersionInfo
versionInfo)
public void testCloseContainer(ContainerTestVersionInfo versionInfo)
throws Exception {
init(versionInfo);
- keyValueContainer.create(volumeSet, volumeChoosingPolicy, scmId);
+ keyValueContainer.create(volumeSet, volumeChoosingPolicy, scmId,
StorageType.DISK);
keyValueContainer.close();
keyValueContainerData = keyValueContainer
@@ -712,7 +712,7 @@ public void testCloseContainer(ContainerTestVersionInfo
versionInfo)
public void testReportOfUnhealthyContainer(
ContainerTestVersionInfo versionInfo) throws Exception {
init(versionInfo);
- keyValueContainer.create(volumeSet, volumeChoosingPolicy, scmId);
+ keyValueContainer.create(volumeSet, volumeChoosingPolicy, scmId,
StorageType.DISK);
assertNotNull(keyValueContainer.getContainerReport());
keyValueContainer.markContainerUnhealthy();
File containerFile = keyValueContainer.getContainerFile();
@@ -727,7 +727,7 @@ public void testReportOfUnhealthyContainer(
public void testUpdateContainer(ContainerTestVersionInfo versionInfo)
throws Exception {
init(versionInfo);
- keyValueContainer.create(volumeSet, volumeChoosingPolicy, scmId);
+ keyValueContainer.create(volumeSet, volumeChoosingPolicy, scmId,
StorageType.DISK);
Map<String, String> metadata = new HashMap<>();
metadata.put(OzoneConsts.VOLUME, OzoneConsts.OZONE);
metadata.put(OzoneConsts.OWNER, OzoneConsts.OZONE_SIMPLE_HDFS_USER);
@@ -756,7 +756,7 @@ public void testUpdateContainerUnsupportedRequest(
StorageContainerException exception =
assertThrows(StorageContainerException.class, () -> {
keyValueContainer = new KeyValueContainer(keyValueContainerData, CONF);
- keyValueContainer.create(volumeSet, volumeChoosingPolicy, scmId);
+ keyValueContainer.create(volumeSet, volumeChoosingPolicy, scmId,
StorageType.DISK);
Map<String, String> metadata = new HashMap<>();
metadata.put(OzoneConsts.VOLUME, OzoneConsts.OZONE);
keyValueContainer.update(metadata, false);
@@ -773,7 +773,7 @@ public void testContainerRocksDB(ContainerTestVersionInfo
versionInfo)
closeContainer();
keyValueContainer = new KeyValueContainer(
keyValueContainerData, CONF);
- keyValueContainer.create(volumeSet, volumeChoosingPolicy, scmId);
+ keyValueContainer.create(volumeSet, volumeChoosingPolicy, scmId,
StorageType.DISK);
try (DBHandle db = BlockUtils.getDB(keyValueContainerData, CONF)) {
RDBStore store = (RDBStore) db.getStore().getStore();
@@ -827,7 +827,7 @@ public void testDBProfileAffectsDBOptions(
ContainerTestVersionInfo versionInfo) throws Exception {
init(versionInfo);
// Create Container 1
- keyValueContainer.create(volumeSet, volumeChoosingPolicy, scmId);
+ keyValueContainer.create(volumeSet, volumeChoosingPolicy, scmId,
StorageType.DISK);
DatanodeDBProfile outProfile1;
try (DBHandle db1 =
@@ -848,7 +848,7 @@ public void testDBProfileAffectsDBOptions(
(long) StorageUnit.GB.toBytes(5), UUID.randomUUID().toString(),
datanodeId.toString());
keyValueContainer = new KeyValueContainer(keyValueContainerData,
otherConf);
- keyValueContainer.create(volumeSet, volumeChoosingPolicy, scmId);
+ keyValueContainer.create(volumeSet, volumeChoosingPolicy, scmId,
StorageType.DISK);
DatanodeDBProfile outProfile2;
try (DBHandle db2 =
@@ -928,7 +928,7 @@ void testAutoCompactionSmallSstFile(
List<File> exportFiles = new ArrayList<>();
for (HddsVolume volume: volumeList) {
reset(volumeChoosingPolicy);
- when(volumeChoosingPolicy.chooseVolume(anyList(), anyLong()))
+ when(volumeChoosingPolicy.chooseVolume(anyList(), anyLong(),
eq(StorageType.DISK)))
.thenReturn(volume);
for (int index = 0; index < count; index++, containerId++) {
// Create new container
@@ -936,7 +936,7 @@ void testAutoCompactionSmallSstFile(
(long) StorageUnit.GB.toBytes(5), UUID.randomUUID().toString(),
datanodeId.toString());
container = new KeyValueContainer(containerData, CONF);
- container.create(volumeSet, volumeChoosingPolicy, scmId);
+ container.create(volumeSet, volumeChoosingPolicy, scmId,
StorageType.DISK);
containerData = container.getContainerData();
containerData.setState(ContainerProtos.ContainerDataProto.State.CLOSED);
populate(container, numberOfKeysToWrite);
@@ -1043,7 +1043,7 @@ public void testIsEmptyContainerStateWhileImport(
KeyValueContainer container = new KeyValueContainer(containerData, CONF);
HddsVolume containerVolume = volumeChoosingPolicy.chooseVolume(
- StorageVolumeUtil.getHddsVolumesList(volumeSet.getVolumesList()), 1);
+ StorageVolumeUtil.getHddsVolumesList(volumeSet.getVolumesList()), 1,
StorageType.DISK);
container.populatePathFields(scmId, containerVolume);
try (InputStream fis = Files.newInputStream(folderToExport.toPath())) {
@@ -1091,7 +1091,7 @@ public void
testIsEmptyContainerStateWhileImportWithoutBlock(
KeyValueContainer container = new KeyValueContainer(containerData, CONF);
HddsVolume containerVolume = volumeChoosingPolicy.chooseVolume(
- StorageVolumeUtil.getHddsVolumesList(volumeSet.getVolumesList()), 1);
+ StorageVolumeUtil.getHddsVolumesList(volumeSet.getVolumesList()), 1,
StorageType.DISK);
container.populatePathFields(scmId, containerVolume);
try (InputStream fis = Files.newInputStream(folderToExport.toPath())) {
@@ -1146,7 +1146,7 @@ private void testMixedSchemaImport(String dir,
ContainerTestHelper.CONTAINER_MAX_SIZE, UUID.randomUUID().toString(),
UUID.randomUUID().toString());
KeyValueContainer container = new KeyValueContainer(data, conf);
- container.create(volumeSet, volumeChoosingPolicy, scmId);
+ container.create(volumeSet, volumeChoosingPolicy, scmId, StorageType.DISK);
long pendingDeleteBlockCount = 20;
try (DBHandle meta = BlockUtils.getDB(data, conf)) {
Table<String, Long> metadataTable = meta.getStore().getMetadataTable();
@@ -1208,10 +1208,10 @@ public void testContainerCreationCommitSpaceReserve(
keyValueContainer = new KeyValueContainer(keyValueContainerData, CONF);
keyValueContainer = spy(keyValueContainer);
- keyValueContainer.create(volumeSet, volumeChoosingPolicy, scmId);
+ keyValueContainer.create(volumeSet, volumeChoosingPolicy, scmId,
StorageType.DISK);
// verify that
- verify(volumeChoosingPolicy).chooseVolume(anyList(), anyLong()); // this
would reserve commit space
+ verify(volumeChoosingPolicy).chooseVolume(anyList(), anyLong(),
eq(StorageType.DISK));
assertTrue(keyValueContainerData.isCommittedSpace());
}
}
diff --git
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/TestKeyValueContainerIntegrityChecks.java
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/TestKeyValueContainerIntegrityChecks.java
index adc4b35ba1a..a1b44f4a44c 100644
---
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/TestKeyValueContainerIntegrityChecks.java
+++
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/TestKeyValueContainerIntegrityChecks.java
@@ -30,6 +30,7 @@
import java.util.List;
import java.util.UUID;
import org.apache.commons.lang3.RandomStringUtils;
+import org.apache.hadoop.fs.StorageType;
import org.apache.hadoop.hdds.client.BlockID;
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos;
@@ -132,7 +133,7 @@ protected KeyValueContainer createContainerWithBlocks(long
containerId,
UUID.randomUUID().toString(), UUID.randomUUID().toString());
KeyValueContainer container = new KeyValueContainer(containerData, conf);
container.create(volumeSet, new RoundRobinVolumeChoosingPolicy(),
- clusterID);
+ clusterID, StorageType.DISK);
try (DBHandle metadataStore = BlockUtils.getDB(containerData,
conf)) {
assertNotNull(containerData.getChunksPath());
diff --git
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/TestKeyValueContainerMarkUnhealthy.java
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/TestKeyValueContainerMarkUnhealthy.java
index 3606f80d13f..77aa70b8fd7 100644
---
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/TestKeyValueContainerMarkUnhealthy.java
+++
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/TestKeyValueContainerMarkUnhealthy.java
@@ -23,6 +23,7 @@
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.Mockito.anyList;
import static org.mockito.Mockito.anyLong;
+import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -32,6 +33,7 @@
import java.nio.file.Path;
import java.util.UUID;
import org.apache.hadoop.conf.StorageUnit;
+import org.apache.hadoop.fs.StorageType;
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
import
org.apache.hadoop.hdds.scm.container.common.helpers.StorageContainerException;
import org.apache.hadoop.ozone.container.common.impl.ContainerDataYaml;
@@ -79,7 +81,7 @@ public void setup() throws Exception {
volumeSet = mock(MutableVolumeSet.class);
volumeChoosingPolicy = mock(RoundRobinVolumeChoosingPolicy.class);
- when(volumeChoosingPolicy.chooseVolume(anyList(), anyLong()))
+ when(volumeChoosingPolicy.chooseVolume(anyList(), anyLong(),
eq(StorageType.DISK)))
.thenReturn(hddsVolume);
keyValueContainerData = new KeyValueContainerData(1L,
@@ -145,7 +147,7 @@ public void
testMarkClosedContainerAsUnhealthy(ContainerLayoutVersion layoutVers
initTestData(layoutVersion);
// We need to create the container so the compact-on-close operation
// does not NPE.
- keyValueContainer.create(volumeSet, volumeChoosingPolicy, scmId);
+ keyValueContainer.create(volumeSet, volumeChoosingPolicy, scmId,
StorageType.DISK);
keyValueContainer.close();
keyValueContainer.markContainerUnhealthy();
assertThat(keyValueContainerData.getState()).isEqualTo(UNHEALTHY);
@@ -159,7 +161,7 @@ public void
testMarkQuasiClosedContainerAsUnhealthy(ContainerLayoutVersion layou
initTestData(layoutVersion);
// We need to create the container so the sync-on-quasi-close operation
// does not NPE.
- keyValueContainer.create(volumeSet, volumeChoosingPolicy, scmId);
+ keyValueContainer.create(volumeSet, volumeChoosingPolicy, scmId,
StorageType.DISK);
keyValueContainer.quasiClose();
keyValueContainer.markContainerUnhealthy();
assertThat(keyValueContainerData.getState()).isEqualTo(UNHEALTHY);
diff --git
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/TestKeyValueHandler.java
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/TestKeyValueHandler.java
index 0385564ebf7..7eb3166df4b 100644
---
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/TestKeyValueHandler.java
+++
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/TestKeyValueHandler.java
@@ -72,6 +72,7 @@
import org.apache.commons.io.FileUtils;
import org.apache.hadoop.conf.StorageUnit;
import org.apache.hadoop.fs.FileUtil;
+import org.apache.hadoop.fs.StorageType;
import org.apache.hadoop.hdds.client.BlockID;
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
import org.apache.hadoop.hdds.protocol.DatanodeDetails;
@@ -876,7 +877,7 @@ public void testICRsOnContainerClose(ContainerLayoutVersion
containerLayoutVersi
// markContainerForClose - OPEN -> CLOSING (should send immediate ICR)
containerData.setState(ContainerProtos.ContainerDataProto.State.OPEN);
KeyValueContainer container = new KeyValueContainer(containerData, conf);
- container.create(volumeSet, new RoundRobinVolumeChoosingPolicy(),
CLUSTER_ID);
+ container.create(volumeSet, new RoundRobinVolumeChoosingPolicy(),
CLUSTER_ID, StorageType.DISK);
containerSet.addContainer(container);
kvHandler.markContainerForClose(container);
@@ -1023,7 +1024,7 @@ public void testReadBlockMetrics() throws Exception {
(long) StorageUnit.GB.toBytes(1), UUID.randomUUID().toString(),
DATANODE_UUID);
KeyValueContainer container = new KeyValueContainer(containerData, conf);
- container.create(volumeSet, new RoundRobinVolumeChoosingPolicy(),
CLUSTER_ID);
+ container.create(volumeSet, new RoundRobinVolumeChoosingPolicy(),
CLUSTER_ID, StorageType.DISK);
containerSet.addContainer(container);
BlockID blockID = ContainerTestHelper.getTestBlockID(containerID);
diff --git
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/impl/AbstractTestChunkManager.java
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/impl/AbstractTestChunkManager.java
index 6995b75f530..1e09faea8d9 100644
---
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/impl/AbstractTestChunkManager.java
+++
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/impl/AbstractTestChunkManager.java
@@ -24,6 +24,7 @@
import static org.junit.jupiter.api.Assumptions.abort;
import static org.mockito.Mockito.anyList;
import static org.mockito.Mockito.anyLong;
+import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -35,6 +36,7 @@
import java.nio.ByteBuffer;
import java.util.UUID;
import org.apache.hadoop.conf.StorageUnit;
+import org.apache.hadoop.fs.StorageType;
import org.apache.hadoop.hdds.client.BlockID;
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
import org.apache.hadoop.ozone.container.common.helpers.ChunkInfo;
@@ -93,7 +95,7 @@ public final void setUp(@TempDir File confDir) throws
Exception {
RoundRobinVolumeChoosingPolicy volumeChoosingPolicy =
mock(RoundRobinVolumeChoosingPolicy.class);
- when(volumeChoosingPolicy.chooseVolume(anyList(), anyLong()))
+ when(volumeChoosingPolicy.chooseVolume(anyList(), anyLong(),
eq(StorageType.DISK)))
.thenReturn(hddsVolume);
keyValueContainerData = new KeyValueContainerData(1L,
@@ -104,7 +106,7 @@ public final void setUp(@TempDir File confDir) throws
Exception {
keyValueContainer = new KeyValueContainer(keyValueContainerData, config);
keyValueContainer.create(volumeSet, volumeChoosingPolicy,
- UUID.randomUUID().toString());
+ UUID.randomUUID().toString(), StorageType.DISK);
header = "my header".getBytes(UTF_8);
byte[] bytes = "testing write chunks".getBytes(UTF_8);
diff --git
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/impl/TestBlockManagerImpl.java
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/impl/TestBlockManagerImpl.java
index eb58ac3ce84..43d012c068c 100644
---
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/impl/TestBlockManagerImpl.java
+++
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/impl/TestBlockManagerImpl.java
@@ -26,6 +26,7 @@
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.ArgumentMatchers.anyList;
import static org.mockito.ArgumentMatchers.anyLong;
+import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -35,6 +36,7 @@
import java.util.List;
import java.util.UUID;
import org.apache.hadoop.conf.StorageUnit;
+import org.apache.hadoop.fs.StorageType;
import org.apache.hadoop.hdds.client.BlockID;
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos;
@@ -95,7 +97,7 @@ private void initialize() throws Exception {
VolumeSet volumeSet = mock(MutableVolumeSet.class);
RoundRobinVolumeChoosingPolicy volumeChoosingPolicy =
mock(RoundRobinVolumeChoosingPolicy.class);
- when(volumeChoosingPolicy.chooseVolume(anyList(), anyLong()))
+ when(volumeChoosingPolicy.chooseVolume(anyList(), anyLong(),
eq(StorageType.DISK)))
.thenReturn(hddsVolume);
KeyValueContainerData keyValueContainerData = new KeyValueContainerData(1L,
@@ -106,7 +108,7 @@ private void initialize() throws Exception {
keyValueContainer = new KeyValueContainer(
keyValueContainerData, config);
- keyValueContainer.create(volumeSet, volumeChoosingPolicy, scmId);
+ keyValueContainer.create(volumeSet, volumeChoosingPolicy, scmId,
StorageType.DISK);
// Creating BlockData
BlockID blockID = new BlockID(1L, 1L);
diff --git
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/ozoneimpl/TestContainerReader.java
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/ozoneimpl/TestContainerReader.java
index 234fda2cd00..4b796376fd0 100644
---
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/ozoneimpl/TestContainerReader.java
+++
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/ozoneimpl/TestContainerReader.java
@@ -33,6 +33,7 @@
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.Mockito.anyList;
import static org.mockito.Mockito.anyLong;
+import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -45,6 +46,7 @@
import java.util.List;
import java.util.UUID;
import org.apache.hadoop.conf.StorageUnit;
+import org.apache.hadoop.fs.StorageType;
import org.apache.hadoop.hdds.client.BlockID;
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos;
@@ -130,7 +132,7 @@ private void setup(ContainerTestVersionInfo versionInfo)
throws Exception {
volumeSet = mock(MutableVolumeSet.class);
volumeChoosingPolicy = mock(RoundRobinVolumeChoosingPolicy.class);
- when(volumeChoosingPolicy.chooseVolume(anyList(), anyLong()))
+ when(volumeChoosingPolicy.chooseVolume(anyList(), anyLong(),
eq(StorageType.DISK)))
.thenReturn(hddsVolume);
for (int i = 0; i < 2; i++) {
@@ -141,7 +143,7 @@ private void setup(ContainerTestVersionInfo versionInfo)
throws Exception {
KeyValueContainer keyValueContainer =
new KeyValueContainer(keyValueContainerData,
conf);
- keyValueContainer.create(volumeSet, volumeChoosingPolicy, clusterId);
+ keyValueContainer.create(volumeSet, volumeChoosingPolicy, clusterId,
StorageType.DISK);
List<Long> blkNames;
@@ -299,7 +301,7 @@ public void testContainerReader(ContainerTestVersionInfo
versionInfo)
new KeyValueContainer(recoveringContainerData,
conf);
recoveringKeyValueContainer.create(
- volumeSet, volumeChoosingPolicy, clusterId);
+ volumeSet, volumeChoosingPolicy, clusterId, StorageType.DISK);
thread = new Thread(containerReader);
thread.start();
@@ -359,7 +361,7 @@ public void testContainerReaderWithLoadException(
StorageVolumeUtil.checkVolume(hddsVolume1, clusterId, clusterId, conf,
null, null);
volumeChoosingPolicy1 = mock(RoundRobinVolumeChoosingPolicy.class);
- when(volumeChoosingPolicy1.chooseVolume(anyList(), anyLong()))
+ when(volumeChoosingPolicy1.chooseVolume(anyList(), anyLong(),
eq(StorageType.DISK)))
.thenReturn(hddsVolume1);
int containerCount = 3;
@@ -370,7 +372,7 @@ public void testContainerReaderWithLoadException(
datanodeId.toString());
KeyValueContainer keyValueContainer =
new KeyValueContainer(keyValueContainerData, conf);
- keyValueContainer.create(volumeSet1, volumeChoosingPolicy1, clusterId);
+ keyValueContainer.create(volumeSet1, volumeChoosingPolicy1, clusterId,
StorageType.DISK);
if (i == 0) {
// rename first container directory name
@@ -417,7 +419,7 @@ public void testContainerReaderWithInvalidDbPath(
StorageVolumeUtil.checkVolume(hddsVolume1, clusterId, clusterId, conf,
null, null);
volumeChoosingPolicy1 = mock(RoundRobinVolumeChoosingPolicy.class);
- when(volumeChoosingPolicy1.chooseVolume(anyList(), anyLong()))
+ when(volumeChoosingPolicy1.chooseVolume(anyList(), anyLong(),
eq(StorageType.DISK)))
.thenReturn(hddsVolume1);
List<File> dbPathList = new ArrayList<>();
@@ -429,7 +431,7 @@ public void testContainerReaderWithInvalidDbPath(
datanodeId.toString());
KeyValueContainer keyValueContainer =
new KeyValueContainer(keyValueContainerData, conf);
- keyValueContainer.create(volumeSet1, volumeChoosingPolicy1, clusterId);
+ keyValueContainer.create(volumeSet1, volumeChoosingPolicy1, clusterId,
StorageType.DISK);
dbPathList.add(keyValueContainerData.getDbFile());
}
ContainerCache.getInstance(conf).shutdownCache();
@@ -642,7 +644,7 @@ private KeyValueContainer createContainerWithId(int id,
VolumeSet volSet,
KeyValueContainer keyValueContainer =
new KeyValueContainer(keyValueContainerData,
conf);
- keyValueContainer.create(volSet, policy, clusterId);
+ keyValueContainer.create(volSet, policy, clusterId, StorageType.DISK);
List<Long> blkNames;
if (id % 2 == 0) {
@@ -680,7 +682,7 @@ public void testMarkedDeletedContainerCleared(
KeyValueContainer kvContainer =
new KeyValueContainer(containerData, conf);
kvContainer.create(
- volumeSet, volumeChoosingPolicy, clusterId);
+ volumeSet, volumeChoosingPolicy, clusterId, StorageType.DISK);
long baseCount = 0;
if (containerData.hasSchema(OzoneConsts.SCHEMA_V3)) {
// add db entry for the container ID 101 for V3
@@ -849,7 +851,7 @@ private KeyValueContainer createContainer(long containerId)
throws Exception {
(long) StorageUnit.GB.toBytes(5), UUID.randomUUID().toString(),
datanodeId.toString());
containerData.setState(ContainerProtos.ContainerDataProto.State.CLOSED);
KeyValueContainer container = new KeyValueContainer(containerData, conf);
- container.create(volumeSet, volumeChoosingPolicy, clusterId);
+ container.create(volumeSet, volumeChoosingPolicy, clusterId,
StorageType.DISK);
return container;
}
diff --git
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/ozoneimpl/TestOzoneContainer.java
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/ozoneimpl/TestOzoneContainer.java
index 91c3f8ed58c..ecac604cde6 100644
---
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/ozoneimpl/TestOzoneContainer.java
+++
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/ozoneimpl/TestOzoneContainer.java
@@ -41,6 +41,7 @@
import java.util.concurrent.ConcurrentSkipListSet;
import org.apache.commons.io.FileUtils;
import org.apache.hadoop.conf.StorageUnit;
+import org.apache.hadoop.fs.StorageType;
import org.apache.hadoop.hdds.HddsConfigKeys;
import org.apache.hadoop.hdds.client.BlockID;
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
@@ -168,7 +169,7 @@ public void testBuildContainerMap(ContainerTestVersionInfo
versionInfo)
containerDatas.add(keyValueContainerData);
keyValueContainer = new KeyValueContainer(
keyValueContainerData, conf);
- keyValueContainer.create(volumeSet, volumeChoosingPolicy, clusterId);
+ keyValueContainer.create(volumeSet, volumeChoosingPolicy, clusterId,
StorageType.DISK);
myVolume = keyValueContainer.getContainerData().getVolume();
// Track container in mock volume
@@ -286,7 +287,7 @@ public void
testContainerCreateDiskFull(ContainerTestVersionInfo versionInfo)
StorageContainerException e = assertThrows(
StorageContainerException.class,
() -> keyValueContainer.
- create(volumeSet, volumeChoosingPolicy, clusterId)
+ create(volumeSet, volumeChoosingPolicy, clusterId,
StorageType.DISK)
);
assertEquals(DISK_OUT_OF_SPACE, e.getResult());
}
diff --git
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/replication/TestContainerImporter.java
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/replication/TestContainerImporter.java
index e594dad3e58..553fb267882 100644
---
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/replication/TestContainerImporter.java
+++
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/replication/TestContainerImporter.java
@@ -23,6 +23,8 @@
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyList;
+import static org.mockito.ArgumentMatchers.isNull;
import static org.mockito.Mockito.anyLong;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.doNothing;
@@ -234,6 +236,19 @@ public void testImportContainerResetsLastScanTime() throws
Exception {
assertEquals(Optional.empty(), containerData.lastDataScanTime());
}
+ @Test
+ public void testChooseNextVolumeStorageType() throws Exception {
+ VolumeChoosingPolicy policy = mock(VolumeChoosingPolicy.class);
+ HddsVolume expectedVolume = mock(HddsVolume.class);
+ long spaceToReserve = 100L;
+ when(policy.chooseVolume(anyList(), anyLong(), isNull()))
+ .thenReturn(expectedVolume);
+ ContainerImporter importer = new ContainerImporter(conf, containerSet,
+ controllerMock, volumeSet, policy);
+
+ assertEquals(expectedVolume, importer.chooseNextVolume(spaceToReserve));
+ }
+
private File containerTarFile(long id, ContainerData data) throws
IOException {
File yamlFile = new File(tempDir, "container.yaml");
ContainerDataYaml.createContainerFile(data, yamlFile);
diff --git
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/replication/TestGrpcReplicationService.java
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/replication/TestGrpcReplicationService.java
index 8b831fa0646..0fc8b1a5554 100644
---
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/replication/TestGrpcReplicationService.java
+++
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/replication/TestGrpcReplicationService.java
@@ -40,6 +40,7 @@
import java.util.Collections;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicLong;
+import org.apache.hadoop.fs.StorageType;
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
import org.apache.hadoop.hdds.protocol.DatanodeDetails;
import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos;
@@ -139,7 +140,7 @@ public void init() throws Exception {
StorageVolumeUtil.getHddsVolumesList(volumeSet.getVolumesList())
.forEach(hddsVolume -> hddsVolume.setDbParentDir(tempDir.toFile()));
container.create(volumeSet, new RoundRobinVolumeChoosingPolicy(),
- "test-replication");
+ "test-replication", StorageType.DISK);
containerSet.addContainer(container);
container.close();
diff --git
a/hadoop-hdds/interface-client/src/main/proto/DatanodeClientProtocol.proto
b/hadoop-hdds/interface-client/src/main/proto/DatanodeClientProtocol.proto
index 05c94624c99..faff319310f 100644
--- a/hadoop-hdds/interface-client/src/main/proto/DatanodeClientProtocol.proto
+++ b/hadoop-hdds/interface-client/src/main/proto/DatanodeClientProtocol.proto
@@ -150,6 +150,8 @@ message DatanodeBlockID {
optional uint64 blockCommitSequenceId = 3 [default = 0];
optional int32 replicaIndex = 4;
+ optional int32 storageTypeID = 5;
+
}
message KeyValue {
@@ -271,6 +273,10 @@ message CreateContainerRequestProto {
optional ContainerType containerType = 3 [default = KeyValueContainer];
optional int32 replicaIndex = 4;
optional ContainerDataProto.State state = 5;
+
+ // If we do not set storageTypeID, it means that we allow Containers to be
+ // created on Volumes of any StorageType.
+ optional int32 storageTypeID = 6;
}
message CreateContainerResponseProto {
diff --git
a/hadoop-ozone/cli-repair/src/test/java/org/apache/hadoop/ozone/repair/datanode/schemaupgrade/TestUpgradeContainerSchema.java
b/hadoop-ozone/cli-repair/src/test/java/org/apache/hadoop/ozone/repair/datanode/schemaupgrade/TestUpgradeContainerSchema.java
index f8983e23a9e..e51e50ffe3b 100644
---
a/hadoop-ozone/cli-repair/src/test/java/org/apache/hadoop/ozone/repair/datanode/schemaupgrade/TestUpgradeContainerSchema.java
+++
b/hadoop-ozone/cli-repair/src/test/java/org/apache/hadoop/ozone/repair/datanode/schemaupgrade/TestUpgradeContainerSchema.java
@@ -36,6 +36,7 @@
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.Mockito.anyList;
import static org.mockito.Mockito.anyLong;
+import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -53,6 +54,7 @@
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
import java.util.stream.Stream;
+import org.apache.hadoop.fs.StorageType;
import org.apache.hadoop.hdds.cli.GenericCli;
import org.apache.hadoop.hdds.client.BlockID;
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
@@ -159,7 +161,7 @@ private void initDatanode(HDDSLayoutFeature layoutFeature)
throws IOException {
volumeChoosingPolicy = mock(RoundRobinVolumeChoosingPolicy.class);
final AtomicInteger loopCount = new AtomicInteger(0);
- when(volumeChoosingPolicy.chooseVolume(anyList(), anyLong()))
+ when(volumeChoosingPolicy.chooseVolume(anyList(), anyLong(),
eq(StorageType.DISK)))
.thenAnswer(invocation -> {
final int ii = loopCount.getAndIncrement() % volumes.size();
return volumes.get(ii);
@@ -318,7 +320,7 @@ private void putChunksInBlock(
data.setSchemaVersion(SCHEMA_V2);
KeyValueContainer container = new KeyValueContainer(data, conf);
- container.create(volumeSet, volumeChoosingPolicy, SCM_ID);
+ container.create(volumeSet, volumeChoosingPolicy, SCM_ID,
StorageType.DISK);
containerSet.addContainer(container);
data = (KeyValueContainerData) containerSet.getContainer(containerId)
diff --git
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/TestContainerSmallFile.java
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/TestContainerSmallFile.java
index 8140ea3eb45..c624b091f0f 100644
---
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/TestContainerSmallFile.java
+++
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/TestContainerSmallFile.java
@@ -81,7 +81,7 @@ public void testAllocateWrite() throws Exception {
BlockID blockID = ContainerTestHelper.getTestBlockID(
container.getContainerInfo().getContainerID());
ContainerProtocolCalls.writeSmallFile(client, blockID,
- "data123".getBytes(UTF_8), null);
+ "data123".getBytes(UTF_8), null, null);
ContainerProtos.GetSmallFileResponseProto response =
ContainerProtocolCalls.readSmallFile(client, blockID, null);
String readData = response.getData().getDataBuffers().getBuffersList()
@@ -124,7 +124,7 @@ public void testInvalidContainerRead() throws Exception {
BlockID blockID = ContainerTestHelper.getTestBlockID(
container.getContainerInfo().getContainerID());
ContainerProtocolCalls.writeSmallFile(client, blockID,
- "data123".getBytes(UTF_8), null);
+ "data123".getBytes(UTF_8), null, null);
assertThrowsExactly(StorageContainerException.class,
() -> ContainerProtocolCalls.readSmallFile(client,
@@ -149,7 +149,8 @@ public void testReadWriteWithBCSId() throws Exception {
container.getContainerInfo().getContainerID());
ContainerProtos.PutSmallFileResponseProto responseProto =
ContainerProtocolCalls
- .writeSmallFile(client, blockID1, "data123".getBytes(UTF_8), null);
+ .writeSmallFile(client, blockID1, "data123".getBytes(UTF_8), null,
+ null);
long bcsId = responseProto.getCommittedBlockLength().getBlockID()
.getBlockCommitSequenceId();
@@ -164,7 +165,7 @@ public void testReadWriteWithBCSId() throws Exception {
BlockID blockID2 = ContainerTestHelper
.getTestBlockID(container.getContainerInfo().getContainerID());
ContainerProtocolCalls
- .writeSmallFile(client, blockID2, "data123".getBytes(UTF_8), null);
+ .writeSmallFile(client, blockID2, "data123".getBytes(UTF_8), null,
null);
blockID1.setBlockCommitSequenceId(bcsId + 1);
//read a file with higher bcsId than the committed bcsId for the block
diff --git
a/hadoop-ozone/vapor/src/main/java/org/apache/hadoop/ozone/freon/ChunkManagerDiskWrite.java
b/hadoop-ozone/vapor/src/main/java/org/apache/hadoop/ozone/freon/ChunkManagerDiskWrite.java
index b7ca060419d..885ff965520 100644
---
a/hadoop-ozone/vapor/src/main/java/org/apache/hadoop/ozone/freon/ChunkManagerDiskWrite.java
+++
b/hadoop-ozone/vapor/src/main/java/org/apache/hadoop/ozone/freon/ChunkManagerDiskWrite.java
@@ -28,6 +28,7 @@
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicLong;
import org.apache.commons.lang3.RandomStringUtils;
+import org.apache.hadoop.fs.StorageType;
import org.apache.hadoop.hdds.cli.HddsVersionProvider;
import org.apache.hadoop.hdds.client.BlockID;
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
@@ -130,7 +131,7 @@ public Void call() throws Exception {
KeyValueContainer keyValueContainer =
new KeyValueContainer(keyValueContainerData, ozoneConfiguration);
- keyValueContainer.create(volumeSet, volumeChoicePolicy, "scmid");
+ keyValueContainer.create(volumeSet, volumeChoicePolicy, "scmid",
StorageType.DISK);
containersPerThread.put(i, keyValueContainer);
}
diff --git
a/hadoop-ozone/vapor/src/main/java/org/apache/hadoop/ozone/freon/containergenerator/GeneratorDatanode.java
b/hadoop-ozone/vapor/src/main/java/org/apache/hadoop/ozone/freon/containergenerator/GeneratorDatanode.java
index 10f47fe2090..239026ddc52 100644
---
a/hadoop-ozone/vapor/src/main/java/org/apache/hadoop/ozone/freon/containergenerator/GeneratorDatanode.java
+++
b/hadoop-ozone/vapor/src/main/java/org/apache/hadoop/ozone/freon/containergenerator/GeneratorDatanode.java
@@ -34,6 +34,7 @@
import java.util.SplittableRandom;
import java.util.concurrent.Callable;
import java.util.stream.Stream;
+import org.apache.hadoop.fs.StorageType;
import org.apache.hadoop.hdds.cli.HddsVersionProvider;
import org.apache.hadoop.hdds.client.BlockID;
import org.apache.hadoop.hdds.conf.ConfigurationSource;
@@ -329,7 +330,7 @@ private KeyValueContainer createContainer(long containerId)
new KeyValueContainer(keyValueContainerData, config);
try {
- keyValueContainer.create(volumeSet, volumeChoosingPolicy, scmId);
+ keyValueContainer.create(volumeSet, volumeChoosingPolicy, scmId,
StorageType.DISK);
} catch (StorageContainerException ex) {
throw new RuntimeException(ex);
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]