Skip to content

Commit 081b73f

Browse files
ZhengYa-0110lzf575
authored andcommitted
fix: prometheus encoder lock error
1 parent 326d2d6 commit 081b73f

2 files changed

Lines changed: 23 additions & 8 deletions

File tree

server/controller/prometheus/encoder/label.go

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ func newLabel(org *common.ORG, ln *labelName, lv *labelValue) *label {
5252

5353
func (l *label) store(item *metadbmodel.PrometheusLabel) {
5454
nameID, ok1 := l.labelName.getID(item.Name)
55-
valueID, ok2 := l.labelValue.getID(item.Value)
55+
valueID, ok2 := l.labelValue.getIDSafe(item.Value)
5656
if !ok1 || !ok2 {
5757
return
5858
}
@@ -107,7 +107,7 @@ func (l *label) refresh(args ...interface{}) error {
107107
return scanErr
108108
}
109109
nameID, ok1 := l.labelName.getID(name)
110-
valueID, ok2 := l.labelValue.getID(value)
110+
valueID, ok2 := l.labelValue.getIDSafe(value)
111111
if ok1 && ok2 {
112112
newMap[cache.IDLabelKey{NameID: nameID, ValueID: valueID}] = id
113113
}
@@ -129,15 +129,13 @@ func (l *label) refresh(args ...interface{}) error {
129129

130130
func (l *label) encode(toAdd []*controller.PrometheusLabelRequest) ([]*controller.PrometheusLabel, error) {
131131
l.lock.Lock()
132-
defer l.lock.Unlock()
133-
134132
resp := make([]*controller.PrometheusLabel, 0)
135133
var dbToAdd []*metadbmodel.PrometheusLabel
136134
for _, item := range toAdd {
137135
n := item.GetName()
138136
v := item.GetValue()
139137
nameID, ok1 := l.labelName.getID(n)
140-
valueID, ok2 := l.labelValue.getID(v)
138+
valueID, ok2 := l.labelValue.getIDSafe(v)
141139
if ok1 && ok2 {
142140
if id, ok := l.getID(cache.IDLabelKey{NameID: nameID, ValueID: valueID}); ok {
143141
resp = append(resp, &controller.PrometheusLabel{
@@ -153,20 +151,27 @@ func (l *label) encode(toAdd []*controller.PrometheusLabelRequest) ([]*controlle
153151
Value: v,
154152
})
155153
}
154+
l.lock.Unlock()
155+
156+
if len(dbToAdd) == 0 {
157+
return resp, nil
158+
}
156159

157160
err := addBatch(l.org.DB, dbToAdd, l.resourceType)
158161
if err != nil {
159162
log.Errorf("add %s error: %s", l.resourceType, err.Error(), l.org.LogPrefix)
160163
return nil, err
161164
}
165+
166+
l.lock.Lock()
162167
for _, item := range dbToAdd {
163168
l.store(item)
164169
resp = append(resp, &controller.PrometheusLabel{
165170
Name: &item.Name,
166171
Value: &item.Value,
167172
Id: proto.Uint32(uint32(item.ID)),
168173
})
169-
170174
}
175+
l.lock.Unlock()
171176
return resp, nil
172177
}

server/controller/prometheus/encoder/label_value.go

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,8 +102,6 @@ func (lv *labelValue) refresh(args ...interface{}) error {
102102

103103
func (lv *labelValue) encode(strs []string) ([]*controller.PrometheusLabelValue, error) {
104104
lv.lock.Lock()
105-
defer lv.lock.Unlock()
106-
107105
resp := make([]*controller.PrometheusLabelValue, 0)
108106
dbToAdd := make([]*metadbmodel.PrometheusLabelValue, 0)
109107
for i := range strs {
@@ -114,6 +112,8 @@ func (lv *labelValue) encode(strs []string) ([]*controller.PrometheusLabelValue,
114112
}
115113
dbToAdd = append(dbToAdd, &metadbmodel.PrometheusLabelValue{Value: str})
116114
}
115+
lv.lock.Unlock()
116+
117117
if len(dbToAdd) == 0 {
118118
return resp, nil
119119
}
@@ -123,10 +123,13 @@ func (lv *labelValue) encode(strs []string) ([]*controller.PrometheusLabelValue,
123123
log.Errorf("add %s error: %s", lv.resourceType, err.Error(), lv.org.LogPrefix)
124124
return nil, err
125125
}
126+
127+
lv.lock.Lock()
126128
for i := range dbToAdd {
127129
lv.store(dbToAdd[i])
128130
resp = append(resp, &controller.PrometheusLabelValue{Value: &dbToAdd[i].Value, Id: proto.Uint32(uint32(dbToAdd[i].ID))})
129131
}
132+
lv.lock.Unlock()
130133
return resp, nil
131134
}
132135

@@ -135,6 +138,13 @@ func (lv *labelValue) getID(str string) (int, bool) {
135138
return id, ok
136139
}
137140

141+
// getIDSafe is a thread-safe variant for callers that do not already hold lv.lock.
142+
func (lv *labelValue) getIDSafe(str string) (int, bool) {
143+
lv.lock.Lock()
144+
defer lv.lock.Unlock()
145+
return lv.getID(str)
146+
}
147+
138148
func (lv *labelValue) store(item *metadbmodel.PrometheusLabelValue) {
139149
lv.strToID[item.Value] = item.ID
140150

0 commit comments

Comments
 (0)