| 245 | } |
| 246 | |
| 247 | func TestMergeLeft(t *testing.T) { |
| 248 | now := time.Now().Unix() |
| 249 | |
| 250 | firstRing := func() *Desc { |
| 251 | return &Desc{ |
| 252 | Ingesters: map[string]InstanceDesc{ |
| 253 | "Ing 1": {Addr: "addr1", Timestamp: now, State: ACTIVE, Tokens: []uint32{30, 40, 50}}, |
| 254 | "Ing 2": {Addr: "addr2", Timestamp: now, State: JOINING, Tokens: []uint32{5, 10, 20, 100, 200}}, |
| 255 | }, |
| 256 | } |
| 257 | } |
| 258 | |
| 259 | // Not normalised because it contains duplicate and unsorted tokens. |
| 260 | firstRingNotNormalised := func() *Desc { |
| 261 | return &Desc{ |
| 262 | Ingesters: map[string]InstanceDesc{ |
| 263 | "Ing 1": {Addr: "addr1", Timestamp: now, State: ACTIVE, Tokens: []uint32{30, 40, 40, 50}}, |
| 264 | "Ing 2": {Addr: "addr2", Timestamp: now, State: JOINING, Tokens: []uint32{20, 10, 5, 10, 20, 100, 200, 100}}, |
| 265 | }, |
| 266 | } |
| 267 | } |
| 268 | |
| 269 | secondRing := func() *Desc { |
| 270 | return &Desc{ |
| 271 | Ingesters: map[string]InstanceDesc{ |
| 272 | "Ing 2": {Addr: "addr2", Timestamp: now, State: LEFT}, |
| 273 | }, |
| 274 | } |
| 275 | } |
| 276 | |
| 277 | // Not normalised because it contains a LEFT ingester with tokens. |
| 278 | secondRingNotNormalised := func() *Desc { |
| 279 | return &Desc{ |
| 280 | Ingesters: map[string]InstanceDesc{ |
| 281 | "Ing 2": {Addr: "addr2", Timestamp: now, State: LEFT, Tokens: []uint32{5, 10, 20, 100, 200}}, |
| 282 | }, |
| 283 | } |
| 284 | } |
| 285 | |
| 286 | expectedFirstSecondMerge := func() *Desc { |
| 287 | return &Desc{ |
| 288 | Ingesters: map[string]InstanceDesc{ |
| 289 | "Ing 1": {Addr: "addr1", Timestamp: now, State: ACTIVE, Tokens: []uint32{30, 40, 50}}, |
| 290 | "Ing 2": {Addr: "addr2", Timestamp: now, State: LEFT}, |
| 291 | }, |
| 292 | } |
| 293 | } |
| 294 | |
| 295 | thirdRing := func() *Desc { |
| 296 | return &Desc{ |
| 297 | Ingesters: map[string]InstanceDesc{ |
| 298 | "Ing 1": {Addr: "addr1", Timestamp: now + 10, State: LEAVING, Tokens: []uint32{30, 40, 50}}, |
| 299 | "Ing 2": {Addr: "addr2", Timestamp: now, State: JOINING, Tokens: []uint32{5, 10, 20, 100, 200}}, // from firstRing |
| 300 | }, |
| 301 | } |
| 302 | } |
| 303 | |
| 304 | expectedFirstSecondThirdMerge := func() *Desc { |