@@ -132,6 +132,62 @@ func TestAddIngesterReplacesExistingTokens(t *testing.T) {
132
132
require .Equal (t , newTokens , r .Ingesters [ing1Name ].Tokens )
133
133
}
134
134
135
+ func TestRing_Get_ZoneAwarenessWithIngesterLeaving (t * testing.T ) {
136
+ const testCount = 10000
137
+
138
+ r := NewDesc ()
139
+ instances := map [string ]InstanceDesc {
140
+ "instance-1" : {Addr : "127.0.0.1" , Zone : "zone-a" , Tokens : GenerateTokens (128 , nil ), State : ACTIVE },
141
+ "instance-2" : {Addr : "127.0.0.2" , Zone : "zone-a" , Tokens : GenerateTokens (128 , nil ), State : ACTIVE },
142
+ "instance-3" : {Addr : "127.0.0.3" , Zone : "zone-b" , Tokens : GenerateTokens (128 , nil ), State : ACTIVE },
143
+ "instance-4" : {Addr : "127.0.0.4" , Zone : "zone-b" , Tokens : GenerateTokens (128 , nil ), State : ACTIVE },
144
+ "instance-5" : {Addr : "127.0.0.5" , Zone : "zone-c" , Tokens : GenerateTokens (128 , nil ), State : LEAVING },
145
+ "instance-6" : {Addr : "127.0.0.6" , Zone : "zone-c" , Tokens : GenerateTokens (128 , nil ), State : ACTIVE },
146
+ }
147
+ var prevTokens []uint32
148
+ for id , instance := range instances {
149
+ ingTokens := GenerateTokens (128 , prevTokens )
150
+ r .AddIngester (id , instance .Addr , instance .Zone , ingTokens , instance .State , time .Now ())
151
+ prevTokens = append (prevTokens , ingTokens ... )
152
+ }
153
+ instancesList := make ([]InstanceDesc , 0 , len (r .GetIngesters ()))
154
+ for _ , v := range r .GetIngesters () {
155
+ instancesList = append (instancesList , v )
156
+ }
157
+
158
+ ring := Ring {
159
+ cfg : Config {
160
+ HeartbeatTimeout : time .Hour ,
161
+ ReplicationFactor : 3 ,
162
+ ZoneAwarenessEnabled : true ,
163
+ },
164
+ ringDesc : r ,
165
+ ringTokens : r .GetTokens (),
166
+ ringTokensByZone : r .getTokensByZone (),
167
+ ringInstanceByToken : r .getTokensInfo (),
168
+ ringZones : getZones (r .getTokensByZone ()),
169
+ strategy : NewDefaultReplicationStrategy (),
170
+ }
171
+
172
+ _ , bufHosts , bufZones := MakeBuffersForGet ()
173
+
174
+ // Use the GenerateTokens to get an array of random uint32 values.
175
+ testValues := GenerateTokens (testCount , nil )
176
+
177
+ for i := 0 ; i < testCount ; i ++ {
178
+ set , err := ring .Get (testValues [i ], Write , instancesList , bufHosts , bufZones )
179
+ require .NoError (t , err )
180
+
181
+ distinctZones := map [string ]int {}
182
+ for _ , instance := range set .Instances {
183
+ distinctZones [instance .Zone ]++
184
+ }
185
+
186
+ assert .Equal (t , len (set .Instances ), 3 )
187
+ assert .Equal (t , len (distinctZones ), 3 )
188
+ }
189
+ }
190
+
135
191
func TestRing_Get_ZoneAwareness (t * testing.T ) {
136
192
// Number of tests to run.
137
193
const testCount = 10000
0 commit comments