flow service idle timeout based on wall clock
Change-Id: Ifb2c15ab9e5c5b07c58f3194ff2152cef650a6ae
Showing
1 changed file
with
12 additions
and
15 deletions
... | @@ -7,7 +7,6 @@ import java.util.Iterator; | ... | @@ -7,7 +7,6 @@ import java.util.Iterator; |
7 | import java.util.List; | 7 | import java.util.List; |
8 | import java.util.Map; | 8 | import java.util.Map; |
9 | import java.util.concurrent.ConcurrentHashMap; | 9 | import java.util.concurrent.ConcurrentHashMap; |
10 | -import java.util.concurrent.atomic.AtomicInteger; | ||
11 | 10 | ||
12 | import org.apache.felix.scr.annotations.Activate; | 11 | import org.apache.felix.scr.annotations.Activate; |
13 | import org.apache.felix.scr.annotations.Component; | 12 | import org.apache.felix.scr.annotations.Component; |
... | @@ -62,7 +61,7 @@ implements FlowRuleService, FlowRuleProviderRegistry { | ... | @@ -62,7 +61,7 @@ implements FlowRuleService, FlowRuleProviderRegistry { |
62 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 61 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
63 | protected DeviceService deviceService; | 62 | protected DeviceService deviceService; |
64 | 63 | ||
65 | - private final Map<FlowRule, AtomicInteger> deadRounds = new ConcurrentHashMap<>(); | 64 | + private final Map<FlowRule, Long> idleTime = new ConcurrentHashMap<>(); |
66 | 65 | ||
67 | @Activate | 66 | @Activate |
68 | public void activate() { | 67 | public void activate() { |
... | @@ -89,7 +88,7 @@ implements FlowRuleService, FlowRuleProviderRegistry { | ... | @@ -89,7 +88,7 @@ implements FlowRuleService, FlowRuleProviderRegistry { |
89 | FlowRule f = flowRules[i]; | 88 | FlowRule f = flowRules[i]; |
90 | final Device device = deviceService.getDevice(f.deviceId()); | 89 | final Device device = deviceService.getDevice(f.deviceId()); |
91 | final FlowRuleProvider frp = getProvider(device.providerId()); | 90 | final FlowRuleProvider frp = getProvider(device.providerId()); |
92 | - deadRounds.put(f, new AtomicInteger(0)); | 91 | + idleTime.put(f, System.currentTimeMillis()); |
93 | store.storeFlowRule(f); | 92 | store.storeFlowRule(f); |
94 | frp.applyFlowRule(f); | 93 | frp.applyFlowRule(f); |
95 | } | 94 | } |
... | @@ -104,7 +103,7 @@ implements FlowRuleService, FlowRuleProviderRegistry { | ... | @@ -104,7 +103,7 @@ implements FlowRuleService, FlowRuleProviderRegistry { |
104 | f = flowRules[i]; | 103 | f = flowRules[i]; |
105 | device = deviceService.getDevice(f.deviceId()); | 104 | device = deviceService.getDevice(f.deviceId()); |
106 | frp = getProvider(device.providerId()); | 105 | frp = getProvider(device.providerId()); |
107 | - deadRounds.remove(f); | 106 | + idleTime.remove(f); |
108 | store.deleteFlowRule(f); | 107 | store.deleteFlowRule(f); |
109 | frp.removeFlowRule(f); | 108 | frp.removeFlowRule(f); |
110 | } | 109 | } |
... | @@ -225,7 +224,7 @@ implements FlowRuleService, FlowRuleProviderRegistry { | ... | @@ -225,7 +224,7 @@ implements FlowRuleService, FlowRuleProviderRegistry { |
225 | checkNotNull(flowRule, FLOW_RULE_NULL); | 224 | checkNotNull(flowRule, FLOW_RULE_NULL); |
226 | checkValidity(); | 225 | checkValidity(); |
227 | 226 | ||
228 | - if (deadRounds.containsKey(flowRule) && | 227 | + if (idleTime.containsKey(flowRule) && |
229 | checkRuleLiveness(flowRule, store.getFlowRule(flowRule))) { | 228 | checkRuleLiveness(flowRule, store.getFlowRule(flowRule))) { |
230 | 229 | ||
231 | FlowRuleEvent event = store.addOrUpdateFlowRule(flowRule); | 230 | FlowRuleEvent event = store.addOrUpdateFlowRule(flowRule); |
... | @@ -242,16 +241,14 @@ implements FlowRuleService, FlowRuleProviderRegistry { | ... | @@ -242,16 +241,14 @@ implements FlowRuleService, FlowRuleProviderRegistry { |
242 | } | 241 | } |
243 | 242 | ||
244 | private boolean checkRuleLiveness(FlowRule swRule, FlowRule storedRule) { | 243 | private boolean checkRuleLiveness(FlowRule swRule, FlowRule storedRule) { |
245 | - return true; | 244 | + long timeout = storedRule.timeout() * 1000; |
246 | -// int timeout = storedRule.timeout(); | 245 | + Long currentTime = System.currentTimeMillis(); |
247 | -// if (storedRule.packets() != swRule.packets()) { | 246 | + if (storedRule.packets() != swRule.packets()) { |
248 | -// deadRounds.get(swRule).set(0); | 247 | + idleTime.put(swRule, currentTime); |
249 | -// return true; | 248 | + return true; |
250 | -// } | 249 | + } |
251 | -// | 250 | + return (currentTime - idleTime.get(swRule)) <= timeout; |
252 | -// return (deadRounds.get(swRule).getAndIncrement() * | 251 | + |
253 | -// FlowRuleProvider.POLL_INTERVAL) <= timeout; | ||
254 | -// | ||
255 | } | 252 | } |
256 | 253 | ||
257 | // Posts the specified event to the local event dispatcher. | 254 | // Posts the specified event to the local event dispatcher. | ... | ... |
-
Please register or login to post a comment