getFlowEntries now operates correctly in a distributed setting
Showing
2 changed files
with
44 additions
and
1 deletions
... | @@ -11,6 +11,7 @@ import java.util.Arrays; | ... | @@ -11,6 +11,7 @@ import java.util.Arrays; |
11 | import java.util.Collection; | 11 | import java.util.Collection; |
12 | import java.util.Collections; | 12 | import java.util.Collections; |
13 | import java.util.Map; | 13 | import java.util.Map; |
14 | +import java.util.Set; | ||
14 | import java.util.concurrent.ExecutorService; | 15 | import java.util.concurrent.ExecutorService; |
15 | import java.util.concurrent.Executors; | 16 | import java.util.concurrent.Executors; |
16 | import java.util.concurrent.Future; | 17 | import java.util.concurrent.Future; |
... | @@ -159,6 +160,21 @@ public class DistributedFlowRuleStore | ... | @@ -159,6 +160,21 @@ public class DistributedFlowRuleStore |
159 | } | 160 | } |
160 | }); | 161 | }); |
161 | 162 | ||
163 | + clusterCommunicator.addSubscriber(GET_DEVICE_FLOW_ENTRIES, new ClusterMessageHandler() { | ||
164 | + | ||
165 | + @Override | ||
166 | + public void handle(ClusterMessage message) { | ||
167 | + DeviceId deviceId = SERIALIZER.decode(message.payload()); | ||
168 | + log.info("Received get flow entries request for {} from {}", deviceId, message.sender()); | ||
169 | + Set<FlowEntry> flowEntries = getFlowEntriesInternal(deviceId); | ||
170 | + try { | ||
171 | + message.respond(SERIALIZER.encode(flowEntries)); | ||
172 | + } catch (IOException e) { | ||
173 | + log.error("Failed to respond to peer's getFlowEntries request", e); | ||
174 | + } | ||
175 | + } | ||
176 | + }); | ||
177 | + | ||
162 | log.info("Started"); | 178 | log.info("Started"); |
163 | } | 179 | } |
164 | 180 | ||
... | @@ -217,9 +233,33 @@ public class DistributedFlowRuleStore | ... | @@ -217,9 +233,33 @@ public class DistributedFlowRuleStore |
217 | 233 | ||
218 | @Override | 234 | @Override |
219 | public synchronized Iterable<FlowEntry> getFlowEntries(DeviceId deviceId) { | 235 | public synchronized Iterable<FlowEntry> getFlowEntries(DeviceId deviceId) { |
236 | + | ||
237 | + ReplicaInfo replicaInfo = replicaInfoManager.getReplicaInfoFor(deviceId); | ||
238 | + if (replicaInfo.master().get().equals(clusterService.getLocalNode().id())) { | ||
239 | + return getFlowEntriesInternal(deviceId); | ||
240 | + } | ||
241 | + | ||
242 | + log.info("Forwarding getFlowEntries to {}, which is the primary (master) for device {}", | ||
243 | + replicaInfo.master().orNull(), deviceId); | ||
244 | + | ||
245 | + ClusterMessage message = new ClusterMessage( | ||
246 | + clusterService.getLocalNode().id(), | ||
247 | + GET_DEVICE_FLOW_ENTRIES, | ||
248 | + SERIALIZER.encode(deviceId)); | ||
249 | + | ||
250 | + try { | ||
251 | + ClusterMessageResponse response = clusterCommunicator.sendAndReceive(message, replicaInfo.master().get()); | ||
252 | + return SERIALIZER.decode(response.get(FLOW_RULE_STORE_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)); | ||
253 | + } catch (IOException | TimeoutException e) { | ||
254 | + // FIXME: throw a FlowStoreException | ||
255 | + throw new RuntimeException(e); | ||
256 | + } | ||
257 | + } | ||
258 | + | ||
259 | + private Set<FlowEntry> getFlowEntriesInternal(DeviceId deviceId) { | ||
220 | Collection<? extends FlowEntry> rules = flowEntries.get(deviceId); | 260 | Collection<? extends FlowEntry> rules = flowEntries.get(deviceId); |
221 | if (rules == null) { | 261 | if (rules == null) { |
222 | - return Collections.emptyList(); | 262 | + return Collections.emptySet(); |
223 | } | 263 | } |
224 | return ImmutableSet.copyOf(rules); | 264 | return ImmutableSet.copyOf(rules); |
225 | } | 265 | } | ... | ... |
... | @@ -13,4 +13,7 @@ public final class FlowStoreMessageSubjects { | ... | @@ -13,4 +13,7 @@ public final class FlowStoreMessageSubjects { |
13 | 13 | ||
14 | public static final MessageSubject GET_FLOW_ENTRY | 14 | public static final MessageSubject GET_FLOW_ENTRY |
15 | = new MessageSubject("peer-forward-get-flow-entry"); | 15 | = new MessageSubject("peer-forward-get-flow-entry"); |
16 | + | ||
17 | + public static final MessageSubject GET_DEVICE_FLOW_ENTRIES | ||
18 | + = new MessageSubject("peer-forward-get-device-flow-entries"); | ||
16 | } | 19 | } | ... | ... |
-
Please register or login to post a comment