Skip to content

Commit a453844

Browse files
committed
Fix tombstone overwrite bug
1 parent d64f57c commit a453844

File tree

3 files changed

+45
-11
lines changed

3 files changed

+45
-11
lines changed

pkg/experiment/metastore/index/tombstones/store/tombstone_store.go

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,26 @@ var ErrInvalidTombstoneEntry = errors.New("invalid tombstone entry")
1717
var tombstoneBucketName = []byte("tombstones")
1818

1919
type TombstoneEntry struct {
20+
// Key the entry was stored under. This is needed for backward
21+
// compatibility: if the logic for generating keys changes, we
22+
// will still be able to delete old entries.
23+
key []byte
2024
Index uint64
2125
AppendedAt int64
2226
*metastorev1.Tombstones
2327
}
2428

29+
func (e TombstoneEntry) Name() string {
30+
switch {
31+
case e.Tombstones.Blocks != nil:
32+
return e.Tombstones.Blocks.Name
33+
case e.Tombstones.Shard != nil:
34+
return e.Tombstones.Shard.Name
35+
default:
36+
return ""
37+
}
38+
}
39+
2540
type TombstoneStore struct{ bucketName []byte }
2641

2742
func NewTombstoneStore() *TombstoneStore {
@@ -83,20 +98,29 @@ func marshalTombstoneEntry(e TombstoneEntry) store.KV {
8398
}
8499

85100
func marshalTombstoneEntryKey(e TombstoneEntry) []byte {
86-
b := make([]byte, 16)
101+
if e.key != nil {
102+
b := make([]byte, len(e.key))
103+
copy(b, e.key)
104+
return b
105+
}
106+
name := e.Name()
107+
b := make([]byte, 16+len(name))
87108
binary.BigEndian.PutUint64(b[0:8], e.Index)
88109
binary.BigEndian.PutUint64(b[8:16], uint64(e.AppendedAt))
110+
copy(b[16:], name)
89111
return b
90112
}
91113

92-
func unmarshalTombstoneEntry(dst *TombstoneEntry, e store.KV) error {
93-
if len(e.Key) < 16 {
114+
func unmarshalTombstoneEntry(e *TombstoneEntry, kv store.KV) error {
115+
if len(kv.Key) < 16 {
94116
return ErrInvalidTombstoneEntry
95117
}
96-
dst.Index = binary.BigEndian.Uint64(e.Key[0:8])
97-
dst.AppendedAt = int64(binary.BigEndian.Uint64(e.Key[8:16]))
98-
dst.Tombstones = new(metastorev1.Tombstones)
99-
if err := dst.Tombstones.UnmarshalVT(e.Value); err != nil {
118+
e.key = make([]byte, len(kv.Key))
119+
copy(e.key, kv.Key)
120+
e.Index = binary.BigEndian.Uint64(kv.Key[0:8])
121+
e.AppendedAt = int64(binary.BigEndian.Uint64(kv.Key[8:16]))
122+
e.Tombstones = new(metastorev1.Tombstones)
123+
if err := e.Tombstones.UnmarshalVT(kv.Value); err != nil {
100124
return fmt.Errorf("%w: %w", ErrInvalidTombstoneEntry, err)
101125
}
102126
return nil

pkg/experiment/metastore/index/tombstones/store/tombstone_store_test.go

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,12 @@ func TestBlockQueueStore_StoreEntry(t *testing.T) {
4141
var i int
4242
for iter.Next() {
4343
assert.Less(t, i, len(entries))
44-
assert.Equal(t, entries[i], iter.At())
44+
actual := iter.At()
45+
expected := entries[i]
46+
assert.Equal(t, expected.Index, actual.Index)
47+
assert.Equal(t, expected.AppendedAt, actual.AppendedAt)
48+
assert.Equal(t, expected.Tombstones, actual.Tombstones)
49+
assert.NotNil(t, actual.key)
4550
i++
4651
}
4752
assert.Nil(t, iter.Err())
@@ -92,7 +97,12 @@ func TestTombstoneStore_DeleteQueuedEntries(t *testing.T) {
9297
i++
9398
}
9499
assert.Less(t, i, len(entries))
95-
assert.Equal(t, entries[i], iter.At())
100+
actual := iter.At()
101+
expected := entries[i]
102+
assert.Equal(t, expected.Index, actual.Index)
103+
assert.Equal(t, expected.AppendedAt, actual.AppendedAt)
104+
assert.Equal(t, expected.Tombstones, actual.Tombstones)
105+
assert.NotNil(t, actual.key)
96106
i++
97107
}
98108
assert.Nil(t, iter.Err())

pkg/experiment/metastore/index/tombstones/tombstones_restore_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ func TestTombstonesRestore(t *testing.T) {
2424
require.NoError(t, ts.Init(tx))
2525
require.NoError(t, tx.Commit())
2626

27-
for i, tombstone := range []*metastorev1.Tombstones{
27+
for _, tombstone := range []*metastorev1.Tombstones{
2828
{
2929
Blocks: &metastorev1.BlockTombstones{
3030
Name: "x-1",
@@ -52,7 +52,7 @@ func TestTombstonesRestore(t *testing.T) {
5252
} {
5353
tx, err := db.Begin(true)
5454
require.NoError(t, err)
55-
err = ts.AddTombstones(tx, &raft.Log{Index: uint64(i), AppendedAt: now}, tombstone)
55+
err = ts.AddTombstones(tx, &raft.Log{Index: 1, AppendedAt: now}, tombstone)
5656
require.NoError(t, err)
5757
require.NoError(t, tx.Commit())
5858
}

0 commit comments

Comments
 (0)