Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit f6233a1

Browse files
add token range example in the distributed-db playground
1 parent 883f407 commit f6233a1

File tree

1 file changed

+87
-16
lines changed
  • mutexes/distributed-db/playground/tokens

1 file changed

+87
-16
lines changed

‎mutexes/distributed-db/playground/tokens/main.go‎

Lines changed: 87 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,23 +10,59 @@ import (
1010
)
1111

1212
func main() {
13-
tokens := NewTokens(5, 256)
14-
for i := 0; i < 50; i++ {
13+
nodes := []Node{
14+
{
15+
ID: 1,
16+
Name: "server1",
17+
Address: "localhost:8081",
18+
},
19+
{
20+
ID: 2,
21+
Name: "server2",
22+
Address: "localhost:8082",
23+
},
24+
{
25+
ID: 3,
26+
Name: "server3",
27+
Address: "localhost:8083",
28+
},
29+
{
30+
ID: 4,
31+
Name: "server4",
32+
Address: "localhost:8084",
33+
},
34+
{
35+
ID: 5,
36+
Name: "server5",
37+
Address: "localhost:8085",
38+
},
39+
}
40+
tokens := NewTokens(nodes, 256)
41+
42+
newNode := Node{
43+
ID: 6,
44+
Name: "server6",
45+
Address: "localhost:8086",
46+
}
47+
tokens.AddNode(newNode)
48+
49+
for i := 0; i < 1000; i++ {
1550
key := fmt.Sprintf("k%d", i+1)
1651
sum := hash(key)
17-
fmt.Println(key, sum, tokens.Get(sum))
52+
fmt.Println(key, sum, tokens.GetNode(sum).Name)
1853
}
1954
}
2055

21-
func NewTokens(numberOfNodes, numberOfTokenRanges int) Tokens {
22-
servers := make([]string, numberOfNodes)
23-
tokenRange := math.MaxInt / numberOfNodes / numberOfTokenRanges
56+
func NewTokens(nodes []Node, numberOfTokenRanges int) Tokens {
57+
numberOfNodes := len(nodes)
58+
tokenRange := uint64(math.MaxInt / numberOfNodes / numberOfTokenRanges)
2459
ranges := make([]uint64, 0, numberOfNodes*numberOfTokenRanges)
60+
nodesMap := map[int]Node{}
2561
for i := 0; i < numberOfNodes; i++ {
26-
servers[i] = fmt.Sprintf("server%d", i+1)
62+
nodesMap[nodes[i].ID] = nodes[i]
2763
for j := numberOfTokenRanges * i; j < numberOfTokenRanges*(i+1); j++ {
28-
r := tokenRange * (j + 1)
29-
ranges = append(ranges, uint64(r))
64+
r := tokenRange * uint64(j + 1)
65+
ranges = append(ranges, r)
3066
}
3167
}
3268

@@ -36,9 +72,9 @@ func NewTokens(numberOfNodes, numberOfTokenRanges int) Tokens {
3672
randomRanges[i], randomRanges[j] = randomRanges[j], randomRanges[i]
3773
})
3874

39-
i, mappings := 0, map[uint64]string{}
75+
i, mappings := 0, map[uint64]int{}
4076
for _, r := range randomRanges {
41-
mappings[r] = servers[i]
77+
mappings[r] = nodes[i].ID
4278
i++
4379
if i == numberOfNodes {
4480
i = 0
@@ -48,20 +84,55 @@ func NewTokens(numberOfNodes, numberOfTokenRanges int) Tokens {
4884
tokens := Tokens{
4985
Ranges: ranges,
5086
Mappings: mappings,
87+
Nodes: nodesMap,
88+
NumberOfTokenRanges: numberOfTokenRanges,
5189
}
5290
return tokens
5391
}
5492

5593
type Tokens struct {
56-
Ranges []uint64
57-
Mappings map[uint64]string
94+
Ranges []uint64
95+
Mappings map[uint64]int
96+
Nodes map[int]Node
97+
NumberOfTokenRanges int
98+
rangeMax uint64
5899
}
59100

60-
func (t *Tokens) Get(n uint64) string {
101+
func (t *Tokens) GetNode(token uint64) Node {
61102
idx := sort.Search(len(t.Ranges)-1, func(i int) bool {
62-
return t.Ranges[i] >= n
103+
return t.Ranges[i] >= token
63104
})
64-
return t.Mappings[t.Ranges[idx]]
105+
nodeID := t.Mappings[t.Ranges[idx]]
106+
return t.Nodes[nodeID]
107+
}
108+
109+
func (t *Tokens) AddNode(node Node) {
110+
t.Nodes[node.ID] = node
111+
tokenRange := uint64(math.MaxInt / len(t.Nodes) / t.NumberOfTokenRanges)
112+
newRanges := make([]uint64, 0, t.NumberOfTokenRanges)
113+
for i := 0; i < len(t.Ranges)+t.NumberOfTokenRanges; i++ {
114+
if i < len(t.Ranges) {
115+
r := t.Ranges[i]
116+
decrement := r - tokenRange*(uint64(i+1))
117+
newRange := r - decrement
118+
srv := t.Mappings[r]
119+
120+
delete(t.Mappings, r)
121+
t.Mappings[newRange] = srv
122+
t.Ranges[i] = newRange
123+
} else {
124+
newRange := tokenRange * uint64(i+1)
125+
t.Mappings[newRange] = len(t.Nodes)
126+
newRanges = append(newRanges, newRange)
127+
}
128+
}
129+
t.Ranges = append(t.Ranges, newRanges...)
130+
}
131+
132+
type Node struct {
133+
ID int
134+
Name string
135+
Address string
65136
}
66137

67138
func hash(s string) uint64 {

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /