Further simplified the store & connection manager relationship.
Showing
16 changed files
with
129 additions
and
250 deletions
| 1 | -package org.onlab.onos.ccc; | ||
| 2 | - | ||
| 3 | -import com.fasterxml.jackson.core.JsonEncoding; | ||
| 4 | -import com.fasterxml.jackson.core.JsonFactory; | ||
| 5 | -import com.fasterxml.jackson.databind.JsonNode; | ||
| 6 | -import com.fasterxml.jackson.databind.ObjectMapper; | ||
| 7 | -import com.fasterxml.jackson.databind.node.ArrayNode; | ||
| 8 | -import com.fasterxml.jackson.databind.node.ObjectNode; | ||
| 9 | -import org.onlab.onos.cluster.DefaultControllerNode; | ||
| 10 | -import org.onlab.onos.cluster.NodeId; | ||
| 11 | -import org.onlab.packet.IpPrefix; | ||
| 12 | - | ||
| 13 | -import java.io.File; | ||
| 14 | -import java.io.IOException; | ||
| 15 | -import java.util.HashSet; | ||
| 16 | -import java.util.Iterator; | ||
| 17 | -import java.util.Set; | ||
| 18 | - | ||
| 19 | -/** | ||
| 20 | - * Allows for reading and writing cluster definition as a JSON file. | ||
| 21 | - */ | ||
| 22 | -public class ClusterDefinitionStore { | ||
| 23 | - | ||
| 24 | - private final File file; | ||
| 25 | - | ||
| 26 | - /** | ||
| 27 | - * Creates a reader/writer of the cluster definition file. | ||
| 28 | - * | ||
| 29 | - * @param filePath location of the definition file | ||
| 30 | - */ | ||
| 31 | - public ClusterDefinitionStore(String filePath) { | ||
| 32 | - file = new File(filePath); | ||
| 33 | - } | ||
| 34 | - | ||
| 35 | - /** | ||
| 36 | - * Returns set of the controller nodes, including self. | ||
| 37 | - * | ||
| 38 | - * @return set of controller nodes | ||
| 39 | - */ | ||
| 40 | - public Set<DefaultControllerNode> read() throws IOException { | ||
| 41 | - Set<DefaultControllerNode> nodes = new HashSet<>(); | ||
| 42 | - ObjectMapper mapper = new ObjectMapper(); | ||
| 43 | - ObjectNode clusterNodeDef = (ObjectNode) mapper.readTree(file); | ||
| 44 | - Iterator<JsonNode> it = ((ArrayNode) clusterNodeDef.get("nodes")).elements(); | ||
| 45 | - while (it.hasNext()) { | ||
| 46 | - ObjectNode nodeDef = (ObjectNode) it.next(); | ||
| 47 | - nodes.add(new DefaultControllerNode(new NodeId(nodeDef.get("id").asText()), | ||
| 48 | - IpPrefix.valueOf(nodeDef.get("ip").asText()), | ||
| 49 | - nodeDef.get("tcpPort").asInt(9876))); | ||
| 50 | - } | ||
| 51 | - return nodes; | ||
| 52 | - } | ||
| 53 | - | ||
| 54 | - /** | ||
| 55 | - * Writes the given set of the controller nodes. | ||
| 56 | - * | ||
| 57 | - * @param nodes set of controller nodes | ||
| 58 | - */ | ||
| 59 | - public void write(Set<DefaultControllerNode> nodes) throws IOException { | ||
| 60 | - ObjectMapper mapper = new ObjectMapper(); | ||
| 61 | - ObjectNode clusterNodeDef = mapper.createObjectNode(); | ||
| 62 | - ArrayNode nodeDefs = mapper.createArrayNode(); | ||
| 63 | - clusterNodeDef.set("nodes", nodeDefs); | ||
| 64 | - for (DefaultControllerNode node : nodes) { | ||
| 65 | - ObjectNode nodeDef = mapper.createObjectNode(); | ||
| 66 | - nodeDef.put("id", node.id().toString()) | ||
| 67 | - .put("ip", node.ip().toString()) | ||
| 68 | - .put("tcpPort", node.tcpPort()); | ||
| 69 | - nodeDefs.add(nodeDef); | ||
| 70 | - } | ||
| 71 | - mapper.writeTree(new JsonFactory().createGenerator(file, JsonEncoding.UTF8), | ||
| 72 | - clusterNodeDef); | ||
| 73 | - } | ||
| 74 | - | ||
| 75 | -} |
| 1 | +package org.onlab.onos.store.cluster.impl; | ||
| 2 | + | ||
| 3 | +import org.onlab.onos.cluster.DefaultControllerNode; | ||
| 4 | + | ||
| 5 | +/** | ||
| 6 | + * Service for administering communications manager. | ||
| 7 | + */ | ||
| 8 | +public interface ClusterCommunicationAdminService { | ||
| 9 | + | ||
| 10 | + /** | ||
| 11 | + * Adds the node to the list of monitored nodes. | ||
| 12 | + * | ||
| 13 | + * @param node node to be added | ||
| 14 | + */ | ||
| 15 | + void addNode(DefaultControllerNode node); | ||
| 16 | + | ||
| 17 | + /** | ||
| 18 | + * Removes the node from the list of monitored nodes. | ||
| 19 | + * | ||
| 20 | + * @param node node to be removed | ||
| 21 | + */ | ||
| 22 | + void removeNode(DefaultControllerNode node); | ||
| 23 | + | ||
| 24 | + /** | ||
| 25 | + * Starts-up the communications engine. | ||
| 26 | + * | ||
| 27 | + * @param localNode local controller node | ||
| 28 | + * @param delegate nodes delegate | ||
| 29 | + */ | ||
| 30 | + void startUp(DefaultControllerNode localNode, ClusterNodesDelegate delegate); | ||
| 31 | + | ||
| 32 | +} |
This diff is collapsed. Click to expand it.
| ... | @@ -23,12 +23,12 @@ public class ClusterConnectionListener extends AcceptorLoop { | ... | @@ -23,12 +23,12 @@ public class ClusterConnectionListener extends AcceptorLoop { |
| 23 | private static final int SO_SEND_BUFFER_SIZE = COMM_BUFFER_SIZE; | 23 | private static final int SO_SEND_BUFFER_SIZE = COMM_BUFFER_SIZE; |
| 24 | private static final int SO_RCV_BUFFER_SIZE = COMM_BUFFER_SIZE; | 24 | private static final int SO_RCV_BUFFER_SIZE = COMM_BUFFER_SIZE; |
| 25 | 25 | ||
| 26 | - private final WorkerFinder workerFinder; | 26 | + private final ClusterCommunicationManager manager; |
| 27 | 27 | ||
| 28 | - ClusterConnectionListener(IpPrefix ip, int tcpPort, | 28 | + ClusterConnectionListener(ClusterCommunicationManager manager, |
| 29 | - WorkerFinder workerFinder) throws IOException { | 29 | + IpPrefix ip, int tcpPort) throws IOException { |
| 30 | super(SELECT_TIMEOUT, new InetSocketAddress(getByAddress(ip.toOctets()), tcpPort)); | 30 | super(SELECT_TIMEOUT, new InetSocketAddress(getByAddress(ip.toOctets()), tcpPort)); |
| 31 | - this.workerFinder = workerFinder; | 31 | + this.manager = manager; |
| 32 | } | 32 | } |
| 33 | 33 | ||
| 34 | @Override | 34 | @Override |
| ... | @@ -41,7 +41,7 @@ public class ClusterConnectionListener extends AcceptorLoop { | ... | @@ -41,7 +41,7 @@ public class ClusterConnectionListener extends AcceptorLoop { |
| 41 | so.setReceiveBufferSize(SO_RCV_BUFFER_SIZE); | 41 | so.setReceiveBufferSize(SO_RCV_BUFFER_SIZE); |
| 42 | so.setSendBufferSize(SO_SEND_BUFFER_SIZE); | 42 | so.setSendBufferSize(SO_SEND_BUFFER_SIZE); |
| 43 | 43 | ||
| 44 | - workerFinder.findWorker().acceptStream(sc); | 44 | + manager.findWorker().acceptStream(sc); |
| 45 | } | 45 | } |
| 46 | 46 | ||
| 47 | } | 47 | } | ... | ... |
| ... | @@ -3,8 +3,10 @@ package org.onlab.onos.store.cluster.impl; | ... | @@ -3,8 +3,10 @@ package org.onlab.onos.store.cluster.impl; |
| 3 | import org.onlab.nio.IOLoop; | 3 | import org.onlab.nio.IOLoop; |
| 4 | import org.onlab.nio.MessageStream; | 4 | import org.onlab.nio.MessageStream; |
| 5 | import org.onlab.onos.cluster.DefaultControllerNode; | 5 | import org.onlab.onos.cluster.DefaultControllerNode; |
| 6 | +import org.onlab.onos.cluster.NodeId; | ||
| 6 | import org.onlab.onos.store.cluster.messaging.ClusterMessage; | 7 | import org.onlab.onos.store.cluster.messaging.ClusterMessage; |
| 7 | import org.onlab.onos.store.cluster.messaging.ClusterMessageStream; | 8 | import org.onlab.onos.store.cluster.messaging.ClusterMessageStream; |
| 9 | +import org.onlab.onos.store.cluster.messaging.HelloMessage; | ||
| 8 | import org.onlab.onos.store.cluster.messaging.SerializationService; | 10 | import org.onlab.onos.store.cluster.messaging.SerializationService; |
| 9 | import org.slf4j.Logger; | 11 | import org.slf4j.Logger; |
| 10 | import org.slf4j.LoggerFactory; | 12 | import org.slf4j.LoggerFactory; |
| ... | @@ -29,27 +31,23 @@ public class ClusterIOWorker extends | ... | @@ -29,27 +31,23 @@ public class ClusterIOWorker extends |
| 29 | 31 | ||
| 30 | private static final long SELECT_TIMEOUT = 50; | 32 | private static final long SELECT_TIMEOUT = 50; |
| 31 | 33 | ||
| 32 | - private final ConnectionManager connectionManager; | 34 | + private final ClusterCommunicationManager manager; |
| 33 | - private final CommunicationsDelegate commsDelegate; | ||
| 34 | private final SerializationService serializationService; | 35 | private final SerializationService serializationService; |
| 35 | private final ClusterMessage helloMessage; | 36 | private final ClusterMessage helloMessage; |
| 36 | 37 | ||
| 37 | /** | 38 | /** |
| 38 | * Creates a new cluster IO worker. | 39 | * Creates a new cluster IO worker. |
| 39 | * | 40 | * |
| 40 | - * @param connectionManager parent connection manager | 41 | + * @param manager parent comms manager |
| 41 | - * @param commsDelegate communications delegate for dispatching | ||
| 42 | * @param serializationService serialization service for encode/decode | 42 | * @param serializationService serialization service for encode/decode |
| 43 | * @param helloMessage hello message for greeting peers | 43 | * @param helloMessage hello message for greeting peers |
| 44 | * @throws IOException if errors occur during IO loop ignition | 44 | * @throws IOException if errors occur during IO loop ignition |
| 45 | */ | 45 | */ |
| 46 | - ClusterIOWorker(ConnectionManager connectionManager, | 46 | + ClusterIOWorker(ClusterCommunicationManager manager, |
| 47 | - CommunicationsDelegate commsDelegate, | ||
| 48 | SerializationService serializationService, | 47 | SerializationService serializationService, |
| 49 | ClusterMessage helloMessage) throws IOException { | 48 | ClusterMessage helloMessage) throws IOException { |
| 50 | super(SELECT_TIMEOUT); | 49 | super(SELECT_TIMEOUT); |
| 51 | - this.connectionManager = connectionManager; | 50 | + this.manager = manager; |
| 52 | - this.commsDelegate = commsDelegate; | ||
| 53 | this.serializationService = serializationService; | 51 | this.serializationService = serializationService; |
| 54 | this.helloMessage = helloMessage; | 52 | this.helloMessage = helloMessage; |
| 55 | } | 53 | } |
| ... | @@ -61,11 +59,27 @@ public class ClusterIOWorker extends | ... | @@ -61,11 +59,27 @@ public class ClusterIOWorker extends |
| 61 | 59 | ||
| 62 | @Override | 60 | @Override |
| 63 | protected void processMessages(List<ClusterMessage> messages, MessageStream<ClusterMessage> stream) { | 61 | protected void processMessages(List<ClusterMessage> messages, MessageStream<ClusterMessage> stream) { |
| 62 | + NodeId nodeId = getNodeId(messages, (ClusterMessageStream) stream); | ||
| 64 | for (ClusterMessage message : messages) { | 63 | for (ClusterMessage message : messages) { |
| 65 | - commsDelegate.dispatch(message); | 64 | + manager.dispatch(message, nodeId); |
| 66 | } | 65 | } |
| 67 | } | 66 | } |
| 68 | 67 | ||
| 68 | + // Retrieves the node from the stream. If one is not bound, it attempts | ||
| 69 | + // to bind it using the knowledge that the first message must be a hello. | ||
| 70 | + private NodeId getNodeId(List<ClusterMessage> messages, ClusterMessageStream stream) { | ||
| 71 | + DefaultControllerNode node = stream.node(); | ||
| 72 | + if (node == null && !messages.isEmpty()) { | ||
| 73 | + ClusterMessage firstMessage = messages.get(0); | ||
| 74 | + if (firstMessage instanceof HelloMessage) { | ||
| 75 | + HelloMessage hello = (HelloMessage) firstMessage; | ||
| 76 | + node = manager.addNodeStream(hello.nodeId(), hello.ipAddress(), | ||
| 77 | + hello.tcpPort(), stream); | ||
| 78 | + } | ||
| 79 | + } | ||
| 80 | + return node != null ? node.id() : null; | ||
| 81 | + } | ||
| 82 | + | ||
| 69 | @Override | 83 | @Override |
| 70 | public ClusterMessageStream acceptStream(SocketChannel channel) { | 84 | public ClusterMessageStream acceptStream(SocketChannel channel) { |
| 71 | ClusterMessageStream stream = super.acceptStream(channel); | 85 | ClusterMessageStream stream = super.acceptStream(channel); |
| ... | @@ -99,7 +113,7 @@ public class ClusterIOWorker extends | ... | @@ -99,7 +113,7 @@ public class ClusterIOWorker extends |
| 99 | DefaultControllerNode node = ((ClusterMessageStream) stream).node(); | 113 | DefaultControllerNode node = ((ClusterMessageStream) stream).node(); |
| 100 | if (node != null) { | 114 | if (node != null) { |
| 101 | log.info("Closed connection to node {}", node.id()); | 115 | log.info("Closed connection to node {}", node.id()); |
| 102 | - connectionManager.removeNodeStream(node); | 116 | + manager.removeNodeStream(node); |
| 103 | } | 117 | } |
| 104 | super.removeStream(stream); | 118 | super.removeStream(stream); |
| 105 | } | 119 | } | ... | ... |
| 1 | package org.onlab.onos.store.cluster.impl; | 1 | package org.onlab.onos.store.cluster.impl; |
| 2 | 2 | ||
| 3 | import org.onlab.onos.cluster.DefaultControllerNode; | 3 | import org.onlab.onos.cluster.DefaultControllerNode; |
| 4 | +import org.onlab.onos.cluster.NodeId; | ||
| 5 | +import org.onlab.packet.IpPrefix; | ||
| 4 | 6 | ||
| 5 | /** | 7 | /** |
| 6 | * Simple back interface through which connection manager can interact with | 8 | * Simple back interface through which connection manager can interact with |
| ... | @@ -9,17 +11,20 @@ import org.onlab.onos.cluster.DefaultControllerNode; | ... | @@ -9,17 +11,20 @@ import org.onlab.onos.cluster.DefaultControllerNode; |
| 9 | public interface ClusterNodesDelegate { | 11 | public interface ClusterNodesDelegate { |
| 10 | 12 | ||
| 11 | /** | 13 | /** |
| 12 | - * Notifies about a new cluster node being detected. | 14 | + * Notifies about cluster node coming online. |
| 13 | * | 15 | * |
| 14 | - * @param node newly detected cluster node | 16 | + * @param nodeId newly detected cluster node id |
| 17 | + * @param ip node IP listen address | ||
| 18 | + * @param tcpPort node TCP listen port | ||
| 19 | + * @return the controller node | ||
| 15 | */ | 20 | */ |
| 16 | - void nodeDetected(DefaultControllerNode node); | 21 | + DefaultControllerNode nodeDetected(NodeId nodeId, IpPrefix ip, int tcpPort); |
| 17 | 22 | ||
| 18 | /** | 23 | /** |
| 19 | * Notifies about cluster node going offline. | 24 | * Notifies about cluster node going offline. |
| 20 | * | 25 | * |
| 21 | - * @param node cluster node that vanished | 26 | + * @param nodeId identifier of the cluster node that vanished |
| 22 | */ | 27 | */ |
| 23 | - void nodeVanished(DefaultControllerNode node); | 28 | + void nodeVanished(NodeId nodeId); |
| 24 | 29 | ||
| 25 | } | 30 | } | ... | ... |
core/store/dist/src/main/java/org/onlab/onos/store/cluster/impl/CommunicationsDelegate.java
deleted
100644 → 0
| 1 | -package org.onlab.onos.store.cluster.impl; | ||
| 2 | - | ||
| 3 | -import org.onlab.onos.store.cluster.messaging.ClusterMessage; | ||
| 4 | - | ||
| 5 | -/** | ||
| 6 | - * Simple back interface for interacting with the communications service. | ||
| 7 | - */ | ||
| 8 | -public interface CommunicationsDelegate { | ||
| 9 | - | ||
| 10 | - /** | ||
| 11 | - * Dispatches the specified message to all registered subscribers. | ||
| 12 | - * | ||
| 13 | - * @param message message to be dispatched | ||
| 14 | - */ | ||
| 15 | - void dispatch(ClusterMessage message); | ||
| 16 | - | ||
| 17 | - /** | ||
| 18 | - * Sets the sender. | ||
| 19 | - * | ||
| 20 | - * @param messageSender message sender | ||
| 21 | - */ | ||
| 22 | - void setSender(MessageSender messageSender); | ||
| 23 | - | ||
| 24 | -} |
| ... | @@ -14,7 +14,6 @@ import org.onlab.onos.cluster.ControllerNode; | ... | @@ -14,7 +14,6 @@ import org.onlab.onos.cluster.ControllerNode; |
| 14 | import org.onlab.onos.cluster.DefaultControllerNode; | 14 | import org.onlab.onos.cluster.DefaultControllerNode; |
| 15 | import org.onlab.onos.cluster.NodeId; | 15 | import org.onlab.onos.cluster.NodeId; |
| 16 | import org.onlab.onos.store.AbstractStore; | 16 | import org.onlab.onos.store.AbstractStore; |
| 17 | -import org.onlab.onos.store.cluster.messaging.SerializationService; | ||
| 18 | import org.onlab.packet.IpPrefix; | 17 | import org.onlab.packet.IpPrefix; |
| 19 | import org.slf4j.Logger; | 18 | import org.slf4j.Logger; |
| 20 | import org.slf4j.LoggerFactory; | 19 | import org.slf4j.LoggerFactory; |
| ... | @@ -43,20 +42,20 @@ public class DistributedClusterStore | ... | @@ -43,20 +42,20 @@ public class DistributedClusterStore |
| 43 | private final Map<NodeId, State> states = new ConcurrentHashMap<>(); | 42 | private final Map<NodeId, State> states = new ConcurrentHashMap<>(); |
| 44 | 43 | ||
| 45 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 44 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
| 46 | - private CommunicationsDelegate commsDelegate; | 45 | + private ClusterCommunicationAdminService communicationAdminService; |
| 47 | - | ||
| 48 | - @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
| 49 | - private SerializationService serializationService; | ||
| 50 | 46 | ||
| 51 | private final ClusterNodesDelegate nodesDelegate = new InnerNodesDelegate(); | 47 | private final ClusterNodesDelegate nodesDelegate = new InnerNodesDelegate(); |
| 52 | - private ConnectionManager connectionManager; | ||
| 53 | 48 | ||
| 54 | @Activate | 49 | @Activate |
| 55 | public void activate() { | 50 | public void activate() { |
| 56 | loadClusterDefinition(); | 51 | loadClusterDefinition(); |
| 57 | establishSelfIdentity(); | 52 | establishSelfIdentity(); |
| 58 | - connectionManager = new ConnectionManager(localNode, nodesDelegate, | 53 | + |
| 59 | - commsDelegate, serializationService); | 54 | + // Start-up the comm service and prime it with the loaded nodes. |
| 55 | + communicationAdminService.startUp(localNode, nodesDelegate); | ||
| 56 | + for (DefaultControllerNode node : nodes.values()) { | ||
| 57 | + communicationAdminService.addNode(node); | ||
| 58 | + } | ||
| 60 | log.info("Started"); | 59 | log.info("Started"); |
| 61 | } | 60 | } |
| 62 | 61 | ||
| ... | @@ -92,8 +91,8 @@ public class DistributedClusterStore | ... | @@ -92,8 +91,8 @@ public class DistributedClusterStore |
| 92 | if (localNode == null) { | 91 | if (localNode == null) { |
| 93 | localNode = new DefaultControllerNode(new NodeId(ip.toString()), ip); | 92 | localNode = new DefaultControllerNode(new NodeId(ip.toString()), ip); |
| 94 | nodes.put(localNode.id(), localNode); | 93 | nodes.put(localNode.id(), localNode); |
| 95 | - states.put(localNode.id(), State.ACTIVE); | ||
| 96 | } | 94 | } |
| 95 | + states.put(localNode.id(), State.ACTIVE); | ||
| 97 | } | 96 | } |
| 98 | 97 | ||
| 99 | @Override | 98 | @Override |
| ... | @@ -122,7 +121,7 @@ public class DistributedClusterStore | ... | @@ -122,7 +121,7 @@ public class DistributedClusterStore |
| 122 | public ControllerNode addNode(NodeId nodeId, IpPrefix ip, int tcpPort) { | 121 | public ControllerNode addNode(NodeId nodeId, IpPrefix ip, int tcpPort) { |
| 123 | DefaultControllerNode node = new DefaultControllerNode(nodeId, ip, tcpPort); | 122 | DefaultControllerNode node = new DefaultControllerNode(nodeId, ip, tcpPort); |
| 124 | nodes.put(nodeId, node); | 123 | nodes.put(nodeId, node); |
| 125 | - connectionManager.addNode(node); | 124 | + communicationAdminService.addNode(node); |
| 126 | return node; | 125 | return node; |
| 127 | } | 126 | } |
| 128 | 127 | ||
| ... | @@ -130,21 +129,25 @@ public class DistributedClusterStore | ... | @@ -130,21 +129,25 @@ public class DistributedClusterStore |
| 130 | public void removeNode(NodeId nodeId) { | 129 | public void removeNode(NodeId nodeId) { |
| 131 | DefaultControllerNode node = nodes.remove(nodeId); | 130 | DefaultControllerNode node = nodes.remove(nodeId); |
| 132 | if (node != null) { | 131 | if (node != null) { |
| 133 | - connectionManager.removeNode(node); | 132 | + communicationAdminService.removeNode(node); |
| 134 | } | 133 | } |
| 135 | } | 134 | } |
| 136 | 135 | ||
| 137 | // Entity to handle back calls from the connection manager. | 136 | // Entity to handle back calls from the connection manager. |
| 138 | private class InnerNodesDelegate implements ClusterNodesDelegate { | 137 | private class InnerNodesDelegate implements ClusterNodesDelegate { |
| 139 | @Override | 138 | @Override |
| 140 | - public void nodeDetected(DefaultControllerNode node) { | 139 | + public DefaultControllerNode nodeDetected(NodeId nodeId, IpPrefix ip, int tcpPort) { |
| 141 | - nodes.put(node.id(), node); | 140 | + DefaultControllerNode node = nodes.get(nodeId); |
| 142 | - states.put(node.id(), State.ACTIVE); | 141 | + if (node == null) { |
| 142 | + node = (DefaultControllerNode) addNode(nodeId, ip, tcpPort); | ||
| 143 | + } | ||
| 144 | + states.put(nodeId, State.ACTIVE); | ||
| 145 | + return node; | ||
| 143 | } | 146 | } |
| 144 | - | ||
| 145 | @Override | 147 | @Override |
| 146 | - public void nodeVanished(DefaultControllerNode node) { | 148 | + public void nodeVanished(NodeId nodeId) { |
| 147 | - states.put(node.id(), State.INACTIVE); | 149 | + states.put(nodeId, State.INACTIVE); |
| 148 | } | 150 | } |
| 149 | } | 151 | } |
| 152 | + | ||
| 150 | } | 153 | } | ... | ... |
core/store/dist/src/main/java/org/onlab/onos/store/cluster/impl/MessageSender.java
deleted
100644 → 0
| 1 | -package org.onlab.onos.store.cluster.impl; | ||
| 2 | - | ||
| 3 | -import org.onlab.onos.cluster.NodeId; | ||
| 4 | -import org.onlab.onos.store.cluster.messaging.ClusterMessage; | ||
| 5 | - | ||
| 6 | -/** | ||
| 7 | - * Created by tom on 9/29/14. | ||
| 8 | - */ | ||
| 9 | -public interface MessageSender { | ||
| 10 | - | ||
| 11 | - /** | ||
| 12 | - * Sends the specified message to the given cluster node. | ||
| 13 | - * | ||
| 14 | - * @param nodeId node identifier | ||
| 15 | - * @param message mesage to send | ||
| 16 | - * @return true if the message was sent sucessfully; false if there is | ||
| 17 | - * no stream or if there was an error | ||
| 18 | - */ | ||
| 19 | - boolean send(NodeId nodeId, ClusterMessage message); | ||
| 20 | - | ||
| 21 | -} |
| ... | @@ -29,9 +29,9 @@ public class HelloMessage extends ClusterMessage { | ... | @@ -29,9 +29,9 @@ public class HelloMessage extends ClusterMessage { |
| 29 | */ | 29 | */ |
| 30 | public HelloMessage(NodeId nodeId, IpPrefix ipAddress, int tcpPort) { | 30 | public HelloMessage(NodeId nodeId, IpPrefix ipAddress, int tcpPort) { |
| 31 | super(MessageSubject.HELLO); | 31 | super(MessageSubject.HELLO); |
| 32 | - nodeId = nodeId; | 32 | + this.nodeId = nodeId; |
| 33 | - ipAddress = ipAddress; | 33 | + this.ipAddress = ipAddress; |
| 34 | - tcpPort = tcpPort; | 34 | + this.tcpPort = tcpPort; |
| 35 | } | 35 | } |
| 36 | 36 | ||
| 37 | /** | 37 | /** |
| ... | @@ -60,4 +60,5 @@ public class HelloMessage extends ClusterMessage { | ... | @@ -60,4 +60,5 @@ public class HelloMessage extends ClusterMessage { |
| 60 | public int tcpPort() { | 60 | public int tcpPort() { |
| 61 | return tcpPort; | 61 | return tcpPort; |
| 62 | } | 62 | } |
| 63 | + | ||
| 63 | } | 64 | } | ... | ... |
| 1 | package org.onlab.onos.store.cluster.messaging; | 1 | package org.onlab.onos.store.cluster.messaging; |
| 2 | 2 | ||
| 3 | +import org.onlab.onos.cluster.NodeId; | ||
| 4 | + | ||
| 3 | /** | 5 | /** |
| 4 | * Represents a message consumer. | 6 | * Represents a message consumer. |
| 5 | */ | 7 | */ |
| ... | @@ -8,8 +10,9 @@ public interface MessageSubscriber { | ... | @@ -8,8 +10,9 @@ public interface MessageSubscriber { |
| 8 | /** | 10 | /** |
| 9 | * Receives the specified cluster message. | 11 | * Receives the specified cluster message. |
| 10 | * | 12 | * |
| 11 | - * @param message message to be received | 13 | + * @param message message to be received |
| 14 | + * @param fromNodeId node from which the message was received | ||
| 12 | */ | 15 | */ |
| 13 | - void receive(ClusterMessage message); | 16 | + void receive(ClusterMessage message, NodeId fromNodeId); |
| 14 | 17 | ||
| 15 | } | 18 | } | ... | ... |
| ... | @@ -3,12 +3,12 @@ package org.onlab.onos.store.cluster.messaging; | ... | @@ -3,12 +3,12 @@ package org.onlab.onos.store.cluster.messaging; |
| 3 | import java.nio.ByteBuffer; | 3 | import java.nio.ByteBuffer; |
| 4 | 4 | ||
| 5 | /** | 5 | /** |
| 6 | - * Service for serializing/deserializing intra-cluster messages. | 6 | + * Service for encoding & decoding intra-cluster messages. |
| 7 | */ | 7 | */ |
| 8 | public interface SerializationService { | 8 | public interface SerializationService { |
| 9 | 9 | ||
| 10 | /** | 10 | /** |
| 11 | - * Decodes the specified byte buffer to obtain a message within. | 11 | + * Decodes the specified byte buffer to obtain the message within. |
| 12 | * | 12 | * |
| 13 | * @param buffer byte buffer with message(s) | 13 | * @param buffer byte buffer with message(s) |
| 14 | * @return parsed message | 14 | * @return parsed message | ... | ... |
| 1 | -package org.onlab.onos.store.cluster.messaging.impl; | ||
| 2 | - | ||
| 3 | -import com.google.common.collect.HashMultimap; | ||
| 4 | -import com.google.common.collect.ImmutableSet; | ||
| 5 | -import com.google.common.collect.Multimap; | ||
| 6 | -import org.apache.felix.scr.annotations.Component; | ||
| 7 | -import org.apache.felix.scr.annotations.Service; | ||
| 8 | -import org.onlab.onos.cluster.NodeId; | ||
| 9 | -import org.onlab.onos.store.cluster.impl.CommunicationsDelegate; | ||
| 10 | -import org.onlab.onos.store.cluster.impl.MessageSender; | ||
| 11 | -import org.onlab.onos.store.cluster.messaging.ClusterCommunicationService; | ||
| 12 | -import org.onlab.onos.store.cluster.messaging.ClusterMessage; | ||
| 13 | -import org.onlab.onos.store.cluster.messaging.MessageSubject; | ||
| 14 | -import org.onlab.onos.store.cluster.messaging.MessageSubscriber; | ||
| 15 | - | ||
| 16 | -import java.util.Set; | ||
| 17 | - | ||
| 18 | -/** | ||
| 19 | - * Implements the cluster communication services to use by other stores. | ||
| 20 | - */ | ||
| 21 | -@Component(immediate = true) | ||
| 22 | -@Service | ||
| 23 | -public class ClusterCommunicationManager | ||
| 24 | - implements ClusterCommunicationService, CommunicationsDelegate { | ||
| 25 | - | ||
| 26 | - // TODO: use something different that won't require synchronization | ||
| 27 | - private Multimap<MessageSubject, MessageSubscriber> subscribers = HashMultimap.create(); | ||
| 28 | - private MessageSender messageSender; | ||
| 29 | - | ||
| 30 | - @Override | ||
| 31 | - public boolean send(ClusterMessage message, NodeId toNodeId) { | ||
| 32 | - return messageSender.send(toNodeId, message); | ||
| 33 | - } | ||
| 34 | - | ||
| 35 | - @Override | ||
| 36 | - public synchronized void addSubscriber(MessageSubject subject, MessageSubscriber subscriber) { | ||
| 37 | - subscribers.put(subject, subscriber); | ||
| 38 | - } | ||
| 39 | - | ||
| 40 | - @Override | ||
| 41 | - public synchronized void removeSubscriber(MessageSubject subject, MessageSubscriber subscriber) { | ||
| 42 | - subscribers.remove(subject, subscriber); | ||
| 43 | - } | ||
| 44 | - | ||
| 45 | - @Override | ||
| 46 | - public Set<MessageSubscriber> getSubscribers(MessageSubject subject) { | ||
| 47 | - return ImmutableSet.copyOf(subscribers.get(subject)); | ||
| 48 | - } | ||
| 49 | - | ||
| 50 | - @Override | ||
| 51 | - public void dispatch(ClusterMessage message) { | ||
| 52 | - Set<MessageSubscriber> set = getSubscribers(message.subject()); | ||
| 53 | - if (set != null) { | ||
| 54 | - for (MessageSubscriber subscriber : set) { | ||
| 55 | - subscriber.receive(message); | ||
| 56 | - } | ||
| 57 | - } | ||
| 58 | - } | ||
| 59 | - | ||
| 60 | - @Override | ||
| 61 | - public void setSender(MessageSender messageSender) { | ||
| 62 | - this.messageSender = messageSender; | ||
| 63 | - } | ||
| 64 | -} |
| 1 | package org.onlab.onos.store.cluster.messaging.impl; | 1 | package org.onlab.onos.store.cluster.messaging.impl; |
| 2 | 2 | ||
| 3 | +import org.apache.felix.scr.annotations.Component; | ||
| 4 | +import org.apache.felix.scr.annotations.Service; | ||
| 5 | +import org.onlab.onos.cluster.NodeId; | ||
| 3 | import org.onlab.onos.store.cluster.messaging.ClusterMessage; | 6 | import org.onlab.onos.store.cluster.messaging.ClusterMessage; |
| 7 | +import org.onlab.onos.store.cluster.messaging.HelloMessage; | ||
| 4 | import org.onlab.onos.store.cluster.messaging.MessageSubject; | 8 | import org.onlab.onos.store.cluster.messaging.MessageSubject; |
| 5 | import org.onlab.onos.store.cluster.messaging.SerializationService; | 9 | import org.onlab.onos.store.cluster.messaging.SerializationService; |
| 10 | +import org.onlab.packet.IpPrefix; | ||
| 11 | +import org.slf4j.Logger; | ||
| 12 | +import org.slf4j.LoggerFactory; | ||
| 6 | 13 | ||
| 7 | import java.nio.ByteBuffer; | 14 | import java.nio.ByteBuffer; |
| 8 | 15 | ||
| ... | @@ -11,8 +18,12 @@ import static com.google.common.base.Preconditions.checkState; | ... | @@ -11,8 +18,12 @@ import static com.google.common.base.Preconditions.checkState; |
| 11 | /** | 18 | /** |
| 12 | * Factory for parsing messages sent between cluster members. | 19 | * Factory for parsing messages sent between cluster members. |
| 13 | */ | 20 | */ |
| 21 | +@Component(immediate = true) | ||
| 22 | +@Service | ||
| 14 | public class MessageSerializer implements SerializationService { | 23 | public class MessageSerializer implements SerializationService { |
| 15 | 24 | ||
| 25 | + private final Logger log = LoggerFactory.getLogger(getClass()); | ||
| 26 | + | ||
| 16 | private static final int METADATA_LENGTH = 16; // 8 + 4 + 4 | 27 | private static final int METADATA_LENGTH = 16; // 8 + 4 + 4 |
| 17 | private static final int LENGTH_OFFSET = 12; | 28 | private static final int LENGTH_OFFSET = 12; |
| 18 | 29 | ||
| ... | @@ -46,11 +57,12 @@ public class MessageSerializer implements SerializationService { | ... | @@ -46,11 +57,12 @@ public class MessageSerializer implements SerializationService { |
| 46 | buffer.get(data); | 57 | buffer.get(data); |
| 47 | 58 | ||
| 48 | // TODO: add deserialization hook here; for now this hack | 59 | // TODO: add deserialization hook here; for now this hack |
| 49 | - return null; // actually deserialize | 60 | + String[] fields = new String(data).split(":"); |
| 61 | + return new HelloMessage(new NodeId(fields[0]), IpPrefix.valueOf(fields[1]), Integer.parseInt(fields[2])); | ||
| 50 | 62 | ||
| 51 | } catch (Exception e) { | 63 | } catch (Exception e) { |
| 52 | // TODO: recover from exceptions by forwarding stream to next marker | 64 | // TODO: recover from exceptions by forwarding stream to next marker |
| 53 | - e.printStackTrace(); | 65 | + log.warn("Unable to decode message due to: " + e); |
| 54 | } | 66 | } |
| 55 | return null; | 67 | return null; |
| 56 | } | 68 | } |
| ... | @@ -58,11 +70,18 @@ public class MessageSerializer implements SerializationService { | ... | @@ -58,11 +70,18 @@ public class MessageSerializer implements SerializationService { |
| 58 | @Override | 70 | @Override |
| 59 | public void encode(ClusterMessage message, ByteBuffer buffer) { | 71 | public void encode(ClusterMessage message, ByteBuffer buffer) { |
| 60 | try { | 72 | try { |
| 61 | - int i = 0; | 73 | + HelloMessage helloMessage = (HelloMessage) message; |
| 62 | - // Type based lookup for proper encoder | 74 | + buffer.putLong(MARKER); |
| 75 | + buffer.putInt(message.subject().ordinal()); | ||
| 76 | + | ||
| 77 | + String str = helloMessage.nodeId() + ":" + helloMessage.ipAddress() + ":" + helloMessage.tcpPort(); | ||
| 78 | + byte[] data = str.getBytes(); | ||
| 79 | + buffer.putInt(data.length + METADATA_LENGTH); | ||
| 80 | + buffer.put(data); | ||
| 81 | + | ||
| 63 | } catch (Exception e) { | 82 | } catch (Exception e) { |
| 64 | // TODO: recover from exceptions by forwarding stream to next marker | 83 | // TODO: recover from exceptions by forwarding stream to next marker |
| 65 | - e.printStackTrace(); | 84 | + log.warn("Unable to encode message due to: " + e); |
| 66 | } | 85 | } |
| 67 | } | 86 | } |
| 68 | 87 | ... | ... |
| ... | @@ -2,9 +2,9 @@ | ... | @@ -2,9 +2,9 @@ |
| 2 | 2 | ||
| 3 | export ONOS_NIC=192.168.56.* | 3 | export ONOS_NIC=192.168.56.* |
| 4 | 4 | ||
| 5 | -export OC1="192.168.56.101" | 5 | +export OC1="192.168.56.11" |
| 6 | -export OC2="192.168.56.102" | 6 | +export OC2="192.168.56.12" |
| 7 | 7 | ||
| 8 | -export OCN="192.168.56.105" | 8 | +export OCN="192.168.56.7" |
| 9 | 9 | ||
| 10 | 10 | ... | ... |
-
Please register or login to post a comment