mirror of
https://github.com/prometheus/prometheus.git
synced 2025-03-05 20:59:13 -08:00
Merge pull request #6820 from codesome/break-compact
Break DB.Compact and DB.CompactHead and DB.CompactBlocks
This commit is contained in:
commit
88af973663
34
tsdb/db.go
34
tsdb/db.go
|
@ -324,7 +324,7 @@ func (db *DBReadOnly) FlushWAL(dir string) error {
|
||||||
}
|
}
|
||||||
mint := head.MinTime()
|
mint := head.MinTime()
|
||||||
maxt := head.MaxTime()
|
maxt := head.MaxTime()
|
||||||
rh := &rangeHead{
|
rh := &RangeHead{
|
||||||
head: head,
|
head: head,
|
||||||
mint: mint,
|
mint: mint,
|
||||||
maxt: maxt,
|
maxt: maxt,
|
||||||
|
@ -685,17 +685,32 @@ func (db *DB) Compact() (err error) {
|
||||||
maxt := rangeForTimestamp(mint, db.head.chunkRange)
|
maxt := rangeForTimestamp(mint, db.head.chunkRange)
|
||||||
|
|
||||||
// Wrap head into a range that bounds all reads to it.
|
// Wrap head into a range that bounds all reads to it.
|
||||||
head := &rangeHead{
|
|
||||||
head: db.head,
|
|
||||||
mint: mint,
|
|
||||||
// We remove 1 millisecond from maxt because block
|
// We remove 1 millisecond from maxt because block
|
||||||
// intervals are half-open: [b.MinTime, b.MaxTime). But
|
// intervals are half-open: [b.MinTime, b.MaxTime). But
|
||||||
// chunk intervals are closed: [c.MinTime, c.MaxTime];
|
// chunk intervals are closed: [c.MinTime, c.MaxTime];
|
||||||
// so in order to make sure that overlaps are evaluated
|
// so in order to make sure that overlaps are evaluated
|
||||||
// consistently, we explicitly remove the last value
|
// consistently, we explicitly remove the last value
|
||||||
// from the block interval here.
|
// from the block interval here.
|
||||||
maxt: maxt - 1,
|
head := NewRangeHead(db.head, mint, maxt-1)
|
||||||
|
if err := db.compactHead(head, mint, maxt); err != nil {
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return db.compactBlocks()
|
||||||
|
}
|
||||||
|
|
||||||
|
// CompactHead compacts the given the RangeHead.
|
||||||
|
func (db *DB) CompactHead(head *RangeHead, mint, maxt int64) (err error) {
|
||||||
|
db.cmtx.Lock()
|
||||||
|
defer db.cmtx.Unlock()
|
||||||
|
|
||||||
|
return db.compactHead(head, mint, maxt)
|
||||||
|
}
|
||||||
|
|
||||||
|
// compactHead compacts the given the RangeHead.
|
||||||
|
// The compaction mutex should be held before calling this method.
|
||||||
|
func (db *DB) compactHead(head *RangeHead, mint, maxt int64) (err error) {
|
||||||
uid, err := db.compactor.Write(db.dir, head, mint, maxt, nil)
|
uid, err := db.compactor.Write(db.dir, head, mint, maxt, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "persist head block")
|
return errors.Wrap(err, "persist head block")
|
||||||
|
@ -718,8 +733,13 @@ func (db *DB) Compact() (err error) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
runtime.GC()
|
runtime.GC()
|
||||||
|
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// compactBlocks compacts all the eligible on-disk blocks.
|
||||||
|
// The compaction mutex should be held before calling this method.
|
||||||
|
func (db *DB) compactBlocks() (err error) {
|
||||||
// Check for compactions of multiple blocks.
|
// Check for compactions of multiple blocks.
|
||||||
for {
|
for {
|
||||||
plan, err := db.compactor.Plan(db.dir)
|
plan, err := db.compactor.Plan(db.dir)
|
||||||
|
@ -1192,7 +1212,7 @@ func (db *DB) Snapshot(dir string, withHead bool) error {
|
||||||
|
|
||||||
mint := db.head.MinTime()
|
mint := db.head.MinTime()
|
||||||
maxt := db.head.MaxTime()
|
maxt := db.head.MaxTime()
|
||||||
head := &rangeHead{
|
head := &RangeHead{
|
||||||
head: db.head,
|
head: db.head,
|
||||||
mint: mint,
|
mint: mint,
|
||||||
maxt: maxt,
|
maxt: maxt,
|
||||||
|
@ -1221,7 +1241,7 @@ func (db *DB) Querier(mint, maxt int64) (Querier, error) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if maxt >= db.head.MinTime() {
|
if maxt >= db.head.MinTime() {
|
||||||
blocks = append(blocks, &rangeHead{
|
blocks = append(blocks, &RangeHead{
|
||||||
head: db.head,
|
head: db.head,
|
||||||
mint: mint,
|
mint: mint,
|
||||||
maxt: maxt,
|
maxt: maxt,
|
||||||
|
|
25
tsdb/head.go
25
tsdb/head.go
|
@ -748,36 +748,45 @@ func (h *Head) initTime(t int64) (initialized bool) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
type rangeHead struct {
|
type RangeHead struct {
|
||||||
head *Head
|
head *Head
|
||||||
mint, maxt int64
|
mint, maxt int64
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *rangeHead) Index() (IndexReader, error) {
|
// NewRangeHead returns a *rangeHead.
|
||||||
|
func NewRangeHead(head *Head, mint, maxt int64) *RangeHead {
|
||||||
|
return &RangeHead{
|
||||||
|
head: head,
|
||||||
|
mint: mint,
|
||||||
|
maxt: maxt,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *RangeHead) Index() (IndexReader, error) {
|
||||||
return h.head.indexRange(h.mint, h.maxt), nil
|
return h.head.indexRange(h.mint, h.maxt), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *rangeHead) Chunks() (ChunkReader, error) {
|
func (h *RangeHead) Chunks() (ChunkReader, error) {
|
||||||
return h.head.chunksRange(h.mint, h.maxt), nil
|
return h.head.chunksRange(h.mint, h.maxt), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *rangeHead) Tombstones() (tombstones.Reader, error) {
|
func (h *RangeHead) Tombstones() (tombstones.Reader, error) {
|
||||||
return h.head.tombstones, nil
|
return h.head.tombstones, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *rangeHead) MinTime() int64 {
|
func (h *RangeHead) MinTime() int64 {
|
||||||
return h.mint
|
return h.mint
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *rangeHead) MaxTime() int64 {
|
func (h *RangeHead) MaxTime() int64 {
|
||||||
return h.maxt
|
return h.maxt
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *rangeHead) NumSeries() uint64 {
|
func (h *RangeHead) NumSeries() uint64 {
|
||||||
return h.head.NumSeries()
|
return h.head.NumSeries()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *rangeHead) Meta() BlockMeta {
|
func (h *RangeHead) Meta() BlockMeta {
|
||||||
return BlockMeta{
|
return BlockMeta{
|
||||||
MinTime: h.MinTime(),
|
MinTime: h.MinTime(),
|
||||||
MaxTime: h.MaxTime(),
|
MaxTime: h.MaxTime(),
|
||||||
|
|
Loading…
Reference in a new issue