From 54cc73af08f66e2ddd0de1fc717addd95dc24b37 Mon Sep 17 00:00:00 2001 From: mdominka <50666672+mdominka@users.noreply.github.com> Date: Tue, 14 Jan 2020 09:35:34 +0100 Subject: [PATCH] Add missing HA config keys (#3776) --- .../com/cloud/ha/HighAvailabilityManager.java | 46 ++++- .../java/com/cloud/configuration/Config.java | 43 +---- .../ConfigurationManagerImpl.java | 174 +++++++++--------- .../cloud/ha/HighAvailabilityManagerImpl.java | 109 +++++------ .../java/com/cloud/test/DatabaseConfig.java | 59 +++--- 5 files changed, 219 insertions(+), 212 deletions(-) diff --git a/engine/components-api/src/main/java/com/cloud/ha/HighAvailabilityManager.java b/engine/components-api/src/main/java/com/cloud/ha/HighAvailabilityManager.java index ecfb6f65701..0894a0b8668 100644 --- a/engine/components-api/src/main/java/com/cloud/ha/HighAvailabilityManager.java +++ b/engine/components-api/src/main/java/com/cloud/ha/HighAvailabilityManager.java @@ -16,18 +16,62 @@ // under the License. package com.cloud.ha; -import java.util.List; +import static org.apache.cloudstack.framework.config.ConfigKey.Scope.Cluster; import com.cloud.deploy.DeploymentPlanner; import com.cloud.host.HostVO; import com.cloud.host.Status; import com.cloud.utils.component.Manager; import com.cloud.vm.VMInstanceVO; +import org.apache.cloudstack.framework.config.ConfigKey; + +import java.util.List; /** * HighAvailabilityManager checks to make sure the VMs are running fine. */ public interface HighAvailabilityManager extends Manager { + + ConfigKey ForceHA = new ConfigKey<>("Advanced", Boolean.class, "force.ha", "false", + "Force High-Availability to happen even if the VM says no.", true, Cluster); + + ConfigKey HAWorkers = new ConfigKey<>("Advanced", Integer.class, "ha.workers", "5", + "The number of High-Availability worker threads.", true, Cluster); + + ConfigKey InvestigateRetryInterval = new ConfigKey<>("Advanced", Integer.class, "investigate.retry.interval", + "60", "The time (in seconds) between VM pings when the agent is disconnected.", true, Cluster); + + ConfigKey MigrateRetryInterval = new ConfigKey<>("Advanced", Integer.class, "migrate.retry.interval", + "120", "The time (in seconds) between migration retries.", true, Cluster); + + ConfigKey RestartRetryInterval = new ConfigKey<>("Advanced", Integer.class, "restart.retry.interval", + "600", "The time (in seconds) between retries to restart a VM.", true, Cluster); + + ConfigKey StopRetryInterval = new ConfigKey<>("Advanced", Integer.class, "stop.retry.interval", + "600", "The time in seconds between retries to stop or destroy a VM.", true, Cluster); + + ConfigKey TimeBetweenCleanup = new ConfigKey<>("Advanced", Long.class, + "time.between.cleanup", "86400", "The time in seconds to wait before the" + + " cleanup thread runs for the different HA-Worker-Threads. The cleanup thread finds all the work items " + + "that were successful and is now ready to be purged from the the database (table: op_ha_work).", + true, Cluster); + + ConfigKey MaxRetries = new ConfigKey<>("Advanced", Integer.class, "max.retries", + "5", "The number of times to try a restart for the different Work-Types: " + + "Migrating - VMs off of a host, Destroy - a VM, Stop - a VM for storage pool migration purposes," + + " CheckStop - checks if a VM has been stopped, ForceStop - force a VM to stop even if the " + + "states don't allow it, Destroy - a VM and HA - restart a VM.", true, Cluster); + + ConfigKey TimeToSleep = new ConfigKey<>("Advanced", Long.class, "time.to.sleep", + "60", "The time in seconds to sleep before checking the database (table: op_ha_work) " + + "for new working types (Migration, Stop, CheckStop, ForceStop, Destroy and HA), if no work items are found.", + true, Cluster); + + ConfigKey TimeBetweenFailures = new ConfigKey<>("Advanced", Long.class, + "time.between.failures", "3600", "The time in seconds before try to cleanup all the VMs" + + " which are registered for the HA event that were successful and are now ready to be purged.", + true, Cluster); + public enum WorkType { Migration, // Migrating VMs off of a host. Stop, // Stops a VM for storage pool migration purposes. This should be obsolete now. diff --git a/server/src/main/java/com/cloud/configuration/Config.java b/server/src/main/java/com/cloud/configuration/Config.java index 1aad66d43a5..3daf720138c 100644 --- a/server/src/main/java/com/cloud/configuration/Config.java +++ b/server/src/main/java/com/cloud/configuration/Config.java @@ -16,15 +16,6 @@ // under the License. package com.cloud.configuration; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.StringTokenizer; - -import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService; -import org.apache.cloudstack.engine.subsystem.api.storage.StoragePoolAllocator; -import org.apache.cloudstack.framework.config.ConfigKey; - import com.cloud.agent.AgentManager; import com.cloud.consoleproxy.ConsoleProxyManager; import com.cloud.ha.HighAvailabilityManager; @@ -38,6 +29,14 @@ import com.cloud.storage.snapshot.SnapshotManager; import com.cloud.template.TemplateManager; import com.cloud.vm.UserVmManager; import com.cloud.vm.snapshot.VMSnapshotManager; +import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService; +import org.apache.cloudstack.engine.subsystem.api.storage.StoragePoolAllocator; +import org.apache.cloudstack.framework.config.ConfigKey; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.StringTokenizer; /** * @deprecated use the more dynamic ConfigKey @@ -558,15 +557,6 @@ public enum Config { "The interval (in milliseconds) when host stats are retrieved from agents.", null), HostRetry("Advanced", AgentManager.class, Integer.class, "host.retry", "2", "Number of times to retry hosts for creating a volume", null), - InvestigateRetryInterval( - "Advanced", - HighAvailabilityManager.class, - Integer.class, - "investigate.retry.interval", - "60", - "Time (in seconds) between VM pings when agent is disconnected", - null), - MigrateRetryInterval("Advanced", HighAvailabilityManager.class, Integer.class, "migrate.retry.interval", "120", "Time (in seconds) between migration retries", null), RouterCpuMHz( "Advanced", NetworkOrchestrationService.class, @@ -575,14 +565,6 @@ public enum Config { String.valueOf(VpcVirtualNetworkApplianceManager.DEFAULT_ROUTER_CPU_MHZ), "Default CPU speed (MHz) for router VM.", null), - RestartRetryInterval( - "Advanced", - HighAvailabilityManager.class, - Integer.class, - "restart.retry.interval", - "600", - "Time (in seconds) between retries to restart a vm", - null), RouterStatsInterval( "Advanced", NetworkOrchestrationService.class, @@ -624,18 +606,9 @@ public enum Config { "specify extra public nics used for virtual router(up to 5)", "0-5"), ScaleRetry("Advanced", ManagementServer.class, Integer.class, "scale.retry", "2", "Number of times to retry scaling up the vm", null), - StopRetryInterval( - "Advanced", - HighAvailabilityManager.class, - Integer.class, - "stop.retry.interval", - "600", - "Time in seconds between retries to stop or destroy a vm", - null), UpdateWait("Advanced", AgentManager.class, Integer.class, "update.wait", "600", "Time to wait (in seconds) before alerting on a updating agent", null), XapiWait("Advanced", AgentManager.class, Integer.class, "xapiwait", "60", "Time (in seconds) to wait for XAPI to return", null), MigrateWait("Advanced", AgentManager.class, Integer.class, "migratewait", "3600", "Time (in seconds) to wait for VM migrate finish", null), - HAWorkers("Advanced", AgentManager.class, Integer.class, "ha.workers", "5", "Number of ha worker threads.", null), MountParent( "Advanced", ManagementServer.class, diff --git a/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java index 61f828b0c31..1f8655d40c9 100755 --- a/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java @@ -16,92 +16,6 @@ // under the License. package com.cloud.configuration; -import java.io.UnsupportedEncodingException; -import java.net.URI; -import java.net.URISyntaxException; -import java.net.URLDecoder; -import java.sql.Date; -import java.sql.PreparedStatement; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.ListIterator; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import java.util.UUID; - -import javax.inject.Inject; -import javax.naming.ConfigurationException; - -import org.apache.cloudstack.acl.SecurityChecker; -import org.apache.cloudstack.affinity.AffinityGroup; -import org.apache.cloudstack.affinity.AffinityGroupService; -import org.apache.cloudstack.affinity.dao.AffinityGroupDao; -import org.apache.cloudstack.api.ApiConstants; -import org.apache.cloudstack.api.command.admin.config.UpdateCfgCmd; -import org.apache.cloudstack.api.command.admin.network.CreateManagementNetworkIpRangeCmd; -import org.apache.cloudstack.api.command.admin.network.CreateNetworkOfferingCmd; -import org.apache.cloudstack.api.command.admin.network.DeleteManagementNetworkIpRangeCmd; -import org.apache.cloudstack.api.command.admin.network.DeleteNetworkOfferingCmd; -import org.apache.cloudstack.api.command.admin.network.UpdateNetworkOfferingCmd; -import org.apache.cloudstack.api.command.admin.offering.CreateDiskOfferingCmd; -import org.apache.cloudstack.api.command.admin.offering.CreateServiceOfferingCmd; -import org.apache.cloudstack.api.command.admin.offering.DeleteDiskOfferingCmd; -import org.apache.cloudstack.api.command.admin.offering.DeleteServiceOfferingCmd; -import org.apache.cloudstack.api.command.admin.offering.UpdateDiskOfferingCmd; -import org.apache.cloudstack.api.command.admin.offering.UpdateServiceOfferingCmd; -import org.apache.cloudstack.api.command.admin.pod.DeletePodCmd; -import org.apache.cloudstack.api.command.admin.pod.UpdatePodCmd; -import org.apache.cloudstack.api.command.admin.region.CreatePortableIpRangeCmd; -import org.apache.cloudstack.api.command.admin.region.DeletePortableIpRangeCmd; -import org.apache.cloudstack.api.command.admin.region.ListPortableIpRangesCmd; -import org.apache.cloudstack.api.command.admin.vlan.CreateVlanIpRangeCmd; -import org.apache.cloudstack.api.command.admin.vlan.DedicatePublicIpRangeCmd; -import org.apache.cloudstack.api.command.admin.vlan.DeleteVlanIpRangeCmd; -import org.apache.cloudstack.api.command.admin.vlan.ReleasePublicIpRangeCmd; -import org.apache.cloudstack.api.command.admin.zone.CreateZoneCmd; -import org.apache.cloudstack.api.command.admin.zone.DeleteZoneCmd; -import org.apache.cloudstack.api.command.admin.zone.UpdateZoneCmd; -import org.apache.cloudstack.api.command.user.network.ListNetworkOfferingsCmd; -import org.apache.cloudstack.config.Configuration; -import org.apache.cloudstack.context.CallContext; -import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService; -import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; -import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope; -import org.apache.cloudstack.framework.config.ConfigDepot; -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.framework.config.impl.ConfigurationVO; -import org.apache.cloudstack.framework.messagebus.MessageBus; -import org.apache.cloudstack.framework.messagebus.PublishScope; -import org.apache.cloudstack.region.PortableIp; -import org.apache.cloudstack.region.PortableIpDao; -import org.apache.cloudstack.region.PortableIpRange; -import org.apache.cloudstack.region.PortableIpRangeDao; -import org.apache.cloudstack.region.PortableIpRangeVO; -import org.apache.cloudstack.region.PortableIpVO; -import org.apache.cloudstack.region.Region; -import org.apache.cloudstack.region.RegionVO; -import org.apache.cloudstack.region.dao.RegionDao; -import org.apache.cloudstack.resourcedetail.DiskOfferingDetailVO; -import org.apache.cloudstack.resourcedetail.dao.DiskOfferingDetailsDao; -import org.apache.cloudstack.storage.datastore.db.ImageStoreDao; -import org.apache.cloudstack.storage.datastore.db.ImageStoreDetailsDao; -import org.apache.cloudstack.storage.datastore.db.ImageStoreVO; -import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; -import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailsDao; -import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.collections.MapUtils; -import org.apache.log4j.Logger; - import com.cloud.alert.AlertManager; import com.cloud.api.ApiDBUtils; import com.cloud.api.query.dao.NetworkOfferingJoinDao; @@ -243,6 +157,91 @@ import com.google.common.base.MoreObjects; import com.google.common.base.Preconditions; import com.google.common.base.Strings; import com.google.common.collect.Sets; +import org.apache.cloudstack.acl.SecurityChecker; +import org.apache.cloudstack.affinity.AffinityGroup; +import org.apache.cloudstack.affinity.AffinityGroupService; +import org.apache.cloudstack.affinity.dao.AffinityGroupDao; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.command.admin.config.UpdateCfgCmd; +import org.apache.cloudstack.api.command.admin.network.CreateManagementNetworkIpRangeCmd; +import org.apache.cloudstack.api.command.admin.network.CreateNetworkOfferingCmd; +import org.apache.cloudstack.api.command.admin.network.DeleteManagementNetworkIpRangeCmd; +import org.apache.cloudstack.api.command.admin.network.DeleteNetworkOfferingCmd; +import org.apache.cloudstack.api.command.admin.network.UpdateNetworkOfferingCmd; +import org.apache.cloudstack.api.command.admin.offering.CreateDiskOfferingCmd; +import org.apache.cloudstack.api.command.admin.offering.CreateServiceOfferingCmd; +import org.apache.cloudstack.api.command.admin.offering.DeleteDiskOfferingCmd; +import org.apache.cloudstack.api.command.admin.offering.DeleteServiceOfferingCmd; +import org.apache.cloudstack.api.command.admin.offering.UpdateDiskOfferingCmd; +import org.apache.cloudstack.api.command.admin.offering.UpdateServiceOfferingCmd; +import org.apache.cloudstack.api.command.admin.pod.DeletePodCmd; +import org.apache.cloudstack.api.command.admin.pod.UpdatePodCmd; +import org.apache.cloudstack.api.command.admin.region.CreatePortableIpRangeCmd; +import org.apache.cloudstack.api.command.admin.region.DeletePortableIpRangeCmd; +import org.apache.cloudstack.api.command.admin.region.ListPortableIpRangesCmd; +import org.apache.cloudstack.api.command.admin.vlan.CreateVlanIpRangeCmd; +import org.apache.cloudstack.api.command.admin.vlan.DedicatePublicIpRangeCmd; +import org.apache.cloudstack.api.command.admin.vlan.DeleteVlanIpRangeCmd; +import org.apache.cloudstack.api.command.admin.vlan.ReleasePublicIpRangeCmd; +import org.apache.cloudstack.api.command.admin.zone.CreateZoneCmd; +import org.apache.cloudstack.api.command.admin.zone.DeleteZoneCmd; +import org.apache.cloudstack.api.command.admin.zone.UpdateZoneCmd; +import org.apache.cloudstack.api.command.user.network.ListNetworkOfferingsCmd; +import org.apache.cloudstack.config.Configuration; +import org.apache.cloudstack.context.CallContext; +import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService; +import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; +import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope; +import org.apache.cloudstack.framework.config.ConfigDepot; +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.framework.config.impl.ConfigurationVO; +import org.apache.cloudstack.framework.messagebus.MessageBus; +import org.apache.cloudstack.framework.messagebus.PublishScope; +import org.apache.cloudstack.region.PortableIp; +import org.apache.cloudstack.region.PortableIpDao; +import org.apache.cloudstack.region.PortableIpRange; +import org.apache.cloudstack.region.PortableIpRangeDao; +import org.apache.cloudstack.region.PortableIpRangeVO; +import org.apache.cloudstack.region.PortableIpVO; +import org.apache.cloudstack.region.Region; +import org.apache.cloudstack.region.RegionVO; +import org.apache.cloudstack.region.dao.RegionDao; +import org.apache.cloudstack.resourcedetail.DiskOfferingDetailVO; +import org.apache.cloudstack.resourcedetail.dao.DiskOfferingDetailsDao; +import org.apache.cloudstack.storage.datastore.db.ImageStoreDao; +import org.apache.cloudstack.storage.datastore.db.ImageStoreDetailsDao; +import org.apache.cloudstack.storage.datastore.db.ImageStoreVO; +import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; +import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailsDao; +import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections.MapUtils; +import org.apache.log4j.Logger; + +import java.io.UnsupportedEncodingException; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URLDecoder; +import java.sql.Date; +import java.sql.PreparedStatement; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.UUID; + +import javax.inject.Inject; +import javax.naming.ConfigurationException; public class ConfigurationManagerImpl extends ManagerBase implements ConfigurationManager, ConfigurationService, Configurable { public static final Logger s_logger = Logger.getLogger(ConfigurationManagerImpl.class); @@ -416,12 +415,9 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati configValuesForValidation.add("consoleproxy.capacityscan.interval"); configValuesForValidation.add("expunge.interval"); configValuesForValidation.add("host.stats.interval"); - configValuesForValidation.add("investigate.retry.interval"); - configValuesForValidation.add("migrate.retry.interval"); configValuesForValidation.add("network.gc.interval"); configValuesForValidation.add("ping.interval"); configValuesForValidation.add("snapshot.poll.interval"); - configValuesForValidation.add("stop.retry.interval"); configValuesForValidation.add("storage.stats.interval"); configValuesForValidation.add("storage.cleanup.interval"); configValuesForValidation.add("wait"); diff --git a/server/src/main/java/com/cloud/ha/HighAvailabilityManagerImpl.java b/server/src/main/java/com/cloud/ha/HighAvailabilityManagerImpl.java index 49211f5eba3..076f5007d54 100644 --- a/server/src/main/java/com/cloud/ha/HighAvailabilityManagerImpl.java +++ b/server/src/main/java/com/cloud/ha/HighAvailabilityManagerImpl.java @@ -16,30 +16,9 @@ // under the License. package com.cloud.ha; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; - -import javax.inject.Inject; -import javax.naming.ConfigurationException; - -import org.apache.log4j.Logger; -import org.apache.log4j.NDC; -import org.apache.cloudstack.engine.orchestration.service.VolumeOrchestrationService; -import org.apache.cloudstack.framework.config.dao.ConfigurationDao; -import org.apache.cloudstack.managed.context.ManagedContext; -import org.apache.cloudstack.managed.context.ManagedContextRunnable; - import com.cloud.agent.AgentManager; import com.cloud.alert.AlertManager; import com.cloud.cluster.ClusterManagerListener; -import org.apache.cloudstack.management.ManagementServerHost; -import com.cloud.configuration.Config; import com.cloud.dc.ClusterDetailsDao; import com.cloud.dc.DataCenterVO; import com.cloud.dc.HostPodVO; @@ -68,7 +47,6 @@ import com.cloud.storage.StorageManager; import com.cloud.storage.dao.GuestOSCategoryDao; import com.cloud.storage.dao.GuestOSDao; import com.cloud.user.AccountManager; -import com.cloud.utils.NumbersUtil; import com.cloud.utils.component.ManagerBase; import com.cloud.utils.concurrency.NamedThreadFactory; import com.cloud.utils.exception.CloudRuntimeException; @@ -78,6 +56,27 @@ import com.cloud.vm.VirtualMachine.State; import com.cloud.vm.VirtualMachineManager; import com.cloud.vm.VirtualMachineProfile; import com.cloud.vm.dao.VMInstanceDao; +import org.apache.cloudstack.engine.orchestration.service.VolumeOrchestrationService; +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.ManagedContext; +import org.apache.cloudstack.managed.context.ManagedContextRunnable; +import org.apache.cloudstack.management.ManagementServerHost; +import org.apache.log4j.Logger; +import org.apache.log4j.NDC; + +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +import javax.inject.Inject; +import javax.naming.ConfigurationException; /** * HighAvailabilityManagerImpl coordinates the HA process. VMs are registered with the HA Manager for HA. The request is stored @@ -101,7 +100,9 @@ import com.cloud.vm.dao.VMInstanceDao; * ha.retry.wait | time to wait before retrying the work item | seconds | 120 || || stop.retry.wait | time to wait * before retrying the stop | seconds | 120 || * } **/ -public class HighAvailabilityManagerImpl extends ManagerBase implements HighAvailabilityManager, ClusterManagerListener { +public class HighAvailabilityManagerImpl extends ManagerBase implements Configurable, HighAvailabilityManager, ClusterManagerListener { + + private static final int SECONDS_TO_MILLISECONDS_FACTOR = 1000; protected static final Logger s_logger = Logger.getLogger(HighAvailabilityManagerImpl.class); WorkerThread[] _workers; @@ -831,42 +832,24 @@ public class HighAvailabilityManagerImpl extends ManagerBase implements HighAvai public boolean configure(final String name, final Map xmlParams) throws ConfigurationException { _serverId = _msServer.getId(); - Map params = new HashMap(); - params = _configDao.getConfiguration(Long.toHexString(_serverId), xmlParams); + final Map params = _configDao.getConfiguration(Long.toHexString(_serverId), + xmlParams); - String value = params.get(Config.HAWorkers.key()); - final int count = NumbersUtil.parseInt(value, 1); + final int count = HAWorkers.value(); _workers = new WorkerThread[count]; for (int i = 0; i < _workers.length; i++) { _workers[i] = new WorkerThread("HA-Worker-" + i); } - value = params.get("force.ha"); - _forceHA = Boolean.parseBoolean(value); - - value = params.get("time.to.sleep"); - _timeToSleep = (long)NumbersUtil.parseInt(value, 60) * 1000; - - value = params.get("max.retries"); - _maxRetries = NumbersUtil.parseInt(value, 5); - - value = params.get("time.between.failures"); - _timeBetweenFailures = NumbersUtil.parseLong(value, 3600) * 1000; - - value = params.get("time.between.cleanup"); - _timeBetweenCleanups = NumbersUtil.parseLong(value, 3600 * 24); - - value = params.get("stop.retry.interval"); - _stopRetryInterval = NumbersUtil.parseInt(value, 10 * 60); - - value = params.get("restart.retry.interval"); - _restartRetryInterval = NumbersUtil.parseInt(value, 10 * 60); - - value = params.get("investigate.retry.interval"); - _investigateRetryInterval = NumbersUtil.parseInt(value, 1 * 60); - - value = params.get("migrate.retry.interval"); - _migrateRetryInterval = NumbersUtil.parseInt(value, 2 * 60); + _forceHA = ForceHA.value(); + _timeToSleep = TimeToSleep.value() * SECONDS_TO_MILLISECONDS_FACTOR; + _maxRetries = MaxRetries.value(); + _timeBetweenFailures = TimeBetweenFailures.value() * SECONDS_TO_MILLISECONDS_FACTOR; + _timeBetweenCleanups = TimeBetweenCleanup.value(); + _stopRetryInterval = StopRetryInterval.value(); + _restartRetryInterval = RestartRetryInterval.value(); + _investigateRetryInterval = InvestigateRetryInterval.value(); + _migrateRetryInterval = MigrateRetryInterval.value(); _instance = params.get("instance"); if (_instance == null) { @@ -1004,4 +987,24 @@ public class HighAvailabilityManagerImpl extends ManagerBase implements HighAvai List haWorks = _haDao.listPendingHaWorkForVm(vmId); return haWorks.size() > 0; } + + /** + * @return The name of the component that provided this configuration + * variable. This value is saved in the database so someone can easily + * identify who provides this variable. + **/ + @Override + public String getConfigComponentName() { + return HighAvailabilityManager.class.getSimpleName(); + } + + /** + * @return The list of config keys provided by this configuable. + */ + @Override + public ConfigKey[] getConfigKeys() { + return new ConfigKey[] {TimeBetweenCleanup, MaxRetries, TimeToSleep, TimeBetweenFailures, + StopRetryInterval, RestartRetryInterval, MigrateRetryInterval, InvestigateRetryInterval, + HAWorkers, ForceHA}; + } } diff --git a/server/src/main/java/com/cloud/test/DatabaseConfig.java b/server/src/main/java/com/cloud/test/DatabaseConfig.java index 9a40543faea..4e0cbac6735 100644 --- a/server/src/main/java/com/cloud/test/DatabaseConfig.java +++ b/server/src/main/java/com/cloud/test/DatabaseConfig.java @@ -16,6 +16,31 @@ // under the License. package com.cloud.test; +import com.cloud.host.Status; +import com.cloud.service.ServiceOfferingVO; +import com.cloud.service.dao.ServiceOfferingDaoImpl; +import com.cloud.storage.DiskOfferingVO; +import com.cloud.storage.Storage.ProvisioningType; +import com.cloud.storage.dao.DiskOfferingDaoImpl; +import com.cloud.utils.DateUtil; +import com.cloud.utils.PropertiesUtil; +import com.cloud.utils.component.ComponentContext; +import com.cloud.utils.db.DB; +import com.cloud.utils.db.Transaction; +import com.cloud.utils.db.TransactionCallbackWithExceptionNoReturn; +import com.cloud.utils.db.TransactionLegacy; +import com.cloud.utils.db.TransactionStatus; +import com.cloud.utils.net.NfsUtils; +import org.apache.cloudstack.utils.security.DigestHelper; +import org.apache.log4j.Logger; +import org.apache.log4j.xml.DOMConfigurator; +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + import java.io.File; import java.io.IOException; import java.net.URISyntaxException; @@ -37,32 +62,6 @@ import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; -import org.apache.cloudstack.utils.security.DigestHelper; -import org.apache.log4j.Logger; -import org.apache.log4j.xml.DOMConfigurator; -import org.w3c.dom.Document; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.xml.sax.Attributes; -import org.xml.sax.SAXException; -import org.xml.sax.helpers.DefaultHandler; - -import com.cloud.host.Status; -import com.cloud.service.ServiceOfferingVO; -import com.cloud.service.dao.ServiceOfferingDaoImpl; -import com.cloud.storage.DiskOfferingVO; -import com.cloud.storage.Storage.ProvisioningType; -import com.cloud.storage.dao.DiskOfferingDaoImpl; -import com.cloud.utils.DateUtil; -import com.cloud.utils.PropertiesUtil; -import com.cloud.utils.component.ComponentContext; -import com.cloud.utils.db.DB; -import com.cloud.utils.db.Transaction; -import com.cloud.utils.db.TransactionCallbackWithExceptionNoReturn; -import com.cloud.utils.db.TransactionLegacy; -import com.cloud.utils.db.TransactionStatus; -import com.cloud.utils.net.NfsUtils; - public class DatabaseConfig { private static final Logger s_logger = Logger.getLogger(DatabaseConfig.class.getName()); @@ -288,10 +287,6 @@ public class DatabaseConfig { s_configurationComponents.put("consoleproxy.session.timeout", "AgentManager"); s_configurationComponents.put("expunge.workers", "UserVmManager"); s_configurationComponents.put("extract.url.cleanup.interval", "management-server"); - s_configurationComponents.put("stop.retry.interval", "HighAvailabilityManager"); - s_configurationComponents.put("restart.retry.interval", "HighAvailabilityManager"); - s_configurationComponents.put("investigate.retry.interval", "HighAvailabilityManager"); - s_configurationComponents.put("migrate.retry.interval", "HighAvailabilityManager"); s_configurationComponents.put("storage.overwrite.provisioning", "UserVmManager"); s_configurationComponents.put("init", "none"); s_configurationComponents.put("system.vm.use.local.storage", "ManagementServer"); @@ -345,10 +340,6 @@ public class DatabaseConfig { s_defaultConfigurationValues.put("extract.url.cleanup.interval", "120"); s_defaultConfigurationValues.put("instance.name", "VM"); s_defaultConfigurationValues.put("expunge.workers", "1"); - s_defaultConfigurationValues.put("stop.retry.interval", "600"); - s_defaultConfigurationValues.put("restart.retry.interval", "600"); - s_defaultConfigurationValues.put("investigate.retry.interval", "60"); - s_defaultConfigurationValues.put("migrate.retry.interval", "120"); s_defaultConfigurationValues.put("event.purge.interval", "86400"); s_defaultConfigurationValues.put("account.cleanup.interval", "86400"); s_defaultConfigurationValues.put("system.vm.use.local.storage", "false");