This is an automated email from the ASF dual-hosted git repository. DaanHoogland pushed a commit to branch ghi10752-configCleanup in repository https://gitbox.apache.org/repos/asf/cloudstack.git
commit fc1fc9ba88dca3b07227a96ebd3e63c6169bc2ff Author: Daan Hoogland <[email protected]> AuthorDate: Fri Aug 14 07:50:40 2026 +0200 move storage configuration items from deprecated Config enum to services --- .../java/com/cloud/storage/VolumeApiService.java | 12 ++++ .../subsystem/api/storage/StorageCacheManager.java | 15 +++++ .../java/com/cloud/template/TemplateManager.java | 4 ++ .../cache/manager/StorageCacheManagerImpl.java | 19 +++++- .../StorageCacheReplacementAlgorithmLRU.java | 11 ++-- .../storage/motion/AncientDataMotionStrategy.java | 15 +++-- .../motion/StorageSystemDataMotionStrategy.java | 2 +- .../storage/volume/VolumeServiceImpl.java | 17 +++--- .../driver/LinstorPrimaryDataStoreDriverImpl.java | 13 ++--- .../driver/ScaleIOPrimaryDataStoreDriver.java | 4 +- .../datastore/manager/ScaleIOSDCManagerImpl.java | 7 +-- .../driver/ScaleIOPrimaryDataStoreDriverTest.java | 4 -- .../datastore/driver/StorPoolStatsCollector.java | 3 +- .../main/java/com/cloud/configuration/Config.java | 67 ---------------------- .../main/java/com/cloud/server/StatsCollector.java | 7 ++- .../com/cloud/storage/VolumeApiServiceImpl.java | 11 ++-- .../storage/download/DownloadMonitorImpl.java | 5 +- .../cloud/storage/snapshot/SnapshotManager.java | 6 ++ .../storage/snapshot/SnapshotManagerImpl.java | 7 +-- .../com/cloud/template/TemplateManagerImpl.java | 3 +- 20 files changed, 104 insertions(+), 128 deletions(-) diff --git a/api/src/main/java/com/cloud/storage/VolumeApiService.java b/api/src/main/java/com/cloud/storage/VolumeApiService.java index 372eb038561..904ab5b9bc9 100644 --- a/api/src/main/java/com/cloud/storage/VolumeApiService.java +++ b/api/src/main/java/com/cloud/storage/VolumeApiService.java @@ -61,6 +61,18 @@ public interface VolumeApiService { true, ConfigKey.Scope.Zone); + ConfigKey<Integer> CopyVolumeWait = new ConfigKey<>("Storage", Integer.class, "copy.volume.wait", "10800", + "In second, timeout for copy volume command", true); + + ConfigKey<Integer> CreateVolumeFromSnapshotWait = new ConfigKey<>("Storage", Integer.class, "create.volume.from.snapshot.wait", "10800", + "In second, timeout for creating volume from snapshot", true); + + ConfigKey<Long> MaxUploadVolumeSize = new ConfigKey<>("Storage", Long.class, "storage.max.volume.upload.size", "500", + "The maximum size for a uploaded volume(in GB).", true); + + ConfigKey<Integer> StoragePoolMaxWaitSeconds = new ConfigKey<>("Storage", Integer.class, "storage.pool.max.waitseconds", "3600", + "Timeout (in seconds) to synchronize storage pool operations.", true); + /** * Creates the database object for a volume based on the given criteria * diff --git a/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/StorageCacheManager.java b/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/StorageCacheManager.java index b8aeb5cf751..d17adf16cc6 100644 --- a/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/StorageCacheManager.java +++ b/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/StorageCacheManager.java @@ -18,7 +18,22 @@ */ package org.apache.cloudstack.engine.subsystem.api.storage; +import org.apache.cloudstack.framework.config.ConfigKey; + public interface StorageCacheManager { + + ConfigKey<Boolean> StorageCacheReplacementEnabled = new ConfigKey<>("Storage", Boolean.class, + "storage.cache.replacement.enabled", "true", + "enable or disable cache storage replacement algorithm.", true); + + ConfigKey<Integer> StorageCacheReplacementInterval = new ConfigKey<>("Storage", Integer.class, + "storage.cache.replacement.interval", "86400", + "time interval between cache replacement threads (in seconds).", true); + + ConfigKey<Integer> StorageCacheReplacementLRUTimeInterval = new ConfigKey<>("Storage", Integer.class, + "storage.cache.replacement.lru.interval", "30", + "time interval for unused data on cache storage (in days).", true); + DataStore getCacheStorage(Scope scope); DataStore getCacheStorage(DataObject data, Scope scope); diff --git a/engine/components-api/src/main/java/com/cloud/template/TemplateManager.java b/engine/components-api/src/main/java/com/cloud/template/TemplateManager.java index 8c11fe6c93a..0cadaac4c96 100644 --- a/engine/components-api/src/main/java/com/cloud/template/TemplateManager.java +++ b/engine/components-api/src/main/java/com/cloud/template/TemplateManager.java @@ -85,6 +85,10 @@ public interface TemplateManager { true, ConfigKey.Scope.Cluster); + ConfigKey<Integer> CreatePrivateTemplateFromSnapshotWait = new ConfigKey<>("Storage", Integer.class, + "create.private.template.from.snapshot.wait", "10800", + "In second, timeout for CreatePrivateTemplateFromSnapshotCommand", true); + // KVM/libvirt maps deviceSeq=3 to hdc (hda/hdb are taken by the root volume on i440fx/IDE). // user_vm.iso_id has always pointed at this slot; additional cdroms live in vm_iso_map. int CDROM_PRIMARY_DEVICE_SEQ = 3; diff --git a/engine/storage/cache/src/main/java/org/apache/cloudstack/storage/cache/manager/StorageCacheManagerImpl.java b/engine/storage/cache/src/main/java/org/apache/cloudstack/storage/cache/manager/StorageCacheManagerImpl.java index 21ef851fb2f..931f5e5281e 100644 --- a/engine/storage/cache/src/main/java/org/apache/cloudstack/storage/cache/manager/StorageCacheManagerImpl.java +++ b/engine/storage/cache/src/main/java/org/apache/cloudstack/storage/cache/manager/StorageCacheManagerImpl.java @@ -47,6 +47,8 @@ import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreState import org.apache.cloudstack.engine.subsystem.api.storage.Scope; import org.apache.cloudstack.engine.subsystem.api.storage.StorageCacheManager; import org.apache.cloudstack.framework.async.AsyncCallFuture; +import org.apache.cloudstack.framework.config.ConfigKey; +import org.apache.cloudstack.framework.config.Configurable; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; import org.apache.cloudstack.managed.context.ManagedContextRunnable; import org.apache.cloudstack.storage.cache.allocator.StorageCacheAllocator; @@ -64,8 +66,9 @@ import com.cloud.utils.db.QueryBuilder; import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.exception.CloudRuntimeException; -public class StorageCacheManagerImpl implements StorageCacheManager, Manager { +public class StorageCacheManagerImpl implements StorageCacheManager, Manager, Configurable { protected Logger logger = LogManager.getLogger(getClass()); + @Inject List<StorageCacheAllocator> storageCacheAllocator; @Inject @@ -159,13 +162,23 @@ public class StorageCacheManagerImpl implements StorageCacheManager, Manager { @Override public boolean configure(String name, Map<String, Object> params) throws ConfigurationException { - cacheReplacementEnabled = Boolean.parseBoolean(configDao.getValue(Config.StorageCacheReplacementEnabled.key())); - cacheReplaceMentInterval = NumbersUtil.parseInt(configDao.getValue(Config.StorageCacheReplacementInterval.key()), 86400); + cacheReplacementEnabled = StorageCacheReplacementEnabled.value(); + cacheReplaceMentInterval = StorageCacheReplacementInterval.value(); workers = NumbersUtil.parseInt(configDao.getValue(Config.ExpungeWorkers.key()), 10); executors = Executors.newScheduledThreadPool(workers, new NamedThreadFactory("StorageCacheManager-cache-replacement")); return true; } + @Override + public String getConfigComponentName() { + return StorageCacheManager.class.getSimpleName(); + } + + @Override + public ConfigKey<?>[] getConfigKeys() { + return new ConfigKey<?>[] {StorageCacheReplacementEnabled, StorageCacheReplacementInterval, StorageCacheReplacementLRUTimeInterval}; + } + protected class CacheReplacementRunner extends ManagedContextRunnable { @Override diff --git a/engine/storage/cache/src/main/java/org/apache/cloudstack/storage/cache/manager/StorageCacheReplacementAlgorithmLRU.java b/engine/storage/cache/src/main/java/org/apache/cloudstack/storage/cache/manager/StorageCacheReplacementAlgorithmLRU.java index 7042ee45333..3a4c590fa5f 100644 --- a/engine/storage/cache/src/main/java/org/apache/cloudstack/storage/cache/manager/StorageCacheReplacementAlgorithmLRU.java +++ b/engine/storage/cache/src/main/java/org/apache/cloudstack/storage/cache/manager/StorageCacheReplacementAlgorithmLRU.java @@ -28,22 +28,19 @@ import org.apache.cloudstack.engine.subsystem.api.storage.DataObject; import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine; import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotDataFactory; +import org.apache.cloudstack.engine.subsystem.api.storage.StorageCacheManager; import org.apache.cloudstack.engine.subsystem.api.storage.TemplateDataFactory; import org.apache.cloudstack.engine.subsystem.api.storage.VolumeDataFactory; -import org.apache.cloudstack.framework.config.dao.ConfigurationDao; import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreVO; import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO; import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreVO; -import com.cloud.configuration.Config; import com.cloud.utils.DateUtil; -import com.cloud.utils.NumbersUtil; import com.cloud.utils.db.QueryBuilder; import com.cloud.utils.db.SearchCriteria; public class StorageCacheReplacementAlgorithmLRU implements StorageCacheReplacementAlgorithm { - @Inject - ConfigurationDao configDao; + @Inject TemplateDataFactory templateFactory; @Inject @@ -59,7 +56,7 @@ public class StorageCacheReplacementAlgorithmLRU implements StorageCacheReplacem @PostConstruct public void initialize() { - /* Avoid using configDao at this time, we can't be sure that the database is already upgraded + /* Avoid resolving the config value at this time, we can't be sure that the database is already upgraded * and there might be fatal errors when using a dao. */ } @@ -71,7 +68,7 @@ public class StorageCacheReplacementAlgorithmLRU implements StorageCacheReplacem @Override public DataObject chooseOneToBeReplaced(DataStore store) { if (unusedTimeInterval == null) { - unusedTimeInterval = NumbersUtil.parseInt(configDao.getValue(Config.StorageCacheReplacementLRUTimeInterval.key()), 30); + unusedTimeInterval = StorageCacheManager.StorageCacheReplacementLRUTimeInterval.value(); } Calendar cal = Calendar.getInstance(); cal.setTime(DateUtil.now()); diff --git a/engine/storage/datamotion/src/main/java/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java b/engine/storage/datamotion/src/main/java/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java index bbf775de27a..51c1f3425a6 100644 --- a/engine/storage/datamotion/src/main/java/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java +++ b/engine/storage/datamotion/src/main/java/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java @@ -79,9 +79,12 @@ import com.cloud.storage.StorageManager; import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.Storage.StoragePoolType; import com.cloud.storage.StoragePool; +import com.cloud.storage.VolumeApiService; import com.cloud.storage.VolumeVO; import com.cloud.storage.dao.SnapshotDao; import com.cloud.storage.dao.VolumeDao; +import com.cloud.storage.snapshot.SnapshotManager; +import com.cloud.template.TemplateManager; import com.cloud.utils.NumbersUtil; import com.cloud.utils.db.DB; import com.cloud.utils.exception.CloudRuntimeException; @@ -340,8 +343,7 @@ public class AncientDataMotionStrategy implements DataMotionStrategy { srcData = cacheSnapshotChain(snapshot, new ZoneScope(pool.getDataCenterId())); } - String value = configDao.getValue(Config.CreateVolumeFromSnapshotWait.toString()); - int _createVolumeFromSnapshotWait = NumbersUtil.parseInt(value, Integer.parseInt(Config.CreateVolumeFromSnapshotWait.getDefaultValue())); + int _createVolumeFromSnapshotWait = VolumeApiService.CreateVolumeFromSnapshotWait.value(); EndPoint ep = null; if (srcData.getDataStore().getRole() == DataStoreRole.Primary) { @@ -425,8 +427,7 @@ public class AncientDataMotionStrategy implements DataMotionStrategy { } protected Answer copyVolumeBetweenPools(DataObject srcData, DataObject destData) { - String value = configDao.getValue(Config.CopyVolumeWait.key()); - int _copyvolumewait = NumbersUtil.parseInt(value, Integer.parseInt(Config.CopyVolumeWait.getDefaultValue())); + int _copyvolumewait = VolumeApiService.CopyVolumeWait.value(); Scope destScope = getZoneScope(destData.getDataStore().getScope()); DataStore cacheStore = cacheMgr.getCacheStorage(destScope); @@ -733,8 +734,7 @@ public class AncientDataMotionStrategy implements DataMotionStrategy { @DB protected Answer createTemplateFromSnapshot(DataObject srcData, DataObject destData) { - String value = configDao.getValue(Config.CreatePrivateTemplateFromSnapshotWait.toString()); - int _createprivatetemplatefromsnapshotwait = NumbersUtil.parseInt(value, Integer.parseInt(Config.CreatePrivateTemplateFromSnapshotWait.getDefaultValue())); + int _createprivatetemplatefromsnapshotwait = TemplateManager.CreatePrivateTemplateFromSnapshotWait.value(); boolean needCache = false; if (needCacheStorage(srcData, destData)) { @@ -767,8 +767,7 @@ public class AncientDataMotionStrategy implements DataMotionStrategy { } protected Answer copySnapshot(DataObject srcData, DataObject destData) { - String value = configDao.getValue(Config.BackupSnapshotWait.toString()); - int _backupsnapshotwait = NumbersUtil.parseInt(value, Integer.parseInt(Config.BackupSnapshotWait.getDefaultValue())); + int _backupsnapshotwait = SnapshotManager.BackupSnapshotWait.value(); DataObject cacheData = null; SnapshotInfo snapshotInfo = (SnapshotInfo)srcData; diff --git a/engine/storage/datamotion/src/main/java/org/apache/cloudstack/storage/motion/StorageSystemDataMotionStrategy.java b/engine/storage/datamotion/src/main/java/org/apache/cloudstack/storage/motion/StorageSystemDataMotionStrategy.java index 7674f1ce25a..a98e1fa893b 100644 --- a/engine/storage/datamotion/src/main/java/org/apache/cloudstack/storage/motion/StorageSystemDataMotionStrategy.java +++ b/engine/storage/datamotion/src/main/java/org/apache/cloudstack/storage/motion/StorageSystemDataMotionStrategy.java @@ -1608,7 +1608,7 @@ public class StorageSystemDataMotionStrategy implements DataMotionStrategy { AsyncCallFuture<VolumeApiResult> future = _volumeService.createVolumeAsync(volumeInfo, volumeInfo.getDataStore()); - int storagePoolMaxWaitSeconds = NumbersUtil.parseInt(_configDao.getValue(Config.StoragePoolMaxWaitSeconds.key()), 3600); + int storagePoolMaxWaitSeconds = VolumeApiService.StoragePoolMaxWaitSeconds.value(); VolumeApiResult result = future.get(storagePoolMaxWaitSeconds, TimeUnit.SECONDS); diff --git a/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java b/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java index 6502de70a1f..d9d23903bdc 100644 --- a/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java +++ b/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java @@ -106,7 +106,6 @@ import com.cloud.agent.api.to.DataObjectType; import com.cloud.agent.api.to.StorageFilerTO; import com.cloud.agent.api.to.VirtualMachineTO; import com.cloud.alert.AlertManager; -import com.cloud.configuration.Config; import com.cloud.configuration.Resource.ResourceType; import com.cloud.dc.dao.ClusterDao; import com.cloud.event.EventTypes; @@ -138,6 +137,7 @@ import com.cloud.storage.VMTemplateStorageResourceAssoc; import com.cloud.storage.VMTemplateStorageResourceAssoc.Status; import com.cloud.storage.VMTemplateVO; import com.cloud.storage.Volume; +import com.cloud.storage.VolumeApiService; import com.cloud.storage.VolumeApiServiceImpl; import com.cloud.storage.Volume.State; import com.cloud.storage.VolumeDetailVO; @@ -155,7 +155,6 @@ import com.cloud.storage.template.TemplateProp; import com.cloud.user.Account; import com.cloud.user.AccountManager; import com.cloud.user.ResourceLimitService; -import com.cloud.utils.NumbersUtil; import com.cloud.utils.Pair; import com.cloud.utils.db.DB; import com.cloud.utils.db.GlobalLock; @@ -669,7 +668,7 @@ public class VolumeServiceImpl implements VolumeService { } private TemplateInfo waitForTemplateDownloaded(PrimaryDataStore store, TemplateInfo template) { - int storagePoolMaxWaitSeconds = NumbersUtil.parseInt(configDao.getValue(Config.StoragePoolMaxWaitSeconds.key()), 3600); + int storagePoolMaxWaitSeconds = VolumeApiService.StoragePoolMaxWaitSeconds.value(); int sleepTime = 120; int tries = storagePoolMaxWaitSeconds / sleepTime; while (tries > 0) { @@ -705,7 +704,7 @@ public class VolumeServiceImpl implements VolumeService { AsyncCallbackDispatcher<VolumeServiceImpl, CopyCommandResult> caller = AsyncCallbackDispatcher.create(this); caller.setCallback(caller.getTarget().copyBaseImageCallback(null, null)).setContext(context); - int storagePoolMaxWaitSeconds = NumbersUtil.parseInt(configDao.getValue(Config.StoragePoolMaxWaitSeconds.key()), 3600); + int storagePoolMaxWaitSeconds = VolumeApiService.StoragePoolMaxWaitSeconds.value(); if (logger.isDebugEnabled()) { logger.debug("Acquire lock on VMTemplateStoragePool " + templatePoolRefId + " with timeout " + storagePoolMaxWaitSeconds + " seconds"); } @@ -980,7 +979,7 @@ public class VolumeServiceImpl implements VolumeService { // At this point, we have an entry in the DB that points to our cached template. // We need to lock it as there may be other VMs that may get started using the same template. // We want to avoid having to create multiple cache copies of the same template. - int storagePoolMaxWaitSeconds = NumbersUtil.parseInt(configDao.getValue(Config.StoragePoolMaxWaitSeconds.key()), 3600); + int storagePoolMaxWaitSeconds = VolumeApiService.StoragePoolMaxWaitSeconds.value(); long templatePoolRefId = templatePoolRef.getId(); templatePoolRef = _tmpltPoolDao.acquireInLockTable(templatePoolRefId, storagePoolMaxWaitSeconds); @@ -1045,7 +1044,7 @@ public class VolumeServiceImpl implements VolumeService { private void copyTemplateToManagedTemplateVolume(TemplateInfo srcTemplateInfo, TemplateInfo templateOnPrimary, VMTemplateStoragePoolVO templatePoolRef, PrimaryDataStore destPrimaryDataStore, Host destHost) throws StorageAccessException { AsyncCallFuture<VolumeApiResult> copyTemplateFuture = new AsyncCallFuture<>(); - int storagePoolMaxWaitSeconds = NumbersUtil.parseInt(configDao.getValue(Config.StoragePoolMaxWaitSeconds.key()), 3600); + int storagePoolMaxWaitSeconds = VolumeApiService.StoragePoolMaxWaitSeconds.value(); long templatePoolRefId = templatePoolRef.getId(); try { @@ -1432,7 +1431,7 @@ public class VolumeServiceImpl implements VolumeService { throw new CloudRuntimeException("Unable to create managed storage template, couldn't get global lock on " + templateIdManagedPoolIdLockString); } - int storagePoolMaxWaitSeconds = NumbersUtil.parseInt(configDao.getValue(Config.StoragePoolMaxWaitSeconds.key()), 3600); + int storagePoolMaxWaitSeconds = VolumeApiService.StoragePoolMaxWaitSeconds.value(); if (!lock.lock(storagePoolMaxWaitSeconds)) { logger.debug("Unable to create managed storage template, couldn't lock on " + templateIdManagedPoolIdLockString); throw new CloudRuntimeException("Unable to create managed storage template, couldn't lock on " + templateIdManagedPoolIdLockString); @@ -1539,7 +1538,7 @@ public class VolumeServiceImpl implements VolumeService { throw new CloudRuntimeException("Unable to create managed storage template/volume, couldn't get global lock on " + tmplIdManagedPoolIdLockString); } - int storagePoolMaxWaitSeconds = NumbersUtil.parseInt(configDao.getValue(Config.StoragePoolMaxWaitSeconds.key()), 3600); + int storagePoolMaxWaitSeconds = VolumeApiService.StoragePoolMaxWaitSeconds.value(); if (!lock.lock(storagePoolMaxWaitSeconds)) { logger.debug("Unable to create managed storage template/volume, couldn't lock on " + tmplIdManagedPoolIdLockString); throw new CloudRuntimeException("Unable to create managed storage template/volume, couldn't lock on " + tmplIdManagedPoolIdLockString); @@ -1611,7 +1610,7 @@ public class VolumeServiceImpl implements VolumeService { throw new CloudRuntimeException("Unable to create volume from template, couldn't get global lock on " + tmplIdManagedPoolIdDestinationHostLockString); } - int storagePoolMaxWaitSeconds = NumbersUtil.parseInt(configDao.getValue(Config.StoragePoolMaxWaitSeconds.key()), 3600); + int storagePoolMaxWaitSeconds = VolumeApiService.StoragePoolMaxWaitSeconds.value(); if (!lock.lock(storagePoolMaxWaitSeconds)) { logger.debug("Unable to create volume from template, couldn't lock on " + tmplIdManagedPoolIdDestinationHostLockString); throw new CloudRuntimeException("Unable to create volume from template, couldn't lock on " + tmplIdManagedPoolIdDestinationHostLockString); diff --git a/plugins/storage/volume/linstor/src/main/java/org/apache/cloudstack/storage/datastore/driver/LinstorPrimaryDataStoreDriverImpl.java b/plugins/storage/volume/linstor/src/main/java/org/apache/cloudstack/storage/datastore/driver/LinstorPrimaryDataStoreDriverImpl.java index bc0e0a89706..02b2904e97e 100644 --- a/plugins/storage/volume/linstor/src/main/java/org/apache/cloudstack/storage/datastore/driver/LinstorPrimaryDataStoreDriverImpl.java +++ b/plugins/storage/volume/linstor/src/main/java/org/apache/cloudstack/storage/datastore/driver/LinstorPrimaryDataStoreDriverImpl.java @@ -71,6 +71,7 @@ import com.cloud.storage.VMTemplateStoragePoolVO; import com.cloud.storage.VMTemplateStorageResourceAssoc; import com.cloud.storage.VMTemplateVO; import com.cloud.storage.Volume; +import com.cloud.storage.VolumeApiService; import com.cloud.storage.VolumeDetailVO; import com.cloud.storage.VolumeVO; import com.cloud.storage.dao.SnapshotDao; @@ -80,6 +81,7 @@ import com.cloud.storage.dao.VMTemplateDao; import com.cloud.storage.dao.VMTemplatePoolDao; import com.cloud.storage.dao.VolumeDao; import com.cloud.storage.dao.VolumeDetailsDao; +import com.cloud.storage.snapshot.SnapshotManager; import com.cloud.utils.NumbersUtil; import com.cloud.utils.Pair; import com.cloud.utils.exception.CloudRuntimeException; @@ -666,9 +668,7 @@ public class LinstorPrimaryDataStoreDriverImpl implements PrimaryDataStoreDriver final String rscName) throws ApiException { String resultMsg = null; - String value = _configDao.getValue(Config.BackupSnapshotWait.toString()); - int _backupsnapshotwait = NumbersUtil.parseInt( - value, Integer.parseInt(Config.BackupSnapshotWait.getDefaultValue())); + int _backupsnapshotwait = SnapshotManager.BackupSnapshotWait.value(); LinstorRevertBackupSnapshotCommand cmd = new LinstorRevertBackupSnapshotCommand( snapshot.getTO(), @@ -1018,8 +1018,7 @@ public class LinstorPrimaryDataStoreDriverImpl implements PrimaryDataStoreDriver // uses the format of the base volume and we backup snapshots as QCOW2 // https://github.com/apache/cloudstack/pull/8802#issuecomment-2024019927 to.setFormat(Storage.ImageFormat.RAW); - int nMaxExecutionSeconds = NumbersUtil.parseInt( - _configDao.getValue(Config.CopyVolumeWait.key()), 10800); + int nMaxExecutionSeconds = VolumeApiService.CopyVolumeWait.value(); CopyCommand cmd = new CopyCommand( to, dstData.getTO(), @@ -1106,9 +1105,7 @@ public class LinstorPrimaryDataStoreDriverImpl implements PrimaryDataStoreDriver } protected Answer copySnapshot(DataObject srcData, DataObject destData) { - String value = _configDao.getValue(Config.BackupSnapshotWait.toString()); - int _backupsnapshotwait = NumbersUtil.parseInt( - value, Integer.parseInt(Config.BackupSnapshotWait.getDefaultValue())); + int _backupsnapshotwait = SnapshotManager.BackupSnapshotWait.value(); SnapshotObject snapshotObject = (SnapshotObject)srcData; Boolean snapshotFullBackup = snapshotObject.getFullBackup(); diff --git a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriver.java b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriver.java index 14cb82a4c2b..0b257122404 100644 --- a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriver.java +++ b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriver.java @@ -95,6 +95,7 @@ import com.cloud.storage.StoragePool; import com.cloud.storage.StoragePoolHostVO; import com.cloud.storage.VMTemplateStoragePoolVO; import com.cloud.storage.Volume; +import com.cloud.storage.VolumeApiService; import com.cloud.storage.VolumeDetailVO; import com.cloud.storage.VolumeVO; import com.cloud.storage.dao.SnapshotDao; @@ -836,8 +837,7 @@ public class ScaleIOPrimaryDataStoreDriver implements PrimaryDataStoreDriver { protected Answer copyOfflineVolume(DataObject srcData, DataObject destData, Host destHost) { // Copy PowerFlex/ScaleIO volume logger.debug("Initiating copy from PowerFlex template volume on host {}", destHost != null ? destHost : "<not specified>"); - String value = configDao.getValue(Config.CopyVolumeWait.key()); - int copyVolumeWait = NumbersUtil.parseInt(value, Integer.parseInt(Config.CopyVolumeWait.getDefaultValue())); + int copyVolumeWait = VolumeApiService.CopyVolumeWait.value(); CopyCommand cmd = new CopyCommand(srcData.getTO(), destData.getTO(), copyVolumeWait, VirtualMachineManager.ExecuteInSequence.value()); diff --git a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/manager/ScaleIOSDCManagerImpl.java b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/manager/ScaleIOSDCManagerImpl.java index cb111e9ccac..41455dc7f27 100644 --- a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/manager/ScaleIOSDCManagerImpl.java +++ b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/manager/ScaleIOSDCManagerImpl.java @@ -46,14 +46,13 @@ import com.cloud.agent.api.Answer; import com.cloud.agent.api.PrepareStorageClientAnswer; import com.cloud.agent.api.PrepareStorageClientCommand; import com.cloud.agent.api.UnprepareStorageClientCommand; -import com.cloud.configuration.Config; import com.cloud.exception.AgentUnavailableException; import com.cloud.exception.OperationTimedoutException; import com.cloud.host.Host; import com.cloud.storage.StorageManager; import com.cloud.storage.StoragePoolHostVO; +import com.cloud.storage.VolumeApiService; import com.cloud.storage.dao.StoragePoolHostDao; -import com.cloud.utils.NumbersUtil; import com.cloud.utils.db.GlobalLock; import com.cloud.utils.exception.CloudRuntimeException; @@ -134,7 +133,7 @@ public class ScaleIOSDCManagerImpl implements ScaleIOSDCManager, Configurable { throw new CloudRuntimeException("Unable to prepare SDC, couldn't get global lock on " + hostIdStorageSystemIdLockString); } - int storagePoolMaxWaitSeconds = NumbersUtil.parseInt(configDao.getValue(Config.StoragePoolMaxWaitSeconds.key()), 3600); + int storagePoolMaxWaitSeconds = VolumeApiService.StoragePoolMaxWaitSeconds.value(); if (!hostIdStorageSystemIdLock.lock(storagePoolMaxWaitSeconds)) { logger.debug("Unable to prepare SDC, couldn't lock on " + hostIdStorageSystemIdLockString); throw new CloudRuntimeException("Unable to prepare SDC, couldn't lock on " + hostIdStorageSystemIdLockString); @@ -280,7 +279,7 @@ public class ScaleIOSDCManagerImpl implements ScaleIOSDCManager, Configurable { throw new CloudRuntimeException("Unable to unprepare SDC, couldn't get global lock on " + hostIdStorageSystemIdLockString); } - int storagePoolMaxWaitSeconds = NumbersUtil.parseInt(configDao.getValue(Config.StoragePoolMaxWaitSeconds.key()), 3600); + int storagePoolMaxWaitSeconds = VolumeApiService.StoragePoolMaxWaitSeconds.value(); if (!lock.lock(storagePoolMaxWaitSeconds)) { logger.debug("Unable to unprepare SDC, couldn't lock on " + hostIdStorageSystemIdLockString); throw new CloudRuntimeException("Unable to unprepare SDC, couldn't lock on " + hostIdStorageSystemIdLockString); diff --git a/plugins/storage/volume/scaleio/src/test/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriverTest.java b/plugins/storage/volume/scaleio/src/test/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriverTest.java index 610b595ee05..f31d9a82b08 100644 --- a/plugins/storage/volume/scaleio/src/test/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriverTest.java +++ b/plugins/storage/volume/scaleio/src/test/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriverTest.java @@ -512,8 +512,6 @@ public class ScaleIOPrimaryDataStoreDriverTest { @Test public void testCopyOfflineVolume() { - when(configDao.getValue(Config.CopyVolumeWait.key())).thenReturn("3600"); - DataObject srcData = Mockito.mock(DataObject.class); DataTO srcDataTO = Mockito.mock(DataTO.class); when(srcData.getTO()).thenReturn(srcDataTO); @@ -535,8 +533,6 @@ public class ScaleIOPrimaryDataStoreDriverTest { @Test public void testCopyOfflineVolumeFailureWhenNoEndpointFound() { - when(configDao.getValue(Config.CopyVolumeWait.key())).thenReturn("3600"); - DataObject srcData = Mockito.mock(DataObject.class); DataTO srcDataTO = Mockito.mock(DataTO.class); when(srcData.getTO()).thenReturn(srcDataTO); diff --git a/plugins/storage/volume/storpool/src/main/java/org/apache/cloudstack/storage/datastore/driver/StorPoolStatsCollector.java b/plugins/storage/volume/storpool/src/main/java/org/apache/cloudstack/storage/datastore/driver/StorPoolStatsCollector.java index a2c8b274ce9..487dbb30495 100644 --- a/plugins/storage/volume/storpool/src/main/java/org/apache/cloudstack/storage/datastore/driver/StorPoolStatsCollector.java +++ b/plugins/storage/volume/storpool/src/main/java/org/apache/cloudstack/storage/datastore/driver/StorPoolStatsCollector.java @@ -40,6 +40,7 @@ import org.apache.cloudstack.storage.snapshot.StorPoolConfigurationManager; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; +import com.cloud.server.StatsCollector; import com.cloud.storage.DataStoreRole; import com.cloud.storage.SnapshotVO; import com.cloud.storage.dao.SnapshotDao; @@ -84,7 +85,7 @@ public class StorPoolStatsCollector extends ManagerBase { List<StoragePoolVO> spPools = storagePoolDao.findPoolsByProvider(StorPoolUtil.SP_PROVIDER_NAME); if (CollectionUtils.isNotEmpty(spPools)) { executor = Executors.newScheduledThreadPool(3, new NamedThreadFactory("StorPoolStatsCollector")); - long storageStatsInterval = NumbersUtil.parseLong(configurationDao.getValue("storage.stats.interval"), 60000L); + long storageStatsInterval = StatsCollector.StorageStatsInterval.value(); long volumeStatsInterval = NumbersUtil.parseLong(configurationDao.getValue("volume.stats.interval"), 60000L); if (StorPoolConfigurationManager.VolumesStatsInterval.value() > 0 && volumeStatsInterval > 0) { diff --git a/server/src/main/java/com/cloud/configuration/Config.java b/server/src/main/java/com/cloud/configuration/Config.java index af9133ae4d3..f017741e3c5 100644 --- a/server/src/main/java/com/cloud/configuration/Config.java +++ b/server/src/main/java/com/cloud/configuration/Config.java @@ -58,64 +58,6 @@ public enum Config { // Storage - StorageStatsInterval( - "Storage", - ManagementServer.class, - String.class, - "storage.stats.interval", - "60000", - "The interval (in milliseconds) when storage stats (per host) are retrieved from agents.", - null), - StorageCacheReplacementLRUTimeInterval( - "Storage", - ManagementServer.class, - Integer.class, - "storage.cache.replacement.lru.interval", - "30", - "time interval for unused data on cache storage (in days).", - null), - StorageCacheReplacementEnabled( - "Storage", - ManagementServer.class, - Boolean.class, - "storage.cache.replacement.enabled", - "true", - "enable or disable cache storage replacement algorithm.", - null), - StorageCacheReplacementInterval( - "Storage", - ManagementServer.class, - Integer.class, - "storage.cache.replacement.interval", - "86400", - "time interval between cache replacement threads (in seconds).", - null), - MaxUploadVolumeSize("Storage", ManagementServer.class, Integer.class, "storage.max.volume.upload.size", "500", "The maximum size for a uploaded volume(in GB).", null), - TotalRetries( - "Storage", - AgentManager.class, - Integer.class, - "total.retries", - "4", - "The number of times each command sent to a host should be retried in case of failure.", - null), - StoragePoolMaxWaitSeconds( - "Storage", - ManagementServer.class, - Integer.class, - "storage.pool.max.waitseconds", - "3600", - "Timeout (in seconds) to synchronize storage pool operations.", - null), - CreateVolumeFromSnapshotWait( - "Storage", - StorageManager.class, - Integer.class, - "create.volume.from.snapshot.wait", - "10800", - "In second, timeout for creating volume from snapshot", - null), - CopyVolumeWait("Storage", StorageManager.class, Integer.class, "copy.volume.wait", "10800", "In second, timeout for copy volume command", null), CreatePrivateTemplateFromVolumeWait( "Storage", UserVmManager.class, @@ -124,15 +66,6 @@ public enum Config { "10800", "In second, timeout for CreatePrivateTemplateFromVolumeCommand", null), - CreatePrivateTemplateFromSnapshotWait( - "Storage", - UserVmManager.class, - Integer.class, - "create.private.template.from.snapshot.wait", - "10800", - "In second, timeout for CreatePrivateTemplateFromSnapshotCommand", - null), - BackupSnapshotWait("Storage", StorageManager.class, Integer.class, "backup.snapshot.wait", "21600", "In second, timeout for BackupSnapshotCommand", null), HAStorageMigration( "Storage", ManagementServer.class, diff --git a/server/src/main/java/com/cloud/server/StatsCollector.java b/server/src/main/java/com/cloud/server/StatsCollector.java index 293b28c6cb4..2e53bd1c017 100644 --- a/server/src/main/java/com/cloud/server/StatsCollector.java +++ b/server/src/main/java/com/cloud/server/StatsCollector.java @@ -275,6 +275,8 @@ public class StatsCollector extends ManagerBase implements ComponentMethodInterc private static final ConfigKey<Integer> StatsTimeout = new ConfigKey<>("Advanced", Integer.class, "stats.timeout", "60000", "The timeout for stats call in milli seconds.", true, ConfigKey.Scope.Cluster); + public static final ConfigKey<Long> StorageStatsInterval = new ConfigKey<>("Storage", Long.class, "storage.stats.interval", "60000", + "The interval (in milliseconds) when storage stats (per host) are retrieved from agents.", true); private static final ConfigKey<String> statsOutputUri = new ConfigKey<>("Advanced", String.class, "stats.output.uri", "", "URI to send StatsCollector statistics to. The collector is defined on the URI scheme. Example: graphite://graphite-hostaddress:port or influxdb://influxdb-hostaddress/dbname. Note that the port is optional, if not added the default port for the respective collector (graphite or influxdb) will be used. Additionally, the database name '/dbname' is also optional; default db name is 'cloudstack'. You must create and configure the database if using influxdb.", true); @@ -445,7 +447,7 @@ public class StatsCollector extends ManagerBase implements ComponentMethodInterc hostStatsInterval = NumbersUtil.parseLong(configs.get("host.stats.interval"), ONE_MINUTE_IN_MILLISCONDS); vmStatsInterval = NumbersUtil.parseLong(configs.get("vm.stats.interval"), ONE_MINUTE_IN_MILLISCONDS); - storageStatsInterval = NumbersUtil.parseLong(configs.get("storage.stats.interval"), ONE_MINUTE_IN_MILLISCONDS); + storageStatsInterval = StorageStatsInterval.value(); volumeStatsInterval = NumbersUtil.parseLong(configs.get("volume.stats.interval"), ONE_MINUTE_IN_MILLISCONDS); autoScaleStatsInterval = AutoScaleManager.AutoScaleStatsInterval.value(); ManagementServerStatusAdministrator managementServerStatusAdministrator = new ManagementServerStatusAdministrator(); @@ -2208,7 +2210,8 @@ public class StatsCollector extends ManagerBase implements ComponentMethodInterc vmStatsIncrementMetrics, vmStatsMaxRetentionTime, vmStatsCollectUserVMOnly, vmDiskStatsRetentionEnabled, vmDiskStatsMaxRetentionTime, MANAGEMENT_SERVER_STATUS_COLLECTION_INTERVAL, DATABASE_SERVER_STATUS_COLLECTION_INTERVAL, - DATABASE_SERVER_LOAD_HISTORY_RETENTION_NUMBER}; + DATABASE_SERVER_LOAD_HISTORY_RETENTION_NUMBER, + StorageStatsInterval}; } public double getImageStoreCapacityThreshold() { diff --git a/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java b/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java index 535946ecdbc..665aa59d7bb 100644 --- a/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java +++ b/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java @@ -560,7 +560,7 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic command.setLocalPath(volumeStore.getLocalDownloadPath()); //using the existing max upload size configuration command.setProcessTimeout(NumbersUtil.parseLong(_configDao.getValue("vmware.package.ova.timeout"), 3600)); - command.setMaxUploadSize(_configDao.getValue(Config.MaxUploadVolumeSize.key())); + command.setMaxUploadSize(String.valueOf(MaxUploadVolumeSize.value())); long accountId = vol.getAccountId(); Account account = _accountDao.findById(accountId); @@ -4873,9 +4873,6 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic if (secStore == null) { throw new InvalidParameterValueException(String.format("Secondary storage to satisfy storage needs cannot be found for zone: %d", zoneId)); } - String value = _configDao.getValue(Config.CopyVolumeWait.toString()); - NumbersUtil.parseInt(value, Integer.parseInt(Config.CopyVolumeWait.getDefaultValue())); - // Copy volume from primary to secondary storage VolumeInfo srcVol = volFactory.getVolume(volumeId); VolumeInfo destVol = volFactory.getVolume(volumeId, DataStoreRole.Image); @@ -5786,7 +5783,11 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic MatchStoragePoolTagsWithDiskOffering, UseHttpsToUpload, WaitDetachDevice, - AllowCheckAndRepairVolume + AllowCheckAndRepairVolume, + CopyVolumeWait, + CreateVolumeFromSnapshotWait, + MaxUploadVolumeSize, + StoragePoolMaxWaitSeconds }; } } diff --git a/server/src/main/java/com/cloud/storage/download/DownloadMonitorImpl.java b/server/src/main/java/com/cloud/storage/download/DownloadMonitorImpl.java index 5258f433755..3344fe0f235 100644 --- a/server/src/main/java/com/cloud/storage/download/DownloadMonitorImpl.java +++ b/server/src/main/java/com/cloud/storage/download/DownloadMonitorImpl.java @@ -53,6 +53,7 @@ import com.cloud.configuration.Config; import com.cloud.storage.DataStoreRole; import com.cloud.storage.RegisterVolumePayload; import com.cloud.storage.Storage.ImageFormat; +import com.cloud.storage.VolumeApiService; import com.cloud.storage.VMTemplateStorageResourceAssoc.Status; import com.cloud.storage.template.TemplateConstants; import com.cloud.storage.upload.UploadListener; @@ -336,7 +337,7 @@ public class DownloadMonitorImpl extends ManagerBase implements DownloadMonitor private Long getMaxVolumeSizeInBytes() { try { - return Long.parseLong(_configDao.getValue("storage.max.volume.upload.size")) * 1024L * 1024L * 1024L; + return VolumeApiService.MaxUploadVolumeSize.value() * 1024L * 1024L * 1024L; } catch (NumberFormatException e) { return null; } @@ -344,7 +345,7 @@ public class DownloadMonitorImpl extends ManagerBase implements DownloadMonitor private Long getMaxSnapshotSizeInBytes() { try { - return Long.parseLong(_configDao.getValue("storage.max.volume.upload.size")) * 1024L * 1024L * 1024L; + return VolumeApiService.MaxUploadVolumeSize.value() * 1024L * 1024L * 1024L; } catch (NumberFormatException e) { return null; } diff --git a/server/src/main/java/com/cloud/storage/snapshot/SnapshotManager.java b/server/src/main/java/com/cloud/storage/snapshot/SnapshotManager.java index 10dcc2683de..0e802be3371 100644 --- a/server/src/main/java/com/cloud/storage/snapshot/SnapshotManager.java +++ b/server/src/main/java/com/cloud/storage/snapshot/SnapshotManager.java @@ -72,6 +72,12 @@ public interface SnapshotManager extends Configurable { "For snapshot copy to another primary storage in a different zone. This is supported only for StorPool storage for now.", true, ConfigKey.Scope.StoragePool, null); + ConfigKey<Integer> BackupSnapshotWait = new ConfigKey<>("Storage", Integer.class, "backup.snapshot.wait", "21600", + "In second, timeout for BackupSnapshotCommand", true); + + ConfigKey<Integer> TotalRetries = new ConfigKey<>("Storage", Integer.class, "total.retries", "4", + "The number of times each command sent to a host should be retried in case of failure.", true); + void deletePoliciesForVolume(Long volumeId); /** diff --git a/server/src/main/java/com/cloud/storage/snapshot/SnapshotManagerImpl.java b/server/src/main/java/com/cloud/storage/snapshot/SnapshotManagerImpl.java index dc33a4442a3..fe3f9add5a0 100755 --- a/server/src/main/java/com/cloud/storage/snapshot/SnapshotManagerImpl.java +++ b/server/src/main/java/com/cloud/storage/snapshot/SnapshotManagerImpl.java @@ -310,7 +310,8 @@ public class SnapshotManagerImpl extends MutualExclusiveIdsManagerBase implement @Override public ConfigKey<?>[] getConfigKeys() { return new ConfigKey<?>[] {BackupRetryAttempts, BackupRetryInterval, SnapshotHourlyMax, SnapshotDailyMax, SnapshotMonthlyMax, SnapshotWeeklyMax, usageSnapshotSelection, - SnapshotInfo.BackupSnapshotAfterTakingSnapshot, VmStorageSnapshotKvm, kvmIncrementalSnapshot, snapshotDeltaMax, snapshotShowChainSize, UseStorageReplication, KVMSnapshotEnabled}; + SnapshotInfo.BackupSnapshotAfterTakingSnapshot, VmStorageSnapshotKvm, kvmIncrementalSnapshot, snapshotDeltaMax, snapshotShowChainSize, UseStorageReplication, KVMSnapshotEnabled, + BackupSnapshotWait, TotalRetries}; } @Override @@ -1882,13 +1883,11 @@ public class SnapshotManagerImpl extends MutualExclusiveIdsManagerBase implement @Override public boolean configure(String name, Map<String, Object> params) throws ConfigurationException { - String value = _configDao.getValue(Config.BackupSnapshotWait.toString()); - Type.HOURLY.setMax(SnapshotHourlyMax.value()); Type.DAILY.setMax(SnapshotDailyMax.value()); Type.WEEKLY.setMax(SnapshotWeeklyMax.value()); Type.MONTHLY.setMax(SnapshotMonthlyMax.value()); - _totalRetries = NumbersUtil.parseInt(_configDao.getValue("total.retries"), 4); + _totalRetries = TotalRetries.value(); _pauseInterval = 2 * NumbersUtil.parseInt(_configDao.getValue("ping.interval"), 60); snapshotBackupRetries = BackupRetryAttempts.value(); diff --git a/server/src/main/java/com/cloud/template/TemplateManagerImpl.java b/server/src/main/java/com/cloud/template/TemplateManagerImpl.java index 41668470719..21c6e674db1 100755 --- a/server/src/main/java/com/cloud/template/TemplateManagerImpl.java +++ b/server/src/main/java/com/cloud/template/TemplateManagerImpl.java @@ -2753,7 +2753,8 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager, TemplateDeleteFromPrimaryStorage, PublicTemplateSecStorageCopy, PrivateTemplateSecStorageCopy, - VmIsoMaxCount}; + VmIsoMaxCount, + CreatePrivateTemplateFromSnapshotWait}; } public List<TemplateAdapter> getTemplateAdapters() {
