Skip to content
This repository has been archived by the owner on Aug 13, 2019. It is now read-only.

Commit

Permalink
Fix updating of NumTombstones in block.Delete(..) (#385)
Browse files Browse the repository at this point in the history
Signed-off-by: Ganesh Vernekar <[email protected]>
  • Loading branch information
codesome authored and krasi-georgiev committed Sep 27, 2018
1 parent a971f52 commit 6e71296
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 1 deletion.
2 changes: 1 addition & 1 deletion block.go
Original file line number Diff line number Diff line change
Expand Up @@ -478,14 +478,14 @@ Outer:
err = pb.tombstones.Iter(func(id uint64, ivs Intervals) error {
for _, iv := range ivs {
stones.addInterval(id, iv)
pb.meta.Stats.NumTombstones++
}
return nil
})
if err != nil {
return err
}
pb.tombstones = stones
pb.meta.Stats.NumTombstones = pb.tombstones.Total()

if err := writeTombstoneFile(pb.dir, pb.tombstones); err != nil {
return err
Expand Down
35 changes: 35 additions & 0 deletions db_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1302,3 +1302,38 @@ func TestInitializeHeadTimestamp(t *testing.T) {
testutil.Equals(t, int64(15000), db.head.MaxTime())
})
}

func TestCorrectNumTombstones(t *testing.T) {
db, close := openTestDB(t, nil)
defer close()
defer db.Close()

blockRange := DefaultOptions.BlockRanges[0]
label := labels.FromStrings("foo", "bar")

app := db.Appender()
for i := int64(0); i < 3; i++ {
for j := int64(0); j < 15; j++ {
_, err := app.Add(label, i*blockRange+j, 0)
testutil.Ok(t, err)
}
}
testutil.Ok(t, app.Commit())

_, err := db.compact()
testutil.Ok(t, err)
testutil.Equals(t, 1, len(db.blocks))

testutil.Ok(t, db.Delete(0, 1, labels.NewEqualMatcher("foo", "bar")))
testutil.Equals(t, uint64(1), db.blocks[0].meta.Stats.NumTombstones)

// {0, 1} and {2, 3} are merged to form 1 tombstone.
testutil.Ok(t, db.Delete(2, 3, labels.NewEqualMatcher("foo", "bar")))
testutil.Equals(t, uint64(1), db.blocks[0].meta.Stats.NumTombstones)

testutil.Ok(t, db.Delete(5, 6, labels.NewEqualMatcher("foo", "bar")))
testutil.Equals(t, uint64(2), db.blocks[0].meta.Stats.NumTombstones)

testutil.Ok(t, db.Delete(9, 11, labels.NewEqualMatcher("foo", "bar")))
testutil.Equals(t, uint64(3), db.blocks[0].meta.Stats.NumTombstones)
}
14 changes: 14 additions & 0 deletions tombstones.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,9 @@ type TombstoneReader interface {
// Iter calls the given function for each encountered interval.
Iter(func(uint64, Intervals) error) error

// Total returns the total count of tombstones.
Total() uint64

// Close any underlying resources
Close() error
}
Expand Down Expand Up @@ -185,6 +188,17 @@ func (t *memTombstones) Iter(f func(uint64, Intervals) error) error {
return nil
}

func (t *memTombstones) Total() uint64 {
t.mtx.RLock()
defer t.mtx.RUnlock()

total := uint64(0)
for _, ivs := range t.intvlGroups {
total += uint64(len(ivs))
}
return total
}

// addInterval to an existing memTombstones
func (t *memTombstones) addInterval(ref uint64, itvs ...Interval) {
t.mtx.Lock()
Expand Down

0 comments on commit 6e71296

Please sign in to comment.