Skip to content

Commit

Permalink
add test
Browse files Browse the repository at this point in the history
  • Loading branch information
NamanJain8 committed Dec 18, 2020
1 parent 355b8e2 commit efad954
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 2 deletions.
3 changes: 1 addition & 2 deletions levels.go
Original file line number Diff line number Diff line change
Expand Up @@ -768,8 +768,7 @@ func containsPrefix(table *table.Table, prefix []byte) bool {
// In table iterator's Seek, we assume that key has timestamp in last 8 bytes. We set ts=0,
// so that we don't skip the key prefixed with prefix.
prefixWithTs := make([]byte, len(prefix)+8)
copy(prefixWithTs[:len(prefix)], prefix)
prefixWithTs = prefixWithTs[:cap(prefixWithTs)]
copy(prefixWithTs, prefix)
ti.Seek(prefixWithTs)
if bytes.HasPrefix(ti.Key(), prefix) {
return true
Expand Down
49 changes: 49 additions & 0 deletions levels_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,11 @@
package badger

import (
"fmt"
"math"
"math/rand"
"os"
"sort"
"testing"
"time"

Expand Down Expand Up @@ -838,3 +842,48 @@ func TestDropPrefixMoveBug(t *testing.T) {
require.NoError(t, db.lc.validate())
})
}

func TestTableContainsPrefix(t *testing.T) {
opts := table.Options{
LoadingMode: options.LoadToRAM,
BlockSize: 4 * 1024,
BloomFalsePositive: 0.001,
}

buildTable := func(keys []string) *os.File {
filename := fmt.Sprintf("%s%s%d.sst", os.TempDir(), string(os.PathSeparator), rand.Uint32())
f, err := y.CreateSyncedFile(filename, true)
require.NoError(t, err)
b := table.NewTableBuilder(opts)
defer b.Close()

v := []byte("value")
sort.Slice(keys, func(i, j int) bool {
return keys[i] < keys[j]
})
for _, k := range keys {
b.Add(y.KeyWithTs([]byte(k), 1), y.ValueStruct{Value: v}, 0)
b.Add(y.KeyWithTs([]byte(k), 2), y.ValueStruct{Value: v}, 0)
}
_, err = f.Write(b.Finish())
require.NoError(t, err)
f.Close()
f, _ = y.OpenSyncedFile(filename, true)
return f
}

f := buildTable([]string{"key1", "key3", "key31", "key32", "key4"})
tbl, err := table.OpenTable(f, opts)
require.NoError(t, err)
defer tbl.DecrRef()

require.True(t, containsPrefix(tbl, []byte("key")))
require.True(t, containsPrefix(tbl, []byte("key1")))
require.True(t, containsPrefix(tbl, []byte("key3")))
require.True(t, containsPrefix(tbl, []byte("key32")))
require.True(t, containsPrefix(tbl, []byte("key4")))

require.False(t, containsPrefix(tbl, []byte("key0")))
require.False(t, containsPrefix(tbl, []byte("key2")))
require.False(t, containsPrefix(tbl, []byte("key5")))
}

0 comments on commit efad954

Please sign in to comment.