(t *testing.T)
| 152 | } |
| 153 | |
| 154 | func TestZoneResultsQuorum(t *testing.T) { |
| 155 | s, err := e2e.NewScenario(networkName) |
| 156 | require.NoError(t, err) |
| 157 | defer s.Close() |
| 158 | |
| 159 | flags := BlocksStorageFlags() |
| 160 | flags["-distributor.shard-by-all-labels"] = "true" |
| 161 | flags["-distributor.replication-factor"] = "3" |
| 162 | flags["-distributor.zone-awareness-enabled"] = "true" |
| 163 | |
| 164 | // Start dependencies. |
| 165 | consul := e2edb.NewConsul() |
| 166 | minio := e2edb.NewMinio(9000, flags["-blocks-storage.s3.bucket-name"]) |
| 167 | require.NoError(t, s.StartAndWaitReady(consul, minio)) |
| 168 | |
| 169 | // Start Cortex components. |
| 170 | ingesterFlags := func(zone string) map[string]string { |
| 171 | return mergeFlags(flags, map[string]string{ |
| 172 | "-ingester.availability-zone": zone, |
| 173 | }) |
| 174 | } |
| 175 | |
| 176 | ingester1 := e2ecortex.NewIngesterWithConfigFile("ingester-1", e2ecortex.RingStoreConsul, consul.NetworkHTTPEndpoint(), "", ingesterFlags("zone-a"), "") |
| 177 | ingester2 := e2ecortex.NewIngesterWithConfigFile("ingester-2", e2ecortex.RingStoreConsul, consul.NetworkHTTPEndpoint(), "", ingesterFlags("zone-a"), "") |
| 178 | ingester3 := e2ecortex.NewIngesterWithConfigFile("ingester-3", e2ecortex.RingStoreConsul, consul.NetworkHTTPEndpoint(), "", ingesterFlags("zone-b"), "") |
| 179 | ingester4 := e2ecortex.NewIngesterWithConfigFile("ingester-4", e2ecortex.RingStoreConsul, consul.NetworkHTTPEndpoint(), "", ingesterFlags("zone-b"), "") |
| 180 | ingester5 := e2ecortex.NewIngesterWithConfigFile("ingester-5", e2ecortex.RingStoreConsul, consul.NetworkHTTPEndpoint(), "", ingesterFlags("zone-c"), "") |
| 181 | ingester6 := e2ecortex.NewIngesterWithConfigFile("ingester-6", e2ecortex.RingStoreConsul, consul.NetworkHTTPEndpoint(), "", ingesterFlags("zone-c"), "") |
| 182 | require.NoError(t, s.StartAndWaitReady(ingester1, ingester2, ingester3, ingester4, ingester5, ingester6)) |
| 183 | |
| 184 | distributor := e2ecortex.NewDistributor("distributor", e2ecortex.RingStoreConsul, consul.NetworkHTTPEndpoint(), flags, "") |
| 185 | querier := e2ecortex.NewQuerier("querier", e2ecortex.RingStoreConsul, consul.NetworkHTTPEndpoint(), flags, "") |
| 186 | flagsZoneResultsQuorum := mergeFlags(flags, map[string]string{ |
| 187 | "-distributor.zone-results-quorum-metadata": "true", |
| 188 | }) |
| 189 | querierZoneResultsQuorum := e2ecortex.NewQuerier("querier-zrq", e2ecortex.RingStoreConsul, consul.NetworkHTTPEndpoint(), flagsZoneResultsQuorum, "") |
| 190 | require.NoError(t, s.StartAndWaitReady(distributor, querier, querierZoneResultsQuorum)) |
| 191 | |
| 192 | // Wait until distributor and queriers have updated the ring. |
| 193 | require.NoError(t, distributor.WaitSumMetricsWithOptions(e2e.Equals(6), []string{"cortex_ring_members"}, e2e.WithLabelMatchers( |
| 194 | labels.MustNewMatcher(labels.MatchEqual, "name", "ingester"), |
| 195 | labels.MustNewMatcher(labels.MatchEqual, "state", "ACTIVE")))) |
| 196 | |
| 197 | require.NoError(t, querier.WaitSumMetricsWithOptions(e2e.Equals(6), []string{"cortex_ring_members"}, e2e.WithLabelMatchers( |
| 198 | labels.MustNewMatcher(labels.MatchEqual, "name", "ingester"), |
| 199 | labels.MustNewMatcher(labels.MatchEqual, "state", "ACTIVE")))) |
| 200 | |
| 201 | require.NoError(t, querierZoneResultsQuorum.WaitSumMetricsWithOptions(e2e.Equals(6), []string{"cortex_ring_members"}, e2e.WithLabelMatchers( |
| 202 | labels.MustNewMatcher(labels.MatchEqual, "name", "ingester"), |
| 203 | labels.MustNewMatcher(labels.MatchEqual, "state", "ACTIVE")))) |
| 204 | |
| 205 | client, err := e2ecortex.NewClient(distributor.HTTPEndpoint(), querier.HTTPEndpoint(), "", "", userID) |
| 206 | require.NoError(t, err) |
| 207 | clientZoneResultsQuorum, err := e2ecortex.NewClient(distributor.HTTPEndpoint(), querierZoneResultsQuorum.HTTPEndpoint(), "", "", userID) |
| 208 | require.NoError(t, err) |
| 209 | |
| 210 | // Push some series |
| 211 | now := time.Now() |
nothing calls this directly
no test coverage detected