mirror of https://github.com/apache/cloudstack.git
storage: add NVMeTCP storage pool type
NVMe-oF over TCP (NVMe-TCP) is conceptually a separate storage fabric from Fibre Channel / iSCSI: it speaks the NVMe command set rather than SCSI, identifies namespaces by EUI-128 NGUIDs rather than WWNs, and on Linux is multipathed natively by the nvme driver rather than by device-mapper multipath. Giving it its own StoragePoolType lets the KVM agent dispatch the adaptive driver to a dedicated NVMe-oF adapter (added in the next commit) without polluting the existing Fibre Channel code path. The new value is wired into the same format-routing and derivePath fall-through paths that already special-case FiberChannel in KVMStorageProcessor: NVMe-TCP volumes are also RAW and carry their device path in DataObjectTO.path rather than in a managedStoreTarget detail.
This commit is contained in:
parent
1b44cfa604
commit
7d1ec8ff8a
|
|
@ -183,7 +183,8 @@ public class Storage {
|
|||
Linstor(true, true, EncryptionSupport.Storage),
|
||||
DatastoreCluster(true, true, EncryptionSupport.Unsupported), // for VMware, to abstract pool of clusters
|
||||
StorPool(true, true, EncryptionSupport.Hypervisor),
|
||||
FiberChannel(true, true, EncryptionSupport.Unsupported); // Fiber Channel Pool for KVM hypervisors is used to find the volume by WWN value (/dev/disk/by-id/wwn-<wwnvalue>)
|
||||
FiberChannel(true, true, EncryptionSupport.Unsupported), // Fiber Channel Pool for KVM hypervisors is used to find the volume by WWN value (/dev/disk/by-id/wwn-<wwnvalue>)
|
||||
NVMeTCP(true, true, EncryptionSupport.Unsupported); // NVMe over TCP (NVMe-oF/TCP) Pool for KVM hypervisors; volumes are identified by EUI-128 NGUID (/dev/disk/by-id/nvme-eui.<eui>)
|
||||
|
||||
private final boolean shared;
|
||||
private final boolean overProvisioning;
|
||||
|
|
|
|||
|
|
@ -376,7 +376,8 @@ public class KVMStorageProcessor implements StorageProcessor {
|
|||
StoragePoolType.RBD,
|
||||
StoragePoolType.PowerFlex,
|
||||
StoragePoolType.Linstor,
|
||||
StoragePoolType.FiberChannel).contains(primaryPool.getType())) {
|
||||
StoragePoolType.FiberChannel,
|
||||
StoragePoolType.NVMeTCP).contains(primaryPool.getType())) {
|
||||
newTemplate.setFormat(ImageFormat.RAW);
|
||||
} else {
|
||||
newTemplate.setFormat(ImageFormat.QCOW2);
|
||||
|
|
@ -409,7 +410,8 @@ public class KVMStorageProcessor implements StorageProcessor {
|
|||
|
||||
public static String derivePath(PrimaryDataStoreTO primaryStore, DataTO destData, Map<String, String> details) {
|
||||
String path = null;
|
||||
if (primaryStore.getPoolType() == StoragePoolType.FiberChannel) {
|
||||
if (primaryStore.getPoolType() == StoragePoolType.FiberChannel
|
||||
|| primaryStore.getPoolType() == StoragePoolType.NVMeTCP) {
|
||||
path = destData.getPath();
|
||||
} else {
|
||||
path = details != null ? details.get("managedStoreTarget") : null;
|
||||
|
|
@ -3175,7 +3177,8 @@ public class KVMStorageProcessor implements StorageProcessor {
|
|||
StoragePoolType.RBD,
|
||||
StoragePoolType.PowerFlex,
|
||||
StoragePoolType.Linstor,
|
||||
StoragePoolType.FiberChannel).contains(poolType)) {
|
||||
StoragePoolType.FiberChannel,
|
||||
StoragePoolType.NVMeTCP).contains(poolType)) {
|
||||
return ImageFormat.RAW;
|
||||
} else {
|
||||
return ImageFormat.QCOW2;
|
||||
|
|
|
|||
Loading…
Reference in New Issue