This is an automated email from the ASF dual-hosted git repository. dahn pushed a commit to branch 4.22 in repository https://gitbox.apache.org/repos/asf/cloudstack.git
commit edb62b490c676852460dc8db1f4699f03ed710bd Merge: 315cd52fd1a bbc23a74683 Author: Daan Hoogland <[email protected]> AuthorDate: Mon Jan 26 13:30:26 2026 +0100 Merge branch '4.20' into 4.22 .../org/apache/cloudstack/query/QueryService.java | 2 +- .../main/java/com/cloud/storage/dao/VolumeDao.java | 6 +-- .../java/com/cloud/storage/dao/VolumeDaoImpl.java | 6 +-- .../storage/configdrive/ConfigDriveBuilder.java | 4 +- .../configdrive/ConfigDriveBuilderTest.java | 12 ++--- .../storage/image/SecondaryStorageServiceImpl.java | 2 +- .../storage/image/TemplateDataFactoryImpl.java | 3 ++ .../storage/image/TemplateServiceImpl.java | 7 +-- .../storage/datastore/PrimaryDataStoreImpl.java | 2 +- .../cloudstack/framework/config/ConfigKey.java | 28 ++++++++++- packaging/el8/cloud.spec | 2 +- .../apache/cloudstack/sioc/SiocManagerImpl.java | 2 +- .../com/cloud/ovm/hypervisor/OvmResourceBase.java | 2 +- .../driver/DateraPrimaryDataStoreDriver.java | 2 +- .../datastore/provider/DateraHostListener.java | 4 +- .../driver/SolidFirePrimaryDataStoreDriver.java | 2 +- .../datastore/provider/SolidFireHostListener.java | 4 +- .../driver/StorPoolPrimaryDataStoreDriver.java | 2 +- scripts/storage/secondary/cloud-install-sys-tmplt | 1 + scripts/storage/secondary/setup-sysvm-tmplt | 1 + .../router/VirtualNetworkApplianceManagerImpl.java | 1 + .../com/cloud/resource/ResourceManagerImpl.java | 4 +- .../main/java/com/cloud/server/StatsCollector.java | 2 +- .../java/com/cloud/storage/StorageManagerImpl.java | 16 ++++--- .../cloud/storage/StoragePoolAutomationImpl.java | 2 +- .../main/java/com/cloud/vm/UserVmManagerImpl.java | 2 +- .../cloud/resource/ResourceManagerImplTest.java | 12 ++--- .../com/cloud/storage/StorageManagerImplTest.java | 56 +++++++++++++++++++++- 28 files changed, 138 insertions(+), 51 deletions(-) diff --cc framework/config/src/main/java/org/apache/cloudstack/framework/config/ConfigKey.java index 0ea910fcb6d,27b04ddf893..c19ec751153 --- a/framework/config/src/main/java/org/apache/cloudstack/framework/config/ConfigKey.java +++ b/framework/config/src/main/java/org/apache/cloudstack/framework/config/ConfigKey.java @@@ -380,35 -224,37 +388,51 @@@ public class ConfigKey<T> public T value() { if (_value == null || isDynamic()) { String value = s_depot != null ? s_depot.getConfigStringValue(_name, Scope.Global, null) : null; - _value = valueOf((value == null) ? defaultValue() : value); + + String effective; + if (value != null) { + if (value.isEmpty() && _defaultValueIfEmpty != null) { + effective = _defaultValueIfEmpty; + } else { + effective = value; + } + } else { + effective = _defaultValueIfEmpty != null ? _defaultValueIfEmpty : defaultValue(); + } + + _value = valueOf(effective); } - return _value; } - protected T valueInScope(Scope scope, Long id) { - if (id == null) { + protected T valueInGlobalOrAvailableParentScope(Scope scope, Long id) { + if (scopes.size() <= 1) { return value(); } + Pair<Scope, Long> s = new Pair<>(scope, id); + do { + s = s_depot != null ? s_depot.getParentScope(s.first(), s.second()) : null; + if (s != null && scopes.contains(s.first())) { + return valueInScope(s.first(), s.second()); + } + } while (s != null); + logger.trace("Global value for config ({}): {}", _name, _value); + return value(); + } + public T valueInScope(Scope scope, Long id) { + if (id == null) { + return value(); + } String value = s_depot != null ? s_depot.getConfigStringValue(_name, scope, id) : null; if (value == null) { - return value(); + return valueInGlobalOrAvailableParentScope(scope, id); } + logger.trace("Scope({}) value for config ({}): {}", scope, _name, _value); + + if (value.isEmpty() && _defaultValueIfEmpty != null) { + return valueOf(_defaultValueIfEmpty); + } return valueOf(value); }
