From 44d755ae38db13a8074d4fa81fde39f1bc5f4816 Mon Sep 17 00:00:00 2001 From: Joel Speed Date: Wed, 18 Apr 2018 11:34:50 +0100 Subject: [PATCH] Fix asynchronous calls to map --- pkg/custom-provider/provider.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/pkg/custom-provider/provider.go b/pkg/custom-provider/provider.go index b9ea5f1c..83625385 100644 --- a/pkg/custom-provider/provider.go +++ b/pkg/custom-provider/provider.go @@ -19,9 +19,11 @@ package provider import ( "context" "fmt" - "github.com/golang/glog" + "sync" "time" + "github.com/golang/glog" + "github.com/kubernetes-incubator/custom-metrics-apiserver/pkg/provider" pmodel "github.com/prometheus/common/model" apierr "k8s.io/apimachinery/pkg/api/errors" @@ -287,6 +289,7 @@ func (l *cachingMetricsLister) updateMetrics() error { // don't do duplicate queries when it's just the matchers that change seriesCacheByQuery := make(map[prom.Selector][]prom.Series) + seriesCacheByQueryLock := sync.RWMutex{} // these can take a while on large clusters, so launch in parallel // and don't duplicate @@ -298,7 +301,9 @@ func (l *cachingMetricsLister) updateMetrics() error { errs <- nil continue } + seriesCacheByQueryLock.Lock() selectors[sel] = struct{}{} + seriesCacheByQueryLock.Unlock() go func() { series, err := l.promClient.Series(context.TODO(), pmodel.Interval{startTime, 0}, sel) if err != nil { @@ -306,7 +311,9 @@ func (l *cachingMetricsLister) updateMetrics() error { return } errs <- nil + seriesCacheByQueryLock.Lock() seriesCacheByQuery[sel] = series + seriesCacheByQueryLock.Unlock() }() }