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 2015/09/13 17:51:25 UTC
karaf-cellar git commit: [KARAF-3981] Improve OBR synchronizer
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é <jb...@apache.org>
Authored: Sun Sep 13 17:51:01 2015 +0200
Committer: Jean-Baptiste Onofré <jb...@apache.org>
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();