diff --git a/server/controller/prometheus/encoder/label.go b/server/controller/prometheus/encoder/label.go index cc8cf8834e3..636bfaf9950 100644 --- a/server/controller/prometheus/encoder/label.go +++ b/server/controller/prometheus/encoder/label.go @@ -52,7 +52,7 @@ func newLabel(org *common.ORG, ln *labelName, lv *labelValue) *label { func (l *label) store(item *metadbmodel.PrometheusLabel) { nameID, ok1 := l.labelName.getID(item.Name) - valueID, ok2 := l.labelValue.getID(item.Value) + valueID, ok2 := l.labelValue.getIDSafe(item.Value) if !ok1 || !ok2 { return } @@ -107,7 +107,7 @@ func (l *label) refresh(args ...interface{}) error { return scanErr } nameID, ok1 := l.labelName.getID(name) - valueID, ok2 := l.labelValue.getID(value) + valueID, ok2 := l.labelValue.getIDSafe(value) if ok1 && ok2 { newMap[cache.IDLabelKey{NameID: nameID, ValueID: valueID}] = id } @@ -129,15 +129,13 @@ func (l *label) refresh(args ...interface{}) error { func (l *label) encode(toAdd []*controller.PrometheusLabelRequest) ([]*controller.PrometheusLabel, error) { l.lock.Lock() - defer l.lock.Unlock() - resp := make([]*controller.PrometheusLabel, 0) var dbToAdd []*metadbmodel.PrometheusLabel for _, item := range toAdd { n := item.GetName() v := item.GetValue() nameID, ok1 := l.labelName.getID(n) - valueID, ok2 := l.labelValue.getID(v) + valueID, ok2 := l.labelValue.getIDSafe(v) if ok1 && ok2 { if id, ok := l.getID(cache.IDLabelKey{NameID: nameID, ValueID: valueID}); ok { resp = append(resp, &controller.PrometheusLabel{ @@ -153,12 +151,19 @@ func (l *label) encode(toAdd []*controller.PrometheusLabelRequest) ([]*controlle Value: v, }) } + l.lock.Unlock() + + if len(dbToAdd) == 0 { + return resp, nil + } err := addBatch(l.org.DB, dbToAdd, l.resourceType) if err != nil { log.Errorf("add %s error: %s", l.resourceType, err.Error(), l.org.LogPrefix) return nil, err } + + l.lock.Lock() for _, item := range dbToAdd { l.store(item) resp = append(resp, &controller.PrometheusLabel{ @@ -166,7 +171,7 @@ func (l *label) encode(toAdd []*controller.PrometheusLabelRequest) ([]*controlle Value: &item.Value, Id: proto.Uint32(uint32(item.ID)), }) - } + l.lock.Unlock() return resp, nil } diff --git a/server/controller/prometheus/encoder/label_value.go b/server/controller/prometheus/encoder/label_value.go index fdc757419cf..9cbb72c648b 100644 --- a/server/controller/prometheus/encoder/label_value.go +++ b/server/controller/prometheus/encoder/label_value.go @@ -102,8 +102,6 @@ func (lv *labelValue) refresh(args ...interface{}) error { func (lv *labelValue) encode(strs []string) ([]*controller.PrometheusLabelValue, error) { lv.lock.Lock() - defer lv.lock.Unlock() - resp := make([]*controller.PrometheusLabelValue, 0) dbToAdd := make([]*metadbmodel.PrometheusLabelValue, 0) for i := range strs { @@ -114,6 +112,8 @@ func (lv *labelValue) encode(strs []string) ([]*controller.PrometheusLabelValue, } dbToAdd = append(dbToAdd, &metadbmodel.PrometheusLabelValue{Value: str}) } + lv.lock.Unlock() + if len(dbToAdd) == 0 { return resp, nil } @@ -123,10 +123,13 @@ func (lv *labelValue) encode(strs []string) ([]*controller.PrometheusLabelValue, log.Errorf("add %s error: %s", lv.resourceType, err.Error(), lv.org.LogPrefix) return nil, err } + + lv.lock.Lock() for i := range dbToAdd { lv.store(dbToAdd[i]) resp = append(resp, &controller.PrometheusLabelValue{Value: &dbToAdd[i].Value, Id: proto.Uint32(uint32(dbToAdd[i].ID))}) } + lv.lock.Unlock() return resp, nil } @@ -135,6 +138,13 @@ func (lv *labelValue) getID(str string) (int, bool) { return id, ok } +// getIDSafe is a thread-safe variant for callers that do not already hold lv.lock. +func (lv *labelValue) getIDSafe(str string) (int, bool) { + lv.lock.Lock() + defer lv.lock.Unlock() + return lv.getID(str) +} + func (lv *labelValue) store(item *metadbmodel.PrometheusLabelValue) { lv.strToID[item.Value] = item.ID diff --git a/server/controller/prometheus/label.go b/server/controller/prometheus/label.go index 14a9630b7d5..07d1f273f70 100644 --- a/server/controller/prometheus/label.go +++ b/server/controller/prometheus/label.go @@ -329,10 +329,10 @@ func (s *LabelSynchronizer) assembleMetricLabel(mls []*trident.MetricLabelReques log.Errorf("metric name id not found, name to request count: %+v", nonMetricNameToCount, s.org.LogPrefix) } if nonLabelNames.Cardinality() > 0 { - log.Errorf("label name id not found, names: %v", nonLabelNames.ToSlice(), s.org.LogPrefix) + log.Errorf("label name id not found, %s", logNotFoundDetail(nonLabelNames.ToSlice()), s.org.LogPrefix) } if nonLabelValues.Cardinality() > 0 { - log.Errorf("label value id not found, values: %v", nonLabelValues.ToSlice(), s.org.LogPrefix) + log.Errorf("label value id not found, %s", logNotFoundDetail(nonLabelValues.ToSlice()), s.org.LogPrefix) } return respMLs, nil }