@Override @ActionEvent(eventType = EventTypes.EVENT_HA_RESOURCE_DISABLE, eventDescription = "disabling HA for resource") public boolean disableHA(final Long resourceId, final HAResource.ResourceType resourceType) { Preconditions.checkArgument(resourceId != null && resourceId > 0L); Preconditions.checkArgument(resourceType != null); boolean result = configureHA(resourceId, resourceType, false, null); if (result) { transitionHAState(HAConfig.Event.Disabled, haConfigDao.findHAResource(resourceId, resourceType)); purgeHACounter(resourceId, resourceType); } return result; }
public boolean isHAEligible(final HAResource resource) { return resource != null && isHAEnabledForZone(resource) && isHAEnabledForCluster(resource) && isHAEligibleForResource(resource); }
public synchronized void purgeHACounter(final Long resourceId, final HAResource.ResourceType resourceType) { final String key = resourceCounterKey(resourceId, resourceType); if (haCounterMap.containsKey(key)) { haCounterMap.remove(key); } }
@Override @ActionEvent(eventType = EventTypes.EVENT_HA_RESOURCE_CONFIGURE, eventDescription = "configuring HA for resource") public boolean configureHA(final Long resourceId, final HAResource.ResourceType resourceType, final String haProvider) { Preconditions.checkArgument(resourceId != null && resourceId > 0L); Preconditions.checkArgument(resourceType != null); Preconditions.checkArgument(!Strings.isNullOrEmpty(haProvider)); if (!haProviderMap.containsKey(haProvider.toLowerCase())) { throw new CloudRuntimeException("Given HA provider does not exist."); } validateHAProviderConfigForResource(resourceId, resourceType, haProviderMap.get(haProvider.toLowerCase())); return configureHA(resourceId, resourceType, null, haProvider.toLowerCase()); }
private HAResource validateAndFindHAResource(final HAConfig haConfig) { HAResource resource = null; if (haConfig == null) { return null; } if (haConfig.getResourceType() == HAResource.ResourceType.Host) { final Host host = hostDao.findById(haConfig.getResourceId()); if (host != null && host.getRemoved() != null) { return null; } resource = host; if (haConfig.getState() == null || (resource == null && haConfig.getState() != HAConfig.HAState.Disabled)) { disableHA(haConfig.getResourceId(), haConfig.getResourceType()); return null; } } if (!haConfig.isEnabled() || !isHAEnabledForZone(resource) || !isHAEnabledForCluster(resource)) { if (haConfig.getState() != HAConfig.HAState.Disabled) { if (transitionHAState(HAConfig.Event.Disabled, haConfig) ) { purgeHACounter(haConfig.getResourceId(), haConfig.getResourceType()); } } return null; } else if (haConfig.getState() == HAConfig.HAState.Disabled) { transitionHAState(HAConfig.Event.Enabled, haConfig); } return resource; }
private boolean processHAStateChange(final HAConfig haConfig, final HAConfig.HAState newState, final boolean status) { if (!status || !checkHAOwnership(haConfig)) { return false; final HAResource resource = validateAndFindHAResource(haConfig); if (resource == null) { return false; final HAProvider<HAResource> haProvider = validateAndFindHAProvider(haConfig, resource); if (haProvider == null) { return false; final HAResourceCounter counter = getHACounter(haConfig.getResourceId(), haConfig.getResourceType());
final HAResourceCounter counter = getHACounter(haConfig.getResourceId(), haConfig.getResourceType()); transitionHAState(HAConfig.Event.PerformActivityCheck, haConfig); transitionHAState(HAConfig.Event.PeriodicRecheckResourceActivity, haConfig); transitionHAState(HAConfig.Event.RecoveryOperationThresholdExceeded, haConfig); } else { transitionHAState(HAConfig.Event.RetryRecovery, haConfig); counter.markRecoveryStarted(); if (counter.canExitRecovery((Long)(haProvider.getConfigValue(HAProviderConfig.RecoveryWaitTimeout, resource)))) { if (transitionHAState(HAConfig.Event.RecoveryWaitPeriodTimeout, haConfig)) { counter.markRecoveryCompleted(); transitionHAState(HAConfig.Event.RetryFencing, haConfig);
@Override public boolean preStateTransitionEvent(final HAConfig.HAState oldState, final HAConfig.Event event, final HAConfig.HAState newState, final HAConfig haConfig, final boolean status, final Object opaque) { if (oldState != newState || newState == HAConfig.HAState.Suspect || newState == HAConfig.HAState.Checking) { return false; } if (LOG.isTraceEnabled()) { LOG.trace("HA state pre-transition:: new state=" + newState + ", old state=" + oldState + ", for resource id=" + haConfig.getResourceId() + ", status=" + status + ", ha config state=" + haConfig.getState()); } if (status && haConfig.getState() != newState) { LOG.warn("HA state pre-transition:: HA state is not equal to transition state, HA state=" + haConfig.getState() + ", new state=" + newState); } return processHAStateChange(haConfig, newState, status); }
@Override @ActionEvent(eventType = EventTypes.EVENT_HA_RESOURCE_ENABLE, eventDescription = "enabling HA for resource") public boolean enableHA(final Long resourceId, final HAResource.ResourceType resourceType) { Preconditions.checkArgument(resourceId != null && resourceId > 0L); Preconditions.checkArgument(resourceType != null); return configureHA(resourceId, resourceType, true, null); }
@Override public boolean postStateTransitionEvent(final StateMachine2.Transition<HAConfig.HAState, HAConfig.Event> transition, final HAConfig haConfig, final boolean status, final Object opaque) { if (LOG.isTraceEnabled()) { LOG.trace("HA state post-transition:: new state=" + transition.getToState() + ", old state=" + transition.getCurrentState() + ", for resource id=" + haConfig.getResourceId() + ", status=" + status + ", ha config state=" + haConfig.getState()); } if (status && haConfig.getState() != transition.getToState()) { LOG.warn("HA state post-transition:: HA state is not equal to transition state, HA state=" + haConfig.getState() + ", new state=" + transition.getToState()); } return processHAStateChange(haConfig, transition.getToState(), status); }
public synchronized HAResourceCounter getHACounter(final Long resourceId, final HAResource.ResourceType resourceType) { final String key = resourceCounterKey(resourceId, resourceType); if (!haCounterMap.containsKey(key)) { haCounterMap.put(key, new HAResourceCounter()); } return haCounterMap.get(key); }