diff options
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.java | 37 |
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 |