Daniel Erez has uploaded a new change for review. Change subject: core,webadmin: GetConfigurationValuesQuery for UI cache ......................................................................
core,webadmin: GetConfigurationValuesQuery for UI cache Added 'GetConfigurationValuesQuery' for fetching and caching all configuration values (ConfigurationValues enum) on UI startup. Apart of the obvious performance improvement, using a single query for retrieval (instead of a query for each value), results in a simpler/cleaner UI code. Core: * GetConfigurationValuesQuery - new query * Version - added 3_2 constant for query's usage. * DBConfigUtils - lowered some logs from 'warn' to 'debug' for preventing redundant warnings on each query's execute. UI: * AsyncDataProvider: ** CacheConfigValues - caching the 'pre-converted (raw)' configuration values returned from 'GetConfigurationValuesQuery'. ** GetConfigValue - getting a raw configuration value from the cache (for future usage - requires value conversion if needed). ** GetConfigFromCache - removed legacy 'GetConfigurationValue' call. * LoginModel/UserPortalLoginModel - caching values after login. * DataCenterNetworkListModel/HostInterfaceListModel - 'GetManagementNetworkName' call has relied on the fact that the query returns asynchronously - caused a NPE on startup. Change-Id: Id51a9f86bceef07de728335643b16c0554b6876c Signed-off-by: Daniel Erez <de...@redhat.com> --- A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetConfigurationValuesQuery.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java M backend/manager/modules/compat/src/main/java/org/ovirt/engine/core/compat/Version.java M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/generic/DBConfigUtils.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/dataprovider/AsyncDataProvider.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/LoginModel.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/datacenters/DataCenterNetworkListModel.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/HostInterfaceListModel.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/userportal/UserPortalLoginModel.java 9 files changed, 133 insertions(+), 36 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/63/8563/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetConfigurationValuesQuery.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetConfigurationValuesQuery.java new file mode 100644 index 0000000..415adaa --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetConfigurationValuesQuery.java @@ -0,0 +1,66 @@ +package org.ovirt.engine.core.bll; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.ovirt.engine.core.common.config.Config; +import org.ovirt.engine.core.common.config.ConfigValues; +import org.ovirt.engine.core.common.queries.ConfigurationValues; +import org.ovirt.engine.core.common.queries.GetConfigurationValueParameters; +import org.ovirt.engine.core.compat.EnumCompat; +import org.ovirt.engine.core.compat.KeyValuePairCompat; +import org.ovirt.engine.core.compat.Version; + +public class GetConfigurationValuesQuery<P extends GetConfigurationValueParameters> extends QueriesCommandBase<P> { + + private static final List<String> versions = + Arrays.asList(Config.DefaultConfigurationVersion, + Version.v2_2.toString(), + Version.v3_0.toString(), + Version.v3_1.toString(), + Version.v3_2.toString()); + + public GetConfigurationValuesQuery(P parameters) { + super(parameters); + } + + @Override + protected void executeQueryCommand() { + Map<Map.Entry<ConfigurationValues, String>, Object> configValuesMap = + new HashMap<Map.Entry<ConfigurationValues, String>, Object>(); + + for (ConfigurationValues configValue : ConfigurationValues.values()) { + // Ignore an admin configuration value on filtered mode + // Ignore a configuration value that doesn't exist in ConfigValues enum + if (!shouldReturnValue(configValue) || !EnumCompat.IsDefined(ConfigValues.class, configValue.toString())) { + continue; + } + + // Adding a configuration value for each version + for (String version : versions) { + Map.Entry<ConfigurationValues, String> key = + new KeyValuePairCompat<ConfigurationValues, String>(configValue, version); + Object value = + Config.<Object> GetValue(ConfigValues.valueOf(configValue.toString()), version); + + configValuesMap.put(key, value); + } + } + + getQueryReturnValue().setReturnValue(configValuesMap); + } + + /** + * Validates if the query should return anything or not, according to the user's permissions: + * <ul> + * <li>If the query is run as an administrator (note that since we've reached the {@link #executeQueryCommand()} method, + * we've already validated that the use is indeed an administrator), the results from the database queries should be returned.</li> + * <li>If the query is run as a user, it may return results <b>ONLY</b> if the configuration value has {@link org.ovirt.engine.core.common.queries.ConfigurationValues.ConfigAuthType#User}.</li> + * </ul> + */ + private boolean shouldReturnValue(ConfigurationValues configValue) { + return !getParameters().isFiltered() || !configValue.isAdmin(); + } +} diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java index a1c5bee..21831a5 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java @@ -144,6 +144,7 @@ // Configuration values GetConfigurationValue(VdcQueryAuthType.User), + GetConfigurationValues(VdcQueryAuthType.User), GetTimeZones(VdcQueryAuthType.User), GetDefualtTimeZone(VdcQueryAuthType.User), GetDiskConfigurationList(VdcQueryAuthType.User), diff --git a/backend/manager/modules/compat/src/main/java/org/ovirt/engine/core/compat/Version.java b/backend/manager/modules/compat/src/main/java/org/ovirt/engine/core/compat/Version.java index df3b28c..8dc0cfa 100644 --- a/backend/manager/modules/compat/src/main/java/org/ovirt/engine/core/compat/Version.java +++ b/backend/manager/modules/compat/src/main/java/org/ovirt/engine/core/compat/Version.java @@ -13,6 +13,7 @@ public static final Version v2_2 = new Version(2, 2); public static final Version v3_0 = new Version(3, 0); public static final Version v3_1 = new Version(3, 1); + public static final Version v3_2 = new Version(3, 2); public Version(String value) { 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 3f59fbb..387e236 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 @@ -239,9 +239,9 @@ Map<String, Object> defaultValues = new HashMap<String, Object>(); defaultValues.put(version, returnValue); _vdcOptionCache.put(option.getoption_name(), defaultValues); - log.warn("Adding new value to configuration cache."); + log.debug("Adding new value to configuration cache."); } - log.warnFormat("Didn't find the value of {0} in DB for version {1} - using default: {2}", + log.debugFormat("Didn't find the value of {0} in DB for version {1} - using default: {2}", name, version, returnValue); } diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/dataprovider/AsyncDataProvider.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/dataprovider/AsyncDataProvider.java index 2bd2c60..ae00ab3 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/dataprovider/AsyncDataProvider.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/dataprovider/AsyncDataProvider.java @@ -120,6 +120,9 @@ private static HashMap<Map.Entry<ConfigurationValues, String>, Object> cachedConfigValues = new HashMap<Map.Entry<ConfigurationValues, String>, Object>(); + private static HashMap<Map.Entry<ConfigurationValues, String>, Object> cachedConfigValuesPreConvert = + new HashMap<Map.Entry<ConfigurationValues, String>, Object>(); + public static void GetDomainListViaPublic(AsyncQuery aQuery, boolean filterInternalDomain) { aQuery.converterCallback = new IAsyncConverter() { @Override @@ -2109,6 +2112,35 @@ } /** + * Cache configuration values [raw (not converted) values from vdc_options table]. + */ + public static void CacheConfigValues(AsyncQuery aQuery) { + aQuery.converterCallback = new IAsyncConverter() { + @Override + public Object Convert(Object returnValue, AsyncQuery _asyncQuery) + { + if (returnValue != null) { + cachedConfigValuesPreConvert.putAll((HashMap<Map.Entry<ConfigurationValues, String>, Object>) returnValue); + } + return cachedConfigValuesPreConvert; + } + }; + + Frontend.RunQuery(VdcQueryType.GetConfigurationValues, new GetConfigurationValueParameters(), aQuery); + } + + /** + * Get configuration value from 'cachedConfigValuesPreConvert' + * (raw values from vdc_options table). + */ + public static Object GetConfigValue(ConfigurationValues configValue, String version) { + Map.Entry<ConfigurationValues, String> key = + new KeyValuePairCompat<ConfigurationValues, String>(configValue, version); + + return cachedConfigValuesPreConvert.get(key); + } + + /** * method to get an item from config while caching it (config is not supposed to change during a session) * @param aQuery * an async query @@ -2116,43 +2148,31 @@ * a converter for the async query */ public static void GetConfigFromCache(GetConfigurationValueParameters parameters, AsyncQuery aQuery) { - // cache key final Map.Entry<ConfigurationValues, String> config_key = new KeyValuePairCompat<ConfigurationValues, String>(parameters.getConfigValue(), parameters.getVersion()); + Object returnValue = null; + if (cachedConfigValues.containsKey(config_key)) { - // Cache hit - Object cached = cachedConfigValues.get(config_key); - // return result - if (cached != null) { - aQuery.asyncCallback.OnSuccess(aQuery.getModel(), cached); - return; + // cache hit + returnValue = cachedConfigValues.get(config_key); + } + // cache miss: convert configuration value using query's converter + // and call asyncCallback's OnSuccess + else if (cachedConfigValuesPreConvert.containsKey(config_key)) { + returnValue = cachedConfigValuesPreConvert.get(config_key); + + // run converter + if (aQuery.converterCallback != null) { + returnValue = aQuery.converterCallback.Convert(returnValue, aQuery); + } + if (returnValue != null) { + cachedConfigValues.put(config_key, returnValue); } } - - // save original converter - final IAsyncConverter origConverter = aQuery.converterCallback; - - // Cache miss: run the query and replace the converter to cache the results - aQuery.converterCallback = new IAsyncConverter() { - - @Override - public Object Convert(Object returnValue, AsyncQuery asyncQuery) { - // run original converter - if (origConverter != null) { - returnValue = origConverter.Convert(returnValue, asyncQuery); - } - if (returnValue != null) { - cachedConfigValues.put(config_key, returnValue); - } - return returnValue; - } - }; - - // run query - Frontend.RunQuery(VdcQueryType.GetConfigurationValue, parameters, aQuery); + aQuery.asyncCallback.OnSuccess(aQuery.getModel(), returnValue); } /** diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/LoginModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/LoginModel.java index db66909..92ec833 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/LoginModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/LoginModel.java @@ -308,7 +308,7 @@ } else { - loginModel.getLoggedInEvent().raise(this, EventArgs.Empty); + raiseLoggedInEvent(); } StopProgress(); } @@ -320,6 +320,17 @@ _asyncQuery); } + protected void raiseLoggedInEvent() { + // Cache all configurations values before logging-in + AsyncDataProvider.CacheConfigValues(new AsyncQuery(this, new INewAsyncCallback() { + @Override + public void OnSuccess(Object target, Object returnValue) { + LoginModel loginModel = (LoginModel) target; + loginModel.getLoggedInEvent().raise(this, EventArgs.Empty); + } + })); + } + public void AutoLogin(VdcUser user) { loggingInAutomatically = true; @@ -327,7 +338,7 @@ getDomain().setSelectedItem(user.getDomainControler()); disableLoginScreen(); setLoggedUser(user); - getLoggedInEvent().raise(this, EventArgs.Empty); + raiseLoggedInEvent(); } protected void disableLoginScreen() { diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/datacenters/DataCenterNetworkListModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/datacenters/DataCenterNetworkListModel.java index 83cf1b6..fa32a58 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/datacenters/DataCenterNetworkListModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/datacenters/DataCenterNetworkListModel.java @@ -121,7 +121,6 @@ @Override public void OnSuccess(Object model, Object returnValue) { ENGINE_NETWORK = (String) returnValue; - UpdateActionAvailability(); } })); diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/HostInterfaceListModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/HostInterfaceListModel.java index 65d5317..8398317 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/HostInterfaceListModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/HostInterfaceListModel.java @@ -337,7 +337,6 @@ @Override public void OnSuccess(Object model, Object returnValue) { ENGINE_NETWORK_NAME = (String) returnValue; - UpdateActionAvailability(); } })); diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/userportal/UserPortalLoginModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/userportal/UserPortalLoginModel.java index 828c174..3660f23 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/userportal/UserPortalLoginModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/userportal/UserPortalLoginModel.java @@ -206,7 +206,7 @@ if (success) { model.setLoggedUser((VdcUser) returnValue.getActionReturnValue()); - model.getLoggedInEvent().raise(this, EventArgs.Empty); + model.raiseLoggedInEvent(); } else { -- To view, visit http://gerrit.ovirt.org/8563 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Id51a9f86bceef07de728335643b16c0554b6876c Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Daniel Erez <de...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches