[VOL-5284] resetFsm enters race during simultaneous delete device and device down ind

Change-Id: I451d48650702ab901a03a14fa4a965939f2c8250
Signed-off-by: Sridhar Ravindra <sridhar.ravindra@radisys.com>
diff --git a/VERSION b/VERSION
index 61f7501..247519f 100755
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-2.12.0-dev3
+2.12.0-dev5
diff --git a/internal/pkg/core/device_handler.go b/internal/pkg/core/device_handler.go
index c4dd037..929d117 100755
--- a/internal/pkg/core/device_handler.go
+++ b/internal/pkg/core/device_handler.go
@@ -2290,16 +2290,31 @@
 			}
 		}
 	}
-	if dh.GetCollectorIsRunning() {
+
+	dh.mutexCollectorFlag.Lock()
+	logger.Debugw(ctx, "check-collector-is-running", log.Fields{"device-id": dh.device.Id, "flag": dh.collectorIsRunning})
+	if dh.collectorIsRunning {
 		// Stop collector routine
 		dh.stopCollector <- true
+		dh.collectorIsRunning = false
 	}
-	if dh.GetAlarmManagerIsRunning(ctx) {
+	dh.mutexCollectorFlag.Unlock()
+
+	dh.mutextAlarmManagerFlag.Lock()
+	logger.Debugw(ctx, "check-alarm-manager-is-running", log.Fields{"device-id": dh.device.Id, "flag": dh.alarmManagerIsRunning})
+	if dh.alarmManagerIsRunning {
 		dh.stopAlarmManager <- true
+		dh.alarmManagerIsRunning = false
 	}
-	if dh.pSelfTestHdlr.GetSelfTestHandlerIsRunning() {
+	dh.mutextAlarmManagerFlag.Unlock()
+
+	dh.pSelfTestHdlr.SelfTestHandlerLock.Lock()
+	logger.Debugw(ctx, "check-self-test-control-block-is-running", log.Fields{"device-id": dh.device.Id, "flag": dh.pSelfTestHdlr.SelfTestHandlerActive})
+	if dh.pSelfTestHdlr.SelfTestHandlerActive {
 		dh.pSelfTestHdlr.StopSelfTestModule <- true
+		dh.pSelfTestHdlr.SelfTestHandlerActive = false
 	}
+	dh.pSelfTestHdlr.SelfTestHandlerLock.Unlock()
 
 	// Note: We want flow deletes to be processed on onu down, so do not stop flow monitoring routines
 
@@ -3774,7 +3789,6 @@
 
 		select {
 		case <-dh.stopCollector:
-			dh.setCollectorIsRunning(false)
 			logger.Debugw(ctx, "stopping-collector-for-onu", log.Fields{"device-id": dh.device.Id})
 			// Stop the L2 PM FSM
 			go func() {
@@ -4058,8 +4072,7 @@
 	go dh.pAlarmMgr.StartOMCIAlarmMessageProcessing(ctx)
 	dh.setAlarmManagerIsRunning(true)
 	if stop := <-dh.stopAlarmManager; stop {
-		logger.Debugw(ctx, "stopping-collector-for-onu", log.Fields{"device-id": dh.device.Id})
-		dh.setAlarmManagerIsRunning(false)
+		logger.Debugw(ctx, "stopping-alarm-manager-for-onu", log.Fields{"device-id": dh.device.Id})
 		go func() {
 			if dh.pAlarmMgr.AlarmSyncFsm != nil && dh.pAlarmMgr.AlarmSyncFsm.PFsm != nil {
 				_ = dh.pAlarmMgr.AlarmSyncFsm.PFsm.Event(almgr.AsEvStop)
diff --git a/internal/pkg/omcitst/omci_self_test_handler.go b/internal/pkg/omcitst/omci_self_test_handler.go
index f8def86..00a1eee 100755
--- a/internal/pkg/omcitst/omci_self_test_handler.go
+++ b/internal/pkg/omcitst/omci_self_test_handler.go
@@ -69,8 +69,8 @@
 	selfTestFsmMap  map[generated.ClassID]*fsmCb // The fsmCb is indexed by ME Class ID of the Test Action procedure
 	selfTestFsmLock sync.RWMutex
 
-	selfTestHandlerLock   sync.RWMutex
-	selfTestHandlerActive bool
+	SelfTestHandlerLock   sync.RWMutex
+	SelfTestHandlerActive bool
 	StopSelfTestModule    chan bool
 }
 
@@ -359,7 +359,6 @@
 func (selfTestCb *SelfTestControlBlock) waitForStopSelfTestModuleSignal(ctx context.Context) {
 	selfTestCb.SetSelfTestHandlerIsRunning(true)
 	<-selfTestCb.StopSelfTestModule // block on stop signal
-	selfTestCb.SetSelfTestHandlerIsRunning(false)
 
 	logger.Infow(ctx, "received stop signal - clean up start", log.Fields{"device-id": selfTestCb.deviceID})
 	selfTestCb.selfTestFsmLock.Lock()
@@ -381,16 +380,16 @@
 
 // SetSelfTestHandlerIsRunning sets the value to selfTestCb.selfTestHandlerActive
 func (selfTestCb *SelfTestControlBlock) SetSelfTestHandlerIsRunning(active bool) {
-	selfTestCb.selfTestHandlerLock.Lock()
-	defer selfTestCb.selfTestHandlerLock.Unlock()
-	selfTestCb.selfTestHandlerActive = active
+	selfTestCb.SelfTestHandlerLock.Lock()
+	defer selfTestCb.SelfTestHandlerLock.Unlock()
+	selfTestCb.SelfTestHandlerActive = active
 }
 
 // GetSelfTestHandlerIsRunning gets selfTestCb.selfTestHandlerActive
 func (selfTestCb *SelfTestControlBlock) GetSelfTestHandlerIsRunning() bool {
-	selfTestCb.selfTestHandlerLock.RLock()
-	defer selfTestCb.selfTestHandlerLock.RUnlock()
-	return selfTestCb.selfTestHandlerActive
+	selfTestCb.SelfTestHandlerLock.RLock()
+	defer selfTestCb.SelfTestHandlerLock.RUnlock()
+	return selfTestCb.SelfTestHandlerActive
 }
 
 // SelfTestRequestStart initiate Test Request handling procedure. The results are asynchronously conveyed on the respChan.