[VOL-3260] Purging all meter state on OLT delete
Change-Id: I6323779d584b341d33cc91231197504b80a91fc4
diff --git a/app/src/main/java/org/opencord/olt/impl/Olt.java b/app/src/main/java/org/opencord/olt/impl/Olt.java
index fe2675e..1f3634b 100644
--- a/app/src/main/java/org/opencord/olt/impl/Olt.java
+++ b/app/src/main/java/org/opencord/olt/impl/Olt.java
@@ -83,7 +83,6 @@
import org.opencord.olt.AccessSubscriberId;
import org.opencord.olt.internalapi.AccessDeviceFlowService;
import org.opencord.olt.internalapi.AccessDeviceMeterService;
-import org.opencord.olt.internalapi.DeviceBandwidthProfile;
import org.opencord.sadis.BandwidthProfileInformation;
import org.opencord.sadis.BaseInformationService;
import org.opencord.sadis.SadisService;
@@ -695,28 +694,28 @@
// queue up the meters to be created
if (upMeterId == null) {
log.debug("Missing meter for upstream {}", upstreamBpInfo.id());
- checkAndCreateDevMeter(new DeviceBandwidthProfile(deviceId, upstreamBpInfo));
+ checkAndCreateDevMeter(deviceId, upstreamBpInfo);
}
if (downMeterId == null) {
log.debug("Missing meter for downstream {}", downstreamBpInfo.id());
- checkAndCreateDevMeter(new DeviceBandwidthProfile(deviceId, downstreamBpInfo));
+ checkAndCreateDevMeter(deviceId, downstreamBpInfo);
}
}
}
- private void checkAndCreateDevMeter(DeviceBandwidthProfile dm) {
- if (oltMeterService.isMeterPending(dm)) {
- log.debug("Meter is already pending {}", dm);
+ private void checkAndCreateDevMeter(DeviceId deviceId, BandwidthProfileInformation bwpInfo) {
+ if (oltMeterService.isMeterPending(deviceId, bwpInfo)) {
+ log.debug("Meter is already pending {} on device {}", bwpInfo, deviceId);
return;
}
- oltMeterService.addToPendingMeters(dm);
- createMeter(dm);
+ oltMeterService.addToPendingMeters(deviceId, bwpInfo);
+ createMeter(deviceId, bwpInfo);
}
- private void createMeter(DeviceBandwidthProfile dm) {
- log.debug("Creating Meter {} from queue for subscriber", dm);
+ private void createMeter(DeviceId deviceId, BandwidthProfileInformation bwpInfo) {
+ log.debug("Creating Meter with {} on {} for subscriber", bwpInfo, deviceId);
CompletableFuture<Object> meterFuture = new CompletableFuture<>();
- MeterId meterId = oltMeterService.createMeter(dm.getDevId(), dm.getBwInfo(),
+ MeterId meterId = oltMeterService.createMeter(deviceId, bwpInfo,
meterFuture);
meterFuture.thenAcceptAsync(result -> {
@@ -726,12 +725,12 @@
SubscriberFlowInfo fi = subsIterator.next();
if (result == null) {
// meter install sent to device
- log.debug("Meter {} installed for bw {}", meterId, dm.getBwInfo());
+ log.debug("Meter {} installed for bw {} on {}", meterId, bwpInfo, deviceId);
MeterId upMeterId = oltMeterService
- .getMeterIdFromBpMapping(dm.getDevId(), fi.getUpBpInfo());
+ .getMeterIdFromBpMapping(deviceId, fi.getUpBpInfo());
MeterId downMeterId = oltMeterService
- .getMeterIdFromBpMapping(dm.getDevId(), fi.getDownBpInfo());
+ .getMeterIdFromBpMapping(deviceId, fi.getDownBpInfo());
if (upMeterId != null && downMeterId != null) {
log.debug("Provisioning subscriber after meter {}" +
"installation and both meters are present " +
@@ -746,13 +745,13 @@
handleSubFlowsWithMeters(fi);
subsIterator.remove();
}
- oltMeterService.removeFromPendingMeters(new DeviceBandwidthProfile(dm.getDevId(), dm.getBwInfo()));
+ oltMeterService.removeFromPendingMeters(deviceId, bwpInfo);
} else {
// meter install failed
log.error("Addition of subscriber {} failed due to meter " +
"{} with result {}", fi, meterId, result);
subsIterator.remove();
- oltMeterService.removeFromPendingMeters(new DeviceBandwidthProfile(dm.getDevId(), dm.getBwInfo()));
+ oltMeterService.removeFromPendingMeters(deviceId, bwpInfo);
}
}
});
@@ -1054,6 +1053,8 @@
// on every instance, see how it's done in the InternalDeviceListener
// in FlowRuleManager: no mastership check for purgeOnDisconnection
flowRuleService.purgeFlowRules(devId);
+ oltFlowService.clearDeviceState(devId);
+ oltMeterService.clearDeviceState(devId);
return;
} else if (!isLocalLeader) {
log.debug("Not handling event because instance is not leader for {}", devId);
@@ -1180,6 +1181,11 @@
private void handleDeviceDisconnection(Device device, boolean sendUniEvent) {
programmedDevices.remove(device.id());
removeAllSubscribers(device.id());
+ //Handle case where OLT disconnects during subscriber provisioning
+ pendingSubscribers.removeIf(fi -> fi.getDevId().equals(device.id()));
+ oltFlowService.clearDeviceState(device.id());
+
+ //Complete meter and flow purge
flowRuleService.purgeFlowRules(device.id());
oltMeterService.clearMeters(device.id());
post(new AccessDeviceEvent(