@@ -182,14 +182,17 @@ func (s *shard) CreateCursor(ctx context.Context, schema *executor.QuerySchema)
182
182
if (startTime >= shardStartTime && startTime <= shardEndTime ) || (endTime >= shardStartTime && endTime <= shardEndTime ) {
183
183
hasTimeFilter = true
184
184
}
185
-
185
+ iTr := util.TimeRange {}
186
+ if schema .Options ().IsPromQuery () {
187
+ iTr = GetIntersectTimeRange (startTime , endTime , shardStartTime , shardEndTime )
188
+ }
186
189
immutableReader , mutableReader := s .cloneReaders (schema .Options ().OptionsName (), hasTimeFilter , tr )
187
190
if cloneMsSpan != nil {
188
191
cloneMsSpan .SetNameValue (fmt .Sprintf ("order=%d,unorder=%d" , len (immutableReader .Orders ), len (immutableReader .OutOfOrders )))
189
192
cloneMsSpan .Finish ()
190
193
}
191
194
192
- groupCursors , err := s .createGroupCursors (span , schema , lazyInit , result , immutableReader , mutableReader )
195
+ groupCursors , err := s .createGroupCursors (span , schema , lazyInit , result , immutableReader , mutableReader , iTr )
193
196
194
197
// unref file(no need lock here), series iterator will ref/unref file itself
195
198
unRefReaders (immutableReader , mutableReader )
@@ -225,7 +228,7 @@ func (s *shard) GetTSSPFiles(mm string, isOrder bool) (*immutable.TSSPFiles, boo
225
228
}
226
229
227
230
func (s * shard ) initGroupCursors (querySchema * executor.QuerySchema , parallelism int ,
228
- readers * immutable.MmsReaders , memTables * mutable.MemTables ) (comm.KeyCursors , error ) {
231
+ readers * immutable.MmsReaders , memTables * mutable.MemTables , iTr util. TimeRange ) (comm.KeyCursors , error ) {
229
232
var schema record.Schemas
230
233
var filterFieldsIdx []int
231
234
var filterTags []string
@@ -255,6 +258,7 @@ func (s *shard) initGroupCursors(querySchema *executor.QuerySchema, parallelism
255
258
seriesPool : SeriesPool ,
256
259
tmsMergePool : TsmMergePool ,
257
260
querySchema : querySchema ,
261
+ interTr : util.TimeRange {Min : iTr .Min , Max : iTr .Max },
258
262
},
259
263
querySchema : querySchema ,
260
264
}
@@ -350,7 +354,7 @@ func getQueryTimeRange(readers *immutable.MmsReaders, querySchema *executor.Quer
350
354
}
351
355
352
356
func (s * shard ) createGroupCursors (span * tracing.Span , schema * executor.QuerySchema , lazyInit bool , tagSets []* tsi.TagSetInfo ,
353
- readers * immutable.MmsReaders , memTables * mutable.MemTables ) ([]comm.KeyCursor , error ) {
357
+ readers * immutable.MmsReaders , memTables * mutable.MemTables , iTr util. TimeRange ) ([]comm.KeyCursor , error ) {
354
358
355
359
parallelism , totalSid := getParallelismNumAndSidNum (schema , tagSets )
356
360
@@ -363,7 +367,7 @@ func (s *shard) createGroupCursors(span *tracing.Span, schema *executor.QuerySch
363
367
defer groupSpan .Finish ()
364
368
}
365
369
366
- cursors , err := s .initGroupCursors (schema , parallelism , readers , memTables )
370
+ cursors , err := s .initGroupCursors (schema , parallelism , readers , memTables , iTr )
367
371
if err != nil {
368
372
return nil , err
369
373
}
@@ -383,7 +387,6 @@ func (s *shard) createGroupCursors(span *tracing.Span, schema *executor.QuerySch
383
387
cursors [i ].(* groupCursor ).span = subGroupSpan
384
388
}
385
389
}
386
-
387
390
enableFileCursor := executor .IsEnableFileCursor (schema )
388
391
var startGroupIdx int
389
392
errs := make ([]error , parallelism )
@@ -537,6 +540,7 @@ type idKeyCursorContext struct {
537
540
engineType config.EngineType
538
541
tr util.TimeRange
539
542
queryTr util.TimeRange
543
+ interTr util.TimeRange // intersection of the query time and shard time
540
544
auxTags []string
541
545
schema record.Schemas
542
546
readers * immutable.MmsReaders
@@ -772,10 +776,10 @@ func (s *shard) iteratorInit(ctx *idKeyCursorContext, span *tracing.Span, schema
772
776
return NewAggregateCursor (itr , schema , ctx .aggPool , ctx .hasAuxTags ()), nil
773
777
}
774
778
if schema .Options ().IsInstantVectorSelector () {
775
- return NewInstantVectorCursor (itr , schema , ctx .aggPool ), nil
779
+ return NewInstantVectorCursor (itr , schema , ctx .aggPool , ctx . interTr ), nil
776
780
}
777
781
if schema .Options ().IsRangeVectorSelector () && len (schema .Calls ()) > 0 {
778
- return NewRangeVectorCursor (itr , schema , ctx .aggPool ), nil
782
+ return NewRangeVectorCursor (itr , schema , ctx .aggPool , ctx . interTr ), nil
779
783
}
780
784
}
781
785
return itr , nil
@@ -809,9 +813,9 @@ func itrsInit(ctx *idKeyCursorContext, span *tracing.Span, schema *executor.Quer
809
813
if ! canNotAggOnSeries && (len (schema .Calls ()) > 0 && ! havePreAgg ) && ! schema .Options ().IsPromQuery () {
810
814
itrAgg = NewAggregateCursor (itr , schema , ctx .aggPool , ctx .hasAuxTags ())
811
815
} else if schema .Options ().IsInstantVectorSelector () {
812
- itrAgg = NewInstantVectorCursor (itr , schema , ctx .aggPool )
816
+ itrAgg = NewInstantVectorCursor (itr , schema , ctx .aggPool , ctx . interTr )
813
817
} else if schema .Options ().IsRangeVectorSelector () && len (schema .Calls ()) > 0 {
814
- itrAgg = NewRangeVectorCursor (itr , schema , ctx .aggPool )
818
+ itrAgg = NewRangeVectorCursor (itr , schema , ctx .aggPool , ctx . interTr )
815
819
}
816
820
var itrLimit * limitCursor
817
821
@@ -868,9 +872,9 @@ func itrsInitWithLimit(ctx *idKeyCursorContext, span *tracing.Span, schema *exec
868
872
if ! schema .Options ().IsPromQuery () {
869
873
itrAgg = NewAggregateCursor (itr , schema , ctx .aggPool , ctx .hasAuxTags ())
870
874
} else if schema .Options ().IsInstantVectorSelector () {
871
- itrAgg = NewInstantVectorCursor (itr , schema , ctx .aggPool )
875
+ itrAgg = NewInstantVectorCursor (itr , schema , ctx .aggPool , ctx . interTr )
872
876
} else if schema .Options ().IsRangeVectorSelector () && len (schema .Calls ()) > 0 {
873
- itrAgg = NewRangeVectorCursor (itr , schema , ctx .aggPool )
877
+ itrAgg = NewRangeVectorCursor (itr , schema , ctx .aggPool , ctx . interTr )
874
878
}
875
879
}
876
880
var itrLimit * limitCursor
@@ -1026,3 +1030,19 @@ func getParallelismNumAndSidNum(schema *executor.QuerySchema, tagSets []*tsi.Tag
1026
1030
1027
1031
return parallelism , totalSid
1028
1032
}
1033
+
1034
+ // GetIntersectTimeRange used to get intersection of the query time and shard time
1035
+ func GetIntersectTimeRange (queryStartTime , queryEndTime , shardStartTime , shardEndTime int64 ) util.TimeRange {
1036
+ tr := util.TimeRange {}
1037
+ if queryStartTime <= shardStartTime {
1038
+ tr .Min = shardStartTime
1039
+ } else {
1040
+ tr .Min = queryStartTime
1041
+ }
1042
+ if queryEndTime <= shardEndTime {
1043
+ tr .Max = queryEndTime
1044
+ } else {
1045
+ tr .Max = shardEndTime
1046
+ }
1047
+ return tr
1048
+ }
0 commit comments