Martin Mucha has uploaded a new change for review. Change subject: restapi: Fire CDI event with all reloaded VdcOptions upon ReloadConfigurationsCommand ......................................................................
restapi: Fire CDI event with all reloaded VdcOptions upon ReloadConfigurationsCommand when ReloadConfigurationsCommand is called, it updates only data in map. Which is fruitless, since there may be running services which needs to update their configuration. Without this they probably have to regularly poll Config.<> getValue() which is grossly inefficient. With CDI support starting to appear we can implemnt it via CDI events. Change-Id: I89b1d94626b4210cd2a7fb04efc4ee9cc490dd6c Signed-off-by: Martin Mucha <[email protected]> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ReloadConfigurationsCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/enginehealth/NicsHealthCheckManager.java M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/generic/DBConfigUtils.java 3 files changed, 71 insertions(+), 8 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/57/34657/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ReloadConfigurationsCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ReloadConfigurationsCommand.java index 41440ac..f56698a 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ReloadConfigurationsCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ReloadConfigurationsCommand.java @@ -3,14 +3,21 @@ import java.util.Collections; import java.util.List; -import org.ovirt.engine.core.common.AuditLogType; +import javax.enterprise.event.Event; +import javax.inject.Inject; + import org.ovirt.engine.core.bll.utils.PermissionSubject; +import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.VdcObjectType; import org.ovirt.engine.core.common.action.VdcActionParametersBase; +import org.ovirt.engine.core.common.businessentities.VdcOption; import org.ovirt.engine.core.dal.dbbroker.generic.DBConfigUtils; @NonTransactiveCommandAttribute public class ReloadConfigurationsCommand<T extends VdcActionParametersBase> extends CommandBase<T> { + + @Inject + private Event<VdcOptionsUpdated> vdcOptionsUpdatedEvent; public ReloadConfigurationsCommand(T parameters) { super(parameters); @@ -18,7 +25,10 @@ @Override protected void executeCommand() { - DBConfigUtils.refreshReloadableConfigsInVdcOptionCache(); + List<VdcOption> updatedVdcOptions = DBConfigUtils.refreshReloadableConfigsInVdcOptionCache(); + if (!updatedVdcOptions.isEmpty()) { + vdcOptionsUpdatedEvent.fire(new VdcOptionsUpdated(updatedVdcOptions)); + } setSucceeded(true); } @@ -33,4 +43,16 @@ public AuditLogType getAuditLogTypeValue() { return getSucceeded() ? AuditLogType.RELOAD_CONFIGURATIONS_SUCCESS : AuditLogType.RELOAD_CONFIGURATIONS_FAILURE; } + + public class VdcOptionsUpdated { + private final List<VdcOption> updatedVdcOptions; + + public VdcOptionsUpdated(List<VdcOption> updatedVdcOptions) { + this.updatedVdcOptions = Collections.unmodifiableList(updatedVdcOptions); + } + + public List<VdcOption> getUpdatedVdcOptions() { + return updatedVdcOptions; + } + } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/enginehealth/NicsHealthCheckManager.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/enginehealth/NicsHealthCheckManager.java index d3b4e43..c1dbf59 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/enginehealth/NicsHealthCheckManager.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/enginehealth/NicsHealthCheckManager.java @@ -12,9 +12,11 @@ import javax.annotation.PostConstruct; import javax.ejb.DependsOn; +import javax.enterprise.event.Observes; import javax.inject.Singleton; import org.apache.commons.lang.StringUtils; +import org.ovirt.engine.core.bll.ReloadConfigurationsCommand; import org.ovirt.engine.core.common.businessentities.EngineNicHealth; import org.ovirt.engine.core.common.config.Config; import org.ovirt.engine.core.common.config.ConfigValues; @@ -46,6 +48,10 @@ this.init(); } + public void updateConfigValues(@Observes ReloadConfigurationsCommand.VdcOptionsUpdated vdcOptionsUpdated) { + System.out.println("Updating!"); + } + public void init() { String engineNics = Config.getValue(ConfigValues.EngineNics); if (shouldEnableChecking(engineNics)) { diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/generic/DBConfigUtils.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/generic/DBConfigUtils.java index e719863..a0a3aee 100644 --- a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/generic/DBConfigUtils.java +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/generic/DBConfigUtils.java @@ -1,6 +1,7 @@ package org.ovirt.engine.core.dal.dbbroker.generic; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.HashMap; @@ -19,9 +20,9 @@ import org.ovirt.engine.core.dal.dbbroker.DbFacade; import org.ovirt.engine.core.dao.VdcOptionDAO; import org.ovirt.engine.core.utils.ConfigUtilsBase; +import org.ovirt.engine.core.utils.collections.DomainsPasswordMap; import org.ovirt.engine.core.utils.crypt.EngineEncryptionUtils; import org.ovirt.engine.core.utils.serialization.json.JsonObjectDeserializer; -import org.ovirt.engine.core.utils.collections.DomainsPasswordMap; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -241,31 +242,65 @@ /** * Refreshes only the reloadable configurations in the VDC option cache. */ - public static void refreshReloadableConfigsInVdcOptionCache() { + public static List<VdcOption> refreshReloadableConfigsInVdcOptionCache() { + List<VdcOption> updatedOptions = new ArrayList<>(); + for (VdcOption vdcOption : getAllReloadableVdcOptions()) { + boolean optionWasUpdated = updateOption(vdcOption); + if (optionWasUpdated) { + updatedOptions.add(vdcOption); + } + } + return updatedOptions; + } + + //TODO MM: maybe move to dao? + private static List<VdcOption> getAllReloadableVdcOptions() { List<VdcOption> list = getVdcOptionDAO().getAll(); + List<VdcOption> result = new ArrayList<>(); + for (VdcOption option : list) { try { if (isReloadable(option.getoption_name())) { - updateOption(option); + result.add(option); } } catch (NoSuchFieldException e) { log.error("Not refreshing field '{}': does not exist in class {}.", option.getoption_name(), ConfigValues.class.getSimpleName()); } } + + return result; } private static VdcOptionDAO getVdcOptionDAO() { return DbFacade.getInstance().getVdcOptionDao(); } - private static void updateOption(VdcOption option) { + /** + * @param option option to update + * @return true if option was different since last start/update and was updated. + */ + private static boolean updateOption(VdcOption option) { Map<String, Object> values = _vdcOptionCache.get(option.getoption_name()); + String optionVersion = option.getversion(); + Object optionValue = getValue(option); + boolean changed; + if (values == null) { - values = new HashMap<String, Object>(); + values = new HashMap<>(); _vdcOptionCache.put(option.getoption_name(), values); + changed = true; + } else { + Object value = values.get(optionVersion); + boolean newVersion = value == null; + changed = newVersion || !value.equals(optionValue); } - values.put(option.getversion(), getValue(option)); + + if (changed) { + values.put(optionVersion, optionValue); + } + + return changed; } private static boolean isReloadable(String optionName) throws NoSuchFieldException { -- To view, visit http://gerrit.ovirt.org/34657 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I89b1d94626b4210cd2a7fb04efc4ee9cc490dd6c Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Martin Mucha <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
