MeterManager, check max meters before requesting a new meter
Change-Id: I5a5d55ede89bee46c6442b885fe64f231a14e165
diff --git a/incubator/net/src/main/java/org/onosproject/incubator/net/meter/impl/MeterManager.java b/incubator/net/src/main/java/org/onosproject/incubator/net/meter/impl/MeterManager.java
index 37251f6..db5cff0 100644
--- a/incubator/net/src/main/java/org/onosproject/incubator/net/meter/impl/MeterManager.java
+++ b/incubator/net/src/main/java/org/onosproject/incubator/net/meter/impl/MeterManager.java
@@ -30,6 +30,7 @@
import org.onosproject.net.meter.MeterEvent;
import org.onosproject.net.meter.MeterFailReason;
import org.onosproject.net.meter.MeterFeatures;
+import org.onosproject.net.meter.MeterFeaturesKey;
import org.onosproject.net.meter.MeterId;
import org.onosproject.net.meter.MeterKey;
import org.onosproject.net.meter.MeterListener;
@@ -173,14 +174,26 @@
}
private MeterId allocateMeterId(DeviceId deviceId) {
+ long maxMeters = store.getMaxMeters(MeterFeaturesKey.key(deviceId));
+
+ if (maxMeters == 0L) {
+ throw new IllegalStateException("Meters not supported by device " + deviceId);
+ }
+
+ final long mmeters = maxMeters;
long id = meterIdCounters.compute(deviceId, (k, v) -> {
if (v == null) {
return allocateCounter(k);
}
+ if (v.get() >= mmeters) {
+ throw new IllegalStateException("Maximum number of meters " +
+ meterIdCounters.get(deviceId).get() +
+ " reached for device " + deviceId);
+ }
return v;
}).incrementAndGet();
- return MeterId.meterId((int) id);
+ return MeterId.meterId(id);
}
private AtomicCounter allocateCounter(DeviceId deviceId) {