VOL-4446: Fix etcd stale data issue post device delete
Change-Id: Ia4183438adb24ca7443627c9ab5968df6ad55dc8
diff --git a/internal/pkg/core/device_handler.go b/internal/pkg/core/device_handler.go
index 359d715..02bc895 100644
--- a/internal/pkg/core/device_handler.go
+++ b/internal/pkg/core/device_handler.go
@@ -114,6 +114,8 @@
adapterPreviouslyConnected bool
agentPreviouslyConnected bool
+
+ isDeviceDeletionInProgress bool
}
//OnuDevice represents ONU related info
@@ -1688,6 +1690,13 @@
func (dh *DeviceHandler) UpdateFlowsIncrementally(ctx context.Context, device *voltha.Device, flows *of.FlowChanges, groups *of.FlowGroupChanges, flowMetadata *voltha.FlowMetadata) error {
var errorsList []error
+
+ if dh.getDeviceDeletionInProgressFlag() {
+ // The device itself is going to be reset as part of deletion. So nothing to be done.
+ logger.Infow(ctx, "device-deletion-in-progress--not-handling-flows-or-groups", log.Fields{"device-id": device.Id})
+ return nil
+ }
+
logger.Debugw(ctx, "received-incremental-flowupdate-in-device-handler", log.Fields{"device-id": device.Id, "flows": flows, "groups": groups, "flowMetadata": flowMetadata})
errorsList = append(errorsList, dh.handleFlows(ctx, device, flows, flowMetadata)...)
errorsList = append(errorsList, dh.handleGroups(ctx, groups)...)
@@ -1855,6 +1864,9 @@
This clears up flow data and also resource map data for various
other pon resources like alloc_id and gemport_id
*/
+
+ dh.setDeviceDeletionInProgressFlag(true)
+
dh.cleanupDeviceResources(ctx)
logger.Debugw(ctx, "removed-device-from-Resource-manager-KV-store", log.Fields{"device-id": dh.device.Id})
// Stop the Stats collector
@@ -1899,15 +1911,9 @@
if err = dh.clearUNIData(ctx, &onuGemData[i]); err != nil {
logger.Errorw(ctx, "failed-to-clear-data-for-onu", log.Fields{"onu-device": onu})
}
- // Clear flowids for gem cache.
- for _, gem := range onu.GemPorts {
- dh.resourceMgr[ponPort].DeleteFlowIDsForGem(ctx, ponPort, gem)
- }
- err = dh.resourceMgr[ponPort].DelOnuGemInfo(ctx, ponPort, onu.OnuID)
- if err != nil {
- logger.Errorw(ctx, "failed-to-update-onugem-info", log.Fields{"intfid": ponPort, "onugeminfo": onuGemData})
- }
}
+ _ = dh.resourceMgr[ponPort].DeleteAllFlowIDsForGemForIntf(ctx, ponPort)
+ _ = dh.resourceMgr[ponPort].DeleteAllOnuGemInfoForIntf(ctx, ponPort)
if err := dh.resourceMgr[ponPort].Delete(ctx, ponPort); err != nil {
logger.Debug(ctx, err)
}
@@ -3114,3 +3120,15 @@
}
return svc
}
+
+func (dh *DeviceHandler) setDeviceDeletionInProgressFlag(flag bool) {
+ dh.lockDevice.Lock()
+ defer dh.lockDevice.Unlock()
+ dh.isDeviceDeletionInProgress = flag
+}
+
+func (dh *DeviceHandler) getDeviceDeletionInProgressFlag() bool {
+ dh.lockDevice.RLock()
+ defer dh.lockDevice.RUnlock()
+ return dh.isDeviceDeletionInProgress
+}