// LoadMetadataIndex loads the shard metadata into memory. func (e *Engine) LoadMetadataIndex(index *tsdb.DatabaseIndex, measurementFields map[string]*tsdb.MeasurementFields) error { return e.db.View(func(tx *bolt.Tx) error { // Load measurement metadata meta := tx.Bucket([]byte("fields")) c := meta.Cursor() for k, v := c.First(); k != nil; k, v = c.Next() { m := index.CreateMeasurementIndexIfNotExists(string(k)) mf := &tsdb.MeasurementFields{} if err := mf.UnmarshalBinary(v); err != nil { return err } for name, _ := range mf.Fields { m.SetFieldName(name) } mf.Codec = tsdb.NewFieldCodec(mf.Fields) measurementFields[m.Name] = mf } // Load series metadata 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 } index.CreateSeriesIndexIfNotExists(tsdb.MeasurementFromSeriesKey(string(k)), series) } return nil }) }
// addToIndexFromKey will pull the measurement name, series key, and field name from a composite key and add it to the // database index and measurement fields func (e *DevEngine) addToIndexFromKey(key string, fieldType influxql.DataType, index *tsdb.DatabaseIndex, measurementFields map[string]*tsdb.MeasurementFields) error { seriesKey, field := seriesAndFieldFromCompositeKey(key) measurement := tsdb.MeasurementFromSeriesKey(seriesKey) m := index.CreateMeasurementIndexIfNotExists(measurement) m.SetFieldName(field) mf := measurementFields[measurement] if mf == nil { mf = &tsdb.MeasurementFields{ Fields: map[string]*tsdb.Field{}, } measurementFields[measurement] = mf } if err := mf.CreateFieldIfNotExists(field, fieldType, false); err != nil { return err } _, tags, err := models.ParseKey(seriesKey) if err == nil { return err } s := tsdb.NewSeries(seriesKey, tags) s.InitializeShards() index.CreateSeriesIndexIfNotExists(measurement, s) return nil }
// LoadMetadataIndex loads the new series and fields files into memory and flushes them to the BoltDB index. This function // should be called before making a call to Open() func (l *Log) LoadMetadataIndex(index *tsdb.DatabaseIndex, measurementFields map[string]*tsdb.MeasurementFields) error { metaFiles, err := l.metadataFiles() if err != nil { return err } measurementFieldsToSave := make(map[string]*tsdb.MeasurementFields) var seriesToCreate []*tsdb.SeriesCreate // read all the metafiles off disk for _, fn := range metaFiles { a, err := l.readMetadataFile(fn) if err != nil { return err } // loop through the seriesAndFields and add them to the index and the collection to be written to the index for _, sf := range a { for k, mf := range sf.Fields { measurementFieldsToSave[k] = mf m := index.CreateMeasurementIndexIfNotExists(string(k)) for name := range mf.Fields { m.SetFieldName(name) } mf.Codec = tsdb.NewFieldCodec(mf.Fields) measurementFields[m.Name] = mf } for _, sc := range sf.Series { seriesToCreate = append(seriesToCreate, sc) sc.Series.InitializeShards() index.CreateSeriesIndexIfNotExists(tsdb.MeasurementFromSeriesKey(string(sc.Series.Key)), sc.Series) } } } if err := l.Index.WriteIndex(nil, measurementFieldsToSave, seriesToCreate); err != nil { return err } // now remove all the old metafiles for _, fn := range metaFiles { if err := os.Remove(fn); err != nil { return err } } return nil }
// LoadMetadataIndex loads the shard metadata into memory. func (e *Engine) LoadMetadataIndex(index *tsdb.DatabaseIndex, measurementFields map[string]*tsdb.MeasurementFields) error { if err := e.db.View(func(tx *bolt.Tx) error { // Load measurement metadata fields, err := e.readFields(tx) if err != nil { return err } for k, mf := range fields { m := index.CreateMeasurementIndexIfNotExists(string(k)) for name, _ := range mf.Fields { m.SetFieldName(name) } mf.Codec = tsdb.NewFieldCodec(mf.Fields) measurementFields[m.Name] = mf } // Load series metadata series, err := e.readSeries(tx) if err != nil { return err } // Load the series into the in-memory index in sorted order to ensure // it's always consistent for testing purposes a := make([]string, 0, len(series)) for k, _ := range series { a = append(a, k) } sort.Strings(a) for _, key := range a { s := series[key] s.InitializeShards() index.CreateSeriesIndexIfNotExists(tsdb.MeasurementFromSeriesKey(string(key)), s) } return nil }); err != nil { return err } // now flush the metadata that was in the WAL, but hadn't yet been flushed if err := e.WAL.LoadMetadataIndex(index, measurementFields); err != nil { return err } // finally open the WAL up return e.WAL.Open() }
// LoadMetadataIndex loads the shard metadata into memory. func (e *Engine) LoadMetadataIndex(shard *tsdb.Shard, index *tsdb.DatabaseIndex, measurementFields map[string]*tsdb.MeasurementFields) error { // Load measurement metadata fields, err := e.readFields() if err != nil { return err } for k, mf := range fields { m := index.CreateMeasurementIndexIfNotExists(string(k)) for name := range mf.Fields { m.SetFieldName(name) } mf.Codec = tsdb.NewFieldCodec(mf.Fields) measurementFields[m.Name] = mf } // Load series metadata series, err := e.readSeries() if err != nil { return err } // Load the series into the in-memory index in sorted order to ensure // it's always consistent for testing purposes a := make([]string, 0, len(series)) for k := range series { a = append(a, k) } sort.Strings(a) for _, key := range a { s := series[key] s.InitializeShards() index.CreateSeriesIndexIfNotExists(tsdb.MeasurementFromSeriesKey(string(key)), s) } return nil }