github.com/grafana/pyroscope@v1.18.0/pkg/metastore/index/tombstones/tombstones_test.go (about) 1 package tombstones 2 3 import ( 4 "testing" 5 "time" 6 7 "github.com/hashicorp/raft" 8 "github.com/stretchr/testify/assert" 9 "github.com/stretchr/testify/require" 10 11 metastorev1 "github.com/grafana/pyroscope/api/gen/proto/go/metastore/v1" 12 "github.com/grafana/pyroscope/pkg/metastore/index/tombstones/store" 13 "github.com/grafana/pyroscope/pkg/test" 14 ) 15 16 func TestTombstonesIdempotence(t *testing.T) { 17 db := test.BoltDB(t) 18 tombstoneStore := store.NewTombstoneStore() 19 20 ts := NewTombstones(tombstoneStore, nil) 21 tx, err := db.Begin(true) 22 require.NoError(t, err) 23 require.NoError(t, ts.Init(tx)) 24 require.NoError(t, tx.Commit()) 25 26 now := time.Now() 27 cmd := &raft.Log{ 28 Index: 1, 29 Term: 1, 30 Type: raft.LogCommand, 31 Data: []byte("test"), 32 AppendedAt: now, 33 } 34 35 x := &metastorev1.Tombstones{ 36 Blocks: &metastorev1.BlockTombstones{ 37 Name: "test-block", 38 Tenant: "test-tenant", 39 Shard: 1, 40 Blocks: []string{"block-1", "block-2"}, 41 }, 42 } 43 44 t.Run("AddTombstones", func(t *testing.T) { 45 tx, err = db.Begin(true) 46 require.NoError(t, err) 47 err = ts.AddTombstones(tx, cmd, x) 48 require.NoError(t, err) 49 require.NoError(t, tx.Commit()) 50 51 assert.True(t, ts.Exists("test-tenant", 1, "block-1")) 52 assert.True(t, ts.Exists("test-tenant", 1, "block-2")) 53 54 count := countTombstones(ts) 55 56 tx, err = db.Begin(true) 57 require.NoError(t, err) 58 err = ts.AddTombstones(tx, cmd, x) 59 require.NoError(t, err) 60 require.NoError(t, tx.Commit()) 61 assert.Equal(t, count, countTombstones(ts)) 62 63 assert.True(t, ts.Exists("test-tenant", 1, "block-1")) 64 assert.True(t, ts.Exists("test-tenant", 1, "block-2")) 65 }) 66 67 t.Run("DeleteTombstones", func(t *testing.T) { 68 tx, err := db.Begin(true) 69 require.NoError(t, err) 70 err = ts.DeleteTombstones(tx, cmd, x) 71 require.NoError(t, err) 72 require.NoError(t, tx.Commit()) 73 74 assert.False(t, ts.Exists("test-tenant", 1, "block-1")) 75 assert.False(t, ts.Exists("test-tenant", 1, "block-2")) 76 77 count := countTombstones(ts) 78 79 tx, err = db.Begin(true) 80 require.NoError(t, err) 81 err = ts.DeleteTombstones(tx, cmd, x) 82 require.NoError(t, err) 83 require.NoError(t, tx.Commit()) 84 assert.Equal(t, count, countTombstones(ts)) 85 86 assert.False(t, ts.Exists("test-tenant", 1, "block-1")) 87 assert.False(t, ts.Exists("test-tenant", 1, "block-2")) 88 }) 89 } 90 91 func countTombstones(ts *Tombstones) int { 92 var c int 93 iter := ts.ListTombstones(time.Now().Add(time.Hour)) 94 for iter.Next() { 95 c++ 96 } 97 return c 98 }