github.com/muhammadn/cortex@v1.9.1-0.20220510110439-46bb7000d03d/pkg/storage/tsdb/bucketindex/storage_test.go (about)

     1  package bucketindex
     2  
     3  import (
     4  	"context"
     5  	"path"
     6  	"strings"
     7  	"testing"
     8  
     9  	"github.com/go-kit/log"
    10  	"github.com/stretchr/testify/assert"
    11  	"github.com/stretchr/testify/require"
    12  
    13  	"github.com/cortexproject/cortex/pkg/storage/tsdb/testutil"
    14  	cortex_testutil "github.com/cortexproject/cortex/pkg/storage/tsdb/testutil"
    15  )
    16  
    17  func TestReadIndex_ShouldReturnErrorIfIndexDoesNotExist(t *testing.T) {
    18  	bkt, _ := cortex_testutil.PrepareFilesystemBucket(t)
    19  
    20  	idx, err := ReadIndex(context.Background(), bkt, "user-1", nil, log.NewNopLogger())
    21  	require.Equal(t, ErrIndexNotFound, err)
    22  	require.Nil(t, idx)
    23  }
    24  
    25  func TestReadIndex_ShouldReturnErrorIfIndexIsCorrupted(t *testing.T) {
    26  	const userID = "user-1"
    27  
    28  	ctx := context.Background()
    29  	bkt, _ := cortex_testutil.PrepareFilesystemBucket(t)
    30  
    31  	// Write a corrupted index.
    32  	require.NoError(t, bkt.Upload(ctx, path.Join(userID, IndexCompressedFilename), strings.NewReader("invalid!}")))
    33  
    34  	idx, err := ReadIndex(ctx, bkt, userID, nil, log.NewNopLogger())
    35  	require.Equal(t, ErrIndexCorrupted, err)
    36  	require.Nil(t, idx)
    37  }
    38  
    39  func TestReadIndex_ShouldReturnTheParsedIndexOnSuccess(t *testing.T) {
    40  	const userID = "user-1"
    41  
    42  	ctx := context.Background()
    43  	logger := log.NewNopLogger()
    44  
    45  	bkt, _ := cortex_testutil.PrepareFilesystemBucket(t)
    46  
    47  	// Mock some blocks in the storage.
    48  	bkt = BucketWithGlobalMarkers(bkt)
    49  	testutil.MockStorageBlock(t, bkt, userID, 10, 20)
    50  	testutil.MockStorageBlock(t, bkt, userID, 20, 30)
    51  	testutil.MockStorageDeletionMark(t, bkt, userID, testutil.MockStorageBlock(t, bkt, userID, 30, 40))
    52  
    53  	// Write the index.
    54  	u := NewUpdater(bkt, userID, nil, logger)
    55  	expectedIdx, _, err := u.UpdateIndex(ctx, nil)
    56  	require.NoError(t, err)
    57  	require.NoError(t, WriteIndex(ctx, bkt, userID, nil, expectedIdx))
    58  
    59  	// Read it back and compare.
    60  	actualIdx, err := ReadIndex(ctx, bkt, userID, nil, logger)
    61  	require.NoError(t, err)
    62  	assert.Equal(t, expectedIdx, actualIdx)
    63  }
    64  
    65  func BenchmarkReadIndex(b *testing.B) {
    66  	const (
    67  		numBlocks             = 1000
    68  		numBlockDeletionMarks = 100
    69  		userID                = "user-1"
    70  	)
    71  
    72  	ctx := context.Background()
    73  	logger := log.NewNopLogger()
    74  
    75  	bkt, _ := cortex_testutil.PrepareFilesystemBucket(b)
    76  
    77  	// Mock some blocks and deletion marks in the storage.
    78  	bkt = BucketWithGlobalMarkers(bkt)
    79  	for i := 0; i < numBlocks; i++ {
    80  		minT := int64(i * 10)
    81  		maxT := int64((i + 1) * 10)
    82  
    83  		block := testutil.MockStorageBlock(b, bkt, userID, minT, maxT)
    84  
    85  		if i < numBlockDeletionMarks {
    86  			testutil.MockStorageDeletionMark(b, bkt, userID, block)
    87  		}
    88  	}
    89  
    90  	// Write the index.
    91  	u := NewUpdater(bkt, userID, nil, logger)
    92  	idx, _, err := u.UpdateIndex(ctx, nil)
    93  	require.NoError(b, err)
    94  	require.NoError(b, WriteIndex(ctx, bkt, userID, nil, idx))
    95  
    96  	// Read it back once just to make sure the index contains the expected data.
    97  	idx, err = ReadIndex(ctx, bkt, userID, nil, logger)
    98  	require.NoError(b, err)
    99  	require.Len(b, idx.Blocks, numBlocks)
   100  	require.Len(b, idx.BlockDeletionMarks, numBlockDeletionMarks)
   101  
   102  	b.ResetTimer()
   103  
   104  	for n := 0; n < b.N; n++ {
   105  		_, err := ReadIndex(ctx, bkt, userID, nil, logger)
   106  		require.NoError(b, err)
   107  	}
   108  }
   109  
   110  func TestDeleteIndex_ShouldNotReturnErrorIfIndexDoesNotExist(t *testing.T) {
   111  	ctx := context.Background()
   112  	bkt, _ := cortex_testutil.PrepareFilesystemBucket(t)
   113  
   114  	assert.NoError(t, DeleteIndex(ctx, bkt, "user-1", nil))
   115  }