-
Notifications
You must be signed in to change notification settings - Fork 5
/
shardedkv_test.go
130 lines (100 loc) · 2.81 KB
/
shardedkv_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
package shardedkv
import (
"strconv"
"testing"
ch "github.com/dgryski/go-shardedkv/choosers/chash"
st "github.com/dgryski/go-shardedkv/storage/memory"
)
func TestShardedkv(t *testing.T) {
var shards []Shard
nElements := 1000
nShards := 10
for i := 0; i < nShards; i++ {
label := "test_shard" + strconv.Itoa(i)
shards = append(shards, Shard{Name: label, Backend: st.New()})
}
chooser := ch.New()
kv := New(chooser, shards)
for i := 0; i < nElements; i++ {
kv.Set("test"+strconv.Itoa(i), []byte("value"+strconv.Itoa(i)))
}
for i := 0; i < nElements; i++ {
k := "test" + strconv.Itoa(i)
v, ok, err := kv.Get(k)
if ok != true {
t.Errorf("failed to get key: %s\n", err)
}
if string(v) != "value"+strconv.Itoa(i) {
t.Errorf("failed to get a valid value: %s != \"value%d\"\n", v, i)
}
}
var migrationBuckets []string
for i := nShards; i < nShards*2; i++ {
label := "test_shard" + strconv.Itoa(i)
migrationBuckets = append(migrationBuckets, label)
backend := st.New()
shards = append(shards, Shard{Name: label, Backend: backend})
kv.AddShard(label, backend)
}
migration := ch.New()
migration.SetBuckets(migrationBuckets)
kv.BeginMigration(migration)
// make sure requesting still works
for i := 0; i < nElements; i++ {
k := "test" + strconv.Itoa(i)
v, ok, err := kv.Get(k)
if ok != true {
t.Errorf("failed to get key: %s\n", err)
}
if string(v) != "value"+strconv.Itoa(i) {
t.Errorf("failed to get a valid value: %s != \"value%d\"\n", v, i)
}
}
// make sure setting still works
for i := 0; i < nElements; i++ {
kv.Set("test"+strconv.Itoa(i), []byte("value"+strconv.Itoa(i)))
}
for i := 0; i < nElements; i++ {
k := "test" + strconv.Itoa(i)
v, ok, err := kv.Get(k)
if ok != true {
t.Errorf("failed to get key: %s\n", err)
}
if string(v) != "value"+strconv.Itoa(i) {
t.Errorf("failed to get a valid value: %s != \"value%d\"\n", v, i)
}
}
// and that deleting removes from both during a migration
for i := 0; i < nElements; i++ {
kv.Delete("test" + strconv.Itoa(i))
}
for i := 0; i < nElements; i++ {
k := "test" + strconv.Itoa(i)
_, ok, _ := kv.Get(k)
if ok {
t.Errorf("got a key that shouldn't have been there")
}
}
// set the keys again
for i := 0; i < nElements; i++ {
kv.Set("test"+strconv.Itoa(i), []byte("value"+strconv.Itoa(i)))
}
// end the migration
kv.EndMigration()
// delete the old shards
for i := 0; i < nShards; i++ {
label := "test_shard" + strconv.Itoa(i)
kv.DeleteShard(label)
}
// and make sure we can still get to the keys
for i := 0; i < nElements; i++ {
k := "test" + strconv.Itoa(i)
v, ok, err := kv.Get(k)
if ok != true {
t.Errorf("failed to get key: %s\n", err)
}
if string(v) != "value"+strconv.Itoa(i) {
t.Errorf("failed to get a valid value: %s != \"value%d\"\n", v, i)
}
}
}