Committed by
Gerrit Code Review
Removed deprecated ClusterCommunicationService APIs
MessagingService::sendAsync now returns a CompletableFuture<Void> in place of boolean Change-Id: I98134c4c0ea65b9c7e9ba705eebd1669067324ef
Showing
11 changed files
with
125 additions
and
239 deletions
... | @@ -24,61 +24,12 @@ import java.util.function.Function; | ... | @@ -24,61 +24,12 @@ import java.util.function.Function; |
24 | 24 | ||
25 | import org.onosproject.cluster.NodeId; | 25 | import org.onosproject.cluster.NodeId; |
26 | 26 | ||
27 | -import com.google.common.util.concurrent.ListenableFuture; | ||
28 | - | ||
29 | /** | 27 | /** |
30 | * Service for assisting communications between controller cluster nodes. | 28 | * Service for assisting communications between controller cluster nodes. |
31 | */ | 29 | */ |
32 | public interface ClusterCommunicationService { | 30 | public interface ClusterCommunicationService { |
33 | 31 | ||
34 | /** | 32 | /** |
35 | - * Broadcast a message to all controller nodes. | ||
36 | - * | ||
37 | - * @param message message to send | ||
38 | - * @return true if the message was sent successfully to all nodes; false otherwise. | ||
39 | - */ | ||
40 | - @Deprecated | ||
41 | - boolean broadcast(ClusterMessage message); | ||
42 | - | ||
43 | - /** | ||
44 | - * Broadcast a message to all controller nodes including self. | ||
45 | - * | ||
46 | - * @param message message to send | ||
47 | - * @return true if the message was sent successfully to all nodes; false otherwise. | ||
48 | - */ | ||
49 | - @Deprecated | ||
50 | - boolean broadcastIncludeSelf(ClusterMessage message); | ||
51 | - | ||
52 | - /** | ||
53 | - * Sends a message to the specified controller node. | ||
54 | - * | ||
55 | - * @param message message to send | ||
56 | - * @param toNodeId node identifier | ||
57 | - * @return true if the message was sent successfully; false otherwise. | ||
58 | - */ | ||
59 | - @Deprecated | ||
60 | - boolean unicast(ClusterMessage message, NodeId toNodeId); | ||
61 | - | ||
62 | - /** | ||
63 | - * Multicast a message to a set of controller nodes. | ||
64 | - * | ||
65 | - * @param message message to send | ||
66 | - * @param nodeIds recipient node identifiers | ||
67 | - * @return true if the message was sent successfully to all nodes in the group; false otherwise. | ||
68 | - */ | ||
69 | - @Deprecated | ||
70 | - boolean multicast(ClusterMessage message, Iterable<NodeId> nodeIds); | ||
71 | - | ||
72 | - /** | ||
73 | - * Sends a message synchronously. | ||
74 | - * @param message message to send | ||
75 | - * @param toNodeId recipient node identifier | ||
76 | - * @return reply future. | ||
77 | - */ | ||
78 | - @Deprecated | ||
79 | - ListenableFuture<byte[]> sendAndReceive(ClusterMessage message, NodeId toNodeId); | ||
80 | - | ||
81 | - /** | ||
82 | * Adds a new subscriber for the specified message subject. | 33 | * Adds a new subscriber for the specified message subject. |
83 | * | 34 | * |
84 | * @param subject message subject | 35 | * @param subject message subject |
... | @@ -120,9 +71,9 @@ public interface ClusterCommunicationService { | ... | @@ -120,9 +71,9 @@ public interface ClusterCommunicationService { |
120 | * @param encoder function for encoding message to byte[] | 71 | * @param encoder function for encoding message to byte[] |
121 | * @param toNodeId destination node identifier | 72 | * @param toNodeId destination node identifier |
122 | * @param <M> message type | 73 | * @param <M> message type |
123 | - * @return true if the message was sent successfully; false otherwise | 74 | + * @return future that is completed when the message is sent |
124 | */ | 75 | */ |
125 | - <M> boolean unicast(M message, | 76 | + <M> CompletableFuture<Void> unicast(M message, |
126 | MessageSubject subject, | 77 | MessageSubject subject, |
127 | Function<M, byte[]> encoder, | 78 | Function<M, byte[]> encoder, |
128 | NodeId toNodeId); | 79 | NodeId toNodeId); | ... | ... |
... | @@ -15,7 +15,6 @@ | ... | @@ -15,7 +15,6 @@ |
15 | */ | 15 | */ |
16 | package org.onosproject.store.cluster.messaging; | 16 | package org.onosproject.store.cluster.messaging; |
17 | 17 | ||
18 | -import java.io.IOException; | ||
19 | import java.util.concurrent.CompletableFuture; | 18 | import java.util.concurrent.CompletableFuture; |
20 | import java.util.concurrent.Executor; | 19 | import java.util.concurrent.Executor; |
21 | import java.util.function.Consumer; | 20 | import java.util.function.Consumer; |
... | @@ -32,9 +31,9 @@ public interface MessagingService { | ... | @@ -32,9 +31,9 @@ public interface MessagingService { |
32 | * @param ep end point to send the message to. | 31 | * @param ep end point to send the message to. |
33 | * @param type type of message. | 32 | * @param type type of message. |
34 | * @param payload message payload bytes. | 33 | * @param payload message payload bytes. |
35 | - * @throws IOException when I/O exception of some sort has occurred | 34 | + * @return future that is completed when the message is sent |
36 | */ | 35 | */ |
37 | - void sendAsync(Endpoint ep, String type, byte[] payload) throws IOException; | 36 | + CompletableFuture<Void> sendAsync(Endpoint ep, String type, byte[] payload); |
38 | 37 | ||
39 | /** | 38 | /** |
40 | * Sends a message synchronously and waits for a response. | 39 | * Sends a message synchronously and waits for a response. | ... | ... |
... | @@ -42,7 +42,6 @@ import org.onosproject.store.serializers.KryoNamespaces; | ... | @@ -42,7 +42,6 @@ import org.onosproject.store.serializers.KryoNamespaces; |
42 | import org.onosproject.store.serializers.KryoSerializer; | 42 | import org.onosproject.store.serializers.KryoSerializer; |
43 | import org.slf4j.Logger; | 43 | import org.slf4j.Logger; |
44 | 44 | ||
45 | -import java.io.IOException; | ||
46 | import java.util.Map; | 45 | import java.util.Map; |
47 | import java.util.Set; | 46 | import java.util.Set; |
48 | import java.util.concurrent.ExecutorService; | 47 | import java.util.concurrent.ExecutorService; |
... | @@ -237,11 +236,11 @@ public class DistributedClusterStore | ... | @@ -237,11 +236,11 @@ public class DistributedClusterStore |
237 | 236 | ||
238 | private void heartbeatToPeer(byte[] messagePayload, ControllerNode peer) { | 237 | private void heartbeatToPeer(byte[] messagePayload, ControllerNode peer) { |
239 | Endpoint remoteEp = new Endpoint(peer.ip(), peer.tcpPort()); | 238 | Endpoint remoteEp = new Endpoint(peer.ip(), peer.tcpPort()); |
240 | - try { | 239 | + messagingService.sendAsync(remoteEp, HEARTBEAT_MESSAGE, messagePayload).whenComplete((result, error) -> { |
241 | - messagingService.sendAsync(remoteEp, HEARTBEAT_MESSAGE, messagePayload); | 240 | + if (error != null) { |
242 | - } catch (IOException e) { | 241 | + log.trace("Sending heartbeat to {} failed", remoteEp, error); |
243 | - log.trace("Sending heartbeat to {} failed", remoteEp, e); | ||
244 | } | 242 | } |
243 | + }); | ||
245 | } | 244 | } |
246 | 245 | ||
247 | private class HeartbeatMessageHandler implements Consumer<byte[]> { | 246 | private class HeartbeatMessageHandler implements Consumer<byte[]> { | ... | ... |
... | @@ -35,10 +35,6 @@ import org.slf4j.Logger; | ... | @@ -35,10 +35,6 @@ import org.slf4j.Logger; |
35 | import org.slf4j.LoggerFactory; | 35 | import org.slf4j.LoggerFactory; |
36 | 36 | ||
37 | import com.google.common.base.Objects; | 37 | import com.google.common.base.Objects; |
38 | -import com.google.common.util.concurrent.ListenableFuture; | ||
39 | -import com.google.common.util.concurrent.SettableFuture; | ||
40 | - | ||
41 | -import java.io.IOException; | ||
42 | import java.util.Set; | 38 | import java.util.Set; |
43 | import java.util.concurrent.CompletableFuture; | 39 | import java.util.concurrent.CompletableFuture; |
44 | import java.util.concurrent.Executor; | 40 | import java.util.concurrent.Executor; |
... | @@ -62,8 +58,11 @@ public class ClusterCommunicationManager | ... | @@ -62,8 +58,11 @@ public class ClusterCommunicationManager |
62 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 58 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
63 | protected MessagingService messagingService; | 59 | protected MessagingService messagingService; |
64 | 60 | ||
61 | + private NodeId localNodeId; | ||
62 | + | ||
65 | @Activate | 63 | @Activate |
66 | public void activate() { | 64 | public void activate() { |
65 | + localNodeId = clusterService.getLocalNode().id(); | ||
67 | log.info("Started"); | 66 | log.info("Started"); |
68 | } | 67 | } |
69 | 68 | ||
... | @@ -73,60 +72,6 @@ public class ClusterCommunicationManager | ... | @@ -73,60 +72,6 @@ public class ClusterCommunicationManager |
73 | } | 72 | } |
74 | 73 | ||
75 | @Override | 74 | @Override |
76 | - public boolean broadcast(ClusterMessage message) { | ||
77 | - boolean ok = true; | ||
78 | - final ControllerNode localNode = clusterService.getLocalNode(); | ||
79 | - byte[] payload = message.getBytes(); | ||
80 | - for (ControllerNode node : clusterService.getNodes()) { | ||
81 | - if (!node.equals(localNode)) { | ||
82 | - ok = unicastUnchecked(message.subject(), payload, node.id()) && ok; | ||
83 | - } | ||
84 | - } | ||
85 | - return ok; | ||
86 | - } | ||
87 | - | ||
88 | - @Override | ||
89 | - public boolean broadcastIncludeSelf(ClusterMessage message) { | ||
90 | - boolean ok = true; | ||
91 | - byte[] payload = message.getBytes(); | ||
92 | - for (ControllerNode node : clusterService.getNodes()) { | ||
93 | - ok = unicastUnchecked(message.subject(), payload, node.id()) && ok; | ||
94 | - } | ||
95 | - return ok; | ||
96 | - } | ||
97 | - | ||
98 | - @Override | ||
99 | - public boolean multicast(ClusterMessage message, Iterable<NodeId> nodes) { | ||
100 | - boolean ok = true; | ||
101 | - final ControllerNode localNode = clusterService.getLocalNode(); | ||
102 | - byte[] payload = message.getBytes(); | ||
103 | - for (NodeId nodeId : nodes) { | ||
104 | - if (!nodeId.equals(localNode.id())) { | ||
105 | - ok = unicastUnchecked(message.subject(), payload, nodeId) && ok; | ||
106 | - } | ||
107 | - } | ||
108 | - return ok; | ||
109 | - } | ||
110 | - | ||
111 | - @Override | ||
112 | - public boolean unicast(ClusterMessage message, NodeId toNodeId) { | ||
113 | - return unicastUnchecked(message.subject(), message.getBytes(), toNodeId); | ||
114 | - } | ||
115 | - | ||
116 | - @Override | ||
117 | - public ListenableFuture<byte[]> sendAndReceive(ClusterMessage message, NodeId toNodeId) { | ||
118 | - SettableFuture<byte[]> response = SettableFuture.create(); | ||
119 | - sendAndReceive(message.subject(), message.getBytes(), toNodeId).whenComplete((r, e) -> { | ||
120 | - if (e == null) { | ||
121 | - response.set(r); | ||
122 | - } else { | ||
123 | - response.setException(e); | ||
124 | - } | ||
125 | - }); | ||
126 | - return response; | ||
127 | - } | ||
128 | - | ||
129 | - @Override | ||
130 | public <M> void broadcast(M message, | 75 | public <M> void broadcast(M message, |
131 | MessageSubject subject, | 76 | MessageSubject subject, |
132 | Function<M, byte[]> encoder) { | 77 | Function<M, byte[]> encoder) { |
... | @@ -154,15 +99,19 @@ public class ClusterCommunicationManager | ... | @@ -154,15 +99,19 @@ public class ClusterCommunicationManager |
154 | } | 99 | } |
155 | 100 | ||
156 | @Override | 101 | @Override |
157 | - public <M> boolean unicast(M message, | 102 | + public <M> CompletableFuture<Void> unicast(M message, |
158 | MessageSubject subject, | 103 | MessageSubject subject, |
159 | Function<M, byte[]> encoder, | 104 | Function<M, byte[]> encoder, |
160 | NodeId toNodeId) { | 105 | NodeId toNodeId) { |
106 | + try { | ||
161 | byte[] payload = new ClusterMessage( | 107 | byte[] payload = new ClusterMessage( |
162 | - clusterService.getLocalNode().id(), | 108 | + localNodeId, |
163 | subject, | 109 | subject, |
164 | encoder.apply(message)).getBytes(); | 110 | encoder.apply(message)).getBytes(); |
165 | - return unicastUnchecked(subject, payload, toNodeId); | 111 | + return doUnicast(subject, payload, toNodeId); |
112 | + } catch (Exception e) { | ||
113 | + return Tools.exceptionalFuture(e); | ||
114 | + } | ||
166 | } | 115 | } |
167 | 116 | ||
168 | @Override | 117 | @Override |
... | @@ -171,10 +120,10 @@ public class ClusterCommunicationManager | ... | @@ -171,10 +120,10 @@ public class ClusterCommunicationManager |
171 | Function<M, byte[]> encoder, | 120 | Function<M, byte[]> encoder, |
172 | Set<NodeId> nodes) { | 121 | Set<NodeId> nodes) { |
173 | byte[] payload = new ClusterMessage( | 122 | byte[] payload = new ClusterMessage( |
174 | - clusterService.getLocalNode().id(), | 123 | + localNodeId, |
175 | subject, | 124 | subject, |
176 | encoder.apply(message)).getBytes(); | 125 | encoder.apply(message)).getBytes(); |
177 | - nodes.forEach(nodeId -> unicastUnchecked(subject, payload, nodeId)); | 126 | + nodes.forEach(nodeId -> doUnicast(subject, payload, nodeId)); |
178 | } | 127 | } |
179 | 128 | ||
180 | @Override | 129 | @Override |
... | @@ -194,17 +143,11 @@ public class ClusterCommunicationManager | ... | @@ -194,17 +143,11 @@ public class ClusterCommunicationManager |
194 | } | 143 | } |
195 | } | 144 | } |
196 | 145 | ||
197 | - private boolean unicastUnchecked(MessageSubject subject, byte[] payload, NodeId toNodeId) { | 146 | + private CompletableFuture<Void> doUnicast(MessageSubject subject, byte[] payload, NodeId toNodeId) { |
198 | ControllerNode node = clusterService.getNode(toNodeId); | 147 | ControllerNode node = clusterService.getNode(toNodeId); |
199 | checkArgument(node != null, "Unknown nodeId: %s", toNodeId); | 148 | checkArgument(node != null, "Unknown nodeId: %s", toNodeId); |
200 | Endpoint nodeEp = new Endpoint(node.ip(), node.tcpPort()); | 149 | Endpoint nodeEp = new Endpoint(node.ip(), node.tcpPort()); |
201 | - try { | 150 | + return messagingService.sendAsync(nodeEp, subject.value(), payload); |
202 | - messagingService.sendAsync(nodeEp, subject.value(), payload); | ||
203 | - return true; | ||
204 | - } catch (IOException e) { | ||
205 | - log.debug("Failed to send cluster message to nodeId: " + toNodeId, e); | ||
206 | - return false; | ||
207 | - } | ||
208 | } | 151 | } |
209 | 152 | ||
210 | private CompletableFuture<byte[]> sendAndReceive(MessageSubject subject, byte[] payload, NodeId toNodeId) { | 153 | private CompletableFuture<byte[]> sendAndReceive(MessageSubject subject, byte[] payload, NodeId toNodeId) { | ... | ... |
... | @@ -66,27 +66,27 @@ public class EventuallyConsistentMapBuilderImpl<K, V> | ... | @@ -66,27 +66,27 @@ public class EventuallyConsistentMapBuilderImpl<K, V> |
66 | } | 66 | } |
67 | 67 | ||
68 | @Override | 68 | @Override |
69 | - public EventuallyConsistentMapBuilder withName(String name) { | 69 | + public EventuallyConsistentMapBuilder<K, V> withName(String name) { |
70 | this.name = checkNotNull(name); | 70 | this.name = checkNotNull(name); |
71 | return this; | 71 | return this; |
72 | } | 72 | } |
73 | 73 | ||
74 | @Override | 74 | @Override |
75 | - public EventuallyConsistentMapBuilder withSerializer( | 75 | + public EventuallyConsistentMapBuilder<K, V> withSerializer( |
76 | KryoNamespace.Builder serializerBuilder) { | 76 | KryoNamespace.Builder serializerBuilder) { |
77 | this.serializerBuilder = checkNotNull(serializerBuilder); | 77 | this.serializerBuilder = checkNotNull(serializerBuilder); |
78 | return this; | 78 | return this; |
79 | } | 79 | } |
80 | 80 | ||
81 | @Override | 81 | @Override |
82 | - public EventuallyConsistentMapBuilder withClockService( | 82 | + public EventuallyConsistentMapBuilder<K, V> withClockService( |
83 | ClockService<K, V> clockService) { | 83 | ClockService<K, V> clockService) { |
84 | this.clockService = checkNotNull(clockService); | 84 | this.clockService = checkNotNull(clockService); |
85 | return this; | 85 | return this; |
86 | } | 86 | } |
87 | 87 | ||
88 | @Override | 88 | @Override |
89 | - public EventuallyConsistentMapBuilder withEventExecutor(ExecutorService executor) { | 89 | + public EventuallyConsistentMapBuilder<K, V> withEventExecutor(ExecutorService executor) { |
90 | this.eventExecutor = checkNotNull(executor); | 90 | this.eventExecutor = checkNotNull(executor); |
91 | return this; | 91 | return this; |
92 | } | 92 | } |
... | @@ -99,13 +99,13 @@ public class EventuallyConsistentMapBuilderImpl<K, V> | ... | @@ -99,13 +99,13 @@ public class EventuallyConsistentMapBuilderImpl<K, V> |
99 | } | 99 | } |
100 | 100 | ||
101 | @Override | 101 | @Override |
102 | - public EventuallyConsistentMapBuilder withBackgroundExecutor(ScheduledExecutorService executor) { | 102 | + public EventuallyConsistentMapBuilder<K, V> withBackgroundExecutor(ScheduledExecutorService executor) { |
103 | this.backgroundExecutor = checkNotNull(executor); | 103 | this.backgroundExecutor = checkNotNull(executor); |
104 | return this; | 104 | return this; |
105 | } | 105 | } |
106 | 106 | ||
107 | @Override | 107 | @Override |
108 | - public EventuallyConsistentMapBuilder withPeerUpdateFunction( | 108 | + public EventuallyConsistentMapBuilder<K, V> withPeerUpdateFunction( |
109 | BiFunction<K, V, Collection<NodeId>> peerUpdateFunction) { | 109 | BiFunction<K, V, Collection<NodeId>> peerUpdateFunction) { |
110 | this.peerUpdateFunction = checkNotNull(peerUpdateFunction); | 110 | this.peerUpdateFunction = checkNotNull(peerUpdateFunction); |
111 | return this; | 111 | return this; | ... | ... |
... | @@ -509,12 +509,6 @@ public class EventuallyConsistentMapImpl<K, V> | ... | @@ -509,12 +509,6 @@ public class EventuallyConsistentMapImpl<K, V> |
509 | ); | 509 | ); |
510 | } | 510 | } |
511 | 511 | ||
512 | - private boolean unicastMessage(NodeId peer, MessageSubject subject, Object event) { | ||
513 | - return clusterCommunicator.unicast(event, subject, serializer::encode, peer); | ||
514 | - // Note: we had this flipped before... | ||
515 | -// communicationExecutor.execute(() -> clusterCommunicator.unicast(message, peer)); | ||
516 | - } | ||
517 | - | ||
518 | private boolean underHighLoad() { | 512 | private boolean underHighLoad() { |
519 | return counter.get(LOAD_WINDOW) > HIGH_LOAD_THRESHOLD; | 513 | return counter.get(LOAD_WINDOW) > HIGH_LOAD_THRESHOLD; |
520 | } | 514 | } |
... | @@ -556,10 +550,14 @@ public class EventuallyConsistentMapImpl<K, V> | ... | @@ -556,10 +550,14 @@ public class EventuallyConsistentMapImpl<K, V> |
556 | } | 550 | } |
557 | 551 | ||
558 | AntiEntropyAdvertisement<K> ad = createAdvertisement(); | 552 | AntiEntropyAdvertisement<K> ad = createAdvertisement(); |
559 | - | 553 | + NodeId destination = peer; |
560 | - if (!unicastMessage(peer, antiEntropyAdvertisementSubject, ad)) { | 554 | + clusterCommunicator.unicast(ad, antiEntropyAdvertisementSubject, serializer::encode, peer) |
561 | - log.debug("Failed to send anti-entropy advertisement to {}", peer); | 555 | + .whenComplete((result, error) -> { |
556 | + if (error != null) { | ||
557 | + log.debug("Failed to send anti-entropy advertisement to {}", destination); | ||
562 | } | 558 | } |
559 | + }); | ||
560 | + | ||
563 | } catch (Exception e) { | 561 | } catch (Exception e) { |
564 | // Catch all exceptions to avoid scheduled task being suppressed. | 562 | // Catch all exceptions to avoid scheduled task being suppressed. |
565 | log.error("Exception thrown while sending advertisement", e); | 563 | log.error("Exception thrown while sending advertisement", e); |
... | @@ -595,9 +593,14 @@ public class EventuallyConsistentMapImpl<K, V> | ... | @@ -595,9 +593,14 @@ public class EventuallyConsistentMapImpl<K, V> |
595 | // Send the advertisement back if this peer is out-of-sync | 593 | // Send the advertisement back if this peer is out-of-sync |
596 | final NodeId sender = ad.sender(); | 594 | final NodeId sender = ad.sender(); |
597 | AntiEntropyAdvertisement<K> myAd = createAdvertisement(); | 595 | AntiEntropyAdvertisement<K> myAd = createAdvertisement(); |
598 | - if (!unicastMessage(sender, antiEntropyAdvertisementSubject, myAd)) { | 596 | + |
599 | - log.debug("Failed to send reactive anti-entropy advertisement to {}", sender); | 597 | + clusterCommunicator.unicast(myAd, antiEntropyAdvertisementSubject, serializer::encode, sender) |
598 | + .whenComplete((result, error) -> { | ||
599 | + if (error != null) { | ||
600 | + log.debug("Failed to send reactive " | ||
601 | + + "anti-entropy advertisement to {}", sender); | ||
600 | } | 602 | } |
603 | + }); | ||
601 | break; | 604 | break; |
602 | } | 605 | } |
603 | } | 606 | } |
... | @@ -801,12 +804,16 @@ public class EventuallyConsistentMapImpl<K, V> | ... | @@ -801,12 +804,16 @@ public class EventuallyConsistentMapImpl<K, V> |
801 | ) | 804 | ) |
802 | ); | 805 | ); |
803 | communicationExecutor.submit(() -> { | 806 | communicationExecutor.submit(() -> { |
804 | - try { | 807 | + clusterCommunicator.unicast(Lists.newArrayList(map.values()), |
805 | - unicastMessage(peer, updateMessageSubject, Lists.newArrayList(map.values())); | 808 | + updateMessageSubject, |
806 | - } catch (Exception e) { | 809 | + serializer::encode, |
807 | - log.warn("broadcast error", e); | 810 | + peer) |
811 | + .whenComplete((result, error) -> { | ||
812 | + if (error != null) { | ||
813 | + log.debug("Failed to send to {}", peer); | ||
808 | } | 814 | } |
809 | }); | 815 | }); |
816 | + }); | ||
810 | } | 817 | } |
811 | } | 818 | } |
812 | } | 819 | } | ... | ... |
... | @@ -407,21 +407,22 @@ public class NewDistributedFlowRuleStore | ... | @@ -407,21 +407,22 @@ public class NewDistributedFlowRuleStore |
407 | log.trace("Forwarding storeBatch to {}, which is the primary (master) for device {}", | 407 | log.trace("Forwarding storeBatch to {}, which is the primary (master) for device {}", |
408 | master, deviceId); | 408 | master, deviceId); |
409 | 409 | ||
410 | - if (!clusterCommunicator.unicast(operation, | 410 | + clusterCommunicator.unicast(operation, |
411 | APPLY_BATCH_FLOWS, | 411 | APPLY_BATCH_FLOWS, |
412 | SERIALIZER::encode, | 412 | SERIALIZER::encode, |
413 | - master)) { | 413 | + master) |
414 | + .whenComplete((result, error) -> { | ||
414 | log.warn("Failed to storeBatch: {} to {}", operation, master); | 415 | log.warn("Failed to storeBatch: {} to {}", operation, master); |
415 | 416 | ||
416 | - Set<FlowRule> allFailures = operation.getOperations().stream() | 417 | + Set<FlowRule> allFailures = operation.getOperations() |
418 | + .stream() | ||
417 | .map(op -> op.target()) | 419 | .map(op -> op.target()) |
418 | .collect(Collectors.toSet()); | 420 | .collect(Collectors.toSet()); |
419 | 421 | ||
420 | notifyDelegate(FlowRuleBatchEvent.completed( | 422 | notifyDelegate(FlowRuleBatchEvent.completed( |
421 | new FlowRuleBatchRequest(operation.id(), Collections.emptySet()), | 423 | new FlowRuleBatchRequest(operation.id(), Collections.emptySet()), |
422 | new CompletedBatchOperation(false, allFailures, deviceId))); | 424 | new CompletedBatchOperation(false, allFailures, deviceId))); |
423 | - return; | 425 | + }); |
424 | - } | ||
425 | } | 426 | } |
426 | 427 | ||
427 | private void storeBatchInternal(FlowRuleBatchOperation operation) { | 428 | private void storeBatchInternal(FlowRuleBatchOperation operation) { | ... | ... |
... | @@ -395,8 +395,7 @@ public class DistributedGroupStore | ... | @@ -395,8 +395,7 @@ public class DistributedGroupStore |
395 | } | 395 | } |
396 | 396 | ||
397 | // Check if group to be created by a remote instance | 397 | // Check if group to be created by a remote instance |
398 | - if (mastershipService.getLocalRole( | 398 | + if (mastershipService.getLocalRole(groupDesc.deviceId()) != MastershipRole.MASTER) { |
399 | - groupDesc.deviceId()) != MastershipRole.MASTER) { | ||
400 | log.debug("storeGroupDescription: Device {} local role is not MASTER", | 399 | log.debug("storeGroupDescription: Device {} local role is not MASTER", |
401 | groupDesc.deviceId()); | 400 | groupDesc.deviceId()); |
402 | if (mastershipService.getMasterFor(groupDesc.deviceId()) == null) { | 401 | if (mastershipService.getMasterFor(groupDesc.deviceId()) == null) { |
... | @@ -410,19 +409,22 @@ public class DistributedGroupStore | ... | @@ -410,19 +409,22 @@ public class DistributedGroupStore |
410 | createGroupAddRequestMsg(groupDesc.deviceId(), | 409 | createGroupAddRequestMsg(groupDesc.deviceId(), |
411 | groupDesc); | 410 | groupDesc); |
412 | 411 | ||
413 | - if (!clusterCommunicator.unicast(groupOp, | 412 | + clusterCommunicator.unicast(groupOp, |
414 | GroupStoreMessageSubjects.REMOTE_GROUP_OP_REQUEST, | 413 | GroupStoreMessageSubjects.REMOTE_GROUP_OP_REQUEST, |
415 | m -> kryoBuilder.build().serialize(m), | 414 | m -> kryoBuilder.build().serialize(m), |
416 | - mastershipService.getMasterFor(groupDesc.deviceId()))) { | 415 | + mastershipService.getMasterFor(groupDesc.deviceId())).whenComplete((result, error) -> { |
416 | + if (error != null) { | ||
417 | log.warn("Failed to send request to master: {} to {}", | 417 | log.warn("Failed to send request to master: {} to {}", |
418 | groupOp, | 418 | groupOp, |
419 | mastershipService.getMasterFor(groupDesc.deviceId())); | 419 | mastershipService.getMasterFor(groupDesc.deviceId())); |
420 | //TODO: Send Group operation failure event | 420 | //TODO: Send Group operation failure event |
421 | - return; | 421 | + } else { |
422 | - } | 422 | + log.debug("Sent Group operation request for device {} " |
423 | - log.debug("Sent Group operation request for device {} to remote MASTER {}", | 423 | + + "to remote MASTER {}", |
424 | groupDesc.deviceId(), | 424 | groupDesc.deviceId(), |
425 | mastershipService.getMasterFor(groupDesc.deviceId())); | 425 | mastershipService.getMasterFor(groupDesc.deviceId())); |
426 | + } | ||
427 | + }); | ||
426 | return; | 428 | return; |
427 | } | 429 | } |
428 | 430 | ||
... | @@ -512,15 +514,17 @@ public class DistributedGroupStore | ... | @@ -512,15 +514,17 @@ public class DistributedGroupStore |
512 | newBuckets, | 514 | newBuckets, |
513 | newAppCookie); | 515 | newAppCookie); |
514 | 516 | ||
515 | - if (!clusterCommunicator.unicast(groupOp, | 517 | + clusterCommunicator.unicast(groupOp, |
516 | GroupStoreMessageSubjects.REMOTE_GROUP_OP_REQUEST, | 518 | GroupStoreMessageSubjects.REMOTE_GROUP_OP_REQUEST, |
517 | m -> kryoBuilder.build().serialize(m), | 519 | m -> kryoBuilder.build().serialize(m), |
518 | - mastershipService.getMasterFor(deviceId))) { | 520 | + mastershipService.getMasterFor(deviceId)).whenComplete((result, error) -> { |
521 | + if (error != null) { | ||
519 | log.warn("Failed to send request to master: {} to {}", | 522 | log.warn("Failed to send request to master: {} to {}", |
520 | groupOp, | 523 | groupOp, |
521 | - mastershipService.getMasterFor(deviceId)); | 524 | + mastershipService.getMasterFor(deviceId), error); |
522 | - //TODO: Send Group operation failure event | ||
523 | } | 525 | } |
526 | + //TODO: Send Group operation failure event | ||
527 | + }); | ||
524 | return; | 528 | return; |
525 | } | 529 | } |
526 | log.debug("updateGroupDescription for device {} is getting handled locally", | 530 | log.debug("updateGroupDescription for device {} is getting handled locally", |
... | @@ -643,15 +647,17 @@ public class DistributedGroupStore | ... | @@ -643,15 +647,17 @@ public class DistributedGroupStore |
643 | createGroupDeleteRequestMsg(deviceId, | 647 | createGroupDeleteRequestMsg(deviceId, |
644 | appCookie); | 648 | appCookie); |
645 | 649 | ||
646 | - if (!clusterCommunicator.unicast(groupOp, | 650 | + clusterCommunicator.unicast(groupOp, |
647 | GroupStoreMessageSubjects.REMOTE_GROUP_OP_REQUEST, | 651 | GroupStoreMessageSubjects.REMOTE_GROUP_OP_REQUEST, |
648 | m -> kryoBuilder.build().serialize(m), | 652 | m -> kryoBuilder.build().serialize(m), |
649 | - mastershipService.getMasterFor(deviceId))) { | 653 | + mastershipService.getMasterFor(deviceId)).whenComplete((result, error) -> { |
654 | + if (error != null) { | ||
650 | log.warn("Failed to send request to master: {} to {}", | 655 | log.warn("Failed to send request to master: {} to {}", |
651 | groupOp, | 656 | groupOp, |
652 | - mastershipService.getMasterFor(deviceId)); | 657 | + mastershipService.getMasterFor(deviceId), error); |
653 | - //TODO: Send Group operation failure event | ||
654 | } | 658 | } |
659 | + //TODO: Send Group operation failure event | ||
660 | + }); | ||
655 | return; | 661 | return; |
656 | } | 662 | } |
657 | log.debug("deleteGroupDescription in device {} is getting handled locally", | 663 | log.debug("deleteGroupDescription in device {} is getting handled locally", | ... | ... |
... | @@ -18,7 +18,6 @@ package org.onosproject.store.ecmap; | ... | @@ -18,7 +18,6 @@ package org.onosproject.store.ecmap; |
18 | import com.google.common.collect.ComparisonChain; | 18 | import com.google.common.collect.ComparisonChain; |
19 | import com.google.common.collect.ImmutableSet; | 19 | import com.google.common.collect.ImmutableSet; |
20 | import com.google.common.collect.Lists; | 20 | import com.google.common.collect.Lists; |
21 | -import com.google.common.util.concurrent.ListenableFuture; | ||
22 | import com.google.common.util.concurrent.MoreExecutors; | 21 | import com.google.common.util.concurrent.MoreExecutors; |
23 | 22 | ||
24 | import org.junit.After; | 23 | import org.junit.After; |
... | @@ -145,7 +144,7 @@ public class EventuallyConsistentMapImplTest { | ... | @@ -145,7 +144,7 @@ public class EventuallyConsistentMapImplTest { |
145 | .register(KryoNamespaces.API) | 144 | .register(KryoNamespaces.API) |
146 | .register(TestTimestamp.class); | 145 | .register(TestTimestamp.class); |
147 | 146 | ||
148 | - ecMap = new EventuallyConsistentMapBuilderImpl<>( | 147 | + ecMap = new EventuallyConsistentMapBuilderImpl<String, String>( |
149 | clusterService, clusterCommunicator) | 148 | clusterService, clusterCommunicator) |
150 | .withName(MAP_NAME) | 149 | .withName(MAP_NAME) |
151 | .withSerializer(serializer) | 150 | .withSerializer(serializer) |
... | @@ -702,7 +701,7 @@ public class EventuallyConsistentMapImplTest { | ... | @@ -702,7 +701,7 @@ public class EventuallyConsistentMapImplTest { |
702 | anyObject(MessageSubject.class), | 701 | anyObject(MessageSubject.class), |
703 | anyObject(Function.class), | 702 | anyObject(Function.class), |
704 | anyObject(NodeId.class))) | 703 | anyObject(NodeId.class))) |
705 | - .andReturn(true) | 704 | + .andReturn(CompletableFuture.completedFuture(null)) |
706 | .anyTimes(); | 705 | .anyTimes(); |
707 | replay(clusterCommunicator); | 706 | replay(clusterCommunicator); |
708 | } | 707 | } |
... | @@ -761,9 +760,9 @@ public class EventuallyConsistentMapImplTest { | ... | @@ -761,9 +760,9 @@ public class EventuallyConsistentMapImplTest { |
761 | } | 760 | } |
762 | 761 | ||
763 | @Override | 762 | @Override |
764 | - public <M> boolean unicast(M message, MessageSubject subject, | 763 | + public <M> CompletableFuture<Void> unicast(M message, MessageSubject subject, |
765 | Function<M, byte[]> encoder, NodeId toNodeId) { | 764 | Function<M, byte[]> encoder, NodeId toNodeId) { |
766 | - return false; | 765 | + return null; |
767 | } | 766 | } |
768 | 767 | ||
769 | @Override | 768 | @Override |
... | @@ -795,33 +794,6 @@ public class EventuallyConsistentMapImplTest { | ... | @@ -795,33 +794,6 @@ public class EventuallyConsistentMapImplTest { |
795 | Function<byte[], M> decoder, Consumer<M> handler, | 794 | Function<byte[], M> decoder, Consumer<M> handler, |
796 | Executor executor) { | 795 | Executor executor) { |
797 | } | 796 | } |
798 | - | ||
799 | - @Override | ||
800 | - public boolean broadcast(ClusterMessage message) { | ||
801 | - return false; | ||
802 | - } | ||
803 | - | ||
804 | - @Override | ||
805 | - public boolean broadcastIncludeSelf(ClusterMessage message) { | ||
806 | - return false; | ||
807 | - } | ||
808 | - | ||
809 | - @Override | ||
810 | - public boolean unicast(ClusterMessage message, NodeId toNodeId) { | ||
811 | - return false; | ||
812 | - } | ||
813 | - | ||
814 | - @Override | ||
815 | - public boolean multicast(ClusterMessage message, | ||
816 | - Iterable<NodeId> nodeIds) { | ||
817 | - return false; | ||
818 | - } | ||
819 | - | ||
820 | - @Override | ||
821 | - public ListenableFuture<byte[]> sendAndReceive(ClusterMessage message, | ||
822 | - NodeId toNodeId) { | ||
823 | - return null; | ||
824 | - } | ||
825 | } | 797 | } |
826 | 798 | ||
827 | /** | 799 | /** | ... | ... |
... | @@ -20,7 +20,6 @@ import io.netty.bootstrap.ServerBootstrap; | ... | @@ -20,7 +20,6 @@ import io.netty.bootstrap.ServerBootstrap; |
20 | import io.netty.buffer.PooledByteBufAllocator; | 20 | import io.netty.buffer.PooledByteBufAllocator; |
21 | import io.netty.channel.Channel; | 21 | import io.netty.channel.Channel; |
22 | import io.netty.channel.ChannelFuture; | 22 | import io.netty.channel.ChannelFuture; |
23 | -import io.netty.channel.ChannelFutureListener; | ||
24 | import io.netty.channel.ChannelHandler; | 23 | import io.netty.channel.ChannelHandler; |
25 | import io.netty.channel.ChannelHandlerContext; | 24 | import io.netty.channel.ChannelHandlerContext; |
26 | import io.netty.channel.ChannelInitializer; | 25 | import io.netty.channel.ChannelInitializer; |
... | @@ -136,32 +135,39 @@ public class NettyMessaging implements MessagingService { | ... | @@ -136,32 +135,39 @@ public class NettyMessaging implements MessagingService { |
136 | } | 135 | } |
137 | 136 | ||
138 | @Override | 137 | @Override |
139 | - public void sendAsync(Endpoint ep, String type, byte[] payload) throws IOException { | 138 | + public CompletableFuture<Void> sendAsync(Endpoint ep, String type, byte[] payload) { |
140 | InternalMessage message = new InternalMessage(messageIdGenerator.incrementAndGet(), | 139 | InternalMessage message = new InternalMessage(messageIdGenerator.incrementAndGet(), |
141 | localEp, | 140 | localEp, |
142 | type, | 141 | type, |
143 | payload); | 142 | payload); |
144 | - sendAsync(ep, message); | 143 | + return sendAsync(ep, message); |
145 | } | 144 | } |
146 | 145 | ||
147 | - protected void sendAsync(Endpoint ep, InternalMessage message) throws IOException { | 146 | + protected CompletableFuture<Void> sendAsync(Endpoint ep, InternalMessage message) { |
147 | + CompletableFuture<Void> future = new CompletableFuture<>(); | ||
148 | + try { | ||
148 | if (ep.equals(localEp)) { | 149 | if (ep.equals(localEp)) { |
149 | dispatchLocally(message); | 150 | dispatchLocally(message); |
150 | - return; | 151 | + future.complete(null); |
151 | - } | 152 | + } else { |
152 | Channel channel = null; | 153 | Channel channel = null; |
153 | try { | 154 | try { |
154 | - try { | ||
155 | channel = channels.borrowObject(ep); | 155 | channel = channels.borrowObject(ep); |
156 | - channel.writeAndFlush(message).addListener(ChannelFutureListener.CLOSE_ON_FAILURE); | 156 | + channel.writeAndFlush(message).addListener(channelFuture -> { |
157 | + if (!channelFuture.isSuccess()) { | ||
158 | + future.completeExceptionally(channelFuture.cause()); | ||
159 | + } else { | ||
160 | + future.complete(null); | ||
161 | + } | ||
162 | + }); | ||
157 | } finally { | 163 | } finally { |
158 | channels.returnObject(ep, channel); | 164 | channels.returnObject(ep, channel); |
159 | } | 165 | } |
160 | - } catch (IOException e) { | 166 | + } |
161 | - throw e; | ||
162 | } catch (Exception e) { | 167 | } catch (Exception e) { |
163 | - throw new IOException(e); | 168 | + future.completeExceptionally(e); |
164 | } | 169 | } |
170 | + return future; | ||
165 | } | 171 | } |
166 | 172 | ||
167 | @Override | 173 | @Override |
... | @@ -193,11 +199,11 @@ public class NettyMessaging implements MessagingService { | ... | @@ -193,11 +199,11 @@ public class NettyMessaging implements MessagingService { |
193 | localEp, | 199 | localEp, |
194 | REPLY_MESSAGE_TYPE, | 200 | REPLY_MESSAGE_TYPE, |
195 | responsePayload); | 201 | responsePayload); |
196 | - try { | 202 | + sendAsync(message.sender(), response).whenComplete((result, error) -> { |
197 | - sendAsync(message.sender(), response); | 203 | + if (error != null) { |
198 | - } catch (IOException e) { | 204 | + log.debug("Failed to respond", error); |
199 | - log.debug("Failed to respond", e); | ||
200 | } | 205 | } |
206 | + }); | ||
201 | } | 207 | } |
202 | })); | 208 | })); |
203 | } | 209 | } |
... | @@ -211,11 +217,11 @@ public class NettyMessaging implements MessagingService { | ... | @@ -211,11 +217,11 @@ public class NettyMessaging implements MessagingService { |
211 | localEp, | 217 | localEp, |
212 | REPLY_MESSAGE_TYPE, | 218 | REPLY_MESSAGE_TYPE, |
213 | result); | 219 | result); |
214 | - try { | 220 | + sendAsync(message.sender(), response).whenComplete((r, e) -> { |
215 | - sendAsync(message.sender(), response); | 221 | + if (e != null) { |
216 | - } catch (IOException e) { | ||
217 | log.debug("Failed to respond", e); | 222 | log.debug("Failed to respond", e); |
218 | } | 223 | } |
224 | + }); | ||
219 | } | 225 | } |
220 | }); | 226 | }); |
221 | }); | 227 | }); | ... | ... |
... | @@ -138,29 +138,30 @@ public class IOLoopMessaging implements MessagingService { | ... | @@ -138,29 +138,30 @@ public class IOLoopMessaging implements MessagingService { |
138 | 138 | ||
139 | 139 | ||
140 | @Override | 140 | @Override |
141 | - public void sendAsync(Endpoint ep, String type, byte[] payload) throws IOException { | 141 | + public CompletableFuture<Void> sendAsync(Endpoint ep, String type, byte[] payload) { |
142 | DefaultMessage message = new DefaultMessage( | 142 | DefaultMessage message = new DefaultMessage( |
143 | messageIdGenerator.incrementAndGet(), | 143 | messageIdGenerator.incrementAndGet(), |
144 | localEp, | 144 | localEp, |
145 | type, | 145 | type, |
146 | payload); | 146 | payload); |
147 | - sendAsync(ep, message); | 147 | + return sendAsync(ep, message); |
148 | } | 148 | } |
149 | 149 | ||
150 | - protected void sendAsync(Endpoint ep, DefaultMessage message) throws IOException { | 150 | + protected CompletableFuture<Void> sendAsync(Endpoint ep, DefaultMessage message) { |
151 | + CompletableFuture<Void> future = new CompletableFuture<>(); | ||
151 | if (ep.equals(localEp)) { | 152 | if (ep.equals(localEp)) { |
152 | dispatchLocally(message); | 153 | dispatchLocally(message); |
153 | - return; | 154 | + future.complete(null); |
155 | + return future; | ||
154 | } | 156 | } |
155 | 157 | ||
156 | DefaultMessageStream stream = null; | 158 | DefaultMessageStream stream = null; |
157 | try { | 159 | try { |
158 | stream = streams.borrowObject(ep); | 160 | stream = streams.borrowObject(ep); |
159 | - } catch (Exception e) { | ||
160 | - throw new IOException(e); | ||
161 | - } | ||
162 | - try { | ||
163 | stream.write(message); | 161 | stream.write(message); |
162 | + future.complete(null); | ||
163 | + } catch (Exception e) { | ||
164 | + future.completeExceptionally(e); | ||
164 | } finally { | 165 | } finally { |
165 | try { | 166 | try { |
166 | streams.returnObject(ep, stream); | 167 | streams.returnObject(ep, stream); |
... | @@ -168,6 +169,7 @@ public class IOLoopMessaging implements MessagingService { | ... | @@ -168,6 +169,7 @@ public class IOLoopMessaging implements MessagingService { |
168 | log.warn("Failed to return stream to pool"); | 169 | log.warn("Failed to return stream to pool"); |
169 | } | 170 | } |
170 | } | 171 | } |
172 | + return future; | ||
171 | } | 173 | } |
172 | 174 | ||
173 | @Override | 175 | @Override |
... | @@ -202,30 +204,30 @@ public class IOLoopMessaging implements MessagingService { | ... | @@ -202,30 +204,30 @@ public class IOLoopMessaging implements MessagingService { |
202 | localEp, | 204 | localEp, |
203 | REPLY_MESSAGE_TYPE, | 205 | REPLY_MESSAGE_TYPE, |
204 | responsePayload); | 206 | responsePayload); |
205 | - try { | 207 | + sendAsync(message.sender(), response).whenComplete((result, error) -> { |
206 | - sendAsync(message.sender(), response); | 208 | + log.debug("Failed to respond", error); |
207 | - } catch (IOException e) { | 209 | + }); |
208 | - log.debug("Failed to respond", e); | ||
209 | - } | ||
210 | } | 210 | } |
211 | })); | 211 | })); |
212 | } | 212 | } |
213 | 213 | ||
214 | @Override | 214 | @Override |
215 | public void registerHandler(String type, Function<byte[], CompletableFuture<byte[]>> handler) { | 215 | public void registerHandler(String type, Function<byte[], CompletableFuture<byte[]>> handler) { |
216 | - handlers.put(type, message -> handler.apply(message.payload()).whenComplete((result, error) -> { | 216 | + handlers.put(type, message -> { |
217 | + handler.apply(message.payload()).whenComplete((result, error) -> { | ||
217 | if (error == null) { | 218 | if (error == null) { |
218 | DefaultMessage response = new DefaultMessage(message.id(), | 219 | DefaultMessage response = new DefaultMessage(message.id(), |
219 | localEp, | 220 | localEp, |
220 | REPLY_MESSAGE_TYPE, | 221 | REPLY_MESSAGE_TYPE, |
221 | result); | 222 | result); |
222 | - try { | 223 | + sendAsync(message.sender(), response).whenComplete((r, e) -> { |
223 | - sendAsync(message.sender(), response); | 224 | + if (e != null) { |
224 | - } catch (IOException e) { | ||
225 | log.debug("Failed to respond", e); | 225 | log.debug("Failed to respond", e); |
226 | } | 226 | } |
227 | + }); | ||
227 | } | 228 | } |
228 | - })); | 229 | + }); |
230 | + }); | ||
229 | } | 231 | } |
230 | 232 | ||
231 | @Override | 233 | @Override | ... | ... |
-
Please register or login to post a comment