| 71 | } |
| 72 | |
| 73 | func TestMerge(t *testing.T) { |
| 74 | now := time.Now().Unix() |
| 75 | |
| 76 | firstRing := func() *Desc { |
| 77 | return &Desc{ |
| 78 | Ingesters: map[string]InstanceDesc{ |
| 79 | "Ing 1": {Addr: "addr1", Timestamp: now, State: ACTIVE, Tokens: []uint32{30, 40, 50}}, |
| 80 | "Ing 2": {Addr: "addr2", Timestamp: now, State: JOINING, Tokens: []uint32{5, 10, 20, 100, 200}}, |
| 81 | }, |
| 82 | } |
| 83 | } |
| 84 | |
| 85 | secondRing := func() *Desc { |
| 86 | return &Desc{ |
| 87 | Ingesters: map[string]InstanceDesc{ |
| 88 | "Ing 3": {Addr: "addr3", Timestamp: now + 5, State: ACTIVE, Tokens: []uint32{150, 250, 350}}, |
| 89 | "Ing 2": {Addr: "addr2", Timestamp: now + 5, State: ACTIVE, Tokens: []uint32{5, 10, 20, 100, 200}}, |
| 90 | }, |
| 91 | } |
| 92 | } |
| 93 | |
| 94 | thirdRing := func() *Desc { |
| 95 | return &Desc{ |
| 96 | Ingesters: map[string]InstanceDesc{ |
| 97 | "Ing 1": {Addr: "addr1", Timestamp: now + 10, State: LEAVING, Tokens: []uint32{30, 40, 50}}, |
| 98 | "Ing 3": {Addr: "addr3", Timestamp: now + 10, State: ACTIVE, Tokens: []uint32{150, 250, 350}}, |
| 99 | }, |
| 100 | } |
| 101 | } |
| 102 | |
| 103 | expectedFirstSecondMerge := func() *Desc { |
| 104 | return &Desc{ |
| 105 | Ingesters: map[string]InstanceDesc{ |
| 106 | "Ing 1": {Addr: "addr1", Timestamp: now, State: ACTIVE, Tokens: []uint32{30, 40, 50}}, |
| 107 | "Ing 2": {Addr: "addr2", Timestamp: now + 5, State: ACTIVE, Tokens: []uint32{5, 10, 20, 100, 200}}, |
| 108 | "Ing 3": {Addr: "addr3", Timestamp: now + 5, State: ACTIVE, Tokens: []uint32{150, 250, 350}}, |
| 109 | }, |
| 110 | } |
| 111 | } |
| 112 | |
| 113 | expectedFirstSecondThirdMerge := func() *Desc { |
| 114 | return &Desc{ |
| 115 | Ingesters: map[string]InstanceDesc{ |
| 116 | "Ing 1": {Addr: "addr1", Timestamp: now + 10, State: LEAVING, Tokens: []uint32{30, 40, 50}}, |
| 117 | "Ing 2": {Addr: "addr2", Timestamp: now + 5, State: ACTIVE, Tokens: []uint32{5, 10, 20, 100, 200}}, |
| 118 | "Ing 3": {Addr: "addr3", Timestamp: now + 10, State: ACTIVE, Tokens: []uint32{150, 250, 350}}, |
| 119 | }, |
| 120 | } |
| 121 | } |
| 122 | |
| 123 | fourthRing := func() *Desc { |
| 124 | return &Desc{ |
| 125 | Ingesters: map[string]InstanceDesc{ |
| 126 | "Ing 1": {Addr: "addr1", Timestamp: now + 10, State: LEFT, Tokens: []uint32{30, 40, 50}}, |
| 127 | }, |
| 128 | } |
| 129 | } |
| 130 | |