Showing
3 changed files
with
68 additions
and
0 deletions
| ... | @@ -37,6 +37,15 @@ public interface ClusterCommunicationService { | ... | @@ -37,6 +37,15 @@ public interface ClusterCommunicationService { |
| 37 | boolean multicast(ClusterMessage message, Set<NodeId> nodeIds) throws IOException; | 37 | boolean multicast(ClusterMessage message, Set<NodeId> nodeIds) throws IOException; |
| 38 | 38 | ||
| 39 | /** | 39 | /** |
| 40 | + * Sends a message synchronously. | ||
| 41 | + * @param message message to send | ||
| 42 | + * @param toNodeId recipient node identifier | ||
| 43 | + * @return ClusterMessageResponse which is reply future. | ||
| 44 | + * @throws IOException | ||
| 45 | + */ | ||
| 46 | + ClusterMessageResponse sendAndReceive(ClusterMessage message, NodeId toNodeId) throws IOException; | ||
| 47 | + | ||
| 48 | + /** | ||
| 40 | * Adds a new subscriber for the specified message subject. | 49 | * Adds a new subscriber for the specified message subject. |
| 41 | * | 50 | * |
| 42 | * @param subject message subject | 51 | * @param subject message subject | ... | ... |
core/api/src/main/java/org/onlab/onos/store/cluster/messaging/ClusterMessageResponse.java
0 → 100644
| 1 | +package org.onlab.onos.store.cluster.messaging; | ||
| 2 | + | ||
| 3 | +import java.util.concurrent.TimeUnit; | ||
| 4 | +import java.util.concurrent.TimeoutException; | ||
| 5 | + | ||
| 6 | +import org.onlab.onos.cluster.NodeId; | ||
| 7 | + | ||
| 8 | +public interface ClusterMessageResponse { | ||
| 9 | + public NodeId sender(); | ||
| 10 | + public byte[] get(long timeout, TimeUnit timeunit) throws TimeoutException; | ||
| 11 | + public byte[] get(long timeout) throws InterruptedException; | ||
| 12 | +} |
| ... | @@ -4,6 +4,9 @@ import static com.google.common.base.Preconditions.checkArgument; | ... | @@ -4,6 +4,9 @@ import static com.google.common.base.Preconditions.checkArgument; |
| 4 | 4 | ||
| 5 | import java.io.IOException; | 5 | import java.io.IOException; |
| 6 | import java.util.Set; | 6 | import java.util.Set; |
| 7 | +import java.util.concurrent.TimeUnit; | ||
| 8 | +import java.util.concurrent.TimeoutException; | ||
| 9 | + | ||
| 7 | import org.apache.felix.scr.annotations.Activate; | 10 | import org.apache.felix.scr.annotations.Activate; |
| 8 | import org.apache.felix.scr.annotations.Component; | 11 | import org.apache.felix.scr.annotations.Component; |
| 9 | import org.apache.felix.scr.annotations.Deactivate; | 12 | import org.apache.felix.scr.annotations.Deactivate; |
| ... | @@ -17,6 +20,7 @@ import org.onlab.onos.store.cluster.impl.ClusterMembershipEvent; | ... | @@ -17,6 +20,7 @@ import org.onlab.onos.store.cluster.impl.ClusterMembershipEvent; |
| 17 | import org.onlab.onos.store.cluster.messaging.ClusterCommunicationService; | 20 | import org.onlab.onos.store.cluster.messaging.ClusterCommunicationService; |
| 18 | import org.onlab.onos.store.cluster.messaging.ClusterMessage; | 21 | import org.onlab.onos.store.cluster.messaging.ClusterMessage; |
| 19 | import org.onlab.onos.store.cluster.messaging.ClusterMessageHandler; | 22 | import org.onlab.onos.store.cluster.messaging.ClusterMessageHandler; |
| 23 | +import org.onlab.onos.store.cluster.messaging.ClusterMessageResponse; | ||
| 20 | import org.onlab.onos.store.cluster.messaging.MessageSubject; | 24 | import org.onlab.onos.store.cluster.messaging.MessageSubject; |
| 21 | import org.onlab.onos.store.serializers.ClusterMessageSerializer; | 25 | import org.onlab.onos.store.serializers.ClusterMessageSerializer; |
| 22 | import org.onlab.onos.store.serializers.KryoPoolUtil; | 26 | import org.onlab.onos.store.serializers.KryoPoolUtil; |
| ... | @@ -28,6 +32,7 @@ import org.onlab.netty.Message; | ... | @@ -28,6 +32,7 @@ import org.onlab.netty.Message; |
| 28 | import org.onlab.netty.MessageHandler; | 32 | import org.onlab.netty.MessageHandler; |
| 29 | import org.onlab.netty.MessagingService; | 33 | import org.onlab.netty.MessagingService; |
| 30 | import org.onlab.netty.NettyMessagingService; | 34 | import org.onlab.netty.NettyMessagingService; |
| 35 | +import org.onlab.netty.Response; | ||
| 31 | import org.slf4j.Logger; | 36 | import org.slf4j.Logger; |
| 32 | import org.slf4j.LoggerFactory; | 37 | import org.slf4j.LoggerFactory; |
| 33 | 38 | ||
| ... | @@ -120,6 +125,22 @@ public class ClusterCommunicationManager | ... | @@ -120,6 +125,22 @@ public class ClusterCommunicationManager |
| 120 | } | 125 | } |
| 121 | 126 | ||
| 122 | @Override | 127 | @Override |
| 128 | + public ClusterMessageResponse sendAndReceive(ClusterMessage message, NodeId toNodeId) throws IOException { | ||
| 129 | + ControllerNode node = clusterService.getNode(toNodeId); | ||
| 130 | + checkArgument(node != null, "Unknown nodeId: %s", toNodeId); | ||
| 131 | + Endpoint nodeEp = new Endpoint(node.ip().toString(), node.tcpPort()); | ||
| 132 | + try { | ||
| 133 | + Response responseFuture = | ||
| 134 | + messagingService.sendAndReceive(nodeEp, message.subject().value(), SERIALIZER.encode(message)); | ||
| 135 | + return new InternalClusterMessageResponse(toNodeId, responseFuture); | ||
| 136 | + | ||
| 137 | + } catch (IOException e) { | ||
| 138 | + log.error("Failed interaction with remote nodeId: " + toNodeId, e); | ||
| 139 | + throw e; | ||
| 140 | + } | ||
| 141 | + } | ||
| 142 | + | ||
| 143 | + @Override | ||
| 123 | public void addSubscriber(MessageSubject subject, | 144 | public void addSubscriber(MessageSubject subject, |
| 124 | ClusterMessageHandler subscriber) { | 145 | ClusterMessageHandler subscriber) { |
| 125 | messagingService.registerHandler(subject.value(), new InternalClusterMessageHandler(subscriber)); | 146 | messagingService.registerHandler(subject.value(), new InternalClusterMessageHandler(subscriber)); |
| ... | @@ -144,4 +165,30 @@ public class ClusterCommunicationManager | ... | @@ -144,4 +165,30 @@ public class ClusterCommunicationManager |
| 144 | } | 165 | } |
| 145 | } | 166 | } |
| 146 | } | 167 | } |
| 168 | + | ||
| 169 | + private static final class InternalClusterMessageResponse implements ClusterMessageResponse { | ||
| 170 | + | ||
| 171 | + private final NodeId sender; | ||
| 172 | + private final Response responseFuture; | ||
| 173 | + | ||
| 174 | + public InternalClusterMessageResponse(NodeId sender, Response responseFuture) { | ||
| 175 | + this.sender = sender; | ||
| 176 | + this.responseFuture = responseFuture; | ||
| 177 | + } | ||
| 178 | + @Override | ||
| 179 | + public NodeId sender() { | ||
| 180 | + return sender; | ||
| 181 | + } | ||
| 182 | + | ||
| 183 | + @Override | ||
| 184 | + public byte[] get(long timeout, TimeUnit timeunit) | ||
| 185 | + throws TimeoutException { | ||
| 186 | + return responseFuture.get(timeout, timeunit); | ||
| 187 | + } | ||
| 188 | + | ||
| 189 | + @Override | ||
| 190 | + public byte[] get(long timeout) throws InterruptedException { | ||
| 191 | + return responseFuture.get(); | ||
| 192 | + } | ||
| 193 | + } | ||
| 147 | } | 194 | } | ... | ... |
-
Please register or login to post a comment