VOL-3065: Concurrent metrics context map access causing panic

Change-Id: I4c949a9df36c16e80a83cc4e19de382cd4648aec
diff --git a/internal/pkg/core/device_handler.go b/internal/pkg/core/device_handler.go
index d6cb1e6..ff3aac8 100644
--- a/internal/pkg/core/device_handler.go
+++ b/internal/pkg/core/device_handler.go
@@ -764,7 +764,6 @@
 
 func startCollector(dh *DeviceHandler) {
 	logger.Debugf("starting-collector")
-	context := make(map[string]string)
 	freq := dh.metrics.ToPmConfigs().DefaultFreq
 	for {
 		select {
@@ -772,18 +771,16 @@
 			logger.Debugw("stopping-collector-for-olt", log.Fields{"deviceID:": dh.device.Id})
 			return
 		case <-time.After(time.Duration(freq) * time.Second):
-			context["oltid"] = dh.device.Id
-			context["devicetype"] = dh.device.Type
+
 			ports := make([]*voltha.Port, len(dh.device.Ports))
 			copy(ports, dh.device.Ports)
-
 			for _, port := range ports {
 				// NNI Stats
 				if port.Type == voltha.Port_ETHERNET_NNI {
 					intfID := PortNoToIntfID(port.PortNo, voltha.Port_ETHERNET_NNI)
 					cmnni := dh.portStats.collectNNIMetrics(intfID)
 					logger.Debugw("collect-nni-metrics", log.Fields{"metrics": cmnni})
-					go dh.portStats.publishMetrics(cmnni, port, context, dh.device.Id)
+					go dh.portStats.publishMetrics(cmnni, port, dh.device.Id, dh.device.Type)
 					logger.Debugw("publish-nni-metrics", log.Fields{"nni-port": port.Label})
 				}
 				// PON Stats
@@ -792,7 +789,7 @@
 					if val, ok := dh.activePorts.Load(intfID); ok && val == true {
 						cmpon := dh.portStats.collectPONMetrics(intfID)
 						logger.Debugw("collect-pon-metrics", log.Fields{"metrics": cmpon})
-						go dh.portStats.publishMetrics(cmpon, port, context, dh.device.Id)
+						go dh.portStats.publishMetrics(cmpon, port, dh.device.Id, dh.device.Type)
 					}
 					logger.Debugw("publish-pon-metrics", log.Fields{"pon-port": port.Label})
 				}
diff --git a/internal/pkg/core/statsmanager.go b/internal/pkg/core/statsmanager.go
index 5d742d0..0cb148d 100755
--- a/internal/pkg/core/statsmanager.go
+++ b/internal/pkg/core/statsmanager.go
@@ -351,14 +351,17 @@
 
 // publishMatrics will publish the pon port metrics
 func (StatMgr OpenOltStatisticsMgr) publishMetrics(val map[string]float32,
-	port *voltha.Port, context map[string]string, devID string) {
+	port *voltha.Port, devID string, devType string) {
 	logger.Debugw("publish-metrics", log.Fields{"port": port.Label, "metrics": val})
 
 	var metricInfo voltha.MetricInformation
 	var ke voltha.KpiEvent2
 	var volthaEventSubCatgry voltha.EventSubCategory_Types
-	context["portlabel"] = port.Label
-	context["portno"] = strconv.Itoa(int(port.PortNo))
+	metricsContext := make(map[string]string)
+	metricsContext["oltid"] = devID
+	metricsContext["devicetype"] = devType
+	metricsContext["portlabel"] = port.Label
+	metricsContext["portno"] = strconv.Itoa(int(port.PortNo))
 
 	if port.Type == voltha.Port_ETHERNET_NNI {
 		volthaEventSubCatgry = voltha.EventSubCategory_NNI
@@ -370,7 +373,7 @@
 	mmd := voltha.MetricMetaData{
 		Title:    port.Type.String(),
 		Ts:       float64(raisedTs),
-		Context:  context,
+		Context:  metricsContext,
 		DeviceId: devID,
 	}
 
diff --git a/internal/pkg/core/statsmanager_test.go b/internal/pkg/core/statsmanager_test.go
index 499fda9..f7f8246 100644
--- a/internal/pkg/core/statsmanager_test.go
+++ b/internal/pkg/core/statsmanager_test.go
@@ -76,8 +76,6 @@
 		port     *voltha.Port
 		context  map[string]string
 	}
-	ctx := map[string]string{}
-	ctx["deviceID"] = "Test"
 	ponmap := map[uint32]*PonPort{}
 	ponmap[0] = &PonPort{
 		PONID:          0,
@@ -145,9 +143,8 @@
 				SouthBoundPort: nil,
 			},
 			args: args{
-				val:     nval,
-				port:    &voltha.Port{PortNo: 0, Label: fmt.Sprintf("%s%d", "nni-", 0), Type: voltha.Port_ETHERNET_NNI},
-				context: ctx,
+				val:  nval,
+				port: &voltha.Port{PortNo: 0, Label: fmt.Sprintf("%s%d", "nni-", 0), Type: voltha.Port_ETHERNET_NNI},
 			},
 		},
 		{
@@ -158,9 +155,8 @@
 				SouthBoundPort: ponmap,
 			},
 			args: args{
-				val:     pval,
-				port:    &voltha.Port{PortNo: 1, Label: fmt.Sprintf("%s%d", "pon-", 1), Type: voltha.Port_PON_OLT},
-				context: ctx,
+				val:  pval,
+				port: &voltha.Port{PortNo: 1, Label: fmt.Sprintf("%s%d", "pon-", 1), Type: voltha.Port_PON_OLT},
 			},
 		},
 		// TODO: Add test cases.
@@ -172,7 +168,7 @@
 				NorthBoundPort: tt.fields.NorthBoundPort,
 				SouthBoundPort: tt.fields.SouthBoundPort,
 			}
-			StatMgr.publishMetrics(tt.args.val, tt.args.port, tt.args.context, "onu1")
+			StatMgr.publishMetrics(tt.args.val, tt.args.port, "onu1", "openolt")
 		})
 	}
 }