diff --git a/tsdb/index.go b/tsdb/index.go index a53ca7986b..364e47a3d4 100644 --- a/tsdb/index.go +++ b/tsdb/index.go @@ -752,7 +752,7 @@ func (itr *seriesPointIterator) readSeriesKeys(name []byte) error { // Slurp all series keys. itr.keys = itr.keys[:0] - for { + for i := 0; ; i++ { elem, err := sitr.Next() if err != nil { return err @@ -760,6 +760,14 @@ func (itr *seriesPointIterator) readSeriesKeys(name []byte) error { break } + // Periodically check for interrupt. + if i&0xFF == 0xFF { + select { + case <-itr.opt.InterruptCh: + return itr.Close() + } + } + key := itr.indexSet.SeriesFile.SeriesKey(elem.SeriesID) if len(key) == 0 { continue diff --git a/tsdb/shard.go b/tsdb/shard.go index e9d968c11d..aec69160d8 100644 --- a/tsdb/shard.go +++ b/tsdb/shard.go @@ -811,7 +811,13 @@ func (s *Shard) CreateIterator(ctx context.Context, m *influxql.Measurement, opt return nil, err } indexSet := IndexSet{Indexes: []Index{index}, SeriesFile: s.sfile} - return NewSeriesPointIterator(indexSet, opt) + + itr, err := NewSeriesPointIterator(indexSet, opt) + if err != nil { + return nil, err + } + + return query.NewInterruptIterator(itr, opt.InterruptCh), nil case "_tagKeys": return NewTagKeysIterator(s, opt) }