VOL-4774:openonuAdapterGo: Panic during scale test

Change-Id: Ie41689194d944d533e118a24297b0a9685ade717
diff --git a/internal/pkg/pmmgr/onu_metrics_manager.go b/internal/pkg/pmmgr/onu_metrics_manager.go
index 3da45b0..43ab2a0 100755
--- a/internal/pkg/pmmgr/onu_metrics_manager.go
+++ b/internal/pkg/pmmgr/onu_metrics_manager.go
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-//Package pmmgr provides the utilities to manage onu metrics
+// Package pmmgr provides the utilities to manage onu metrics
 package pmmgr
 
 import (
@@ -331,6 +331,8 @@
 	isEthernetFrameExtendedPmOperationOngoing     bool
 	isExtendedOmci                                bool
 	maxL2PMGetPayLoadSize                         int
+	onuOpticalMetricstimer                        *time.Timer
+	onuUniStatusMetricstimer                      *time.Timer
 }
 
 // NewOnuMetricsManager returns a new instance of the NewOnuMetricsManager
@@ -406,6 +408,14 @@
 		return nil
 	}
 
+	//Metrics collection timers are initialized with a default timer value,  will be stopped immediately and further
+	//timers are  reset during the actual stats collection begins.
+	metricsManager.onuOpticalMetricstimer = time.NewTimer(DefaultMetricCollectionFrequency)
+	metricsManager.onuOpticalMetricstimer.Stop()
+
+	metricsManager.onuUniStatusMetricstimer = time.NewTimer(DefaultMetricCollectionFrequency)
+	metricsManager.onuUniStatusMetricstimer.Stop()
+
 	logger.Info(ctx, "init-OnuMetricsManager completed", log.Fields{"device-id": metricsManager.deviceID})
 	return &metricsManager
 }
@@ -766,10 +776,12 @@
 		}
 
 		if meInstance != nil {
+			mm.onuOpticalMetricstimer.Reset(mm.pOnuDeviceEntry.GetDevOmciCC().GetMaxOmciTimeoutWithRetries() * time.Second)
 			select {
 			case meAttributes = <-mm.opticalMetricsChan:
-				logger.Debugw(ctx, "received optical metrics", log.Fields{"device-id": mm.deviceID})
-			case <-time.After(mm.pOnuDeviceEntry.GetDevOmciCC().GetMaxOmciTimeoutWithRetries() * time.Second):
+				mm.onuOpticalMetricstimer.Stop()
+				logger.Debugw(ctx, "received optical metrics, stopping the optical metrics collection timer", log.Fields{"device-id": mm.deviceID})
+			case <-mm.onuOpticalMetricstimer.C:
 				logger.Errorw(ctx, "timeout waiting for omci-get response for optical metrics", log.Fields{"device-id": mm.deviceID})
 				// The metrics will be empty in this case
 				break loop
@@ -849,11 +861,13 @@
 			return nil, err
 		}
 		if meInstance != nil {
+			mm.onuUniStatusMetricstimer.Reset(mm.pOnuDeviceEntry.GetDevOmciCC().GetMaxOmciTimeoutWithRetries() * time.Second)
 			// Wait for metrics or timeout
 			select {
 			case meAttributes = <-mm.uniStatusMetricsChan:
-				logger.Debugw(ctx, "received uni-g metrics", log.Fields{"device-id": mm.deviceID})
-			case <-time.After(mm.pOnuDeviceEntry.GetDevOmciCC().GetMaxOmciTimeoutWithRetries() * time.Second):
+				mm.onuUniStatusMetricstimer.Stop()
+				logger.Debugw(ctx, "received uni-g metrics, stopping Onu Uni status metrics timer ", log.Fields{"device-id": mm.deviceID})
+			case <-mm.onuUniStatusMetricstimer.C:
 				logger.Errorw(ctx, "timeout waiting for omci-get response for uni status", log.Fields{"device-id": mm.deviceID})
 				// The metrics could be empty in this case
 				break loop1
@@ -909,11 +923,13 @@
 			return nil, err
 		}
 		if meInstance != nil {
+			mm.onuUniStatusMetricstimer.Reset(mm.pOnuDeviceEntry.GetDevOmciCC().GetMaxOmciTimeoutWithRetries() * time.Second)
 			// Wait for metrics or timeout
 			select {
 			case meAttributes = <-mm.uniStatusMetricsChan:
-				logger.Debugw(ctx, "received pptp metrics", log.Fields{"device-id": mm.deviceID})
-			case <-time.After(mm.pOnuDeviceEntry.GetDevOmciCC().GetMaxOmciTimeoutWithRetries() * time.Second):
+				mm.onuUniStatusMetricstimer.Stop()
+				logger.Debugw(ctx, "received pptp metrics, stopping Onu Uni Status metrics timer ", log.Fields{"device-id": mm.deviceID})
+			case <-mm.onuUniStatusMetricstimer.C:
 				logger.Errorw(ctx, "timeout waiting for omci-get response for uni status", log.Fields{"device-id": mm.deviceID})
 				// The metrics could be empty in this case
 				break loop2
@@ -976,11 +992,13 @@
 			return nil, err
 		}
 		if meInstance != nil {
+			mm.onuUniStatusMetricstimer.Reset(mm.pOnuDeviceEntry.GetDevOmciCC().GetMaxOmciTimeoutWithRetries() * time.Second)
 			// Wait for metrics or timeout
 			select {
 			case meAttributes = <-mm.uniStatusMetricsChan:
-				logger.Debugw(ctx, "received veip metrics", log.Fields{"device-id": mm.deviceID})
-			case <-time.After(mm.pOnuDeviceEntry.GetDevOmciCC().GetMaxOmciTimeoutWithRetries() * time.Second):
+				mm.onuUniStatusMetricstimer.Stop()
+				logger.Debugw(ctx, "received veip metrics, stopping Onu Uni status metrics timer ", log.Fields{"device-id": mm.deviceID})
+			case <-mm.onuUniStatusMetricstimer.C:
 				logger.Errorw(ctx, "timeout waiting for omci-get response for uni status", log.Fields{"device-id": mm.deviceID})
 				// The metrics could be empty in this case
 				break loop3