Skip to content

Commit b28db5d

Browse files
committed
Introduce volume allocation algorithm global configuration.
Volume allocation has been using vm.allocation.algorithm config value. This change will allow them to be configured in isolation.
1 parent 4c31f9d commit b28db5d

File tree

5 files changed

+55
-55
lines changed

5 files changed

+55
-55
lines changed

api/src/main/java/com/cloud/deploy/DeploymentClusterPlanner.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ public interface DeploymentClusterPlanner extends DeploymentPlanner {
6262
"vm.allocation.algorithm",
6363
"Advanced",
6464
"random",
65-
"Order in which hosts within a cluster will be considered for VM/volume allocation. The value can be 'random', 'firstfit', 'userdispersing', 'userconcentratedpod_random', 'userconcentratedpod_firstfit', or 'firstfitleastconsumed'.",
65+
"Order in which hosts within a cluster will be considered for VM allocation. The value can be 'random', 'firstfit', 'userdispersing', 'userconcentratedpod_random', 'userconcentratedpod_firstfit', or 'firstfitleastconsumed'.",
6666
true,
6767
ConfigKey.Scope.Global, null, null, null, null, null,
6868
ConfigKey.Kind.Select,

engine/api/src/main/java/org/apache/cloudstack/engine/orchestration/service/VolumeOrchestrationService.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,17 @@ public interface VolumeOrchestrationService {
8383
"The maximum size for a volume (in GiB).",
8484
true);
8585

86+
ConfigKey<String> VolumeAllocationAlgorithm = new ConfigKey<>(
87+
String.class,
88+
"volume.allocation.algorithm",
89+
"Advanced",
90+
"random",
91+
"Order in which storage pool within a cluster will be considered for volume allocation. The value can be 'random', 'firstfit', 'userdispersing', 'userconcentratedpod_random', 'userconcentratedpod_firstfit', or 'firstfitleastconsumed'.",
92+
false,
93+
ConfigKey.Scope.Global, null, null, null, null, null,
94+
ConfigKey.Kind.Select,
95+
"random,firstfit,userdispersing,userconcentratedpod_random,userconcentratedpod_firstfit,firstfitleastconsumed");
96+
8697
VolumeInfo moveVolume(VolumeInfo volume, long destPoolDcId, Long destPoolPodId, Long destPoolClusterId, HypervisorType dataDiskHyperType)
8798
throws ConcurrentOperationException, StorageUnavailableException;
8899

engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2018,7 +2018,9 @@ public boolean canVmRestartOnAnotherServer(long vmId) {
20182018

20192019
@Override
20202020
public ConfigKey<?>[] getConfigKeys() {
2021-
return new ConfigKey<?>[] {RecreatableSystemVmEnabled, MaxVolumeSize, StorageHAMigrationEnabled, StorageMigrationEnabled, CustomDiskOfferingMaxSize, CustomDiskOfferingMinSize, VolumeUrlCheck};
2021+
return new ConfigKey<?>[] {
2022+
RecreatableSystemVmEnabled, MaxVolumeSize, StorageHAMigrationEnabled, StorageMigrationEnabled,
2023+
CustomDiskOfferingMaxSize, CustomDiskOfferingMinSize, VolumeUrlCheck, VolumeAllocationAlgorithm};
20222024
}
20232025

20242026
@Override

engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/AbstractStoragePoolAllocator.java

Lines changed: 30 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -16,53 +16,51 @@
1616
// under the License.
1717
package org.apache.cloudstack.storage.allocator;
1818

19-
import java.math.BigDecimal;
20-
import java.security.SecureRandom;
21-
import java.util.ArrayList;
22-
import java.util.Arrays;
23-
import java.util.Collections;
24-
import java.util.HashMap;
25-
import java.util.List;
26-
import java.util.Map;
27-
28-
import javax.inject.Inject;
29-
import javax.naming.ConfigurationException;
30-
3119
import com.cloud.api.query.dao.StoragePoolJoinDao;
32-
import com.cloud.exception.StorageUnavailableException;
33-
import com.cloud.storage.ScopeType;
34-
import com.cloud.storage.StoragePoolStatus;
35-
import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailVO;
36-
import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailsDao;
37-
import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
38-
import org.apache.commons.lang3.StringUtils;
39-
import org.apache.cloudstack.utils.reflectiontostringbuilderutils.ReflectionToStringBuilderUtils;
40-
import org.apache.commons.collections.CollectionUtils;
41-
42-
import com.cloud.utils.Pair;
43-
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
44-
import org.apache.cloudstack.engine.subsystem.api.storage.StoragePoolAllocator;
45-
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
46-
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
47-
4820
import com.cloud.capacity.Capacity;
4921
import com.cloud.capacity.dao.CapacityDao;
5022
import com.cloud.dc.ClusterVO;
5123
import com.cloud.dc.dao.ClusterDao;
5224
import com.cloud.deploy.DeploymentPlan;
5325
import com.cloud.deploy.DeploymentPlanner.ExcludeList;
26+
import com.cloud.exception.StorageUnavailableException;
5427
import com.cloud.hypervisor.Hypervisor.HypervisorType;
28+
import com.cloud.storage.ScopeType;
5529
import com.cloud.storage.Storage;
5630
import com.cloud.storage.StorageManager;
5731
import com.cloud.storage.StoragePool;
32+
import com.cloud.storage.StoragePoolStatus;
5833
import com.cloud.storage.StorageUtil;
5934
import com.cloud.storage.Volume;
6035
import com.cloud.storage.dao.VolumeDao;
6136
import com.cloud.user.Account;
6237
import com.cloud.utils.NumbersUtil;
38+
import com.cloud.utils.Pair;
6339
import com.cloud.utils.component.AdapterBase;
6440
import com.cloud.vm.DiskProfile;
6541
import com.cloud.vm.VirtualMachineProfile;
42+
import org.apache.cloudstack.engine.orchestration.service.VolumeOrchestrationService;
43+
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
44+
import org.apache.cloudstack.engine.subsystem.api.storage.StoragePoolAllocator;
45+
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
46+
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
47+
import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailVO;
48+
import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailsDao;
49+
import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
50+
import org.apache.cloudstack.utils.reflectiontostringbuilderutils.ReflectionToStringBuilderUtils;
51+
import org.apache.commons.collections.CollectionUtils;
52+
import org.apache.commons.lang3.StringUtils;
53+
54+
import javax.inject.Inject;
55+
import javax.naming.ConfigurationException;
56+
import java.math.BigDecimal;
57+
import java.security.SecureRandom;
58+
import java.util.ArrayList;
59+
import java.util.Arrays;
60+
import java.util.Collections;
61+
import java.util.HashMap;
62+
import java.util.List;
63+
import java.util.Map;
6664

6765
public abstract class AbstractStoragePoolAllocator extends AdapterBase implements StoragePoolAllocator {
6866

@@ -95,7 +93,7 @@ public boolean configure(String name, Map<String, Object> params) throws Configu
9593
String globalStorageOverprovisioningFactor = configs.get("storage.overprovisioning.factor");
9694
storageOverprovisioningFactor = new BigDecimal(NumbersUtil.parseFloat(globalStorageOverprovisioningFactor, 2.0f));
9795
extraBytesPerVolume = 0;
98-
String allocationAlgorithm = configs.get("vm.allocation.algorithm");
96+
String allocationAlgorithm = VolumeOrchestrationService.VolumeAllocationAlgorithm.value();
9997
if (allocationAlgorithm != null) {
10098
this.allocationAlgorithm = allocationAlgorithm;
10199
}
@@ -227,13 +225,12 @@ public List<StoragePool> reorderPools(List<StoragePool> pools, VirtualMachinePro
227225
}
228226

229227
List<StoragePool> reorderStoragePoolsBasedOnAlgorithm(List<StoragePool> pools, DeploymentPlan plan, Account account) {
230-
logger.debug(String.format("Using allocation algorithm [%s] to reorder pools.", allocationAlgorithm));
231-
228+
logger.debug("Using volume allocation algorithm {} to reorder pools.", allocationAlgorithm);
232229
if (allocationAlgorithm.equals("random") || allocationAlgorithm.equals("userconcentratedpod_random") || (account == null)) {
233230
reorderRandomPools(pools);
234231
} else if (StringUtils.equalsAny(allocationAlgorithm, "userdispersing", "firstfitleastconsumed")) {
235232
if (logger.isTraceEnabled()) {
236-
logger.trace(String.format("Using reordering algorithm [%s]", allocationAlgorithm));
233+
logger.trace("Using reordering algorithm {}", allocationAlgorithm);
237234
}
238235

239236
if (allocationAlgorithm.equals("userdispersing")) {
@@ -248,7 +245,7 @@ List<StoragePool> reorderStoragePoolsBasedOnAlgorithm(List<StoragePool> pools, D
248245
void reorderRandomPools(List<StoragePool> pools) {
249246
StorageUtil.traceLogStoragePools(pools, logger, "pools to choose from: ");
250247
if (logger.isTraceEnabled()) {
251-
logger.trace(String.format("Shuffle this so that we don't check the pools in the same order. Algorithm == '%s' (or no account?)", allocationAlgorithm));
248+
logger.trace("Shuffle this so that we don't check the pools in the same order. Algorithm == {} (or no account?)", allocationAlgorithm);
252249
}
253250
StorageUtil.traceLogStoragePools(pools, logger, "pools to shuffle: ");
254251
Collections.shuffle(pools, secureRandom);

engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/ClusterScopeStoragePoolAllocator.java

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -16,26 +16,24 @@
1616
// under the License.
1717
package org.apache.cloudstack.storage.allocator;
1818

19-
import java.util.ArrayList;
20-
import java.util.Arrays;
21-
import java.util.List;
22-
import java.util.Map;
23-
24-
import javax.inject.Inject;
25-
import javax.naming.ConfigurationException;
26-
27-
import com.cloud.storage.VolumeApiServiceImpl;
28-
import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
29-
import org.springframework.stereotype.Component;
30-
3119
import com.cloud.deploy.DeploymentPlan;
3220
import com.cloud.deploy.DeploymentPlanner.ExcludeList;
3321
import com.cloud.offering.ServiceOffering;
3422
import com.cloud.storage.ScopeType;
3523
import com.cloud.storage.StoragePool;
24+
import com.cloud.storage.VolumeApiServiceImpl;
3625
import com.cloud.storage.dao.DiskOfferingDao;
3726
import com.cloud.vm.DiskProfile;
3827
import com.cloud.vm.VirtualMachineProfile;
28+
import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
29+
import org.springframework.stereotype.Component;
30+
31+
import javax.inject.Inject;
32+
import javax.naming.ConfigurationException;
33+
import java.util.ArrayList;
34+
import java.util.Arrays;
35+
import java.util.List;
36+
import java.util.Map;
3937

4038
@Component
4139
public class ClusterScopeStoragePoolAllocator extends AbstractStoragePoolAllocator {
@@ -116,14 +114,6 @@ protected List<StoragePool> select(DiskProfile dskCh, VirtualMachineProfile vmPr
116114
@Override
117115
public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
118116
super.configure(name, params);
119-
120-
if (configDao != null) {
121-
Map<String, String> configs = configDao.getConfiguration(params);
122-
String allocationAlgorithm = configs.get("vm.allocation.algorithm");
123-
if (allocationAlgorithm != null) {
124-
this.allocationAlgorithm = allocationAlgorithm;
125-
}
126-
}
127117
return true;
128118
}
129119
}

0 commit comments

Comments
 (0)