You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by jb...@apache.org on 2012/05/14 08:55:45 UTC

svn commit: r1338038 - in /karaf/cellar/branches/cellar-2.2.x/config/src/main/java/org/apache/karaf/cellar/config: ConfigurationEventHandler.java ConfigurationSynchronizer.java Constants.java LocalConfigurationListener.java

Author: jbonofre
Date: Mon May 14 06:55:45 2012
New Revision: 1338038

URL: http://svn.apache.org/viewvc?rev=1338038&view=rev
Log:
[KARAF-1434] Introduce the karaf.cellar.sync property to broadcast cluster event depending of the origin

Modified:
    karaf/cellar/branches/cellar-2.2.x/config/src/main/java/org/apache/karaf/cellar/config/ConfigurationEventHandler.java
    karaf/cellar/branches/cellar-2.2.x/config/src/main/java/org/apache/karaf/cellar/config/ConfigurationSynchronizer.java
    karaf/cellar/branches/cellar-2.2.x/config/src/main/java/org/apache/karaf/cellar/config/Constants.java
    karaf/cellar/branches/cellar-2.2.x/config/src/main/java/org/apache/karaf/cellar/config/LocalConfigurationListener.java

Modified: karaf/cellar/branches/cellar-2.2.x/config/src/main/java/org/apache/karaf/cellar/config/ConfigurationEventHandler.java
URL: http://svn.apache.org/viewvc/karaf/cellar/branches/cellar-2.2.x/config/src/main/java/org/apache/karaf/cellar/config/ConfigurationEventHandler.java?rev=1338038&r1=1338037&r2=1338038&view=diff
==============================================================================
--- karaf/cellar/branches/cellar-2.2.x/config/src/main/java/org/apache/karaf/cellar/config/ConfigurationEventHandler.java (original)
+++ karaf/cellar/branches/cellar-2.2.x/config/src/main/java/org/apache/karaf/cellar/config/ConfigurationEventHandler.java Mon May 14 06:55:45 2012
@@ -74,7 +74,7 @@ public class ConfigurationEventHandler e
                         conf.delete();
                     } else {
                         if (remoteDictionary != null) {
-                            Dictionary localDictionary = conf.getProperties();
+                            remoteDictionary.put(Constants.SYNC_PROPERTY, new Long(System.currentTimeMillis()).toString());
                             conf.update(filter(remoteDictionary));
                         }
                     }

