Skip to content

Commit 2b770e6

Browse files
authored
Merge pull request #11 from semihbkgr/memtable-bytes-evaluation
Fixing the calculation of memtable bytes
2 parents 1f0e2cc + 0cabc40 commit 2b770e6

File tree

3 files changed

+107
-2
lines changed

3 files changed

+107
-2
lines changed

lsmtree.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,11 @@ const (
3333
var (
3434
// ErrKeyRequired is returned when putting a zero-length key or nil.
3535
ErrKeyRequired = errors.New("key required")
36-
// ErrKeyRequired is returned when putting a zero-length value or nil.
36+
// ErrValueRequired is returned when putting a zero-length value or nil.
3737
ErrValueRequired = errors.New("value required")
3838
// ErrKeyTooLarge is returned when putting a key that is larger than MaxKeySize.
3939
ErrKeyTooLarge = errors.New("key too large")
40-
// ErrKeyTooLarge is returned when putting a value that is larger than MaxValueSize.
40+
// ErrValueTooLarge is returned when putting a value that is larger than MaxValueSize.
4141
ErrValueTooLarge = errors.New("value too large")
4242
)
4343

memtable.go

+2
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ func (mt *memTable) get(key []byte) ([]byte, bool) {
4141
func (mt *memTable) delete(key []byte) error {
4242
value, exists := mt.data.Put(key, nil)
4343
if !exists {
44+
mt.b += len(key)
45+
} else {
4446
mt.b -= len(value)
4547
}
4648

memtable_test.go

+103
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
package lsmtree
2+
3+
import (
4+
"math/rand"
5+
"testing"
6+
"time"
7+
)
8+
9+
func TestMemTable_put(t *testing.T) {
10+
const keySize = 64
11+
const valueSize = 1024
12+
const length = 100
13+
mt := newMemTable()
14+
for i := 0; i < length; i++ {
15+
err := mt.put(randBytes(keySize), randBytes(valueSize))
16+
if err != nil {
17+
t.Error(err)
18+
}
19+
}
20+
if mt.data.Size() != length {
21+
t.Errorf("length of underlying tree is not as expected, expected: %d, actual: %d", length, mt.data.Size())
22+
}
23+
expectedSize := (keySize + valueSize) * length
24+
if mt.bytes() != expectedSize {
25+
t.Errorf("size of data is not as expected, expected: %d, actual: %d", expectedSize, mt.bytes())
26+
}
27+
}
28+
29+
func TestMemTable_get(t *testing.T) {
30+
const length = 100
31+
mt := newMemTable()
32+
keys := make([][]byte, 0, length)
33+
for i := 0; i < length; i++ {
34+
key := randBytes(64)
35+
keys = append(keys, key)
36+
err := mt.put(key, randBytes(1024))
37+
if err != nil {
38+
t.Error(err)
39+
}
40+
}
41+
for _, k := range keys {
42+
_, ok := mt.get(k)
43+
if !ok {
44+
t.Error("the key does not exist in memtable")
45+
}
46+
}
47+
}
48+
49+
func TestMemTable_delete(t *testing.T) {
50+
const keySize = 64
51+
const length = 100
52+
mt := newMemTable()
53+
keys := make([][]byte, 0, length)
54+
for i := 0; i < length; i++ {
55+
key := randBytes(keySize)
56+
keys = append(keys, key)
57+
err := mt.put(key, randBytes(1024))
58+
if err != nil {
59+
t.Error(err)
60+
}
61+
}
62+
for _, k := range keys {
63+
err := mt.delete(k)
64+
if err != nil {
65+
t.Error(err)
66+
}
67+
}
68+
if mt.data.Size() != length {
69+
t.Errorf("length of underlying tree is not as expected, expected: %d, actual: %d", length, mt.data.Size())
70+
}
71+
expectedSize := keySize * length
72+
if mt.bytes() != expectedSize {
73+
t.Errorf("size of data is not as expected, expected: %d, actual: %d", expectedSize, mt.bytes())
74+
}
75+
}
76+
77+
func TestMemTable_clear(t *testing.T) {
78+
const length = 100
79+
mt := newMemTable()
80+
for i := 0; i < length; i++ {
81+
err := mt.put(randBytes(64), randBytes(1024))
82+
if err != nil {
83+
t.Error(err)
84+
}
85+
}
86+
mt.clear()
87+
if mt.data.Size() != 0 {
88+
t.Errorf("length of underlying tree is not zero, actual: %d", mt.data.Size())
89+
}
90+
if mt.bytes() != 0 {
91+
t.Errorf("size of data is not zero, actual: %d", mt.bytes())
92+
}
93+
}
94+
95+
var r = rand.New(rand.NewSource(time.Now().Unix()))
96+
97+
func randBytes(size int) []byte {
98+
b := make([]byte, 0, size)
99+
for i := 0; i < size; i++ {
100+
b = append(b, byte(r.Uint32()))
101+
}
102+
return b
103+
}

0 commit comments

Comments
 (0)