fix #8028: call api.NewTypesDB() instead of new

The code was calling new(api.TypesDB) which didn't initialize an
unexported map inside of the type. Call api.NewTypesDB() instead.
pull/8055/head
David Norton 2017-02-23 17:58:32 -05:00
parent a20c2dc232
commit c7fa58473f
3 changed files with 62 additions and 1 deletions

View File

@ -14,6 +14,7 @@
- [#8001](https://github.com/influxdata/influxdb/issues/8001): Map types correctly when using a regex and one of the measurements is empty.
- [#8040](https://github.com/influxdata/influxdb/issues/8040): Reduce the expression in a subquery to avoid a panic.
- [#7968](https://github.com/influxdata/influxdb/issues/7968): Properly select a tag within a subquery.
- [#8028](https://github.com/influxdata/influxdb/issues/8028): Fix panic in collectd when configured to read types DB from directory.
## v1.2.0 [2017-01-24]

View File

@ -2,6 +2,7 @@
package collectd // import "github.com/influxdata/influxdb/services/collectd"
import (
"bytes"
"fmt"
"io/ioutil"
"net"
@ -114,7 +115,10 @@ func (s *Service) Open() error {
if stat, err := os.Stat(s.Config.TypesDB); err != nil {
return fmt.Errorf("Stat(): %s", err)
} else if stat.IsDir() {
alltypesdb := new(api.TypesDB)
alltypesdb, err := api.NewTypesDB(&bytes.Buffer{})
if err != nil {
return err
}
var readdir func(path string)
readdir = func(path string) {
files, err := ioutil.ReadDir(path)

View File

@ -3,8 +3,10 @@ package collectd
import (
"encoding/hex"
"errors"
"io/ioutil"
"net"
"os"
"path"
"strings"
"testing"
"time"
@ -53,6 +55,60 @@ func TestService_OpenClose(t *testing.T) {
}
}
// Test that the service can read types DB files from a directory.
func TestService_Open_TypesDBDir(t *testing.T) {
t.Parallel()
// Make a temp dir to write types.db into.
tmpDir, err := ioutil.TempDir(os.TempDir(), "")
if err != nil {
t.Fatal(err)
}
defer os.RemoveAll(tmpDir)
// Write types.db.
if err := ioutil.WriteFile(path.Join(tmpDir, "types.db"), []byte(typesDBText), 0777); err != nil {
t.Fatal(err)
}
// Setup config to read all files in the temp dir.
c := Config{
BindAddress: "127.0.0.1:0",
Database: "collectd_test",
BatchSize: 1000,
BatchDuration: toml.Duration(time.Second),
TypesDB: tmpDir,
}
s := &TestService{
Config: c,
Service: NewService(c),
MetaClient: &internal.MetaClientMock{},
}
if testing.Verbose() {
s.Service.WithLogger(zap.New(
zap.NewTextEncoder(),
zap.Output(os.Stderr),
))
}
s.MetaClient.CreateDatabaseFn = func(name string) (*meta.DatabaseInfo, error) {
return nil, nil
}
s.Service.PointsWriter = s
s.Service.MetaClient = s.MetaClient
if err := s.Service.Open(); err != nil {
t.Fatal(err)
}
if err := s.Service.Close(); err != nil {
t.Fatal(err)
}
}
// Test that the service checks / creates the target database every time we
// try to write points.
func TestService_CreatesDatabase(t *testing.T) {