Merge pull request #8893 from benbjohnson/handle-nil-measurement-iterator

Handle nil MeasurementIterator.
pull/9022/head
Ben Johnson 2017-10-26 11:26:06 -06:00 committed by GitHub
commit da46ac54e8
5 changed files with 75 additions and 41 deletions

View File

@ -43,6 +43,7 @@
- [#8995](https://github.com/influxdata/influxdb/pull/8995): Sort & validate TSI key value insertion.
- [#8968](https://github.com/influxdata/influxdb/issues/8968): Make client errors more helpful on downstream errs. Thanks @darkliquid!
- [#8984](https://github.com/influxdata/influxdb/pull/8984): EXACT and estimated CARDINALITY queries.
- [#8893](https://github.com/influxdata/influxdb/pull/8893): Handle nil MeasurementIterator.
### Bugfixes

View File

@ -229,7 +229,7 @@ func (cmd *Command) printMeasurements(fs *tsi1.FileSet) error {
fmt.Fprintln(tw, "Measurement\t")
// Iterate over each series.
itr := fs.MeasurementIterator()
if itr := fs.MeasurementIterator(); itr != nil {
for e := itr.Next(); e != nil; e = itr.Next() {
if cmd.measurementFilter != nil && !cmd.measurementFilter.Match(e.Name()) {
continue
@ -244,6 +244,7 @@ func (cmd *Command) printMeasurements(fs *tsi1.FileSet) error {
return err
}
}
}
fmt.Fprint(cmd.Stdout, "\n\n")
@ -364,7 +365,8 @@ func (cmd *Command) printIndexFileSummary(f *tsi1.IndexFile) error {
var measurementN, measurementSeriesN, measurementSeriesSize uint64
var keyN uint64
var valueN, valueSeriesN, valueSeriesSize uint64
mitr := f.MeasurementIterator()
if mitr := f.MeasurementIterator(); mitr != nil {
for me, _ := mitr.Next().(*tsi1.MeasurementBlockElem); me != nil; me, _ = mitr.Next().(*tsi1.MeasurementBlockElem) {
kitr := f.TagKeyIterator(me.Name())
for ke, _ := kitr.Next().(*tsi1.TagBlockKeyElem); ke != nil; ke, _ = kitr.Next().(*tsi1.TagBlockKeyElem) {
@ -380,6 +382,7 @@ func (cmd *Command) printIndexFileSummary(f *tsi1.IndexFile) error {
measurementSeriesN += uint64(me.SeriesN())
measurementSeriesSize += uint64(len(me.SeriesData()))
}
}
// Write stats.
tw := tabwriter.NewWriter(cmd.Stdout, 8, 8, 1, '\t', 0)

View File

@ -528,9 +528,13 @@ func (fs *FileSet) MeasurementNamesByExpr(expr influxql.Expr) ([][]byte, error)
return fs.measurementNamesByExpr(expr)
}
itr := fs.MeasurementIterator()
if itr == nil {
return nil, nil
}
// Iterate over all measurements if no condition exists.
var names [][]byte
itr := fs.MeasurementIterator()
for e := itr.Next(); e != nil; e = itr.Next() {
names = append(names, e.Name())
}
@ -605,8 +609,12 @@ func (fs *FileSet) measurementNamesByExpr(expr influxql.Expr) ([][]byte, error)
// measurementNamesByNameFilter returns matching measurement names in sorted order.
func (fs *FileSet) measurementNamesByNameFilter(op influxql.Token, val string, regex *regexp.Regexp) [][]byte {
var names [][]byte
itr := fs.MeasurementIterator()
if itr == nil {
return nil
}
var names [][]byte
for e := itr.Next(); e != nil; e = itr.Next() {
var matched bool
switch op {
@ -632,6 +640,10 @@ func (fs *FileSet) measurementNamesByTagFilter(op influxql.Token, key, val strin
var names [][]byte
mitr := fs.MeasurementIterator()
if mitr == nil {
return nil
}
for me := mitr.Next(); me != nil; me = mitr.Next() {
// If the operator is non-regex, only check the specified value.
var tagMatch bool

View File

@ -415,6 +415,10 @@ func (i *Index) MeasurementNamesByRegex(re *regexp.Regexp) ([][]byte, error) {
defer fs.Release()
itr := fs.MeasurementIterator()
if itr == nil {
return nil, nil
}
var a [][]byte
for e := itr.Next(); e != nil; e = itr.Next() {
if re.Match(e.Name()) {
@ -1200,6 +1204,10 @@ func (itr *seriesPointIterator) Next() (*query.FloatPoint, error) {
// Create new series iterator, if necessary.
// Exit if there are no measurements remaining.
if itr.sitr == nil {
if itr.mitr == nil {
return nil, nil
}
m := itr.mitr.Next()
if m == nil {
return nil, nil

View File

@ -51,6 +51,10 @@ func (p IndexFiles) Files() []File {
// MeasurementNames returns a sorted list of all measurement names for all files.
func (p *IndexFiles) MeasurementNames() [][]byte {
itr := p.MeasurementIterator()
if itr == nil {
return nil
}
var names [][]byte
for e := itr.Next(); e != nil; e = itr.Next() {
names = append(names, bytesutil.Clone(e.Name()))
@ -219,6 +223,10 @@ func (p IndexFiles) writeSeriesBlockTo(w io.Writer, m, k uint64, info *indexComp
func (p IndexFiles) writeTagsetsTo(w io.Writer, info *indexCompactInfo, n *int64) error {
mitr := p.MeasurementIterator()
if mitr == nil {
return nil
}
for m := mitr.Next(); m != nil; m = mitr.Next() {
if err := p.writeTagsetTo(w, m.Name(), info, n); err != nil {
return err
@ -290,6 +298,7 @@ func (p IndexFiles) writeMeasurementBlockTo(w io.Writer, info *indexCompactInfo,
// Add measurement data & compute sketches.
mitr := p.MeasurementIterator()
if mitr != nil {
for m := mitr.Next(); m != nil; m = mitr.Next() {
name := m.Name()
@ -309,6 +318,7 @@ func (p IndexFiles) writeMeasurementBlockTo(w io.Writer, info *indexCompactInfo,
pos := info.tagSets[string(name)]
mw.Add(name, m.Deleted(), pos.offset, pos.size, seriesIDs)
}
}
// Flush data to writer.
nn, err := mw.WriteTo(w)