diff --git a/header/src/main/java/org/zstack/header/volume/CreateQcow2VolumeProvisioningStrategyExtensionPoint.java b/header/src/main/java/org/zstack/header/volume/CreateQcow2VolumeProvisioningStrategyExtensionPoint.java deleted file mode 100644 index a93f47ef87..0000000000 --- a/header/src/main/java/org/zstack/header/volume/CreateQcow2VolumeProvisioningStrategyExtensionPoint.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.zstack.header.volume; - -public interface CreateQcow2VolumeProvisioningStrategyExtensionPoint { - void saveQcow2VolumeProvisioningStrategy(VolumeInventory volume, boolean hasBackingFile); -} diff --git a/header/src/main/java/org/zstack/header/volume/VolumeConstant.java b/header/src/main/java/org/zstack/header/volume/VolumeConstant.java index 15d3062975..848153ef96 100755 --- a/header/src/main/java/org/zstack/header/volume/VolumeConstant.java +++ b/header/src/main/java/org/zstack/header/volume/VolumeConstant.java @@ -12,6 +12,10 @@ public interface VolumeConstant { int DEFAULT_MAX_DATA_VOLUME_NUMBER = 24; String BLOCK_VOLUME_TYPE = "blockVolume"; + String NONE_PREALLOCTION = "none"; + String FULL_PREALLOCTION = "full"; + String FALLOC_PREALLOCTION = "falloc"; + enum Capability { MigrationInCurrentPrimaryStorage, MigrationToOtherPrimaryStorage diff --git a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageFactory.java b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageFactory.java index d755bc71aa..ef94616cc3 100755 --- a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageFactory.java +++ b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageFactory.java @@ -47,6 +47,8 @@ import org.zstack.header.vm.VmInstanceConstant.VmOperation; import org.zstack.header.volume.*; import org.zstack.kvm.KVMConstant; +import org.zstack.resourceconfig.ResourceConfig; +import org.zstack.resourceconfig.ResourceConfigFacade; import org.zstack.storage.primary.PrimaryStorageCapacityChecker; import org.zstack.storage.snapshot.PostMarkRootVolumeAsSnapshotExtension; import org.zstack.storage.snapshot.reference.VolumeSnapshotReferenceUtils; @@ -60,6 +62,7 @@ import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; +import static org.zstack.compute.vm.VmCpuVendor.AuthenticAMD; import static org.zstack.core.Platform.argerr; import static org.zstack.core.Platform.err; import static org.zstack.core.Platform.operr; @@ -101,6 +104,8 @@ public boolean isSupportVmLiveMigration() { private CloudBus bus; @Autowired private ErrorFacade errf; + @Autowired + private ResourceConfigFacade rcf; private Map backupStorageMediatorMap = new HashMap(); @@ -261,11 +266,21 @@ public void afterInstantiateVolume(InstantiateVolumeOnPrimaryStorageMsg msg) { hasBackingFile = true; } } - - VolumeInventory volume = msg.getVolume(); - volume.setPrimaryStorageUuid(msg.getPrimaryStorageUuid()); - for (CreateQcow2VolumeProvisioningStrategyExtensionPoint exp : pluginRgty.getExtensionList(CreateQcow2VolumeProvisioningStrategyExtensionPoint.class)) { - exp.saveQcow2VolumeProvisioningStrategy(volume, hasBackingFile); + + String preallocation = rcf.getResourceConfigValueByResourceType(LocalStoragePrimaryStorageGlobalConfig.QCOW2_ALLOCATION, + msg.getVolume().getUuid(), VolumeVO.class.getSimpleName(), String.class); + if (preallocation != null) { + return; + } + + if (hasBackingFile) { + ResourceConfig rc = rcf.getResourceConfig(LocalStoragePrimaryStorageGlobalConfig.QCOW2_ALLOCATION.getIdentity()); + String psPreallocation = rcf.getResourceConfigValueByResourceType(LocalStoragePrimaryStorageGlobalConfig.QCOW2_ALLOCATION, + msg.getVolume().getPrimaryStorageUuid(), PrimaryStorageVO.class.getSimpleName(), String.class); + if (psPreallocation == null) { + psPreallocation = LocalStoragePrimaryStorageGlobalConfig.QCOW2_ALLOCATION.getDefaultValue(); + } + rc.updateValue(msg.getVolume().getUuid(), psPreallocation); } } diff --git a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStoragePrimaryStorageGlobalConfig.java b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStoragePrimaryStorageGlobalConfig.java index b42b3b50bd..764aa73de2 100644 --- a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStoragePrimaryStorageGlobalConfig.java +++ b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStoragePrimaryStorageGlobalConfig.java @@ -4,6 +4,7 @@ import org.zstack.core.config.GlobalConfigDefinition; import org.zstack.core.config.GlobalConfigValidation; import org.zstack.header.storage.primary.PrimaryStorageVO; +import org.zstack.header.volume.VolumeVO; import org.zstack.resourceconfig.BindResourceConfig; /** @@ -17,6 +18,6 @@ public class LocalStoragePrimaryStorageGlobalConfig { public static GlobalConfig ALLOW_LIVE_MIGRATION = new GlobalConfig(CATEGORY, "liveMigrationWithStorage.allow"); @GlobalConfigValidation(validValues = {"none", "metadata", "falloc", "full"}) - @BindResourceConfig({PrimaryStorageVO.class}) + @BindResourceConfig({VolumeVO.class, PrimaryStorageVO.class}) public static GlobalConfig QCOW2_ALLOCATION = new GlobalConfig(CATEGORY, "qcow2.allocation"); } diff --git a/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorageFactory.java b/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorageFactory.java index 017672a99a..0123453b42 100755 --- a/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorageFactory.java +++ b/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorageFactory.java @@ -40,6 +40,8 @@ import org.zstack.header.vo.ResourceVO; import org.zstack.header.volume.*; import org.zstack.kvm.KVMConstant; +import org.zstack.resourceconfig.ResourceConfig; +import org.zstack.resourceconfig.ResourceConfigFacade; import org.zstack.storage.primary.ChangePrimaryStorageStatusMsg; import org.zstack.storage.primary.PrimaryStorageCapacityUpdater; import org.zstack.storage.primary.PrimaryStorageSystemTags; @@ -80,6 +82,8 @@ public class NfsPrimaryStorageFactory implements NfsPrimaryStorageManager, Prima private RESTFacade restf; @Autowired protected EventFacade evtf; + @Autowired + private ResourceConfigFacade rcf; private Map backends = new HashMap(); private Map> mediators = @@ -793,10 +797,20 @@ public void afterInstantiateVolume(InstantiateVolumeOnPrimaryStorageMsg msg) { } } - VolumeInventory volume = msg.getVolume(); - volume.setPrimaryStorageUuid(msg.getPrimaryStorageUuid()); - for (CreateQcow2VolumeProvisioningStrategyExtensionPoint exp : pluginRgty.getExtensionList(CreateQcow2VolumeProvisioningStrategyExtensionPoint.class)) { - exp.saveQcow2VolumeProvisioningStrategy(volume, hasBackingFile); + String preallocation = rcf.getResourceConfigValueByResourceType(NfsPrimaryStorageGlobalConfig.QCOW2_ALLOCATION, + msg.getVolume().getUuid(), VolumeVO.class.getSimpleName(), String.class); + if (preallocation != null) { + return; + } + + if (hasBackingFile) { + ResourceConfig rc = rcf.getResourceConfig(NfsPrimaryStorageGlobalConfig.QCOW2_ALLOCATION.getIdentity()); + String psPreallocation = rcf.getResourceConfigValueByResourceType(NfsPrimaryStorageGlobalConfig.QCOW2_ALLOCATION, + msg.getVolume().getPrimaryStorageUuid(), PrimaryStorageVO.class.getSimpleName(), String.class); + if (psPreallocation == null) { + psPreallocation = NfsPrimaryStorageGlobalConfig.QCOW2_ALLOCATION.getDefaultValue(); + } + rc.updateValue(msg.getVolume().getUuid(), psPreallocation); } } } diff --git a/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorageGlobalConfig.java b/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorageGlobalConfig.java index 2575292dcb..cfb0274d0f 100755 --- a/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorageGlobalConfig.java +++ b/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorageGlobalConfig.java @@ -4,6 +4,7 @@ import org.zstack.core.config.GlobalConfigDefinition; import org.zstack.core.config.GlobalConfigValidation; import org.zstack.header.storage.primary.PrimaryStorageVO; +import org.zstack.header.volume.VolumeVO; import org.zstack.resourceconfig.BindResourceConfig; /** @@ -19,6 +20,6 @@ public class NfsPrimaryStorageGlobalConfig { public static GlobalConfig GC_INTERVAL = new GlobalConfig(CATEGORY, "deletion.gcInterval"); @GlobalConfigValidation(validValues = {"none", "metadata", "falloc", "full"}) - @BindResourceConfig({PrimaryStorageVO.class}) + @BindResourceConfig({VolumeVO.class, PrimaryStorageVO.class}) public static GlobalConfig QCOW2_ALLOCATION = new GlobalConfig(CATEGORY, "qcow2.allocation"); } diff --git a/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/SMPPrimaryStorageFactory.java b/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/SMPPrimaryStorageFactory.java index 76425ea21c..64fdc52bbf 100755 --- a/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/SMPPrimaryStorageFactory.java +++ b/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/SMPPrimaryStorageFactory.java @@ -28,6 +28,8 @@ import org.zstack.header.storage.snapshot.CreateTemplateFromVolumeSnapshotExtensionPoint; import org.zstack.header.storage.snapshot.VolumeSnapshotInventory; import org.zstack.header.volume.*; +import org.zstack.resourceconfig.ResourceConfig; +import org.zstack.resourceconfig.ResourceConfigFacade; import org.zstack.storage.snapshot.PostMarkRootVolumeAsSnapshotExtension; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; @@ -62,6 +64,8 @@ public class SMPPrimaryStorageFactory implements PrimaryStorageFactory, CreateTe private ErrorFacade errf; @Autowired private PluginRegistry pluginRgty; + @Autowired + private ResourceConfigFacade rcf; @Override public PrimaryStorageType getPrimaryStorageType() { @@ -422,10 +426,20 @@ public void afterInstantiateVolume(InstantiateVolumeOnPrimaryStorageMsg msg) { } } - VolumeInventory volume = msg.getVolume(); - volume.setPrimaryStorageUuid(msg.getPrimaryStorageUuid()); - for (CreateQcow2VolumeProvisioningStrategyExtensionPoint exp : pluginRgty.getExtensionList(CreateQcow2VolumeProvisioningStrategyExtensionPoint.class)) { - exp.saveQcow2VolumeProvisioningStrategy(volume, hasBackingFile); + String preallocation = rcf.getResourceConfigValueByResourceType(SMPPrimaryStorageGlobalConfig.QCOW2_ALLOCATION, + msg.getVolume().getUuid(), VolumeVO.class.getSimpleName(), String.class); + if (preallocation != null) { + return; + } + + if (hasBackingFile) { + ResourceConfig rc = rcf.getResourceConfig(SMPPrimaryStorageGlobalConfig.QCOW2_ALLOCATION.getIdentity()); + String psPreallocation = rcf.getResourceConfigValueByResourceType(SMPPrimaryStorageGlobalConfig.QCOW2_ALLOCATION, + msg.getVolume().getPrimaryStorageUuid(), PrimaryStorageVO.class.getSimpleName(), String.class); + if (psPreallocation == null) { + psPreallocation = SMPPrimaryStorageGlobalConfig.QCOW2_ALLOCATION.getDefaultValue(); + } + rc.updateValue(msg.getVolume().getUuid(), psPreallocation); } } } diff --git a/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/SMPPrimaryStorageGlobalConfig.java b/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/SMPPrimaryStorageGlobalConfig.java index 9e4f6c7b62..dd68ba91cc 100644 --- a/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/SMPPrimaryStorageGlobalConfig.java +++ b/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/SMPPrimaryStorageGlobalConfig.java @@ -4,6 +4,7 @@ import org.zstack.core.config.GlobalConfigDefinition; import org.zstack.core.config.GlobalConfigValidation; import org.zstack.header.storage.primary.PrimaryStorageVO; +import org.zstack.header.volume.VolumeVO; import org.zstack.resourceconfig.BindResourceConfig; /** @@ -17,6 +18,6 @@ public class SMPPrimaryStorageGlobalConfig { public static GlobalConfig GC_INTERVAL = new GlobalConfig(CATEGORY, "deletion.gcInterval"); @GlobalConfigValidation(validValues = {"none", "metadata", "falloc", "full"}) - @BindResourceConfig({PrimaryStorageVO.class}) + @BindResourceConfig({VolumeVO.class, PrimaryStorageVO.class}) public static GlobalConfig QCOW2_ALLOCATION = new GlobalConfig(CATEGORY, "qcow2.allocation"); }