Skip to content

Commit 60dcee1

Browse files
authored
fix: data race in seriesIterator, use atomic int (grafana#12223)
1 parent 2544f00 commit 60dcee1

File tree

1 file changed

+6
-5
lines changed

1 file changed

+6
-5
lines changed

pkg/iter/sample_iterator.go

+6-5
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package iter
33
import (
44
"container/heap"
55
"context"
6+
"go.uber.org/atomic"
67
"io"
78
"sync"
89

@@ -521,7 +522,7 @@ func NewSampleQueryResponseIterator(resp *logproto.SampleQueryResponse) SampleIt
521522
}
522523

523524
type seriesIterator struct {
524-
i int
525+
i *atomic.Int32
525526
series logproto.Series
526527
}
527528

@@ -567,14 +568,14 @@ func NewMultiSeriesIterator(series []logproto.Series) SampleIterator {
567568
// NewSeriesIterator iterates over sample in a series.
568569
func NewSeriesIterator(series logproto.Series) SampleIterator {
569570
return &seriesIterator{
570-
i: -1,
571+
i: atomic.NewInt32(-1),
571572
series: series,
572573
}
573574
}
574575

575576
func (i *seriesIterator) Next() bool {
576-
i.i++
577-
return i.i < len(i.series.Samples)
577+
i.i.Inc()
578+
return int(i.i.Load()) < len(i.series.Samples)
578579
}
579580

580581
func (i *seriesIterator) Error() error {
@@ -590,7 +591,7 @@ func (i *seriesIterator) StreamHash() uint64 {
590591
}
591592

592593
func (i *seriesIterator) Sample() logproto.Sample {
593-
return i.series.Samples[i.i]
594+
return i.series.Samples[i.i.Load()]
594595
}
595596

596597
func (i *seriesIterator) Close() error {

0 commit comments

Comments
 (0)