Committed by
Gerrit Code Review
ONOS-3763 Change flow state to PENDING_ADD when retrying
Will emit a RULE_UPDATE event if the state is changed. Update unit test accordingly. Change-Id: Ie84778c62f52f15b7636d41db246814145e73f77
Showing
5 changed files
with
43 additions
and
2 deletions
... | @@ -97,6 +97,16 @@ public interface FlowRuleStore extends Store<FlowRuleBatchEvent, FlowRuleStoreDe | ... | @@ -97,6 +97,16 @@ public interface FlowRuleStore extends Store<FlowRuleBatchEvent, FlowRuleStoreDe |
97 | FlowRuleEvent removeFlowRule(FlowEntry rule); | 97 | FlowRuleEvent removeFlowRule(FlowEntry rule); |
98 | 98 | ||
99 | /** | 99 | /** |
100 | + * Marks a flow rule as PENDING_ADD during retry. | ||
101 | + * | ||
102 | + * Emits flow_update event if the state is changed | ||
103 | + * | ||
104 | + * @param rule the flow rule that is retrying | ||
105 | + * @return flow_updated event, or null if nothing updated | ||
106 | + */ | ||
107 | + FlowRuleEvent pendingFlowRule(FlowEntry rule); | ||
108 | + | ||
109 | + /** | ||
100 | * Updates the flow table statistics of the specified device using | 110 | * Updates the flow table statistics of the specified device using |
101 | * the given statistics. | 111 | * the given statistics. |
102 | * | 112 | * | ... | ... |
... | @@ -258,6 +258,23 @@ public class SimpleFlowRuleStore | ... | @@ -258,6 +258,23 @@ public class SimpleFlowRuleStore |
258 | } | 258 | } |
259 | 259 | ||
260 | @Override | 260 | @Override |
261 | + public FlowRuleEvent pendingFlowRule(FlowEntry rule) { | ||
262 | + List<StoredFlowEntry> entries = getFlowEntries(rule.deviceId(), rule.id()); | ||
263 | + synchronized (entries) { | ||
264 | + for (StoredFlowEntry entry : entries) { | ||
265 | + if (entry.equals(rule) && | ||
266 | + entry.state() != FlowEntryState.PENDING_ADD) { | ||
267 | + synchronized (entry) { | ||
268 | + entry.setState(FlowEntryState.PENDING_ADD); | ||
269 | + return new FlowRuleEvent(Type.RULE_UPDATED, rule); | ||
270 | + } | ||
271 | + } | ||
272 | + } | ||
273 | + } | ||
274 | + return null; | ||
275 | + } | ||
276 | + | ||
277 | + @Override | ||
261 | public void storeBatch( | 278 | public void storeBatch( |
262 | FlowRuleBatchOperation operation) { | 279 | FlowRuleBatchOperation operation) { |
263 | List<FlowRuleBatchEntry> toAdd = new ArrayList<>(); | 280 | List<FlowRuleBatchEntry> toAdd = new ArrayList<>(); | ... | ... |
... | @@ -305,6 +305,7 @@ public class FlowRuleManager | ... | @@ -305,6 +305,7 @@ public class FlowRuleManager |
305 | break; | 305 | break; |
306 | case ADDED: | 306 | case ADDED: |
307 | case PENDING_ADD: | 307 | case PENDING_ADD: |
308 | + event = store.pendingFlowRule(flowRule); | ||
308 | try { | 309 | try { |
309 | frp.applyFlowRule(flowRule); | 310 | frp.applyFlowRule(flowRule); |
310 | } catch (UnsupportedOperationException e) { | 311 | } catch (UnsupportedOperationException e) { | ... | ... |
... | @@ -206,7 +206,7 @@ public class FlowRuleManagerTest { | ... | @@ -206,7 +206,7 @@ public class FlowRuleManagerTest { |
206 | assertEquals("should still be 2 rules", 2, flowCount()); | 206 | assertEquals("should still be 2 rules", 2, flowCount()); |
207 | 207 | ||
208 | providerService.pushFlowMetrics(DID, ImmutableList.of(fe1)); | 208 | providerService.pushFlowMetrics(DID, ImmutableList.of(fe1)); |
209 | - validateEvents(RULE_UPDATED); | 209 | + validateEvents(RULE_UPDATED, RULE_UPDATED); |
210 | } | 210 | } |
211 | 211 | ||
212 | private boolean validateState(Map<FlowRule, FlowEntryState> expected) { | 212 | private boolean validateState(Map<FlowRule, FlowEntryState> expected) { |
... | @@ -293,7 +293,7 @@ public class FlowRuleManagerTest { | ... | @@ -293,7 +293,7 @@ public class FlowRuleManagerTest { |
293 | service.applyFlowRules(f3); | 293 | service.applyFlowRules(f3); |
294 | 294 | ||
295 | providerService.pushFlowMetrics(DID, Collections.singletonList(fe3)); | 295 | providerService.pushFlowMetrics(DID, Collections.singletonList(fe3)); |
296 | - validateEvents(RULE_ADD_REQUESTED, RULE_ADDED); | 296 | + validateEvents(RULE_ADD_REQUESTED, RULE_ADDED, RULE_UPDATED); |
297 | 297 | ||
298 | providerService.flowRemoved(fe3); | 298 | providerService.flowRemoved(fe3); |
299 | validateEvents(); | 299 | validateEvents(); | ... | ... |
... | @@ -526,6 +526,19 @@ public class NewDistributedFlowRuleStore | ... | @@ -526,6 +526,19 @@ public class NewDistributedFlowRuleStore |
526 | } | 526 | } |
527 | 527 | ||
528 | @Override | 528 | @Override |
529 | + public FlowRuleEvent pendingFlowRule(FlowEntry rule) { | ||
530 | + if (mastershipService.isLocalMaster(rule.deviceId())) { | ||
531 | + StoredFlowEntry stored = flowTable.getFlowEntry(rule); | ||
532 | + if (stored != null && | ||
533 | + stored.state() != FlowEntryState.PENDING_ADD) { | ||
534 | + stored.setState(FlowEntryState.PENDING_ADD); | ||
535 | + return new FlowRuleEvent(Type.RULE_UPDATED, rule); | ||
536 | + } | ||
537 | + } | ||
538 | + return null; | ||
539 | + } | ||
540 | + | ||
541 | + @Override | ||
529 | public FlowRuleEvent addOrUpdateFlowRule(FlowEntry rule) { | 542 | public FlowRuleEvent addOrUpdateFlowRule(FlowEntry rule) { |
530 | NodeId master = mastershipService.getMasterFor(rule.deviceId()); | 543 | NodeId master = mastershipService.getMasterFor(rule.deviceId()); |
531 | if (Objects.equals(local, master)) { | 544 | if (Objects.equals(local, master)) { | ... | ... |
-
Please register or login to post a comment