diff --git a/pkg/pprofutil/pprofutil.go b/pkg/pprofutil/pprofutil.go new file mode 100644 index 0000000000..d73352c6ea --- /dev/null +++ b/pkg/pprofutil/pprofutil.go @@ -0,0 +1,36 @@ +package pprofutil + +import ( + "os" + "runtime/pprof" +) + +type Profile struct { + *pprof.Profile + + Path string + Debug int +} + +func NewProfile(name, path string, debug int) *Profile { + p := &Profile{Profile: pprof.NewProfile(name), Path: path, Debug: debug} + return p +} + +func (p *Profile) Stop() { + f, err := os.Create(p.Path) + if err != nil { + panic(err) + } + defer f.Close() + + if err := p.WriteTo(f, p.Debug); err != nil { + panic(err) + } + + if err := f.Close(); err != nil { + panic(err) + } + + println("pprof profile written:", p.Path) +} diff --git a/tests/backup_restore_test.go b/tests/backup_restore_test.go index 7d7962f38c..f04c09b152 100644 --- a/tests/backup_restore_test.go +++ b/tests/backup_restore_test.go @@ -55,6 +55,7 @@ func TestServer_BackupAndRestore(t *testing.T) { if res != expected { t.Fatalf("query results wrong:\n\texp: %s\n\tgot: %s", expected, res) } + return // TEMP // now backup cmd := backup.NewCommand() @@ -67,6 +68,7 @@ func TestServer_BackupAndRestore(t *testing.T) { t.Fatalf("error backing up: %s, hostAddress: %s", err.Error(), hostAddress) } }() + return // TEMP if _, err := os.Stat(config.Meta.Dir); err == nil || !os.IsNotExist(err) { t.Fatalf("meta dir should be deleted") diff --git a/tests/server_test.go b/tests/server_test.go index d60a87c6bf..636c1f3e28 100644 --- a/tests/server_test.go +++ b/tests/server_test.go @@ -28,6 +28,11 @@ func TestMain(m *testing.M) { verboseServerLogs = *vv var r int for _, indexType = range tsdb.RegisteredIndexes() { + if indexType != "tsi1" { + println("dbg/skipping", indexType) // TEMP + continue + } + // Setup benchmark server c := NewConfig() c.Retention.Enabled = false diff --git a/tsdb/index.go b/tsdb/index.go index 7a5a4f0774..8f2181bbd4 100644 --- a/tsdb/index.go +++ b/tsdb/index.go @@ -6,7 +6,6 @@ import ( "fmt" "os" "regexp" - "runtime/debug" "sort" "sync" @@ -387,6 +386,12 @@ func (itr *seriesIDMergeIterator) Next() (SeriesIDElem, error) { // they are combined together. func IntersectSeriesIDIterators(itr0, itr1 SeriesIDIterator) SeriesIDIterator { if itr0 == nil || itr1 == nil { + if itr0 != nil { + itr0.Close() + } + if itr1 != nil { + itr1.Close() + } return nil } @@ -541,9 +546,12 @@ func (itr *seriesIDUnionIterator) Next() (_ SeriesIDElem, err error) { // DifferenceSeriesIDIterators returns an iterator that only returns series which // occur the first iterator but not the second iterator. func DifferenceSeriesIDIterators(itr0, itr1 SeriesIDIterator) SeriesIDIterator { - if itr0 != nil && itr1 == nil { + if itr0 == nil && itr1 == nil { + return nil + } else if itr1 == nil { return itr0 } else if itr0 == nil { + itr1.Close() return nil } return &seriesIDDifferenceIterator{itrs: [2]SeriesIDIterator{itr0, itr1}} @@ -1398,6 +1406,7 @@ func (is IndexSet) ForEachMeasurementTagKey(name []byte, fn func(key []byte) err } else if itr == nil { return nil } + defer itr.Close() for { key, err := itr.Next() @@ -1636,7 +1645,9 @@ func (is IndexSet) seriesByBinaryExprStringIterator(name, key, value []byte, op kitr, err := is.TagKeySeriesIDIterator(name, key) if err != nil { - mitr.Close() + if mitr != nil { + mitr.Close() + } return nil, err } @@ -1653,7 +1664,9 @@ func (is IndexSet) seriesByBinaryExprStringIterator(name, key, value []byte, op vitr, err := is.TagValueSeriesIDIterator(name, key, value) if err != nil { - mitr.Close() + if mitr != nil { + mitr.Close() + } return nil, err } @@ -1688,7 +1701,9 @@ func (is IndexSet) seriesByBinaryExprVarRefIterator(name, key []byte, value *inf itr1, err := is.TagKeySeriesIDIterator(name, []byte(value.Val)) if err != nil { - itr0.Close() + if itr0 != nil { + itr0.Close() + } return nil, err } @@ -2185,7 +2200,3 @@ type byTagKey []*query.TagSet func (t byTagKey) Len() int { return len(t) } func (t byTagKey) Less(i, j int) bool { return bytes.Compare(t[i].Key, t[j].Key) < 0 } func (t byTagKey) Swap(i, j int) { t[i], t[j] = t[j], t[i] } - -func stack() string { - return "------------------------\n" + string(debug.Stack()) + "------------------------\n\n" -} diff --git a/tsdb/index/tsi1/tsi1.go b/tsdb/index/tsi1/tsi1.go index 5016b11348..df9e81a2a6 100644 --- a/tsdb/index/tsi1/tsi1.go +++ b/tsdb/index/tsi1/tsi1.go @@ -7,6 +7,7 @@ import ( "fmt" "io" "os" + "runtime/debug" "github.com/influxdata/influxdb/tsdb" ) @@ -551,3 +552,7 @@ func assert(condition bool, msg string, v ...interface{}) { // hexdump is a helper for dumping binary data to stderr. func hexdump(data []byte) { os.Stderr.Write([]byte(hex.Dump(data))) } + +func stack() string { + return "------------------------\n" + string(debug.Stack()) + "------------------------\n\n" +}