Compact TSDB head chunks after being cut, to reduce inuse memory

Signed-off-by: NMarco Pracucci <marco@pracucci.com>
上级 49241454
......@@ -49,6 +49,7 @@ type Chunk interface {
// be re-used or a new iterator can be allocated.
Iterator(Iterator) Iterator
NumSamples() int
Compact()
}
// Appender adds sample pairs to a chunk.
......
......@@ -49,6 +49,10 @@ import (
"math/bits"
)
const (
chunkCompactCapacityThreshold = 32
)
// XORChunk holds XOR encoded sample data.
type XORChunk struct {
b bstream
......@@ -75,6 +79,14 @@ func (c *XORChunk) NumSamples() int {
return int(binary.BigEndian.Uint16(c.Bytes()))
}
func (c *XORChunk) Compact() {
if l := len(c.b.stream); cap(c.b.stream) > l+chunkCompactCapacityThreshold {
buf := make([]byte, l)
copy(buf, c.b.stream)
c.b.stream = buf
}
}
// Appender implements the Chunk interface.
func (c *XORChunk) Appender() (Appender, error) {
it := c.iterator(nil)
......
......@@ -1691,6 +1691,11 @@ func (s *memSeries) cut(mint int64) *memChunk {
s.chunks = append(s.chunks, c)
s.headChunk = c
// Remove exceeding capacity from the previous chunk byte slice to save memory.
if l := len(s.chunks); l > 1 {
s.chunks[l-2].chunk.Compact()
}
// Set upper bound on when the next chunk must be started. An earlier timestamp
// may be chosen dynamically at a later point.
s.nextAt = rangeForTimestamp(mint, s.chunkRange)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册