Repository: karaf-cellar
Updated Branches:
  refs/heads/master 8a6d55fc3 -> 6dd40cebc


[KARAF-3981] Improve OBR synchronizer


Project: http://git-wip-us.apache.org/repos/asf/karaf-cellar/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf-cellar/commit/6dd40ceb
Tree: http://git-wip-us.apache.org/repos/asf/karaf-cellar/tree/6dd40ceb
Diff: http://git-wip-us.apache.org/repos/asf/karaf-cellar/diff/6dd40ceb

Branch: refs/heads/master
Commit: 6dd40cebc7c454d7bf71d5809d55e9b6a653941c
Parents: 8a6d55f
Author: Jean-Baptiste Onofré <[email protected]>
Authored: Sun Sep 13 17:51:01 2015 +0200
Committer: Jean-Baptiste Onofré <[email protected]>
Committed: Sun Sep 13 17:51:01 2015 +0200

----------------------------------------------------------------------
 .../karaf/cellar/obr/ObrBundleEventHandler.java |  6 +++
 .../karaf/cellar/obr/ObrUrlEventHandler.java    |  6 +++
 .../karaf/cellar/obr/ObrUrlSynchronizer.java    | 50 +++++++++++++++-----
 .../cellar/obr/internal/osgi/Activator.java     |  1 +
 4 files changed, 52 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/6dd40ceb/obr/src/main/java/org/apache/karaf/cellar/obr/ObrBundleEventHandler.java
----------------------------------------------------------------------
diff --git 
a/obr/src/main/java/org/apache/karaf/cellar/obr/ObrBundleEventHandler.java 
b/obr/src/main/java/org/apache/karaf/cellar/obr/ObrBundleEventHandler.java
index f821cd5..9e3eff3 100644
--- a/obr/src/main/java/org/apache/karaf/cellar/obr/ObrBundleEventHandler.java
+++ b/obr/src/main/java/org/apache/karaf/cellar/obr/ObrBundleEventHandler.java
@@ -131,6 +131,12 @@ public class ObrBundleEventHandler extends ObrSupport 
implements EventHandler<Cl
             return;
         }
 
+        // check if it's not a "local" event
+        if (event.getSourceNode() != null && 
event.getSourceNode().getId().equalsIgnoreCase(clusterManager.getNode().getId()))
 {
+            LOGGER.trace("CELLAR BUNDLE: cluster event is local (coming from 
local synchronizer or listener)");
+            return;
+        }
+
         String bundleId = event.getBundleId();
         boolean deployOptional = event.getDeployOptional();
         boolean start = event.getStart();

http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/6dd40ceb/obr/src/main/java/org/apache/karaf/cellar/obr/ObrUrlEventHandler.java
----------------------------------------------------------------------
diff --git 
a/obr/src/main/java/org/apache/karaf/cellar/obr/ObrUrlEventHandler.java 
b/obr/src/main/java/org/apache/karaf/cellar/obr/ObrUrlEventHandler.java
index ed27ace..9c3078c 100644
--- a/obr/src/main/java/org/apache/karaf/cellar/obr/ObrUrlEventHandler.java
+++ b/obr/src/main/java/org/apache/karaf/cellar/obr/ObrUrlEventHandler.java
@@ -70,6 +70,12 @@ public class ObrUrlEventHandler extends ObrSupport 
implements EventHandler<Clust
             return;
         }
 
