Add array recycling safety (#19103)

Nil entries when recycling arrays.
This commit is contained in:
Klaus Post 2024-02-21 12:27:35 -08:00 committed by GitHub
parent 22aa16ab12
commit 92180bc793
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 24 additions and 14 deletions

View file

@ -420,14 +420,14 @@ func (g *MetricsGroup) RegisterRead(read func(ctx context.Context) []Metric) {
})
}
func (m *Metric) copyMetric() Metric {
func (m *Metric) clone() Metric {
metric := Metric{
Description: m.Description,
Value: m.Value,
HistogramBucketLabel: m.HistogramBucketLabel,
StaticLabels: make(map[string]string),
VariableLabels: make(map[string]string),
Histogram: make(map[string]uint64),
StaticLabels: make(map[string]string, len(m.StaticLabels)),
VariableLabels: make(map[string]string, len(m.VariableLabels)),
Histogram: make(map[string]uint64, len(m.Histogram)),
}
for k, v := range m.StaticLabels {
metric.StaticLabels[k] = v
@ -453,7 +453,7 @@ func (g *MetricsGroup) Get() (metrics []Metric) {
metrics = make([]Metric, 0, len(m))
for i := range m {
metrics = append(metrics, m[i].copyMetric())
metrics = append(metrics, m[i].clone())
}
return metrics
}

View file

@ -1007,21 +1007,29 @@ func (s *peerRESTServer) GetBandwidth(params *grid.URLValues) (*bandwidth.Bucket
// GetPeerMetrics gets the metrics to be federated across peers.
func (s *peerRESTServer) GetPeerMetrics(_ *grid.MSS) (*grid.Array[*Metric], *grid.RemoteErr) {
m := ReportMetrics(context.Background(), peerMetricsGroups)
res := make([]*Metric, 0, len(m))
for m := range m {
res := make([]*Metric, 0, len(peerMetricsGroups))
populateAndPublish(peerMetricsGroups, func(m Metric) bool {
if m.VariableLabels == nil {
m.VariableLabels = make(map[string]string, 1)
}
m.VariableLabels[serverName] = globalLocalNodeName
res = append(res, &m)
}
return true
})
return aoMetricsGroup.NewWith(res), nil
}
// GetPeerBucketMetrics gets the metrics to be federated across peers.
func (s *peerRESTServer) GetPeerBucketMetrics(_ *grid.MSS) (*grid.Array[*Metric], *grid.RemoteErr) {
m := ReportMetrics(context.Background(), bucketPeerMetricsGroups)
res := make([]*Metric, 0, len(m))
for m := range m {
res := make([]*Metric, 0, len(bucketPeerMetricsGroups))
populateAndPublish(bucketPeerMetricsGroups, func(m Metric) bool {
if m.VariableLabels == nil {
m.VariableLabels = make(map[string]string, 1)
}
m.VariableLabels[serverName] = globalLocalNodeName
res = append(res, &m)
}
return true
})
return aoMetricsGroup.NewWith(res), nil
}

View file

@ -595,8 +595,10 @@ func (p *ArrayOf[T]) newA(sz uint32) []T {
}
func (p *ArrayOf[T]) putA(v []T) {
for _, t := range v {
var zero T // nil
for i, t := range v {
p.ePool.Put(t)
v[i] = zero
}
if v != nil {
v = v[:0]