Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add roaring bitmaps to TSI index files. #10122

Merged
merged 8 commits into from
Jul 31, 2018
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
Add roaring bitmaps to TSI index files.
  • Loading branch information
benbjohnson committed Jul 24, 2018
commit fdfd038401689345bd74e8c55bc90e80c765f3fa
6 changes: 3 additions & 3 deletions Gopkg.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion Gopkg.toml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@

[[constraint]]
name = "github.com/RoaringBitmap/roaring"
version = "0.4.3"
source = "https://github.com/influxdata/roaring.git"
revision = "ec86e26aba5545a1819e1ad68e9faa0f1745fff5"

[[constraint]]
name = "github.com/boltdb/bolt"
Expand Down
5 changes: 4 additions & 1 deletion cmd/influx_inspect/dumptsi/dumptsi.go
Original file line number Diff line number Diff line change
Expand Up @@ -353,7 +353,10 @@ func (cmd *Command) printTagValueSeries(sfile *tsdb.SeriesFile, fs *tsi1.FileSet

// Iterate over each series.
tw := tabwriter.NewWriter(cmd.Stdout, 8, 8, 1, '\t', 0)
itr := fs.TagValueSeriesIDIterator(name, key, value)
itr, err := fs.TagValueSeriesIDIterator(name, key, value)
if err != nil {
return err
}
for {
e, err := itr.Next()
if err != nil {
Expand Down
12 changes: 7 additions & 5 deletions tsdb/index/tsi1/file_set.go
Original file line number Diff line number Diff line change
Expand Up @@ -395,15 +395,17 @@ func (fs *FileSet) TagValueIterator(name, key []byte) TagValueIterator {
}

// TagValueSeriesIDIterator returns a series iterator for a single tag value.
func (fs *FileSet) TagValueSeriesIDIterator(name, key, value []byte) tsdb.SeriesIDIterator {
func (fs *FileSet) TagValueSeriesIDIterator(name, key, value []byte) (tsdb.SeriesIDIterator, error) {
a := make([]tsdb.SeriesIDIterator, 0, len(fs.files))
for _, f := range fs.files {
itr := f.TagValueSeriesIDIterator(name, key, value)
if itr != nil {
itr, err := f.TagValueSeriesIDIterator(name, key, value)
if err != nil {
return nil, err
} else if itr != nil {
a = append(a, itr)
}
}
return tsdb.MergeSeriesIDIterators(a...)
return tsdb.MergeSeriesIDIterators(a...), nil
}

// MeasurementsSketches returns the merged measurement sketches for the FileSet.
Expand Down Expand Up @@ -453,7 +455,7 @@ type File interface {
// Series iteration.
MeasurementSeriesIDIterator(name []byte) tsdb.SeriesIDIterator
TagKeySeriesIDIterator(name, key []byte) tsdb.SeriesIDIterator
TagValueSeriesIDIterator(name, key, value []byte) tsdb.SeriesIDIterator
TagValueSeriesIDIterator(name, key, value []byte) (tsdb.SeriesIDIterator, error)

// Sketches for cardinality estimation
MergeMeasurementsSketches(s, t estimator.Sketch) error
Expand Down
6 changes: 4 additions & 2 deletions tsdb/index/tsi1/index.go
Original file line number Diff line number Diff line change
Expand Up @@ -838,8 +838,10 @@ func (i *Index) TagKeySeriesIDIterator(name, key []byte) (tsdb.SeriesIDIterator,
func (i *Index) TagValueSeriesIDIterator(name, key, value []byte) (tsdb.SeriesIDIterator, error) {
a := make([]tsdb.SeriesIDIterator, 0, len(i.partitions))
for _, p := range i.partitions {
itr := p.TagValueSeriesIDIterator(name, key, value)
if itr != nil {
itr, err := p.TagValueSeriesIDIterator(name, key, value)
if err != nil {
return nil, err
} else if itr != nil {
a = append(a, itr)
}
}
Expand Down
25 changes: 18 additions & 7 deletions tsdb/index/tsi1/index_file.go
Original file line number Diff line number Diff line change
Expand Up @@ -331,20 +331,31 @@ func (f *IndexFile) TagKeySeriesIDIterator(name, key []byte) tsdb.SeriesIDIterat

// TagValueSeriesIDIterator returns a series iterator for a tag value and a flag
// indicating if a tombstone exists on the measurement, key, or value.
func (f *IndexFile) TagValueSeriesIDIterator(name, key, value []byte) tsdb.SeriesIDIterator {
func (f *IndexFile) TagValueSeriesIDIterator(name, key, value []byte) (tsdb.SeriesIDIterator, error) {
tblk := f.tblks[string(name)]
if tblk == nil {
return nil
return nil, nil
}

// Find value element.
n, data := tblk.TagValueSeriesData(key, value)
if n == 0 {
return nil
var valueElem TagBlockValueElem
if !tblk.DecodeTagValueElem(key, value, &valueElem) {
return nil, nil
}

// Return iterator based on uvarint encoding, if set.
if valueElem.SeriesN() == 0 {
return nil, nil
} else if valueElem.SeriesData() != nil {
return &rawSeriesIDIterator{n: valueElem.SeriesN(), data: valueElem.SeriesData()}, nil
}

// Create an iterator over value's series.
return &rawSeriesIDIterator{n: n, data: data}
// Otherwise return iterator over roaring.
ss, err := valueElem.SeriesIDSet()
if err != nil {
return nil, err
}
return tsdb.NewSeriesIDSetIterator(ss), nil
}

// TagKey returns a tag key.
Expand Down
30 changes: 24 additions & 6 deletions tsdb/index/tsi1/index_files.go
Original file line number Diff line number Diff line change
Expand Up @@ -139,16 +139,18 @@ func (p IndexFiles) MeasurementSeriesIDIterator(name []byte) tsdb.SeriesIDIterat
}

// TagValueSeriesIDIterator returns an iterator that merges series across all files.
func (p IndexFiles) TagValueSeriesIDIterator(name, key, value []byte) tsdb.SeriesIDIterator {
func (p IndexFiles) TagValueSeriesIDIterator(name, key, value []byte) (tsdb.SeriesIDIterator, error) {
a := make([]tsdb.SeriesIDIterator, 0, len(p))

for i := range p {
itr := p[i].TagValueSeriesIDIterator(name, key, value)
if itr != nil {
itr, err := p[i].TagValueSeriesIDIterator(name, key, value)
if err != nil {
return nil, err
} else if itr != nil {
a = append(a, itr)
}
}
return tsdb.MergeSeriesIDIterators(a...)
return tsdb.MergeSeriesIDIterators(a...), nil
}

// CompactTo merges all index files and writes them to w.
Expand Down Expand Up @@ -185,6 +187,13 @@ func (p IndexFiles) CompactTo(w io.Writer, sfile *tsdb.SeriesFile, m, k uint64,
return n, err
}

// Ensure block is word aligned.
if offset := (n) % 8; offset != 0 {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

are those parentheses necessary?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The n needed a hug. Removed in 8d66027.

if err := writeTo(bw, make([]byte, 8-offset), &n); err != nil {
return n, err
}
}

// Write measurement block.
t.MeasurementBlock.Offset = n
if err := p.writeMeasurementBlockTo(bw, &info, &n); err != nil {
Expand Down Expand Up @@ -289,6 +298,13 @@ func (p IndexFiles) writeTagsetTo(w io.Writer, name []byte, info *indexCompactIn
default:
}

// Ensure block is word aligned.
if offset := (*n) % 8; offset != 0 {
if err := writeTo(w, make([]byte, 8-offset), n); err != nil {
return err
}
}

kitr, err := p.TagKeyIterator(name)
if err != nil {
return err
Expand All @@ -309,8 +325,10 @@ func (p IndexFiles) writeTagsetTo(w io.Writer, name []byte, info *indexCompactIn

// Merge all series together.
if err := func() error {
sitr := p.TagValueSeriesIDIterator(name, ke.Key(), ve.Value())
if sitr != nil {
sitr, err := p.TagValueSeriesIDIterator(name, ke.Key(), ve.Value())
if err != nil {
return err
} else if sitr != nil {
defer sitr.Close()
for {
se, err := sitr.Next()
Expand Down
26 changes: 20 additions & 6 deletions tsdb/index/tsi1/log_file.go
Original file line number Diff line number Diff line change
Expand Up @@ -451,28 +451,28 @@ func (f *LogFile) DeleteTagKey(name, key []byte) error {
}

// TagValueSeriesIDIterator returns a series iterator for a tag value.
func (f *LogFile) TagValueSeriesIDIterator(name, key, value []byte) tsdb.SeriesIDIterator {
func (f *LogFile) TagValueSeriesIDIterator(name, key, value []byte) (tsdb.SeriesIDIterator, error) {
f.mu.RLock()
defer f.mu.RUnlock()

mm, ok := f.mms[string(name)]
if !ok {
return nil
return nil, nil
}

tk, ok := mm.tagSet[string(key)]
if !ok {
return nil
return nil, nil
}

tv, ok := tk.tagValues[string(value)]
if !ok {
return nil
return nil, nil
} else if tv.cardinality() == 0 {
return nil
return nil, nil
}

return tsdb.NewSeriesIDSetIterator(tv.seriesIDSet())
return tsdb.NewSeriesIDSetIterator(tv.seriesIDSet()), nil
}

// MeasurementN returns the total number of measurements.
Expand Down Expand Up @@ -846,6 +846,13 @@ func (f *LogFile) CompactTo(w io.Writer, m, k uint64, cancel <-chan struct{}) (n
return n, err
}

// Ensure block is word aligned.
if offset := n % 8; offset != 0 {
if err := writeTo(bw, make([]byte, 8-offset), &n); err != nil {
return n, err
}
}

// Write measurement block.
t.MeasurementBlock.Offset = n
if err := f.writeMeasurementBlockTo(bw, names, info, &n); err != nil {
Expand Down Expand Up @@ -924,6 +931,13 @@ func (f *LogFile) writeTagsetTo(w io.Writer, name string, info *logFileCompactIn
default:
}

// Ensure block is word aligned.
if offset := (*n) % 8; offset != 0 {
if err := writeTo(w, make([]byte, 8-offset), n); err != nil {
return err
}
}

enc := NewTagBlockEncoder(w)
var valueN int
for _, k := range mm.keys() {
Expand Down
Loading