+        // check if it's not a "local" event
+        if (event.getSourceNode() != null && 
event.getSourceNode().getId().equalsIgnoreCase(clusterManager.getNode().getId()))
 {
+            LOGGER.trace("CELLAR BUNDLE: cluster event is local (coming from 
local synchronizer or listener)");
+            return;
+        }
+
         String url = event.getUrl();
         try {
             if (isAllowed(event.getSourceGroup(), 
Constants.URLS_CONFIG_CATEGORY, url, EventType.INBOUND) || event.getForce()) {

http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/6dd40ceb/obr/src/main/java/org/apache/karaf/cellar/obr/ObrUrlSynchronizer.java
----------------------------------------------------------------------
diff --git 
a/obr/src/main/java/org/apache/karaf/cellar/obr/ObrUrlSynchronizer.java 
b/obr/src/main/java/org/apache/karaf/cellar/obr/ObrUrlSynchronizer.java
index 3e7d4a2..d5f7d7d 100644
--- a/obr/src/main/java/org/apache/karaf/cellar/obr/ObrUrlSynchronizer.java
+++ b/obr/src/main/java/org/apache/karaf/cellar/obr/ObrUrlSynchronizer.java
@@ -18,6 +18,7 @@ import org.apache.felix.bundlerepository.Resource;
 import org.apache.karaf.cellar.core.Configurations;
 import org.apache.karaf.cellar.core.Group;
 import org.apache.karaf.cellar.core.Synchronizer;
+import org.apache.karaf.cellar.core.event.EventProducer;
 import org.apache.karaf.cellar.core.event.EventType;
 import org.osgi.service.cm.Configuration;
 import org.slf4j.Logger;
@@ -35,6 +36,12 @@ public class ObrUrlSynchronizer extends ObrSupport 
implements Synchronizer {
 
     private static final transient Logger LOGGER = 
LoggerFactory.getLogger(ObrUrlSynchronizer.class);
 
+    private EventProducer eventProducer;
+
+    public void setEventProducer(EventProducer eventProducer) {
+        this.eventProducer = eventProducer;
+    }
+
     @Override
     public void init() {
         if (groupManager == null)
@@ -60,19 +67,32 @@ public class ObrUrlSynchronizer extends ObrSupport 
implements Synchronizer {
     @Override
     public void sync(Group group) {
         String policy = getSyncPolicy(group);
-        if (policy != null && policy.equalsIgnoreCase("cluster")) {
-            LOGGER.debug("CELLAR OBR: sync policy is set as 'cluster' for 
cluster group " + group.getName());
-            if (clusterManager.listNodesByGroup(group).size() == 1 && 
clusterManager.listNodesByGroup(group).contains(clusterManager.getNode())) {
-                LOGGER.debug("CELLAR OBR: node is the first and only member of 
the group, pushing state");
-                push(group);
-            } else {
-                LOGGER.debug("CELLAR OBR: pulling state");
-                pull(group);
-            }
+        if (policy == null) {
+            LOGGER.warn("CELLAR OBR: sync policy is not defined for cluster 
group {}", group.getName());
         }
-        if (policy != null && policy.equalsIgnoreCase("node")) {
-            LOGGER.debug("CELLAR OBR: sync policy is set as 'node' for cluster 
group " + group.getName());
+        if (policy.equalsIgnoreCase("cluster")) {
+            LOGGER.debug("CELLAR OBR: sync policy set as 'cluster' for cluster 
group {}", group.getName());
+            LOGGER.debug("CELLAR OBR: updating node from the cluster (pull 
first)");
+            pull(group);
+            LOGGER.debug("CELLAR OBR: updating cluster from the local node 
(push after)");
+            push(group);
+        } else if (policy.equalsIgnoreCase("node")) {
+            LOGGER.debug("CELLAR OBR: sync policy set as 'node' for cluster 
group {}", group.getName());
+            LOGGER.debug("CELLAR OBR: updating cluster from the local node 
(push first)");
+            push(group);
+            LOGGER.debug("CELLAR OBR: updating node from the cluster (pull 
after)");
+            pull(group);
+        } else if (policy.equalsIgnoreCase("clusterOnly")) {
+            LOGGER.debug("CELLAR OBR: sync policy set as 'clusterOnly' for 
cluster group " + group.getName());
+            LOGGER.debug("CELLAR OBR: updating node from the cluster (pull 
only)");
+            pull(group);
+        } else if (policy.equalsIgnoreCase("nodeOnly")) {
+            LOGGER.debug("CELLAR OBR: sync policy set as 'nodeOnly' for 
cluster group " + group.getName());
+            LOGGER.debug("CELLAR OBR: updating cluster from the local node 
(push only)");
             push(group);
+        } else {
+            LOGGER.debug("CELLAR OBR: sync policy set as 'disabled' for 
cluster group " + group.getName());
+            LOGGER.debug("CELLAR OBR: no sync");
         }
     }
 
@@ -122,11 +142,19 @@ public class ObrUrlSynchronizer extends ObrSupport 
implements Synchronizer {
                 Repository[] repositories = obrService.listRepositories();
                 for (Repository repository : repositories) {
                     if (isAllowed(group, Constants.URLS_CONFIG_CATEGORY, 
repository.getURI().toString(), EventType.OUTBOUND)) {
+                        LOGGER.debug("CELLAR OBR: adding repository {} to the 
cluster", repository.getURI().toString());
+                        // update cluster state
                         clusterUrls.add(repository.getURI().toString());
+                        // send cluster event
+                        ClusterObrUrlEvent urlEvent = new 
ClusterObrUrlEvent(repository.getURI().toString(), 
Constants.URL_ADD_EVENT_TYPE);
+                        urlEvent.setSourceGroup(group);
+                        urlEvent.setSourceNode(clusterManager.getNode());
+                        eventProducer.produce(urlEvent);
                         // update OBR bundles in the cluster group
                         Set<ObrBundleInfo> clusterBundles = 
clusterManager.getSet(Constants.BUNDLES_DISTRIBUTED_SET_NAME + 
Configurations.SEPARATOR + groupName);
                         Resource[] resources = repository.getResources();
                         for (Resource resource : resources) {
+                            LOGGER.debug("CELLAR OBR: adding bundle {} to the 
cluster", resource.getPresentationName());
                             ObrBundleInfo info = new 
ObrBundleInfo(resource.getPresentationName(), resource.getSymbolicName(), 
resource.getVersion().toString());
                             clusterBundles.add(info);
                         }

http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/6dd40ceb/obr/src/main/java/org/apache/karaf/cellar/obr/internal/osgi/Activator.java
----------------------------------------------------------------------
diff --git 
a/obr/src/main/java/org/apache/karaf/cellar/obr/internal/osgi/Activator.java 
b/obr/src/main/java/org/apache/karaf/cellar/obr/internal/osgi/Activator.java
index 72cca42..6ec3381 100644
--- a/obr/src/main/java/org/apache/karaf/cellar/obr/internal/osgi/Activator.java
+++ b/obr/src/main/java/org/apache/karaf/cellar/obr/internal/osgi/Activator.java
@@ -100,6 +100,7 @@ public class Activator extends BaseActivator {
         urlSynchronizer.setObrService(repositoryAdmin);
         urlSynchronizer.setClusterManager(clusterManager);
         urlSynchronizer.setGroupManager(groupManager);
+        urlSynchronizer.setEventProducer(eventProducer);
         urlSynchronizer.setConfigurationAdmin(configurationAdmin);
         urlSynchronizer.init();
         props = new Hashtable();

Reply via email to