Skip to content

Commit 729bf3f

Browse files
authored
loads previously created TSDBs into shipper on startup (#6117)
* loads previously created TSDBs into shipper on startup * noopTSDBManager impl * info logs for initial tsdb loading
1 parent 756fc19 commit 729bf3f

File tree

4 files changed

+105
-5
lines changed

4 files changed

+105
-5
lines changed

pkg/storage/stores/indexshipper/uploads/table.go

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -82,12 +82,20 @@ func (lt *table) ForEach(userID string, callback index.ForEachIndexCallback) err
8282
lt.indexSetMtx.RLock()
8383
defer lt.indexSetMtx.RUnlock()
8484

85-
idxSet, ok := lt.indexSet[userID]
86-
if !ok {
87-
return nil
88-
}
85+
// TODO(owen-d): refactor? Uploads mgr never has user indices,
86+
// only common (multitenant) ones.
87+
// iterate through both user and common index
88+
for _, uid := range []string{userID, ""} {
89+
idxSet, ok := lt.indexSet[uid]
90+
if !ok {
91+
continue
92+
}
8993

90-
return idxSet.ForEach(callback)
94+
if err := idxSet.ForEach(callback); err != nil {
95+
return err
96+
}
97+
}
98+
return nil
9199
}
92100

93101
// Upload uploads the index to object storage.

pkg/storage/stores/tsdb/head_manager.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,9 +182,16 @@ func (m *HeadManager) Start() error {
182182
if err != nil {
183183
return err
184184
}
185+
level.Info(m.log).Log("msg", "loaded wals by period", "groups", len(walsByPeriod))
185186

186187
m.activeHeads = newTenantHeads(now, m.shards, m.metrics, m.log)
187188

189+
// Load the shipper with any previously built TSDBs
190+
if err := m.tsdbManager.Start(); err != nil {
191+
return errors.Wrap(err, "failed to start tsdb manager")
192+
}
193+
194+
// Build any old WALs into TSDBs for the shipper
188195
for _, group := range walsByPeriod {
189196
if group.period < curPeriod {
190197
if err := m.tsdbManager.BuildFromWALs(

pkg/storage/stores/tsdb/head_manager_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
type noopTSDBManager struct{ NoopIndex }
2323

2424
func (noopTSDBManager) BuildFromWALs(_ time.Time, _ []WALIdentifier) error { return nil }
25+
func (noopTSDBManager) Start() error { return nil }
2526

2627
func chunkMetasToChunkRefs(user string, fp uint64, xs index.ChunkMetas) (res []ChunkRef) {
2728
for _, x := range xs {

pkg/storage/stores/tsdb/manager.go

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@ package tsdb
33
import (
44
"context"
55
"fmt"
6+
"io/ioutil"
67
"math"
78
"path/filepath"
9+
"strconv"
810
"sync"
911
"time"
1012

@@ -24,6 +26,7 @@ import (
2426
// TSDBManager wraps the index shipper and writes/manages
2527
// TSDB files on disk
2628
type TSDBManager interface {
29+
Start() error
2730
Index
2831
// Builds a new TSDB file from a set of WALs
2932
BuildFromWALs(time.Time, []WALIdentifier) error
@@ -68,6 +71,87 @@ func NewTSDBManager(
6871
}
6972
}
7073

74+
func (m *tsdbManager) Start() (err error) {
75+
var (
76+
buckets, indices, loadingErrors int
77+
)
78+
79+
defer func() {
80+
level.Info(m.log).Log(
81+
"msg", "loaded leftover local indices",
82+
"err", err,
83+
"successful", err == nil,
84+
"buckets", buckets,
85+
"indices", indices,
86+
"failures", loadingErrors,
87+
)
88+
}()
89+
90+
// load list of multitenant tsdbs
91+
mulitenantDir := managerMultitenantDir(m.dir)
92+
files, err := ioutil.ReadDir(mulitenantDir)
93+
if err != nil {
94+
return err
95+
}
96+
97+
for _, f := range files {
98+
if !f.IsDir() {
99+
continue
100+
}
101+
102+
bucket, err := strconv.Atoi(f.Name())
103+
if err != nil {
104+
level.Warn(m.log).Log(
105+
"msg", "failed to parse bucket in multitenant dir ",
106+
"err", err.Error(),
107+
)
108+
continue
109+
}
110+
buckets++
111+
112+
tsdbs, err := ioutil.ReadDir(filepath.Join(mulitenantDir, f.Name()))
113+
if err != nil {
114+
level.Warn(m.log).Log(
115+
"msg", "failed to open period bucket dir",
116+
"bucket", bucket,
117+
"err", err.Error(),
118+
)
119+
continue
120+
}
121+
122+
for _, db := range tsdbs {
123+
id, ok := parseMultitenantTSDBPath(db.Name())
124+
if !ok {
125+
continue
126+
}
127+
indices++
128+
129+
prefixed := newPrefixedIdentifier(id, filepath.Join(mulitenantDir, f.Name()), "")
130+
loaded, err := NewShippableTSDBFile(
131+
prefixed,
132+
false,
133+
)
134+
135+
if err != nil {
136+
level.Warn(m.log).Log(
137+
"msg", "",
138+
"tsdbPath", prefixed.Path(),
139+
"err", err.Error(),
140+
)
141+
loadingErrors++
142+
}
143+
144+
if err := m.shipper.AddIndex(f.Name(), "", loaded); err != nil {
145+
loadingErrors++
146+
return err
147+
}
148+
}
149+
150+
}
151+
152+
return nil
153+
}
154+
71155
func (m *tsdbManager) BuildFromWALs(t time.Time, ids []WALIdentifier) (err error) {
72156
level.Debug(m.log).Log("msg", "building WALs", "n", len(ids), "ts", t)
73157
// get relevant wals

0 commit comments

Comments
 (0)