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")
})
}
}