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();
