Skip to content

Commit a747842

Browse files
JinzhouChen-xmuSongZhen0704
authored andcommitted
improve(memory): label, label_value memory
1 parent c227974 commit a747842

4 files changed

Lines changed: 77 additions & 33 deletions

File tree

server/controller/prometheus/cache/label.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,13 +114,18 @@ func (l *label) Add(batch []*controller.PrometheusLabel) {
114114
}
115115

116116
func (l *label) refresh(args ...interface{}) error {
117+
var count int64
118+
if err := l.org.DB.Model(&metadbmodel.PrometheusLabel{}).Count(&count).Error; err != nil {
119+
return err
120+
}
121+
117122
rows, err := l.org.DB.Model(&metadbmodel.PrometheusLabel{}).Select("id", "name", "value").Rows()
118123
if err != nil {
119124
return err
120125
}
121126
defer rows.Close()
122127

123-
newActive := make(map[LabelKey]int)
128+
newActive := make(map[LabelKey]int, count)
124129
for rows.Next() {
125130
var id int
126131
var name, value string

server/controller/prometheus/cache/label_value.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,13 +98,18 @@ func (lv *labelValue) Add(batch []*controller.PrometheusLabelValue) {
9898
}
9999

100100
func (lv *labelValue) refresh(args ...interface{}) error {
101+
var count int64
102+
if err := lv.org.DB.Model(&metadbmodel.PrometheusLabelValue{}).Count(&count).Error; err != nil {
103+
return err
104+
}
105+
101106
rows, err := lv.org.DB.Model(&metadbmodel.PrometheusLabelValue{}).Select("id", "value").Rows()
102107
if err != nil {
103108
return err
104109
}
105110
defer rows.Close()
106111

107-
newActive := make(map[string]int)
112+
newActive := make(map[string]int, count)
108113
for rows.Next() {
109114
var id int
110115
var value string

server/controller/prometheus/encoder/label.go

Lines changed: 33 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ type label struct {
3232
lock sync.Mutex
3333
resourceType string
3434
labelKeyToID map[cache.LabelKey]int
35+
36+
isRefreshing bool
37+
pendingKeys map[cache.LabelKey]int
3538
}
3639

3740
func newLabel(org *common.ORG) *label {
@@ -43,32 +46,49 @@ func newLabel(org *common.ORG) *label {
4346
}
4447

4548
func (l *label) store(item *metadbmodel.PrometheusLabel) {
46-
l.labelKeyToID[cache.NewLabelKey(item.Name, item.Value)] = item.ID
49+
key := cache.NewLabelKey(item.Name, item.Value)
50+
l.labelKeyToID[key] = item.ID
51+
52+
if l.isRefreshing {
53+
l.pendingKeys[key] = item.ID
54+
}
4755
}
4856

4957
func (l *label) getID(key cache.LabelKey) (int, bool) {
5058
id, ok := l.labelKeyToID[key]
5159
return id, ok
5260
}
5361

54-
func (l *label) refresh(args ...interface{}) error {
55-
// Snapshot existing keys before querying DB, to identify entries added
56-
// by encode() during the query window (those must be preserved even if
57-
// not yet visible in the DB snapshot).
62+
func (l *label) MarkRefresh() {
5863
l.lock.Lock()
59-
preKeys := make(map[cache.LabelKey]struct{}, len(l.labelKeyToID))
60-
for k := range l.labelKeyToID {
61-
preKeys[k] = struct{}{}
64+
defer l.lock.Unlock()
65+
l.isRefreshing = true
66+
l.pendingKeys = make(map[cache.LabelKey]int)
67+
}
68+
69+
func (l *label) MarkRefreshDone() {
70+
l.lock.Lock()
71+
defer l.lock.Unlock()
72+
l.isRefreshing = false
73+
l.pendingKeys = nil
74+
}
75+
76+
func (l *label) refresh(args ...interface{}) error {
77+
l.MarkRefresh()
78+
defer l.MarkRefreshDone()
79+
80+
var count int64
81+
if err := l.org.DB.Model(&metadbmodel.PrometheusLabel{}).Count(&count).Error; err != nil {
82+
return err
6283
}
63-
l.lock.Unlock()
6484

6585
rows, err := l.org.DB.Model(&metadbmodel.PrometheusLabel{}).Select("id", "name", "value").Rows()
6686
if err != nil {
6787
return err
6888
}
6989
defer rows.Close()
7090

71-
newMap := make(map[cache.LabelKey]int)
91+
newMap := make(map[cache.LabelKey]int, count)
7292
for rows.Next() {
7393
var id int
7494
var name, value string
@@ -84,15 +104,12 @@ func (l *label) refresh(args ...interface{}) error {
84104
}
85105

86106
l.lock.Lock()
87-
for k, v := range l.labelKeyToID {
88-
if _, wasInSnapshot := preKeys[k]; !wasInSnapshot {
89-
// Written by encode() after the snapshot; may not be in the DB
90-
// snapshot yet, so preserve it to avoid a spurious cache miss.
91-
newMap[k] = v
92-
}
107+
for k, v := range l.pendingKeys {
108+
newMap[k] = v
93109
}
94110
l.labelKeyToID = newMap
95111
l.lock.Unlock()
112+
96113
return nil
97114
}
98115

server/controller/prometheus/encoder/label_value.go

Lines changed: 32 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ type labelValue struct {
3131
lock sync.Mutex
3232
resourceType string
3333
strToID map[string]int
34+
35+
isRefreshing bool
36+
pendingKeys map[string]int
3437
}
3538

3639
func newLabelValue(org *common.ORG) *labelValue {
@@ -41,16 +44,29 @@ func newLabelValue(org *common.ORG) *labelValue {
4144
}
4245
}
4346

44-
func (lv *labelValue) refresh(args ...interface{}) error {
45-
// Snapshot existing keys before querying DB, to identify entries added
46-
// by encode() during the query window (those must be preserved even if
47-
// not yet visible in the DB snapshot).
47+
func (lv *labelValue) MarkRefresh() {
4848
lv.lock.Lock()
49-
preKeys := make(map[string]struct{}, len(lv.strToID))
50-
for k := range lv.strToID {
51-
preKeys[k] = struct{}{}
49+
defer lv.lock.Unlock()
50+
lv.isRefreshing = true
51+
lv.pendingKeys = make(map[string]int)
52+
}
53+
54+
func (lv *labelValue) MarkRefreshDone() {
55+
lv.lock.Lock()
56+
defer lv.lock.Unlock()
57+
lv.isRefreshing = false
58+
lv.pendingKeys = nil
59+
}
60+
61+
func (lv *labelValue) refresh(args ...interface{}) error {
62+
lv.MarkRefresh()
63+
defer lv.MarkRefreshDone()
64+
65+
var count int64
66+
if err := lv.org.DB.Model(&metadbmodel.PrometheusLabelValue{}).Count(&count).Error; err != nil {
67+
log.Errorf("db query %s failed: %v", lv.resourceType, err, lv.org.LogPrefix)
68+
return err
5269
}
53-
lv.lock.Unlock()
5470

5571
rows, err := lv.org.DB.Model(&metadbmodel.PrometheusLabelValue{}).Select("id", "value").Rows()
5672
if err != nil {
@@ -59,7 +75,7 @@ func (lv *labelValue) refresh(args ...interface{}) error {
5975
}
6076
defer rows.Close()
6177

62-
newMap := make(map[string]int)
78+
newMap := make(map[string]int, count)
6379
for rows.Next() {
6480
var id int
6581
var value string
@@ -75,15 +91,12 @@ func (lv *labelValue) refresh(args ...interface{}) error {
7591
}
7692

7793
lv.lock.Lock()
78-
for k, v := range lv.strToID {
79-
if _, wasInSnapshot := preKeys[k]; !wasInSnapshot {
80-
// Written by encode() after the snapshot; may not be in the DB
81-
// snapshot yet, so preserve it to avoid a spurious cache miss.
82-
newMap[k] = v
83-
}
94+
for k, v := range lv.pendingKeys {
95+
newMap[k] = v
8496
}
8597
lv.strToID = newMap
8698
lv.lock.Unlock()
99+
87100
return nil
88101
}
89102

@@ -124,4 +137,8 @@ func (lv *labelValue) getID(str string) (int, bool) {
124137

125138
func (lv *labelValue) store(item *metadbmodel.PrometheusLabelValue) {
126139
lv.strToID[item.Value] = item.ID
140+
141+
if lv.isRefreshing {
142+
lv.pendingKeys[item.Value] = item.ID
143+
}
127144
}

0 commit comments

Comments
 (0)