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

Reply via email to