github.com/weaviate/weaviate@v1.24.6/adapters/repos/db/lsmkv/memtable_test.go (about) 1 // _ _ 2 // __ _____ __ ___ ___ __ _| |_ ___ 3 // \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \ 4 // \ V V / __/ (_| |\ V /| | (_| | || __/ 5 // \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___| 6 // 7 // Copyright © 2016 - 2024 Weaviate B.V. All rights reserved. 8 // 9 // CONTACT: hello@weaviate.io 10 // 11 12 package lsmkv 13 14 import ( 15 "path" 16 "testing" 17 18 "github.com/stretchr/testify/assert" 19 "github.com/stretchr/testify/require" 20 "github.com/weaviate/weaviate/entities/lsmkv" 21 ) 22 23 // This test prevents a regression on 24 // https://www.youtube.com/watch?v=OS8taasZl8k 25 func Test_MemtableSecondaryKeyBug(t *testing.T) { 26 dir := t.TempDir() 27 28 cl, err := newCommitLogger(dir) 29 require.NoError(t, err) 30 31 m, err := newMemtable(path.Join(dir, "will-never-flush"), StrategyReplace, 1, cl, nil) 32 require.Nil(t, err) 33 t.Cleanup(func() { 34 require.Nil(t, m.commitlog.close()) 35 }) 36 37 t.Run("add initial value", func(t *testing.T) { 38 err = m.put([]byte("my-key"), []byte("my-value"), 39 WithSecondaryKey(0, []byte("secondary-key-initial"))) 40 require.Nil(t, err) 41 }) 42 43 t.Run("retrieve by primary", func(t *testing.T) { 44 val, err := m.get([]byte("my-key")) 45 require.Nil(t, err) 46 assert.Equal(t, []byte("my-value"), val) 47 }) 48 49 t.Run("retrieve by initial secondary", func(t *testing.T) { 50 val, err := m.getBySecondary(0, []byte("secondary-key-initial")) 51 require.Nil(t, err) 52 assert.Equal(t, []byte("my-value"), val) 53 }) 54 55 t.Run("update value with different secondary key", func(t *testing.T) { 56 err = m.put([]byte("my-key"), []byte("my-value-updated"), 57 WithSecondaryKey(0, []byte("different-secondary-key"))) 58 require.Nil(t, err) 59 }) 60 61 t.Run("retrieve by primary again", func(t *testing.T) { 62 val, err := m.get([]byte("my-key")) 63 require.Nil(t, err) 64 assert.Equal(t, []byte("my-value-updated"), val) 65 }) 66 67 t.Run("retrieve by updated secondary", func(t *testing.T) { 68 val, err := m.getBySecondary(0, []byte("different-secondary-key")) 69 require.Nil(t, err) 70 assert.Equal(t, []byte("my-value-updated"), val) 71 }) 72 73 t.Run("retrieve by initial secondary - should not find anything", func(t *testing.T) { 74 val, err := m.getBySecondary(0, []byte("secondary-key-initial")) 75 assert.Equal(t, lsmkv.NotFound, err) 76 assert.Nil(t, val) 77 }) 78 }