// Open opens the reader. func (r *Reader) Open() error { // Open underlying storage. db, err := bolt.Open(r.path, 0666, &bolt.Options{Timeout: 1 * time.Second}) if err != nil { return err } r.db = db if err := r.db.View(func(tx *bolt.Tx) error { var data []byte meta := tx.Bucket([]byte("meta")) if meta == nil { // No data in this shard. return nil } buf := meta.Get([]byte("series")) if buf == nil { // No data in this shard. return nil } data, err = snappy.Decode(nil, buf) if err != nil { return err } if err := json.Unmarshal(data, &r.series); err != nil { return err } buf = meta.Get([]byte("fields")) if buf == nil { // No data in this shard. return nil } data, err = snappy.Decode(nil, buf) if err != nil { return err } if err := json.Unmarshal(data, &r.fields); err != nil { return err } return nil }); err != nil { return err } // Build the codec for each measurement. for k, v := range r.fields { r.codecs[k] = tsdb.NewFieldCodec(v.Fields) } // Create cursor for each field of each series. r.tx, err = r.db.Begin(false) if err != nil { return err } for s, _ := range r.series { if err != nil { return err } measurement := tsdb.MeasurementFromSeriesKey(s) for _, f := range r.fields[tsdb.MeasurementFromSeriesKey(s)].Fields { c := newCursor(r.tx, s, f.Name, r.codecs[measurement]) c.SeekTo(0) r.cursors = append(r.cursors, c) } } sort.Sort(cursors(r.cursors)) return nil }
// Open opens the reader. func (r *Reader) Open() error { // Open underlying storage. db, err := bolt.Open(r.path, 0666, &bolt.Options{Timeout: 1 * time.Second}) if err != nil { return err } r.db = db // Load fields. if err := r.db.View(func(tx *bolt.Tx) error { meta := tx.Bucket([]byte("fields")) c := meta.Cursor() for k, v := c.First(); k != nil; k, v = c.Next() { mf := &tsdb.MeasurementFields{} if err := mf.UnmarshalBinary(v); err != nil { return err } r.fields[string(k)] = mf r.codecs[string(k)] = tsdb.NewFieldCodec(mf.Fields) } return nil }); err != nil { return err } // Load series if err := r.db.View(func(tx *bolt.Tx) error { meta := tx.Bucket([]byte("series")) c := meta.Cursor() for k, v := c.First(); k != nil; k, v = c.Next() { series := &tsdb.Series{} if err := series.UnmarshalBinary(v); err != nil { return err } r.series[string(k)] = series } return nil }); err != nil { return err } // Create cursor for each field of each series. r.tx, err = r.db.Begin(false) if err != nil { return err } for s, _ := range r.series { if err != nil { return err } measurement := tsdb.MeasurementFromSeriesKey(s) fields := r.fields[tsdb.MeasurementFromSeriesKey(s)] if fields == nil { atomic.AddUint64(&NoFieldsFiltered, 1) continue } for _, f := range fields.Fields { c := newCursor(r.tx, s, f.Name, r.codecs[measurement]) c.SeekTo(0) r.cursors = append(r.cursors, c) } } sort.Sort(cursors(r.cursors)) return nil }