@@ -6,49 +6,50 @@ import (
66 "fmt"
77 "hash/fnv"
88 "log"
9+ "math"
910 "math/rand"
11+ "reflect"
1012 "sort"
1113 "time"
1214)
1315
14- type TokenMappings map [uint64 ]string
16+ type TokenMappings map [int ]string
1517
1618type Tokens struct {
1719 Mappings TokenMappings
1820 Nodes Nodes
19- ranges []uint64
21+ ranges []int
2022 numberOfTokenRanges int
2123}
2224
23- func NewTokens (nodes Nodes , numberOfTokenRanges int ) Tokens {
24- numberOfNodes := len (nodes .Map )
25- tokenRange := uint64 ( 200 / numberOfNodes / numberOfTokenRanges )
26- ranges := make ([]uint64 , 0 , numberOfNodes * numberOfTokenRanges )
27- for i := 0 ; i < numberOfNodes ; i ++ {
25+ func NewTokens (nodes Nodes , numberOfTokenRanges int ) * Tokens {
26+ nodeList := append ([] string { nodes . CurrentNode }, nodes . List ( len (nodes .Map )) ... )
27+ tokenRange := math . MaxInt / len ( nodeList ) / numberOfTokenRanges
28+ ranges := make ([]int , 0 , len ( nodeList ) * numberOfTokenRanges )
29+ for i := 0 ; i < len ( nodeList ) ; i ++ {
2830 for j := numberOfTokenRanges * i ; j < numberOfTokenRanges * (i + 1 ); j ++ {
29- r := tokenRange * uint64 ( j + 1 )
31+ r := tokenRange * ( j + 1 )
3032 // produces a sorted ranges slice => needed for searching
3133 ranges = append (ranges , r )
3234 }
3335 }
3436
35- randomRanges := append ([]uint64 {}, ranges ... )
37+ randomRanges := append ([]int {}, ranges ... )
3638 rand .Seed (time .Now ().UnixNano ())
3739 rand .Shuffle (len (randomRanges ), func (i , j int ) {
3840 randomRanges [i ], randomRanges [j ] = randomRanges [j ], randomRanges [i ]
3941 })
4042
41- i , mappings := 0 , map [uint64 ]string {}
42- nodeList := nodes .List (len (nodes .Map ))
43+ i , mappings := 0 , map [int ]string {}
4344 for _ , r := range randomRanges {
4445 mappings [r ] = nodeList [i ]
4546 i ++
46- if i == numberOfNodes {
47+ if i == len ( nodeList ) {
4748 i = 0
4849 }
4950 }
5051
51- tokens := Tokens {
52+ tokens := & Tokens {
5253 Mappings : mappings ,
5354 Nodes : nodes ,
5455 ranges : ranges ,
@@ -57,38 +58,64 @@ func NewTokens(nodes Nodes, numberOfTokenRanges int) Tokens {
5758 return tokens
5859}
5960
60- func (t * Tokens ) GetNode (token uint64 ) string {
61- idx := sort .Search (len (t .ranges )- 1 , func (i int ) bool {
62- return t .ranges [i ] >= token
63- })
61+ func (t * Tokens ) GetNode (token int ) string {
62+ idx := sort .SearchInts (t .ranges , token )
6463 node := t.Mappings [t.ranges [idx ]]
6564 return node
6665}
6766
68- func (t * Tokens ) AddNode (node string ) {
69- _ , ok := t .Nodes .Map [node ]
70- if ok || node == t .Nodes .CurrentNode {
67+ func (t * Tokens ) Merge (mappings map [int ]string ) {
68+ newMappings := map [int ]string {}
69+ nodes := t .Nodes .WithCurrentNode ()
70+ ranges := t .ranges
71+ m1 , m2 := mappings , t .Mappings
72+ if len (mappings ) < len (t .Mappings ) {
73+ m1 = t .Mappings
74+ m2 = mappings
75+ }
76+ 77+ newNodes := map [string ]struct {}{}
78+ newRanges := make ([]int , 0 )
79+ for _ , s := range mappings {
80+ newNodes [s ] = struct {}{}
81+ }
82+ for r := range m1 {
83+ newRanges = append (newRanges , r )
84+ }
85+ sort .Ints (newRanges )
86+ ranges = newRanges
87+ nodes = newNodes
88+ 89+ if reflect .DeepEqual (nodes , t .Nodes .Map ) {
7190 return
7291 }
73- tokenRange := uint64 (200 / len (t .Nodes .Map ) / t .numberOfTokenRanges )
74- newRanges := make ([]uint64 , 0 , t .numberOfTokenRanges )
75- for i := 0 ; i < len (t .ranges )+ t .numberOfTokenRanges ; i ++ {
76- if i < len (t .ranges ) {
77- r := t .ranges [i ]
78- decrement := r - tokenRange * (uint64 (i + 1 ))
79- newRange := r - decrement
80- srv := t .Mappings [r ]
8192
82- delete (t .Mappings , r )
83- t .Mappings [newRange ] = srv
84- t .ranges [i ] = newRange
85- } else {
86- newRange := tokenRange * uint64 (i + 1 )
87- t .Mappings [newRange ] = node
88- newRanges = append (newRanges , newRange )
93+ for s := range nodes {
94+ _ , ok := t .Nodes .WithCurrentNode ()[s ]
95+ if ok {
96+ delete (nodes , s )
8997 }
9098 }
91- t .ranges = append (t .ranges , newRanges ... )
99+ 100+ i := 0
101+ numberOfNodes := len (nodes ) + len (t .Nodes .WithCurrentNode ())
102+ tokenRange := math .MaxInt / numberOfNodes / t .numberOfTokenRanges
103+ m1Nodes := map [string ]struct {}{}
104+ for r , s := range m1 {
105+ m1Nodes [s ] = struct {}{}
106+ factor := sort .SearchInts (ranges , r ) + 1
107+ newMappings [factor * tokenRange ] = s
108+ i ++
109+ }
110+ for _ , s := range m2 {
111+ _ , ok := m1Nodes [s ]
112+ if ok {
113+ continue
114+ }
115+ i ++
116+ newMappings [(i )* tokenRange ] = s
117+ }
118+ t .Mappings = newMappings
92119}
93120
94121func (t * Tokens ) Checksum () string {
0 commit comments