[VOL-3959] Reconciling on MDS match: Replace timer approach by IPC
Change-Id: I550b212288e6853b6fd1189cf1977dd43a230af0
diff --git a/internal/pkg/onuadaptercore/device_handler.go b/internal/pkg/onuadaptercore/device_handler.go
index b9b8504..2d4d67d 100644
--- a/internal/pkg/onuadaptercore/device_handler.go
+++ b/internal/pkg/onuadaptercore/device_handler.go
@@ -216,6 +216,9 @@
reconciling uint8
mutexReconcilingFlag sync.RWMutex
chReconcilingFinished chan bool //channel to indicate that reconciling has been finished
+ reconcilingFlows bool
+ mutexReconcilingFlowsFlag sync.RWMutex
+ chReconcilingFlowsFinished chan bool //channel to indicate that reconciling of flows has been finished
ReadyForSpecificOmciConfig bool
deletionInProgress bool
mutexDeletionInProgressFlag sync.RWMutex
@@ -249,6 +252,8 @@
dh.UniVlanConfigFsmMap = make(map[uint8]*UniVlanConfigFsm)
dh.reconciling = cNoReconciling
dh.chReconcilingFinished = make(chan bool)
+ dh.reconcilingFlows = false
+ dh.chReconcilingFlowsFinished = make(chan bool)
dh.ReadyForSpecificOmciConfig = false
dh.deletionInProgress = false
@@ -926,6 +931,7 @@
}
flowsFound = true
flowsProcessed := 0
+ dh.setReconcilingFlows(true)
for _, flowData := range uniData.PersFlowParams {
logger.Debugw(ctx, "reconciling - add flow with cookie slice", log.Fields{"device-id": dh.deviceID, "cookies": flowData.CookieSlice})
//the slice can be passed 'by value' here, - which internally passes its reference copy
@@ -950,6 +956,7 @@
logger.Debugw(ctx, "reconciling - flows processed", log.Fields{"device-id": dh.deviceID, "flowsProcessed": flowsProcessed,
"numUniFlows": dh.UniVlanConfigFsmMap[uniData.PersUniID].numUniFlows,
"configuredUniFlow": dh.UniVlanConfigFsmMap[uniData.PersUniID].configuredUniFlow})
+ dh.setReconcilingFlows(false)
}
if !flowsFound {
logger.Debugw(ctx, "reconciling - no flows have been stored before adapter restart - terminate reconcilement",
@@ -1663,12 +1670,7 @@
return fmt.Errorf("no valid OnuDevice: %s", dh.deviceID)
}
if includingMibSyncFsm {
- //the MibSync FSM might be active all the ONU-active time,
- // hence it must be stopped unconditionally
- pMibUlFsm := pDevEntry.pMibUploadFsm.pFsm
- if pMibUlFsm != nil {
- _ = pMibUlFsm.Event(ulEvStop) //TODO!! verify if MibSyncFsm stop-processing is sufficient (to allow it again afterwards)
- }
+ pDevEntry.CancelProcessing(ctx)
}
//MibDownload may run
pMibDlFsm := pDevEntry.pMibDownloadFsm.pFsm
@@ -3220,9 +3222,14 @@
logger.Debugw(ctx, "wait for channel signal or timeout",
log.Fields{"timeout": dh.pOpenOnuAc.maxTimeoutReconciling, "device-id": dh.deviceID})
select {
- case <-dh.chReconcilingFinished:
- logger.Debugw(ctx, "reconciling has been finished in time",
- log.Fields{"device-id": dh.deviceID})
+ case success := <-dh.chReconcilingFinished:
+ if success {
+ logger.Debugw(ctx, "reconciling has been finished in time",
+ log.Fields{"device-id": dh.deviceID})
+ } else {
+ logger.Debugw(ctx, "wait for reconciling aborted",
+ log.Fields{"device-id": dh.deviceID})
+ }
case <-time.After(dh.pOpenOnuAc.maxTimeoutReconciling):
logger.Errorw(ctx, "timeout waiting for reconciling to be finished!",
log.Fields{"device-id": dh.deviceID})
@@ -3278,3 +3285,16 @@
func (dh *deviceHandler) getDeviceReasonString() string {
return deviceReasonMap[dh.getDeviceReason()]
}
+
+func (dh *deviceHandler) setReconcilingFlows(value bool) {
+ dh.mutexReconcilingFlowsFlag.Lock()
+ dh.reconcilingFlows = value
+ dh.mutexReconcilingFlowsFlag.Unlock()
+}
+
+func (dh *deviceHandler) isReconcilingFlows() bool {
+ dh.mutexReconcilingFlowsFlag.RLock()
+ value := dh.reconcilingFlows
+ dh.mutexReconcilingFlowsFlag.RUnlock()
+ return value
+}