diff --git a/tsdb/engine/tsm1/file_store.go b/tsdb/engine/tsm1/file_store.go index 6d53020340..ccc0866839 100644 --- a/tsdb/engine/tsm1/file_store.go +++ b/tsdb/engine/tsm1/file_store.go @@ -635,35 +635,26 @@ func (f *FileStore) walkFiles(fn func(f TSMFile) error) error { defer f.mu.RUnlock() // struct to hold the result of opening each reader in a goroutine - type res struct { - err error - } - - resC := make(chan res) - var n int + errC := make(chan error, len(f.files)) for _, f := range f.files { - n++ - go func(tsm TSMFile) { if err := fn(tsm); err != nil { - resC <- res{err: fmt.Errorf("file %s: %s", tsm.Path(), err)} + errC <- fmt.Errorf("file %s: %s", tsm.Path(), err) return } - resC <- res{} + errC <- nil }(f) } - var err error - for i := 0; i < n; i++ { - res := <-resC - if res.err != nil { - err = res.err + for i := 0; i < cap(errC); i++ { + res := <-errC + if res != nil { + return res } } - close(resC) - return err + return nil } // locations returns the files and index blocks for a key and time. ascending indicates diff --git a/tsdb/engine/tsm1/reader.go b/tsdb/engine/tsm1/reader.go index 6ef995b568..3534223c4d 100644 --- a/tsdb/engine/tsm1/reader.go +++ b/tsdb/engine/tsm1/reader.go @@ -215,7 +215,7 @@ func (t *TSMReader) applyTombstones() error { } batch = append(batch, ts.Key) - if len(batch) > 4096 { + if len(batch) >= 4096 { t.index.DeleteRange(batch, prev.Min, prev.Max) batch = batch[:0] } diff --git a/tsdb/engine/tsm1/tombstone.go b/tsdb/engine/tsm1/tombstone.go index 3e67333d97..1619af0e8a 100644 --- a/tsdb/engine/tsm1/tombstone.go +++ b/tsdb/engine/tsm1/tombstone.go @@ -11,7 +11,10 @@ import ( "sync" ) -const v2header = 0x1502 +const ( + v2header = 0x1502 + v2headerSize = 4 +) type Tombstoner struct { mu sync.Mutex @@ -116,8 +119,7 @@ func (t *Tombstoner) Walk(fn func(t Tombstone) error) error { defer f.Close() var b [4]byte - _, err = f.Read(b[:]) - if err != nil { + if _, err := f.Read(b[:]); err != nil { // Might be a zero length file which should not exist, but // an old bug allowed them to occur. Treat it as an empty // v1 tombstone file so we don't abort loading the TSM file. @@ -221,7 +223,7 @@ func (t *Tombstoner) readTombstoneV1(f *os.File, fn func(t Tombstone) error) err // format is binary. func (t *Tombstoner) readTombstoneV2(f *os.File, fn func(t Tombstone) error) error { // Skip header, already checked earlier - if _, err := f.Seek(4, os.SEEK_SET); err != nil { + if _, err := f.Seek(v2headerSize, os.SEEK_SET); err != nil { return err } n := int64(4)