@@ -10,23 +10,59 @@ import (
1010)
1111
1212func  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
5593type  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
67138func  hash (s  string ) uint64  {
0 commit comments