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  }