File tree Expand file tree Collapse file tree 3 files changed +14
-2
lines changed Expand file tree Collapse file tree 3 files changed +14
-2
lines changed Original file line number Diff line number Diff line change @@ -73,6 +73,7 @@ type VectorSelector struct {
73
73
Filters []* labels.Matcher
74
74
BatchSize int64
75
75
SelectTimestamp bool
76
+ Invariant bool
76
77
Projection Projection
77
78
// When set, histogram iterators can return objects which only have their
78
79
// CounterResetHint, Count and Sum values populated. Histogram buckets and spans
Original file line number Diff line number Diff line change @@ -248,7 +248,13 @@ func replacePrometheusNodes(plan parser.Expr) Node {
248
248
// parents of matrixselector nodes are always expected to be functions, not step invariant
249
249
// operators.
250
250
if m , ok := t .Expr .(* parser.MatrixSelector ); ok {
251
- return replacePrometheusNodes (m )
251
+ n := replacePrometheusNodes (m )
252
+ if ms , ok := n .(* MatrixSelector ); ok {
253
+ // For cases such as predict_linear(metric[5m] @start() , 0.3), we mark the
254
+ // vector selector to be invariant. The scanner will only scan points once in such cases.
255
+ ms .VectorSelector .Invariant = true
256
+ }
257
+ return n
252
258
}
253
259
return & StepInvariantExpr {Expr : replacePrometheusNodes (t .Expr )}
254
260
case * parser.MatrixSelector :
Original file line number Diff line number Diff line change @@ -126,6 +126,11 @@ func (p Scanners) NewMatrixSelector(
126
126
selector = newHistogramStatsSelector (selector )
127
127
}
128
128
129
+ var ts * int64
130
+ if logicalNode .VectorSelector .Invariant {
131
+ ts = logicalNode .VectorSelector .Timestamp
132
+ }
133
+
129
134
operators := make ([]model.VectorOperator , 0 , opts .DecodingConcurrency )
130
135
for i := 0 ; i < opts .DecodingConcurrency ; i ++ {
131
136
operator , err := NewMatrixSelector (
@@ -134,7 +139,7 @@ func (p Scanners) NewMatrixSelector(
134
139
call .Func .Name ,
135
140
arg ,
136
141
arg2 ,
137
- logicalNode . VectorSelector . Timestamp ,
142
+ ts ,
138
143
opts ,
139
144
logicalNode .Range ,
140
145
vs .Offset ,
You can’t perform that action at this time.
0 commit comments