@@ -1450,3 +1450,124 @@ func TestQuerierDistributedExecution(t *testing.T) {
1450
1450
require .NoError (t , err )
1451
1451
require .Equal (t , expectedVector2 , val .(model.Vector ))
1452
1452
}
1453
+
1454
+ func TestDistributedExecResults (t * testing.T ) {
1455
+ // e2e test setup
1456
+ s , err := e2e .NewScenario (networkName )
1457
+ require .NoError (t , err )
1458
+ defer s .Close ()
1459
+
1460
+ // initialize the flags
1461
+ flags := mergeFlags (
1462
+ BlocksStorageFlags (),
1463
+ map [string ]string {
1464
+ "-blocks-storage.tsdb.block-ranges-period" : (5 * time .Second ).String (),
1465
+ "-blocks-storage.tsdb.ship-interval" : "1s" ,
1466
+ "-blocks-storage.tsdb.retention-period" : ((5 * time .Second * 2 ) - 1 ).String (),
1467
+ "-querier.thanos-engine" : "true" ,
1468
+ "-querier.distributed-exec-enabled" : "true" ,
1469
+ },
1470
+ )
1471
+
1472
+ flags2 := mergeFlags (
1473
+ BlocksStorageFlags (),
1474
+ map [string ]string {
1475
+ "-blocks-storage.tsdb.block-ranges-period" : (5 * time .Second ).String (),
1476
+ "-blocks-storage.tsdb.ship-interval" : "1s" ,
1477
+ "-blocks-storage.tsdb.retention-period" : ((5 * time .Second * 2 ) - 1 ).String (),
1478
+ "-querier.thanos-engine" : "true" ,
1479
+ "-querier.distributed-exec-enabled" : "false" ,
1480
+ },
1481
+ )
1482
+
1483
+ minio := e2edb .NewMinio (9000 , flags ["-blocks-storage.s3.bucket-name" ])
1484
+ consul := e2edb .NewConsul ()
1485
+ require .NoError (t , s .StartAndWaitReady (consul , minio ))
1486
+
1487
+ // START SERVICE 1
1488
+ distributor := e2ecortex .NewDistributor ("distributor" , e2ecortex .RingStoreConsul , consul .NetworkHTTPEndpoint (), flags , "" )
1489
+ ingester := e2ecortex .NewIngester ("ingester" , e2ecortex .RingStoreConsul , consul .NetworkHTTPEndpoint (), flags , "" )
1490
+ queryScheduler := e2ecortex .NewQueryScheduler ("query-scheduler" , flags , "" )
1491
+ storeGateway := e2ecortex .NewStoreGateway ("store-gateway" , e2ecortex .RingStoreConsul , consul .NetworkHTTPEndpoint (), flags , "" )
1492
+ require .NoError (t , s .StartAndWaitReady (queryScheduler , distributor , ingester , storeGateway ))
1493
+ flags = mergeFlags (flags , map [string ]string {
1494
+ "-querier.store-gateway-addresses" : strings .Join ([]string {storeGateway .NetworkGRPCEndpoint ()}, "," ),
1495
+ })
1496
+ queryFrontend := e2ecortex .NewQueryFrontend ("query-frontend" , mergeFlags (flags , map [string ]string {
1497
+ "-frontend.scheduler-address" : queryScheduler .NetworkGRPCEndpoint (),
1498
+ }), "" )
1499
+ require .NoError (t , s .Start (queryFrontend ))
1500
+ querier := e2ecortex .NewQuerier ("querier" , e2ecortex .RingStoreConsul , consul .NetworkHTTPEndpoint (), mergeFlags (flags , map [string ]string {
1501
+ "-querier.scheduler-address" : queryScheduler .NetworkGRPCEndpoint (),
1502
+ }), "" )
1503
+ require .NoError (t , s .StartAndWaitReady (querier ))
1504
+
1505
+ require .NoError (t , distributor .WaitSumMetrics (e2e .Equals (512 ), "cortex_ring_tokens_total" ))
1506
+ require .NoError (t , querier .WaitSumMetrics (e2e .Equals (2 * 512 ), "cortex_ring_tokens_total" ))
1507
+
1508
+ c , err := e2ecortex .NewClient (distributor .HTTPEndpoint (), queryFrontend .HTTPEndpoint (), "" , "" , "user-1" )
1509
+ require .NoError (t , err )
1510
+
1511
+ // START SERVICE 2
1512
+ distributor2 := e2ecortex .NewDistributor ("distributor" , e2ecortex .RingStoreConsul , consul .NetworkHTTPEndpoint (), flags2 , "" )
1513
+ ingester2 := e2ecortex .NewIngester ("ingester" , e2ecortex .RingStoreConsul , consul .NetworkHTTPEndpoint (), flags2 , "" )
1514
+ queryScheduler2 := e2ecortex .NewQueryScheduler ("query-scheduler" , flags2 , "" )
1515
+ storeGateway2 := e2ecortex .NewStoreGateway ("store-gateway" , e2ecortex .RingStoreConsul , consul .NetworkHTTPEndpoint (), flags , "" )
1516
+ require .NoError (t , s .StartAndWaitReady (queryScheduler2 , distributor2 , ingester2 , storeGateway2 ))
1517
+ flags2 = mergeFlags (flags2 , map [string ]string {
1518
+ "-querier.store-gateway-addresses" : strings .Join ([]string {storeGateway2 .NetworkGRPCEndpoint ()}, "," ),
1519
+ })
1520
+ queryFrontend2 := e2ecortex .NewQueryFrontend ("query-frontend" , mergeFlags (flags2 , map [string ]string {
1521
+ "-frontend.scheduler-address" : queryScheduler2 .NetworkGRPCEndpoint (),
1522
+ }), "" )
1523
+ require .NoError (t , s .Start (queryFrontend2 ))
1524
+ querier2 := e2ecortex .NewQuerier ("querier" , e2ecortex .RingStoreConsul , consul .NetworkHTTPEndpoint (), mergeFlags (flags2 , map [string ]string {
1525
+ "-querier.scheduler-address" : queryScheduler2 .NetworkGRPCEndpoint (),
1526
+ }), "" )
1527
+ require .NoError (t , s .StartAndWaitReady (querier2 ))
1528
+ require .NoError (t , distributor2 .WaitSumMetrics (e2e .Equals (512 ), "cortex_ring_tokens_total" ))
1529
+ require .NoError (t , querier2 .WaitSumMetrics (e2e .Equals (2 * 512 ), "cortex_ring_tokens_total" ))
1530
+ c2 , err := e2ecortex .NewClient (distributor .HTTPEndpoint (), queryFrontend2 .HTTPEndpoint (), "" , "" , "user-2" )
1531
+ require .NoError (t , err )
1532
+
1533
+ // INJECT DATA
1534
+ series1Timestamp := time .Now ()
1535
+ series2Timestamp := series1Timestamp
1536
+ series1 , expectedVector1 := generateSeries ("series_1" , series1Timestamp , prompb.Label {Name : "series_1" , Value : "series_1" })
1537
+ series2 , expectedVector2 := generateSeries ("series_2" , series2Timestamp , prompb.Label {Name : "series_2" , Value : "series_2" })
1538
+
1539
+ res , err := c .Push (series1 )
1540
+ require .NoError (t , err )
1541
+ require .Equal (t , 200 , res .StatusCode )
1542
+ res , err = c2 .Push (series1 )
1543
+ require .NoError (t , err )
1544
+ require .Equal (t , 200 , res .StatusCode )
1545
+
1546
+ res , err = c .Push (series2 )
1547
+ require .NoError (t , err )
1548
+ require .Equal (t , 200 , res .StatusCode )
1549
+ res , err = c2 .Push (series2 )
1550
+ require .NoError (t , err )
1551
+ require .Equal (t , 200 , res .StatusCode )
1552
+
1553
+ var val model.Value
1554
+ val , err = c .Query ("series_1" , series1Timestamp )
1555
+ require .NoError (t , err )
1556
+ require .Equal (t , expectedVector1 , val .(model.Vector ))
1557
+ val , err = c .Query ("series_2" , series2Timestamp )
1558
+ require .NoError (t , err )
1559
+ require .Equal (t , expectedVector2 , val .(model.Vector ))
1560
+
1561
+ val , err = c2 .Query ("series_1" , series1Timestamp )
1562
+ require .NoError (t , err )
1563
+ require .Equal (t , expectedVector1 , val .(model.Vector ))
1564
+ val , err = c2 .Query ("series_2" , series2Timestamp )
1565
+ require .NoError (t , err )
1566
+ require .Equal (t , expectedVector2 , val .(model.Vector ))
1567
+
1568
+ val , err = c .Query ("sum(series_1)+sum(series_2)" , series1Timestamp )
1569
+ require .NoError (t , err )
1570
+ val_distributed , err := c2 .Query ("sum(series_1)+sum(series_2)" , series1Timestamp )
1571
+ require .NoError (t , err )
1572
+ require .Equal (t , val , val_distributed )
1573
+ }
0 commit comments