github.com/weaviate/weaviate@v1.24.6/adapters/repos/db/lsmkv/bucket_backup_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 "context" 16 "fmt" 17 "path/filepath" 18 "testing" 19 20 "github.com/pkg/errors" 21 "github.com/sirupsen/logrus" 22 "github.com/stretchr/testify/assert" 23 "github.com/stretchr/testify/require" 24 "github.com/weaviate/weaviate/entities/cyclemanager" 25 "github.com/weaviate/weaviate/entities/storagestate" 26 ) 27 28 func Test_BucketBackup(t *testing.T) { 29 ctx := context.Background() 30 tests := bucketTests{ 31 { 32 name: "bucketBackup_FlushMemtable", 33 f: bucketBackup_FlushMemtable, 34 opts: []BucketOption{WithStrategy(StrategyReplace)}, 35 }, 36 { 37 name: "bucketBackup_ListFiles", 38 f: bucketBackup_ListFiles, 39 opts: []BucketOption{WithStrategy(StrategyReplace)}, 40 }, 41 } 42 tests.run(ctx, t) 43 } 44 45 func bucketBackup_FlushMemtable(ctx context.Context, t *testing.T, opts []BucketOption) { 46 t.Run("assert that readonly bucket fails to flush", func(t *testing.T) { 47 dirName := t.TempDir() 48 49 b, err := NewBucket(ctx, dirName, dirName, logrus.New(), nil, 50 cyclemanager.NewCallbackGroupNoop(), cyclemanager.NewCallbackGroupNoop(), opts...) 51 require.Nil(t, err) 52 b.UpdateStatus(storagestate.StatusReadOnly) 53 54 err = b.FlushMemtable() 55 require.NotNil(t, err) 56 expectedErr := errors.Wrap(storagestate.ErrStatusReadOnly, "flush memtable") 57 assert.EqualError(t, expectedErr, err.Error()) 58 59 err = b.Shutdown(context.Background()) 60 require.Nil(t, err) 61 }) 62 } 63 64 func bucketBackup_ListFiles(ctx context.Context, t *testing.T, opts []BucketOption) { 65 dirName := t.TempDir() 66 67 b, err := NewBucket(ctx, dirName, dirName, logrus.New(), nil, 68 cyclemanager.NewCallbackGroupNoop(), cyclemanager.NewCallbackGroupNoop(), opts...) 69 require.Nil(t, err) 70 71 t.Run("insert contents into bucket", func(t *testing.T) { 72 for i := 0; i < 10; i++ { 73 err := b.Put([]byte(fmt.Sprint(i)), []byte(fmt.Sprint(i))) 74 require.Nil(t, err) 75 } 76 b.FlushMemtable() // flush memtable to generate .db files 77 }) 78 79 t.Run("assert expected bucket contents", func(t *testing.T) { 80 files, err := b.ListFiles(ctx, dirName) 81 assert.Nil(t, err) 82 assert.Len(t, files, 3) 83 84 exts := make([]string, 3) 85 for i, file := range files { 86 exts[i] = filepath.Ext(file) 87 } 88 assert.Contains(t, exts, ".db") // the segment itself 89 assert.Contains(t, exts, ".bloom") // the segment's bloom filter 90 assert.Contains(t, exts, ".cna") // the segment's count net additions 91 }) 92 93 err = b.Shutdown(context.Background()) 94 require.Nil(t, err) 95 }