You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by ha...@apache.org on 2025/02/20 08:30:49 UTC
(skywalking-banyandb) 01/01: Fix the data race
This is an automated email from the ASF dual-hosted git repository.
hanahmily pushed a commit to branch data-race
in repository https://gitbox.apache.org/repos/asf/skywalking-banyandb.git
commit 9bbf506c91306e112e016600a3d64ed7ecbddfb7
Author: Gao Hongtao <ha...@gmail.com>
AuthorDate: Thu Feb 20 16:29:34 2025 +0800
Fix the data race
Signed-off-by: Gao Hongtao <ha...@gmail.com>
---
pkg/query/logical/measure/topn_plan_localscan.go | 30 +++++++++---------------
1 file changed, 11 insertions(+), 19 deletions(-)
diff --git a/pkg/query/logical/measure/topn_plan_localscan.go b/pkg/query/logical/measure/topn_plan_localscan.go
index 0eba422f..92421573 100644
--- a/pkg/query/logical/measure/topn_plan_localscan.go
+++ b/pkg/query/logical/measure/topn_plan_localscan.go
@@ -152,9 +152,7 @@ func (i *localScan) Execute(ctx context.Context) (mit executor.MIterator, err er
return nil, fmt.Errorf("failed to query measure: %w", err)
}
return &topNMIterator{
- result: result,
- topNValue: measure.GenerateTopNValue(),
- decoder: generateTopNValuesDecoder(),
+ result: result,
}, nil
}
@@ -173,11 +171,9 @@ func (i *localScan) Schema() logical.Schema {
}
type topNMIterator struct {
- result model.MeasureQueryResult
- err error
- topNValue *measure.TopNValue
- decoder *encoding.BytesBlockDecoder
- current []*measurev1.DataPoint
+ result model.MeasureQueryResult
+ err error
+ current []*measurev1.DataPoint
}
func (ei *topNMIterator) Next() bool {
@@ -194,6 +190,10 @@ func (ei *topNMIterator) Next() bool {
return false
}
ei.current = ei.current[:0]
+ topNValue := measure.GenerateTopNValue()
+ defer measure.ReleaseTopNValue(topNValue)
+ decoder := generateTopNValuesDecoder()
+ defer releaseTopNValuesDecoder(decoder)
for i := range r.Timestamps {
fv := r.Fields[0].Values[i]
@@ -203,13 +203,13 @@ func (ei *topNMIterator) Next() bool {
return false
}
ts := timestamppb.New(time.Unix(0, r.Timestamps[i]))
- ei.topNValue.Reset()
- err := ei.topNValue.Unmarshal(bd, ei.decoder)
+ topNValue.Reset()
+ err := topNValue.Unmarshal(bd, decoder)
if err != nil {
ei.err = multierr.Append(ei.err, errors.WithMessagef(err, "failed to unmarshal topN values[%d]:[%s]%s", i, ts, hex.EncodeToString(fv.GetBinaryData())))
continue
}
- fieldName, entityNames, values, entities := ei.topNValue.Values()
+ fieldName, entityNames, values, entities := topNValue.Values()
for j := range entities {
dp := &measurev1.DataPoint{
Timestamp: ts,
@@ -251,14 +251,6 @@ func (ei *topNMIterator) Close() error {
ei.result.Release()
ei.result = nil
}
- if ei.decoder != nil {
- releaseTopNValuesDecoder(ei.decoder)
- ei.decoder = nil
- }
- if ei.topNValue != nil {
- measure.ReleaseTopNValue(ei.topNValue)
- ei.topNValue = nil
- }
return ei.err
}