Modified: karaf/cellar/branches/cellar-2.2.x/config/src/main/java/org/apache/karaf/cellar/config/ConfigurationSynchronizer.java
URL: http://svn.apache.org/viewvc/karaf/cellar/branches/cellar-2.2.x/config/src/main/java/org/apache/karaf/cellar/config/ConfigurationSynchronizer.java?rev=1338038&r1=1338037&r2=1338038&view=diff
==============================================================================
--- karaf/cellar/branches/cellar-2.2.x/config/src/main/java/org/apache/karaf/cellar/config/ConfigurationSynchronizer.java (original)
+++ karaf/cellar/branches/cellar-2.2.x/config/src/main/java/org/apache/karaf/cellar/config/ConfigurationSynchronizer.java Mon May 14 06:55:45 2012
@@ -88,6 +88,7 @@ public class ConfigurationSynchronizer e
                         try {
                             // update the local configuration if needed
                             Configuration conf = configurationAdmin.getConfiguration(pid);
+                            remoteDictionary.put(Constants.SYNC_PROPERTY, new Long(System.currentTimeMillis()).toString());
                             conf.update(filter(remoteDictionary));
                         } catch (IOException ex) {
                             LOGGER.error("CELLAR CONFIG: failed to read from the distributed map", ex);

Modified: karaf/cellar/branches/cellar-2.2.x/config/src/main/java/org/apache/karaf/cellar/config/Constants.java
URL: http://svn.apache.org/viewvc/karaf/cellar/branches/cellar-2.2.x/config/src/main/java/org/apache/karaf/cellar/config/Constants.java?rev=1338038&r1=1338037&r2=1338038&view=diff
==============================================================================
--- karaf/cellar/branches/cellar-2.2.x/config/src/main/java/org/apache/karaf/cellar/config/Constants.java (original)
+++ karaf/cellar/branches/cellar-2.2.x/config/src/main/java/org/apache/karaf/cellar/config/Constants.java Mon May 14 06:55:45 2012
@@ -20,5 +20,6 @@ public class Constants {
 
     public static final String CATEGORY = "config";
     public static final String CONFIGURATION_MAP = "org.apache.karaf.cellar.configuration.map";
+    public static final String SYNC_PROPERTY = "karaf.cellar.sync";
 
 }

Modified: karaf/cellar/branches/cellar-2.2.x/config/src/main/java/org/apache/karaf/cellar/config/LocalConfigurationListener.java
URL: http://svn.apache.org/viewvc/karaf/cellar/branches/cellar-2.2.x/config/src/main/java/org/apache/karaf/cellar/config/LocalConfigurationListener.java?rev=1338038&r1=1338037&r2=1338038&view=diff
==============================================================================
--- karaf/cellar/branches/cellar-2.2.x/config/src/main/java/org/apache/karaf/cellar/config/LocalConfigurationListener.java (original)
+++ karaf/cellar/branches/cellar-2.2.x/config/src/main/java/org/apache/karaf/cellar/config/LocalConfigurationListener.java Mon May 14 06:55:45 2012
@@ -39,6 +39,8 @@ public class LocalConfigurationListener 
 
     private static final transient Logger LOGGER = LoggerFactory.getLogger(LocalConfigurationListener.class);
 
+    private static final long SYNC_TIMEOUT = 200;
+
     private EventProducer eventProducer;
 
     /**
@@ -56,6 +58,22 @@ public class LocalConfigurationListener 
         }
 
         String pid = event.getPid();
+        Configuration conf = null;
+        try {
+            conf = configurationAdmin.getConfiguration(pid);
+        } catch (Exception e) {
+            LOGGER.error("CELLAR CONFIG: can't retrieve configuration with PID {}", pid, e);
+            return;
+        }
+
+        Dictionary localDictionary = conf.getProperties();
+        if (localDictionary.get(Constants.SYNC_PROPERTY) != null) {
+            Long syncTimestamp = new Long((String) localDictionary.get(Constants.SYNC_PROPERTY));
+            Long currentTimestamp = System.currentTimeMillis();
+            if ((currentTimestamp - syncTimestamp) <= SYNC_TIMEOUT) {
+                return;
+            }
+        }
 
         Set<Group> groups = groupManager.listLocalGroups();
 
@@ -71,11 +89,14 @@ public class LocalConfigurationListener 
                         if (event.getType() == ConfigurationEvent.CM_DELETED) {
                             configurationTable.remove(pid);
                         } else {
-                            Configuration conf = configurationAdmin.getConfiguration(pid);
-                            Properties localDictionary = dictionaryToProperties(filter(conf.getProperties()));
+                            //Configuration conf = configurationAdmin.getConfiguration(pid);
+                            Properties localProperties = dictionaryToProperties(filter(localDictionary));
                             // update the distributed map
-                            configurationTable.put(pid, localDictionary);
-                            // TODO broadcast a cluster event but it creates a loop
+                            configurationTable.put(pid, localProperties);
+                            // broadcast the cluster event
+                            RemoteConfigurationEvent remoteConfigurationEvent = new RemoteConfigurationEvent(pid);
+                            remoteConfigurationEvent.setSourceGroup(group);
+                            eventProducer.produce(remoteConfigurationEvent);
                         }
                     } catch (Exception e) {
                         LOGGER.error("CELLAR CONFIG: failed to push configuration with PID {} to the distributed map", pid, e);