Skip to content

Commit 45e7b23

Browse files
committed
feat(backend): refactor to avoid data race
1 parent 0cfcdc3 commit 45e7b23

File tree

2 files changed

+37
-9
lines changed

2 files changed

+37
-9
lines changed

backend/modules/observability/domain/trace/entity/loop_span/trans.go

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package loop_span
66
import (
77
"context"
88
"encoding/json"
9+
"sync"
910
"time"
1011

1112
"github.com/coze-dev/coze-loop/backend/pkg/lang/slices"
@@ -38,6 +39,7 @@ type SpanTransConfig struct {
3839
TagFilter *TagFilter `mapstructure:"tag_filter" json:"tag_filter"`
3940
InputFilter *InputFilter `mapstructure:"input_filter" json:"input_filter"`
4041
OutputFilter *OutputFilter `mapstructure:"output_filter" json:"output_filter"`
42+
initOnce sync.Once
4143
}
4244

4345
type TagFilter struct {
@@ -128,15 +130,17 @@ func (c *OutputFilter) transform(ctx context.Context, span *Span) {
128130
}
129131

130132
func (c *SpanTransConfig) init() {
131-
if c.TagFilter != nil {
132-
c.TagFilter.keyBlackListMap = slices.ToMap(c.TagFilter.KeyBlackList, func(e string) (string, bool) { return e, true })
133-
}
134-
if c.InputFilter != nil {
135-
c.InputFilter.keyWhiteListMap = slices.ToMap(c.InputFilter.KeyWhiteList, func(e string) (string, bool) { return e, true })
136-
}
137-
if c.OutputFilter != nil {
138-
c.OutputFilter.keyWhiteListMap = slices.ToMap(c.OutputFilter.KeyWhiteList, func(e string) (string, bool) { return e, true })
139-
}
133+
c.initOnce.Do(func() {
134+
if c.TagFilter != nil {
135+
c.TagFilter.keyBlackListMap = slices.ToMap(c.TagFilter.KeyBlackList, func(e string) (string, bool) { return e, true })
136+
}
137+
if c.InputFilter != nil {
138+
c.InputFilter.keyWhiteListMap = slices.ToMap(c.InputFilter.KeyWhiteList, func(e string) (string, bool) { return e, true })
139+
}
140+
if c.OutputFilter != nil {
141+
c.OutputFilter.keyWhiteListMap = slices.ToMap(c.OutputFilter.KeyWhiteList, func(e string) (string, bool) { return e, true })
142+
}
143+
})
140144
}
141145

142146
func (c *SpanTransConfig) satisfyFilter(span *Span) bool {

backend/modules/observability/domain/trace/entity/loop_span/trans_test.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"encoding/json"
99
"math/rand"
1010
"sort"
11+
"sync"
1112
"testing"
1213
"time"
1314

@@ -520,3 +521,26 @@ func TestParentIdRedirectChaos(t *testing.T) {
520521
}
521522
}
522523
}
524+
525+
func TestRace(t *testing.T) {
526+
p := SpanTransCfgList{
527+
{
528+
SpanFilter: &FilterFields{},
529+
TagFilter: &TagFilter{
530+
KeyBlackList: []string{
531+
"custom_a",
532+
"custom_c",
533+
},
534+
},
535+
},
536+
}
537+
var wg sync.WaitGroup
538+
for i := 0; i < 100; i++ {
539+
wg.Add(1)
540+
go func() {
541+
p.init()
542+
wg.Done()
543+
}()
544+
}
545+
wg.Wait()
546+
}

0 commit comments

Comments
 (0)