Skip to content

Commit

Permalink
quantile: nil deref
Browse files Browse the repository at this point in the history
`Add()` intended to be side-effect free when called on a `nil` receiver.
  • Loading branch information
mreiferson committed Mar 23, 2015
1 parent 77a46db commit a175087
Showing 1 changed file with 31 additions and 24 deletions.
55 changes: 31 additions & 24 deletions internal/quantile/aggregate.go
Expand Up @@ -74,36 +74,43 @@ func (e *E2eProcessingLatencyAggregate) Less(i, j int) bool {
return e.Percentiles[i]["percentile"] > e.Percentiles[j]["percentile"]
}

// Add merges two E2eProcessingLatencyAggregate by averaging the percentiles
//
// It is side-effect free and does not modify the receiver or the parameter
func (e *E2eProcessingLatencyAggregate) Add(e2 *E2eProcessingLatencyAggregate, N int) *E2eProcessingLatencyAggregate {
if e == nil {
*e = *e2
e = &E2eProcessingLatencyAggregate{}
} else {
p := e.Percentiles
e.Count += e2.Count
for _, value := range e2.Percentiles {
i := -1
for j, v := range p {
if value["quantile"] == v["quantile"] {
i = j
break
}
}
if i == -1 {
i = len(p)
e.Percentiles = append(p, make(map[string]float64))
p = e.Percentiles
p[i]["quantile"] = value["quantile"]
}
p[i]["max"] = math.Max(value["max"], p[i]["max"])
p[i]["min"] = math.Min(value["max"], p[i]["max"])
e = &(*e)
}
e.Addr = "*"

p[i]["count"] += value["count"]
delta := value["average"] - p[i]["average"]
R := delta * value["count"] / p[i]["count"]
p[i]["average"] = p[i]["average"] + R
p := e.Percentiles
e.Count += e2.Count
for _, value := range e2.Percentiles {
i := -1
for j, v := range p {
if value["quantile"] == v["quantile"] {
i = j
break
}
}
if i == -1 {
i = len(p)
e.Percentiles = append(p, make(map[string]float64))
p = e.Percentiles
p[i]["quantile"] = value["quantile"]
}
p[i]["max"] = math.Max(value["max"], p[i]["max"])
p[i]["min"] = math.Min(value["max"], p[i]["max"])

p[i]["count"] += value["count"]
delta := value["average"] - p[i]["average"]
R := delta * value["count"] / p[i]["count"]
p[i]["average"] = p[i]["average"] + R
}

sort.Sort(e)
e.Addr = "*"

return e
}

0 comments on commit a175087

Please sign in to comment.