Committed by
Gerrit Code Review
Added Meter object accounting
Change-Id: I2a3b88ffd1756b738e197943b3e02771f5729e45
Showing
4 changed files
with
40 additions
and
3 deletions
... | @@ -80,4 +80,11 @@ public interface MeterStore extends Store<MeterEvent, MeterStoreDelegate> { | ... | @@ -80,4 +80,11 @@ public interface MeterStore extends Store<MeterEvent, MeterStoreDelegate> { |
80 | * @param reason a failure reason | 80 | * @param reason a failure reason |
81 | */ | 81 | */ |
82 | void failedMeter(MeterOperation op, MeterFailReason reason); | 82 | void failedMeter(MeterOperation op, MeterFailReason reason); |
83 | + | ||
84 | + /** | ||
85 | + * Delete this meter immediately. | ||
86 | + * @param m a meter | ||
87 | + */ | ||
88 | + void deleteMeterNow(Meter m); | ||
89 | + | ||
83 | } | 90 | } | ... | ... |
... | @@ -45,6 +45,8 @@ import org.onosproject.store.service.StorageService; | ... | @@ -45,6 +45,8 @@ import org.onosproject.store.service.StorageService; |
45 | import org.slf4j.Logger; | 45 | import org.slf4j.Logger; |
46 | 46 | ||
47 | import java.util.Collection; | 47 | import java.util.Collection; |
48 | +import java.util.Map; | ||
49 | +import java.util.stream.Collectors; | ||
48 | 50 | ||
49 | import static org.slf4j.LoggerFactory.getLogger; | 51 | import static org.slf4j.LoggerFactory.getLogger; |
50 | 52 | ||
... | @@ -170,7 +172,25 @@ public class MeterManager extends AbstractListenerProviderRegistry<MeterEvent, M | ... | @@ -170,7 +172,25 @@ public class MeterManager extends AbstractListenerProviderRegistry<MeterEvent, M |
170 | 172 | ||
171 | @Override | 173 | @Override |
172 | public void pushMeterMetrics(DeviceId deviceId, Collection<Meter> meterEntries) { | 174 | public void pushMeterMetrics(DeviceId deviceId, Collection<Meter> meterEntries) { |
173 | - meterEntries.forEach(m -> store.updateMeterState(m)); | 175 | + //FIXME: FOLLOWING CODE CANNOT BE TESTED UNTIL SOMETHING THAT |
176 | + //FIXME: IMPLEMENTS METERS EXISTS | ||
177 | + Map<MeterId, Meter> storedMeterMap = store.getAllMeters().stream() | ||
178 | + .collect(Collectors.toMap(Meter::id, m -> m)); | ||
179 | + | ||
180 | + meterEntries.stream() | ||
181 | + .filter(m -> storedMeterMap.remove(m.id()) != null) | ||
182 | + .forEach(m -> store.updateMeterState(m)); | ||
183 | + | ||
184 | + storedMeterMap.values().stream().forEach(m -> { | ||
185 | + if (m.state() == MeterState.PENDING_ADD) { | ||
186 | + provider().performMeterOperation(m.deviceId(), | ||
187 | + new MeterOperation(m, | ||
188 | + MeterOperation.Type.ADD, | ||
189 | + null)); | ||
190 | + } else { | ||
191 | + store.deleteMeterNow(m); | ||
192 | + } | ||
193 | + }); | ||
174 | } | 194 | } |
175 | } | 195 | } |
176 | 196 | ... | ... |
... | @@ -198,6 +198,12 @@ public class DistributedMeterStore extends AbstractStore<MeterEvent, MeterStoreD | ... | @@ -198,6 +198,12 @@ public class DistributedMeterStore extends AbstractStore<MeterEvent, MeterStoreD |
198 | new MeterData(v.meter(), reason, v.origin())); | 198 | new MeterData(v.meter(), reason, v.origin())); |
199 | } | 199 | } |
200 | 200 | ||
201 | + @Override | ||
202 | + public void deleteMeterNow(Meter m) { | ||
203 | + futures.remove(m.id()); | ||
204 | + meters.remove(m.id()); | ||
205 | + } | ||
206 | + | ||
201 | private class InternalMapEventListener implements MapEventListener<MeterId, MeterData> { | 207 | private class InternalMapEventListener implements MapEventListener<MeterId, MeterData> { |
202 | @Override | 208 | @Override |
203 | public void event(MapEvent<MeterId, MeterData> event) { | 209 | public void event(MapEvent<MeterId, MeterData> event) { |
... | @@ -217,12 +223,12 @@ public class DistributedMeterStore extends AbstractStore<MeterEvent, MeterStoreD | ... | @@ -217,12 +223,12 @@ public class DistributedMeterStore extends AbstractStore<MeterEvent, MeterStoreD |
217 | } else if (data.reason().isPresent() && local.equals(data.origin())) { | 223 | } else if (data.reason().isPresent() && local.equals(data.origin())) { |
218 | MeterStoreResult msr = MeterStoreResult.fail(data.reason().get()); | 224 | MeterStoreResult msr = MeterStoreResult.fail(data.reason().get()); |
219 | //TODO: No future -> no friend | 225 | //TODO: No future -> no friend |
220 | - futures.remove(data.meter().id()).complete(msr); | 226 | + futures.get(data.meter().id()).complete(msr); |
221 | } | 227 | } |
222 | break; | 228 | break; |
223 | case ADDED: | 229 | case ADDED: |
224 | case REMOVED: | 230 | case REMOVED: |
225 | - if (local.equals(data.origin())) { | 231 | + if (local.equals(data.origin()) && data.meter().state() == MeterState.PENDING_REMOVE) { |
226 | futures.remove(data.meter().id()).complete(MeterStoreResult.success()); | 232 | futures.remove(data.meter().id()).complete(MeterStoreResult.success()); |
227 | } | 233 | } |
228 | break; | 234 | break; | ... | ... |
... | @@ -306,6 +306,9 @@ public class OpenFlowControllerImpl implements OpenFlowController { | ... | @@ -306,6 +306,9 @@ public class OpenFlowControllerImpl implements OpenFlowController { |
306 | case PORT: | 306 | case PORT: |
307 | executorMsgs.submit(new OFMessageHandler(dpid, reply)); | 307 | executorMsgs.submit(new OFMessageHandler(dpid, reply)); |
308 | break; | 308 | break; |
309 | + case METER: | ||
310 | + executorMsgs.submit(new OFMessageHandler(dpid, reply)); | ||
311 | + break; | ||
309 | case EXPERIMENTER: | 312 | case EXPERIMENTER: |
310 | if (reply instanceof OFCalientFlowStatsReply) { | 313 | if (reply instanceof OFCalientFlowStatsReply) { |
311 | // Convert Calient flow statistics to regular flow stats | 314 | // Convert Calient flow statistics to regular flow stats |
... | @@ -353,6 +356,7 @@ public class OpenFlowControllerImpl implements OpenFlowController { | ... | @@ -353,6 +356,7 @@ public class OpenFlowControllerImpl implements OpenFlowController { |
353 | } | 356 | } |
354 | break; | 357 | break; |
355 | default: | 358 | default: |
359 | + log.warn("Discarding unknown stats reply type {}", reply.getStatsType()); | ||
356 | break; | 360 | break; |
357 | } | 361 | } |
358 | break; | 362 | break; | ... | ... |
-
Please register or login to post a comment