Skip to content

Commit 75ccf21

Browse files
authored
feat(blooms): Separate page buffer pools for series pages and bloom pages (#12992)
Series pages are much smaller than bloom pages and therefore can make use of a separate buffer pool with different buckets. The second commit fixes a possible panic. Signed-off-by: Christian Haudum <[email protected]>
1 parent 94d610e commit 75ccf21

File tree

3 files changed

+24
-13
lines changed

3 files changed

+24
-13
lines changed

pkg/storage/bloom/v1/bloom.go

+7-7
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ type Bloom struct {
2424

2525
func (b *Bloom) Encode(enc *encoding.Encbuf) error {
2626
// divide by 8 b/c bloom capacity is measured in bits, but we want bytes
27-
buf := bytes.NewBuffer(BlockPool.Get(int(b.Capacity() / 8)))
27+
buf := bytes.NewBuffer(BloomPagePool.Get(int(b.Capacity() / 8)))
2828

2929
// TODO(owen-d): have encoder implement writer directly so we don't need
3030
// to indirect via a buffer
@@ -36,7 +36,7 @@ func (b *Bloom) Encode(enc *encoding.Encbuf) error {
3636
data := buf.Bytes()
3737
enc.PutUvarint(len(data)) // length of bloom filter
3838
enc.PutBytes(data)
39-
BlockPool.Put(data[:0]) // release to pool
39+
BloomPagePool.Put(data[:0]) // release to pool
4040
return nil
4141
}
4242

@@ -65,8 +65,8 @@ func (b *Bloom) Decode(dec *encoding.Decbuf) error {
6565
}
6666

6767
func LazyDecodeBloomPage(r io.Reader, pool chunkenc.ReaderPool, page BloomPageHeader) (*BloomPageDecoder, error) {
68-
data := BlockPool.Get(page.Len)[:page.Len]
69-
defer BlockPool.Put(data)
68+
data := BloomPagePool.Get(page.Len)[:page.Len]
69+
defer BloomPagePool.Put(data)
7070

7171
_, err := io.ReadFull(r, data)
7272
if err != nil {
@@ -84,7 +84,7 @@ func LazyDecodeBloomPage(r io.Reader, pool chunkenc.ReaderPool, page BloomPageHe
8484
}
8585
defer pool.PutReader(decompressor)
8686

87-
b := BlockPool.Get(page.DecompressedLen)[:page.DecompressedLen]
87+
b := BloomPagePool.Get(page.DecompressedLen)[:page.DecompressedLen]
8888

8989
if _, err = io.ReadFull(decompressor, b); err != nil {
9090
return nil, errors.Wrap(err, "decompressing bloom page")
@@ -101,7 +101,7 @@ func LazyDecodeBloomPageNoCompression(r io.Reader, page BloomPageHeader) (*Bloom
101101
if page.Len != page.DecompressedLen+4 {
102102
return nil, errors.New("the Len and DecompressedLen of the page do not match")
103103
}
104-
data := BlockPool.Get(page.Len)[:page.Len]
104+
data := BloomPagePool.Get(page.Len)[:page.Len]
105105

106106
_, err := io.ReadFull(r, data)
107107
if err != nil {
@@ -163,7 +163,7 @@ func (d *BloomPageDecoder) Relinquish() {
163163
d.data = nil
164164

165165
if cap(data) > 0 {
166-
BlockPool.Put(data)
166+
BloomPagePool.Put(data)
167167
}
168168
}
169169

pkg/storage/bloom/v1/index.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ func (b *BlockIndex) NewSeriesPageDecoder(r io.ReadSeeker, header SeriesPageHead
155155
defer func() {
156156
if err != nil {
157157
metrics.pagesSkipped.WithLabelValues(pageTypeSeries, skipReasonErr).Inc()
158-
metrics.bytesSkipped.WithLabelValues(pageTypeSeries).Add(float64(header.DecompressedLen))
158+
metrics.bytesSkipped.WithLabelValues(pageTypeSeries, skipReasonErr).Add(float64(header.DecompressedLen))
159159
} else {
160160
metrics.pagesRead.WithLabelValues(pageTypeSeries).Inc()
161161
metrics.bytesRead.WithLabelValues(pageTypeSeries).Add(float64(header.DecompressedLen))
@@ -166,8 +166,8 @@ func (b *BlockIndex) NewSeriesPageDecoder(r io.ReadSeeker, header SeriesPageHead
166166
return nil, errors.Wrap(err, "seeking to series page")
167167
}
168168

169-
data := BlockPool.Get(header.Len)[:header.Len]
170-
defer BlockPool.Put(data)
169+
data := SeriesPagePool.Get(header.Len)[:header.Len]
170+
defer SeriesPagePool.Put(data)
171171
_, err = io.ReadFull(r, data)
172172
if err != nil {
173173
return nil, errors.Wrap(err, "reading series page")

pkg/storage/bloom/v1/util.go

+14-3
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,21 @@ var (
3232
},
3333
}
3434

35-
// 4KB -> 128MB
36-
BlockPool = BytePool{
35+
// buffer pool for series pages
36+
// 1KB 2KB 4KB 8KB 16KB 32KB 64KB 128KB
37+
SeriesPagePool = BytePool{
3738
pool: pool.New(
38-
4<<10, 128<<20, 2,
39+
1<<10, 128<<10, 2,
40+
func(size int) interface{} {
41+
return make([]byte, size)
42+
}),
43+
}
44+
45+
// buffer pool for bloom pages
46+
// 128KB 256KB 512KB 1MB 2MB 4MB 8MB 16MB 32MB 64MB 128MB
47+
BloomPagePool = BytePool{
48+
pool: pool.New(
49+
128<<10, 128<<20, 2,
3950
func(size int) interface{} {
4051
return make([]byte, size)
4152
}),

0 commit comments

Comments
 (0)