aboutsummaryrefslogtreecommitdiffstats
path: root/framework/src/onos/incubator/net/src/main/java/org/onosproject/incubator/net/meter/impl/MeterManager.java
diff options
context:
space:
mode:
Diffstat (limited to 'framework/src/onos/incubator/net/src/main/java/org/onosproject/incubator/net/meter/impl/MeterManager.java')
-rw-r--r--framework/src/onos/incubator/net/src/main/java/org/onosproject/incubator/net/meter/impl/MeterManager.java37
1 files changed, 26 insertions, 11 deletions
diff --git a/framework/src/onos/incubator/net/src/main/java/org/onosproject/incubator/net/meter/impl/MeterManager.java b/framework/src/onos/incubator/net/src/main/java/org/onosproject/incubator/net/meter/impl/MeterManager.java
index 575a7153..5c5c11cd 100644
--- a/framework/src/onos/incubator/net/src/main/java/org/onosproject/incubator/net/meter/impl/MeterManager.java
+++ b/framework/src/onos/incubator/net/src/main/java/org/onosproject/incubator/net/meter/impl/MeterManager.java
@@ -15,6 +15,7 @@
*/
package org.onosproject.incubator.net.meter.impl;
+import com.google.common.collect.Maps;
import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Deactivate;
@@ -27,6 +28,7 @@ import org.onosproject.net.meter.Meter;
import org.onosproject.net.meter.MeterEvent;
import org.onosproject.net.meter.MeterFailReason;
import org.onosproject.net.meter.MeterId;
+import org.onosproject.net.meter.MeterKey;
import org.onosproject.net.meter.MeterListener;
import org.onosproject.net.meter.MeterOperation;
import org.onosproject.net.meter.MeterProvider;
@@ -61,7 +63,7 @@ public class MeterManager extends AbstractListenerProviderRegistry<MeterEvent, M
MeterProvider, MeterProviderService>
implements MeterService, MeterProviderRegistry {
- private final String meterIdentifier = "meter-id-counter";
+ private static final String METERCOUNTERIDENTIFIER = "meter-id-counter-%s";
private final Logger log = getLogger(getClass());
private final MeterStoreDelegate delegate = new InternalMeterStoreDelegate();
@@ -71,15 +73,13 @@ public class MeterManager extends AbstractListenerProviderRegistry<MeterEvent, M
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected MeterStore store;
- private AtomicCounter meterIdCounter;
+ private Map<DeviceId, AtomicCounter> meterIdCounters
+ = Maps.newConcurrentMap();
private TriConsumer<MeterRequest, MeterStoreResult, Throwable> onComplete;
@Activate
public void activate() {
- meterIdCounter = storageService.atomicCounterBuilder()
- .withName(meterIdentifier)
- .build();
store.setDelegate(delegate);
@@ -115,11 +115,13 @@ public class MeterManager extends AbstractListenerProviderRegistry<MeterEvent, M
@Override
public Meter submit(MeterRequest request) {
+ MeterId id = allocateMeterId(request.deviceId());
+
Meter.Builder mBuilder = DefaultMeter.builder()
.forDevice(request.deviceId())
.fromApp(request.appId())
.withBands(request.bands())
- .withId(allocateMeterId())
+ .withId(id)
.withUnit(request.unit());
if (request.isBurst()) {
@@ -152,8 +154,9 @@ public class MeterManager extends AbstractListenerProviderRegistry<MeterEvent, M
}
@Override
- public Meter getMeter(MeterId id) {
- return store.getMeter(id);
+ public Meter getMeter(DeviceId deviceId, MeterId id) {
+ MeterKey key = MeterKey.key(deviceId, id);
+ return store.getMeter(key);
}
@Override
@@ -161,9 +164,21 @@ public class MeterManager extends AbstractListenerProviderRegistry<MeterEvent, M
return store.getAllMeters();
}
- private MeterId allocateMeterId() {
- // FIXME: This will break one day.
- return MeterId.meterId((int) meterIdCounter.incrementAndGet());
+ private MeterId allocateMeterId(DeviceId deviceId) {
+ long id = meterIdCounters.compute(deviceId, (k, v) -> {
+ if (v == null) {
+ return allocateCounter(k);
+ }
+ return v;
+ }).incrementAndGet();
+
+ return MeterId.meterId((int) id);
+ }
+
+ private AtomicCounter allocateCounter(DeviceId deviceId) {
+ return storageService.atomicCounterBuilder()
+ .withName(String.format(METERCOUNTERIDENTIFIER, deviceId))
+ .build();
}
private class InternalMeterProviderService