12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- package storage
- import (
- "os"
- "testing"
- "github.com/seaweedfs/seaweedfs/weed/storage/idx"
- "github.com/seaweedfs/seaweedfs/weed/storage/needle"
- "github.com/seaweedfs/seaweedfs/weed/storage/super_block"
- "github.com/seaweedfs/seaweedfs/weed/storage/types"
- "github.com/stretchr/testify/assert"
- )
- func TestFirstInvalidIndex(t *testing.T) {
- dir := t.TempDir()
- v, err := NewVolume(dir, dir, "", 1, NeedleMapInMemory, &super_block.ReplicaPlacement{}, &needle.TTL{}, 0, 0, 0)
- if err != nil {
- t.Fatalf("volume creation: %v", err)
- }
- type WriteInfo struct {
- offset int64
- size int32
- }
- // initialize 20 needles then update first 10 needles
- for i := 1; i <= 30; i++ {
- n := newRandomNeedle(uint64(i))
- n.Flags = 0x08
- _, _, _, err := v.writeNeedle2(n, true, false)
- if err != nil {
- t.Fatalf("write needle %d: %v", i, err)
- }
- }
- b, err := os.ReadFile(v.IndexFileName() + ".idx")
- // base case every record is valid -> nothing is filtered
- index, err := idx.FirstInvalidIndex(b, func(key types.NeedleId, offset types.Offset, size types.Size) (bool, error) {
- return true, nil
- })
- if err != nil {
- t.Fatalf("failed to complete binary search %v", err)
- }
- assert.Equal(t, 30, index, "when every record is valid nothing should be filtered from binary search")
- index, err = idx.FirstInvalidIndex(b, func(key types.NeedleId, offset types.Offset, size types.Size) (bool, error) {
- return false, nil
- })
- assert.Equal(t, 0, index, "when every record is invalid everything should be filtered from binary search")
- index, err = idx.FirstInvalidIndex(b, func(key types.NeedleId, offset types.Offset, size types.Size) (bool, error) {
- return key < 20, nil
- })
- // needle key range from 1 to 30 so < 20 means 19 keys are valid and cutoff the bytes at 19 * 16 = 304
- assert.Equal(t, 19, index, "when every record is invalid everything should be filtered from binary search")
- index, err = idx.FirstInvalidIndex(b, func(key types.NeedleId, offset types.Offset, size types.Size) (bool, error) {
- return key <= 1, nil
- })
- // needle key range from 1 to 30 so <=1 1 means 1 key is valid and cutoff the bytes at 1 * 16 = 16
- assert.Equal(t, 1, index, "when every record is invalid everything should be filtered from binary search")
- }
|