codeintel-qa: Fix concurrent map read/write (take 2) (#26604)

This commit is contained in:
Eric Fritz 2021-10-25 14:31:32 -05:00 committed by GitHub
parent 4d0dd12229
commit 67482d8f13
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -38,21 +38,24 @@ func queryGraphQL(ctx context.Context, queryName, query string, variables map[st
// formatPercentiles returns a string slice describing latency histograms for each query.
func formatPercentiles() []string {
names := queryNames()
percentiles := make([]string, 0, len(names))
lines := make([]string, 0, len(names))
sort.Strings(names)
for _, queryName := range names {
percentiles = append(percentiles, fmt.Sprintf(
"queryName=%s\trequests=%d\tp50=%s\tp95=%s\tp99=%s",
queryName,
len(durations[queryName]),
percentile(queryName, 0.50),
percentile(queryName, 0.95),
percentile(queryName, 0.99),
))
numRequests, percentileValues := percentiles(queryName, 0.50, 0.95, 0.99)
lines = append(
lines,
fmt.Sprintf("queryName=%s\trequests=%d\tp50=%s\tp95=%s\tp99=%s",
queryName,
numRequests,
percentileValues[0.50],
percentileValues[0.95],
percentileValues[0.99],
))
}
return percentiles
return lines
}
// queryNames returns the keys of the duration map.
@ -68,13 +71,19 @@ func queryNames() (names []string) {
return names
}
// percentile returns the pth percentile duration of the given query type.
func percentile(queryName string, p float64) time.Duration {
// percentiles returns the number of samples and the ps[i]th percentile durations of the given query type.
func percentiles(queryName string, ps ...float64) (int, map[float64]time.Duration) {
m.Lock()
defer m.Unlock()
queryDurations := durations[queryName]
sort.Float64s(queryDurations)
index := int(float64(len(queryDurations)) * p)
return time.Duration(queryDurations[index]) * time.Millisecond
percentiles := make(map[float64]time.Duration, len(ps))
for _, p := range ps {
index := int(float64(len(queryDurations)) * p)
percentiles[p] = time.Duration(queryDurations[index]) * time.Millisecond
}
return len(queryDurations), percentiles
}