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 }