Skip to content

Commit 3ab3fb0

Browse files
committed
add block query context
1 parent 45192ea commit 3ab3fb0

File tree

17 files changed

+374
-130
lines changed

17 files changed

+374
-130
lines changed

api/gen/proto/go/metastore/v1/types.pb.go

Lines changed: 49 additions & 39 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/gen/proto/go/metastore/v1/types_vtproto.pb.go

Lines changed: 31 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/metastore/v1/types.proto

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ message BlockMeta {
2525
int64 min_time = 6;
2626
int64 max_time = 7;
2727
int32 created_by = 8;
28+
uint64 metadata_offset = 12;
2829
uint64 size = 9;
2930
repeated Dataset datasets = 10;
3031

api/openapiv2/gen/phlare.swagger.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -634,6 +634,10 @@
634634
"type": "integer",
635635
"format": "int32"
636636
},
637+
"metadataOffset": {
638+
"type": "string",
639+
"format": "uint64"
640+
},
637641
"size": {
638642
"type": "string",
639643
"format": "uint64"

pkg/experiment/block/compaction.go

Lines changed: 71 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ type CompactionPlan struct {
155155
datasets []*datasetCompaction
156156
meta *metastorev1.BlockMeta
157157
strings *metadata.StringTable
158-
datasetIndex *datasetIndex
158+
datasetIndex *datasetIndexWriter
159159
}
160160

161161
func newBlockCompaction(
@@ -168,7 +168,7 @@ func newBlockCompaction(
168168
tenant: tenant,
169169
datasetMap: make(map[int32]*datasetCompaction),
170170
strings: metadata.NewStringTable(),
171-
datasetIndex: newDatasetIndex(),
171+
datasetIndex: newDatasetIndexWriter(),
172172
}
173173
p.path = BuildObjectPath(tenant, shard, compactionLevel, id)
174174
p.meta = &metastorev1.BlockMeta{
@@ -187,7 +187,8 @@ func (b *CompactionPlan) Compact(ctx context.Context, dst objstore.Bucket, tmpdi
187187
err = multierror.New(err, w.Close()).Err()
188188
}()
189189
// Datasets are compacted in a strict order.
190-
for _, s := range b.datasets {
190+
for i, s := range b.datasets {
191+
b.datasetIndex.resetDatasetIndex(uint32(i))
191192
if err = s.compact(ctx, w); err != nil {
192193
return nil, fmt.Errorf("compacting block: %w", err)
193194
}
@@ -209,20 +210,21 @@ func (b *CompactionPlan) writeDatasetIndex(w *Writer) error {
209210
return err
210211
}
211212
off := w.Offset()
212-
n, err := w.ReadFrom(bytes.NewReader(b.datasetIndex.indexRewriter.buf))
213+
n, err := w.ReadFrom(bytes.NewReader(b.datasetIndex.buf))
213214
if err != nil {
214215
return err
215216
}
216217
labels := metadata.NewLabelBuilder(b.strings).BuildPairs(
217218
metadata.LabelNameTenantDataset,
218-
metadata.LabelValueDatasetIndex,
219+
metadata.LabelValueDatasetTSDBIndex,
219220
)
220221
b.meta.Datasets = append(b.meta.Datasets, &metastorev1.Dataset{
221222
Tenant: b.meta.Tenant,
222223
Name: 0, // Anonymous.
223224
MinTime: b.meta.MinTime,
224225
MaxTime: b.meta.MaxTime,
225226
// FIXME: We mimic the default layout: empty profiles, index, and empty symbols.
227+
// Instead, it should be handled at the query time: substitute the dataset layout.
226228
TableOfContents: []uint64{off, off, w.Offset()},
227229
Size: uint64(n),
228230
Labels: labels,
@@ -571,20 +573,75 @@ func (s *symbolsRewriter) loadStacktraceIDs(values []parquet.Value) {
571573

572574
func (s *symbolsRewriter) Flush() error { return s.w.Flush() }
573575

574-
type datasetIndex struct {
575-
indexRewriter *indexRewriter
576+
// datasetIndexWriter is identical with indexRewriter,
577+
// except it writes dataset ID instead of series ID.
578+
type datasetIndexWriter struct {
579+
series []seriesLabels
580+
chunks []index.ChunkMeta
581+
previous model.Fingerprint
582+
symbols map[string]struct{}
583+
idx uint32
584+
buf []byte
576585
}
577586

578-
func newDatasetIndex() *datasetIndex {
579-
return &datasetIndex{
580-
indexRewriter: newIndexRewriter(),
587+
func newDatasetIndexWriter() *datasetIndexWriter {
588+
return &datasetIndexWriter{
589+
symbols: make(map[string]struct{}),
581590
}
582591
}
583592

584-
func (s *datasetIndex) writeRow(r ProfileEntry) error {
585-
return s.indexRewriter.rewriteRow(r)
593+
func (rw *datasetIndexWriter) resetDatasetIndex(i uint32) { rw.idx = i }
594+
595+
func (rw *datasetIndexWriter) writeRow(e ProfileEntry) error {
596+
if rw.previous != e.Fingerprint || len(rw.series) == 0 {
597+
series := e.Labels.Clone()
598+
for _, l := range series {
599+
rw.symbols[l.Name] = struct{}{}
600+
rw.symbols[l.Value] = struct{}{}
601+
}
602+
rw.series = append(rw.series, seriesLabels{
603+
labels: series,
604+
fingerprint: e.Fingerprint,
605+
})
606+
rw.chunks = append(rw.chunks, index.ChunkMeta{
607+
SeriesIndex: rw.idx,
608+
})
609+
rw.previous = e.Fingerprint
610+
}
611+
return nil
586612
}
587613

588-
func (s *datasetIndex) Flush() error {
589-
return s.indexRewriter.Flush()
614+
func (rw *datasetIndexWriter) Flush() error {
615+
// TODO(kolesnikovae):
616+
// * Estimate size.
617+
// * Use buffer pool.
618+
w, err := memindex.NewWriter(context.Background(), 1<<20)
619+
if err != nil {
620+
return err
621+
}
622+
623+
// Sort symbols
624+
symbols := make([]string, 0, len(rw.symbols))
625+
for s := range rw.symbols {
626+
symbols = append(symbols, s)
627+
}
628+
sort.Strings(symbols)
629+
630+
// Add symbols
631+
for _, symbol := range symbols {
632+
if err = w.AddSymbol(symbol); err != nil {
633+
return err
634+
}
635+
}
636+
637+
// Add Series
638+
for i, series := range rw.series {
639+
if err = w.AddSeries(storage.SeriesRef(i), series.labels, series.fingerprint, rw.chunks[i]); err != nil {
640+
return err
641+
}
642+
}
643+
644+
err = w.Close()
645+
rw.buf = w.ReleaseIndex()
646+
return err
590647
}

pkg/experiment/block/dataset.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,41 @@ import (
1818
"github.com/grafana/pyroscope/pkg/util/refctr"
1919
)
2020

21+
type Section uint32
22+
23+
const (
24+
// Table of contents sections.
25+
_ Section = iota
26+
SectionProfiles
27+
SectionTSDB
28+
SectionSymbols
29+
)
30+
31+
var allSections = []Section{
32+
SectionProfiles,
33+
SectionTSDB,
34+
SectionSymbols,
35+
}
36+
37+
var (
38+
// Version-specific.
39+
sectionNames = [...][]string{1: {"invalid", "profiles", "tsdb", "symbols"}}
40+
sectionIndices = [...][]int{1: {-1, 0, 1, 2}}
41+
)
42+
43+
func (sc Section) open(ctx context.Context, s *Dataset) (err error) {
44+
switch sc {
45+
case SectionTSDB:
46+
return openTSDB(ctx, s)
47+
case SectionSymbols:
48+
return openSymbols(ctx, s)
49+
case SectionProfiles:
50+
return openProfileTable(ctx, s)
51+
default:
52+
panic(fmt.Sprintf("bug: unknown section: %d", sc))
53+
}
54+
}
55+
2156
type Dataset struct {
2257
meta *metastorev1.Dataset
2358
obj *Object

pkg/experiment/block/metadata/metadata.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,3 +137,14 @@ func (t *StringTable) Load(x iter.Iterator[string]) error {
137137
}
138138
return x.Err()
139139
}
140+
141+
func OpenStringTable(src *metastorev1.BlockMeta) *StringTable {
142+
t := &StringTable{
143+
Dict: make(map[string]int32, len(src.StringTable)),
144+
Strings: src.StringTable,
145+
}
146+
for i, s := range src.StringTable {
147+
t.Dict[s] = int32(i)
148+
}
149+
return t
150+
}

0 commit comments

Comments
 (0)