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  }