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/04/30 10:59:45 UTC
svn commit: r1332127 - in /karaf/cellar/trunk:
bundle/src/main/java/org/apache/karaf/cellar/bundle/
bundle/src/main/resources/OSGI-INF/blueprint/
core/src/main/java/org/apache/karaf/cellar/core/
hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/
Author: jbonofre
Date: Mon Apr 30 08:59:44 2012
New Revision: 1332127
URL: http://svn.apache.org/viewvc?rev=1332127&view=rev
Log:
[KARAF-1426] Handler checks if the cluster events is for the local node/group
Modified:
karaf/cellar/trunk/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleEventHandler.java
karaf/cellar/trunk/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleSynchronizer.java
karaf/cellar/trunk/bundle/src/main/java/org/apache/karaf/cellar/bundle/LocalBundleListener.java
karaf/cellar/trunk/bundle/src/main/resources/OSGI-INF/blueprint/blueprint.xml
karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/GroupManager.java
karaf/cellar/trunk/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/HazelcastGroupManager.java
Modified: karaf/cellar/trunk/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleEventHandler.java
URL: http://svn.apache.org/viewvc/karaf/cellar/trunk/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleEventHandler.java?rev=1332127&r1=1332126&r2=1332127&view=diff
==============================================================================
--- karaf/cellar/trunk/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleEventHandler.java (original)
+++ karaf/cellar/trunk/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleEventHandler.java Mon Apr 30 08:59:44 2012
@@ -42,10 +42,18 @@ public class BundleEventHandler extends
* @param event
*/
public void handle(RemoteBundleEvent event) {
+ // check if the handler is ON
if (eventSwitch.getStatus().equals(SwitchStatus.OFF)) {
LOGGER.warn("CELLAR BUNDLE: {} switch is OFF, cluster event is not handled", SWITCH_ID);
return;
}
+
+ // check if the group is local
+ if (!groupManager.isLocalGroup(event.getSourceGroup().getName())) {
+ LOGGER.warn("CELLAR BUNDLE: node is not part of the event cluster group");
+ return;
+ }
+
try {
//Check if the pid is marked as local.
if (isAllowed(event.getSourceGroup(), Constants.CATEGORY, event.getLocation(), EventType.INBOUND)) {
Modified: karaf/cellar/trunk/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleSynchronizer.java
URL: http://svn.apache.org/viewvc/karaf/cellar/trunk/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleSynchronizer.java?rev=1332127&r1=1332126&r2=1332127&view=diff
==============================================================================
--- karaf/cellar/trunk/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleSynchronizer.java (original)
+++ karaf/cellar/trunk/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleSynchronizer.java Mon Apr 30 08:59:44 2012
@@ -16,6 +16,7 @@ package org.apache.karaf.cellar.bundle;
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.control.SwitchStatus;
import org.apache.karaf.cellar.core.event.EventProducer;
import org.apache.karaf.cellar.core.event.EventType;
import org.osgi.framework.Bundle;
@@ -37,7 +38,7 @@ public class BundleSynchronizer extends
private static final transient Logger LOGGER = LoggerFactory.getLogger(BundleSynchronizer.class);
- private List<EventProducer> producerList;
+ private EventProducer eventProducer;
/**
* Registration method
@@ -62,14 +63,14 @@ public class BundleSynchronizer extends
}
/**
- * Reads the configuration from the remote map.
+ * Get the bundle to install from the distributed map
*/
public void pull(Group group) {
if (group != null) {
String groupName = group.getName();
- Map<String, BundleState> bundleTable = clusterManager.getMap(Constants.BUNDLE_MAP + Configurations.SEPARATOR + groupName);
+ Map<String, BundleState> bundleDistributedMap = clusterManager.getMap(Constants.BUNDLE_MAP + Configurations.SEPARATOR + groupName);
- for (Map.Entry<String,BundleState> entry : bundleTable.entrySet()) {
+ for (Map.Entry<String, BundleState> entry : bundleDistributedMap.entrySet()) {
String id = entry.getKey();
BundleState state = entry.getValue();
@@ -91,7 +92,8 @@ public class BundleSynchronizer extends
} catch (BundleException e) {
LOGGER.error("CELLAR BUNDLE: error while pulling bundle", e);
}
- } LOGGER.warn("CELLAR BUNDLE: bundle {} is marked as BLOCKED INBOUND", bundleLocation);
+ }
+ LOGGER.warn("CELLAR BUNDLE: bundle {} is marked as BLOCKED INBOUND", bundleLocation);
}
}
}
@@ -99,10 +101,16 @@ public class BundleSynchronizer extends
}
/**
- * Publishes local configuration to the cluster.
+ * Publishes local bundle to the cluster.
*/
public void push(Group group) {
+ // check if the producer is ON
+ if (eventProducer.getSwitch().getStatus().equals(SwitchStatus.OFF)) {
+ LOGGER.warn("CELLAR BUNDLE: cluster event producer is OFF for this node");
+ return;
+ }
+
if (group != null) {
String groupName = group.getName();
Map<String, BundleState> bundleTable = clusterManager.getMap(Constants.BUNDLE_MAP + Configurations.SEPARATOR + groupName);
@@ -127,17 +135,13 @@ public class BundleSynchronizer extends
BundleState existingState = bundleTable.get(id);
RemoteBundleEvent event = null;
if (existingState == null) {
+ // update the distributed map
event = new RemoteBundleEvent(symbolicName, version, bundleLocation, status);
- // update the cluster map
bundleTable.put(id, bundleState);
}
// broadcast the event
- if (producerList != null && !producerList.isEmpty() && event != null) {
- for (EventProducer producer : producerList) {
- producer.produce(event);
- }
- }
+ eventProducer.produce(event);
} else LOGGER.warn("CELLAR BUNDLE: bundle {} is marked as BLOCKED OUTBOUND", bundleLocation);
}
}
@@ -162,12 +166,12 @@ public class BundleSynchronizer extends
return result;
}
- public List<EventProducer> getProducerList() {
- return producerList;
+ public EventProducer getEventProducer() {
+ return eventProducer;
}
- public void setProducerList(List<EventProducer> producerList) {
- this.producerList = producerList;
+ public void setEventProducer(EventProducer eventProducer) {
+ this.eventProducer = eventProducer;
}
}
Modified: karaf/cellar/trunk/bundle/src/main/java/org/apache/karaf/cellar/bundle/LocalBundleListener.java
URL: http://svn.apache.org/viewvc/karaf/cellar/trunk/bundle/src/main/java/org/apache/karaf/cellar/bundle/LocalBundleListener.java?rev=1332127&r1=1332126&r2=1332127&view=diff
==============================================================================
--- karaf/cellar/trunk/bundle/src/main/java/org/apache/karaf/cellar/bundle/LocalBundleListener.java (original)
+++ karaf/cellar/trunk/bundle/src/main/java/org/apache/karaf/cellar/bundle/LocalBundleListener.java Mon Apr 30 08:59:44 2012
@@ -16,6 +16,7 @@ package org.apache.karaf.cellar.bundle;
import org.apache.karaf.cellar.core.Configurations;
import org.apache.karaf.cellar.core.Group;
import org.apache.karaf.cellar.core.Node;
+import org.apache.karaf.cellar.core.control.SwitchStatus;
import org.apache.karaf.cellar.core.event.EventProducer;
import org.apache.karaf.cellar.core.event.EventType;
import org.osgi.framework.BundleEvent;
@@ -31,9 +32,7 @@ public class LocalBundleListener extends
private static final transient Logger LOGGER = LoggerFactory.getLogger(LocalBundleListener.class);
- private List<EventProducer> producerList;
-
- private Node node;
+ private EventProducer eventProducer;
/**
* Process {@link BundleEvent}s.
@@ -41,50 +40,48 @@ public class LocalBundleListener extends
* @param event
*/
public void bundleChanged(BundleEvent event) {
- try {
- if (event != null && event.getBundle() != null) {
- Set<Group> groups = null;
- try {
- groups = groupManager.listLocalGroups();
- } catch (Exception ex) {
- LOGGER.warn("Failed to list local groups. Is Cellar uninstalling ?");
- }
- if (groups != null && !groups.isEmpty()) {
- for (Group group : groups) {
+ // check if the producer is ON
+ if (eventProducer.getSwitch().getStatus().equals(SwitchStatus.OFF)) {
+ LOGGER.warn("CELLAR BUNDLE: cluster event producer is OFF for this node");
+ return;
+ }
- String symbolicName = event.getBundle().getSymbolicName();
- String version = event.getBundle().getVersion().toString();
- String bundleLocation = event.getBundle().getLocation();
- int type = event.getType();
-
- if (isAllowed(group, Constants.CATEGORY, bundleLocation, EventType.OUTBOUND)) {
- RemoteBundleEvent remoteBundleEvent = new RemoteBundleEvent(symbolicName, version, bundleLocation, type);
- remoteBundleEvent.setSourceGroup(group);
- remoteBundleEvent.setSourceNode(node);
-
- // update the cluster map
- Map<String, BundleState> bundles = clusterManager.getMap(Constants.BUNDLE_MAP + Configurations.SEPARATOR + group.getName());
- BundleState state = bundles.get(symbolicName + "/" + version);
- if (state == null) {
- state = new BundleState();
- }
- state.setStatus(type);
- state.setLocation(event.getBundle().getLocation());
- bundles.put(symbolicName + "/" + version, state);
-
- // broadcast the cluster event
- if (producerList != null && !producerList.isEmpty()) {
- for (EventProducer producer : producerList) {
- producer.produce(remoteBundleEvent);
- }
- }
- } else LOGGER.debug("CELLAR BUNDLE: bundle {} is marked as BLOCKED OUTBOUND", symbolicName);
- }
+ if (event != null && event.getBundle() != null) {
+ Set<Group> groups = null;
+ try {
+ groups = groupManager.listLocalGroups();
+ } catch (Exception ex) {
+ LOGGER.warn("Failed to list local groups. Is Cellar uninstalling ?");
+ }
+
+ if (groups != null && !groups.isEmpty()) {
+ for (Group group : groups) {
+
+ String symbolicName = event.getBundle().getSymbolicName();
+ String version = event.getBundle().getVersion().toString();
+ String bundleLocation = event.getBundle().getLocation();
+ int type = event.getType();
+
+ if (isAllowed(group, Constants.CATEGORY, bundleLocation, EventType.OUTBOUND)) {
+ RemoteBundleEvent remoteBundleEvent = new RemoteBundleEvent(symbolicName, version, bundleLocation, type);
+ remoteBundleEvent.setSourceGroup(group);
+
+ // update the cluster map
+ Map<String, BundleState> bundles = clusterManager.getMap(Constants.BUNDLE_MAP + Configurations.SEPARATOR + group.getName());
+ BundleState state = bundles.get(symbolicName + "/" + version);
+ if (state == null) {
+ state = new BundleState();
+ }
+ state.setStatus(type);
+ state.setLocation(event.getBundle().getLocation());
+ bundles.put(symbolicName + "/" + version, state);
+
+ // broadcast the cluster event
+ eventProducer.produce(remoteBundleEvent);
+ } else LOGGER.debug("CELLAR BUNDLE: bundle {} is marked as BLOCKED OUTBOUND", symbolicName);
}
}
- } catch (Exception ex) {
- LOGGER.error("CELLAR BUNDLE: error handling bundle {} event", event.getBundle().getSymbolicName(), ex);
}
}
@@ -92,9 +89,6 @@ public class LocalBundleListener extends
* Initialization Method.
*/
public void init() {
- if (clusterManager != null) {
- node = clusterManager.getNode();
- }
getBundleContext().addBundleListener(this);
}
@@ -105,12 +99,12 @@ public class LocalBundleListener extends
}
- public List<EventProducer> getProducerList() {
- return producerList;
+ public EventProducer getEventProducer() {
+ return eventProducer;
}
- public void setProducerList(List<EventProducer> producerList) {
- this.producerList = producerList;
+ public void setEventProducer(EventProducer eventProducer) {
+ this.eventProducer = eventProducer;
}
}
Modified: karaf/cellar/trunk/bundle/src/main/resources/OSGI-INF/blueprint/blueprint.xml
URL: http://svn.apache.org/viewvc/karaf/cellar/trunk/bundle/src/main/resources/OSGI-INF/blueprint/blueprint.xml?rev=1332127&r1=1332126&r2=1332127&view=diff
==============================================================================
--- karaf/cellar/trunk/bundle/src/main/resources/OSGI-INF/blueprint/blueprint.xml (original)
+++ karaf/cellar/trunk/bundle/src/main/resources/OSGI-INF/blueprint/blueprint.xml Mon Apr 30 08:59:44 2012
@@ -18,11 +18,11 @@
<!-- Cluster Configuration Listener -->
<bean id="bundleListener" class="org.apache.karaf.cellar.bundle.LocalBundleListener" init-method="init"
destroy-method="destroy">
- <property name="producerList" ref="groupEventProducers"/>
<property name="clusterManager" ref="clusterManager"/>
<property name="groupManager" ref="groupManager"/>
<property name="configurationAdmin" ref="configurationAdmin"/>
<property name="bundleContext" ref="blueprintBundleContext"/>
+ <property name="eventProducer" ref="eventProducer"/>
</bean>
<!-- Configuration Synchronizer -->
@@ -31,8 +31,8 @@
<property name="configurationAdmin" ref="configurationAdmin"/>
<property name="groupManager" ref="groupManager"/>
<property name="clusterManager" ref="clusterManager"/>
- <property name="producerList" ref="groupEventProducers"/>
<property name="bundleContext" ref="blueprintBundleContext"/>
+ <property name="eventProducer" ref="eventProducer"/>
</bean>
<bean id="eventHandler" class="org.apache.karaf.cellar.bundle.BundleEventHandler"
@@ -40,6 +40,7 @@
<property name="configurationAdmin" ref="configurationAdmin"/>
<property name="clusterManager" ref="clusterManager"/>
<property name="bundleContext" ref="blueprintBundleContext"/>
+ <property name="groupManager" ref="groupManager"/>
</bean>
<!-- OSGi Services & References -->
@@ -53,9 +54,6 @@
<reference id="clusterManager" interface="org.apache.karaf.cellar.core.ClusterManager"/>
<reference id="groupManager" interface="org.apache.karaf.cellar.core.GroupManager"/>
<reference id="configurationAdmin" interface="org.osgi.service.cm.ConfigurationAdmin"/>
- <reference id="eventTransportFactory" interface="org.apache.karaf.cellar.core.event.EventTransportFactory"/>
<reference id="eventProducer" interface="org.apache.karaf.cellar.core.event.EventProducer"/>
- <reference-list id="groupEventProducers" member-type="service-object"
- interface="org.apache.karaf.cellar.core.event.EventProducer" filter="(type=group)"/>
</blueprint>
Modified: karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/GroupManager.java
URL: http://svn.apache.org/viewvc/karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/GroupManager.java?rev=1332127&r1=1332126&r2=1332127&view=diff
==============================================================================
--- karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/GroupManager.java (original)
+++ karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/GroupManager.java Mon Apr 30 08:59:44 2012
@@ -66,6 +66,14 @@ public interface GroupManager {
public Set<Group> listLocalGroups();
/**
+ * Check if the local node is part of the given group.
+ *
+ * @param groupName the group name.
+ * @return true if the local node is part of the group, false else.
+ */
+ public boolean isLocalGroup(String groupName);
+
+ /**
* Returns the {@link Group}s of the specified {@link Node}.
*
* @return
Modified: karaf/cellar/trunk/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/HazelcastGroupManager.java
URL: http://svn.apache.org/viewvc/karaf/cellar/trunk/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/HazelcastGroupManager.java?rev=1332127&r1=1332126&r2=1332127&view=diff
==============================================================================
--- karaf/cellar/trunk/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/HazelcastGroupManager.java (original)
+++ karaf/cellar/trunk/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/HazelcastGroupManager.java Mon Apr 30 08:59:44 2012
@@ -168,6 +168,17 @@ public class HazelcastGroupManager imple
}
@Override
+ public boolean isLocalGroup(String groupName) {
+ Set<Group> localGroups = this.listLocalGroups();
+ for (Group localGroup : localGroups) {
+ if (localGroup.getName().equals(groupName)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
public Set<Group> listAllGroups() {
ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader();
try {