@@ -2334,92 +2334,75 @@ Y_UNIT_TEST_SUITE(KqpNewEngine) {
2334
2334
}
2335
2335
}
2336
2336
2337
- Y_UNIT_TEST (StaleRO) {
2338
- auto kikimr = DefaultKikimrRunner ();
2339
- auto db = kikimr. GetTableClient ();
2340
- auto session = db. CreateSession (). GetValueSync (). GetSession ( );
2337
+ Y_UNIT_TEST_TWIN (StaleRO, EnableFollowers ) {
2338
+ auto settings = TKikimrSettings ()
2339
+ . SetEnableForceFollowers (EnableFollowers)
2340
+ . SetWithSampleTables ( false );
2341
2341
2342
- AssertSuccessResult (session.ExecuteSchemeQuery (R"(
2343
- --!syntax_v1
2344
- CREATE TABLE `FollowersKv` (
2342
+ TKikimrRunner kikimr (settings);
2343
+ auto tableClient = kikimr.GetTableClient ();
2344
+ auto queryClient = kikimr.GetQueryClient ();
2345
+ auto session = tableClient.CreateSession ().GetValueSync ().GetSession ();
2346
+
2347
+ AssertSuccessResult (session.ExecuteSchemeQuery (Sprintf (Q_ (R"(
2348
+ CREATE TABLE `Table` (
2345
2349
Key Uint64,
2346
2350
Value String,
2347
2351
PRIMARY KEY (Key)
2348
2352
)
2349
2353
WITH (
2350
- PARTITION_AT_KEYS = (10, 20, 30),
2351
- READ_REPLICAS_SETTINGS = "ANY_AZ:1"
2354
+ PARTITION_AT_KEYS = (10, 20, 30)
2355
+ %s
2352
2356
);
2353
- )" ).GetValueSync ());
2357
+ )" ).c_str (), EnableFollowers ? " , READ_REPLICAS_SETTINGS = \" ANY_AZ:3\" " : " " )
2358
+ ).GetValueSync ());
2354
2359
2355
- AssertSuccessResult (session.ExecuteDataQuery (R"(
2356
- --!syntax_v1
2357
-
2358
- REPLACE INTO `FollowersKv` (Key, Value) VALUES
2360
+ AssertSuccessResult (session.ExecuteDataQuery (Q_ (R"(
2361
+ UPSERT INTO `Table` (Key, Value) VALUES
2359
2362
(1u, "One"),
2360
2363
(11u, "Two"),
2361
2364
(21u, "Three"),
2362
2365
(31u, "Four");
2363
- )" , TTxControl::BeginTx ().CommitTx ()).GetValueSync ());
2366
+ )" ) , TTxControl::BeginTx ().CommitTx ()).GetValueSync ());
2364
2367
2365
- kikimr.GetTestServer ().GetRuntime ()->SetLogPriority (NKikimrServices::KQP_EXECUTER, NActors::NLog::PRI_INFO);
2366
- kikimr.GetTestServer ().GetRuntime ()->SetLogPriority (NKikimrServices::PIPE_CLIENT, NActors::NLog::PRI_DEBUG);
2367
- // kikimr.GetTestServer().GetRuntime()->SetLogPriority(NKikimrServices::PIPE_SERVER, NActors::NLog::PRI_DEBUG);
2368
2368
2369
- // Followers immediate
2370
- auto result = session.ExecuteDataQuery (R"(
2371
- --!syntax_v1
2372
- SELECT * FROM FollowersKv WHERE Key = 21;
2373
- )" , TTxControl::BeginTx (TTxSettings::StaleRO ()).CommitTx ()).ExtractValueSync ();
2374
- AssertSuccessResult (result);
2369
+ auto checkRead = [&](const TString& query, const TString& expectedResult, const TString& tablePath) {
2370
+ auto result = session.ExecuteDataQuery (query, TTxControl::BeginTx (TTxSettings::StaleRO ()).CommitTx ()).ExtractValueSync ();
2371
+ AssertSuccessResult (result);
2372
+ CompareYson (expectedResult, FormatResultSetYson (result.GetResultSet (0 )));
2375
2373
2376
- CompareYson (R"(
2374
+ if (EnableFollowers) {
2375
+ // from master - should NOT read
2376
+ CheckTableReads (session, tablePath, false , false );
2377
+ // from followers - should read
2378
+ CheckTableReads (session, tablePath, true , true );
2379
+ } else {
2380
+ // from master - should read
2381
+ CheckTableReads (session, tablePath, false , true );
2382
+ // from followers - should NOT read
2383
+ CheckTableReads (session, tablePath, true , false );
2384
+ }
2385
+ };
2386
+
2387
+ // immediate
2388
+ checkRead (Q_ (R"(
2389
+ SELECT * FROM Table WHERE Key = 21;
2390
+ )" ), R"(
2377
2391
[
2378
2392
[[21u];["Three"]];
2379
2393
]
2380
- )" , FormatResultSetYson (result.GetResultSet (0 )));
2381
-
2382
- // Followers distributed
2383
- result = session.ExecuteDataQuery (R"(
2384
- --!syntax_v1
2385
- SELECT * FROM FollowersKv WHERE Value != "One" ORDER BY Key;
2386
- )" , TTxControl::BeginTx (TTxSettings::StaleRO ()).CommitTx ()).ExtractValueSync ();
2387
- AssertSuccessResult (result);
2394
+ )" , " /Root/Table" );
2388
2395
2389
- CompareYson (R"(
2396
+ // distributed
2397
+ checkRead (Q_ (R"(
2398
+ SELECT * FROM Table WHERE Value != "One" ORDER BY Key;
2399
+ )" ), R"(
2390
2400
[
2391
2401
[[11u];["Two"]];
2392
2402
[[21u];["Three"]];
2393
2403
[[31u];["Four"]];
2394
2404
]
2395
- )" , FormatResultSetYson (result.GetResultSet (0 )));
2396
-
2397
- // No followers immediate
2398
- result = session.ExecuteDataQuery (R"(
2399
- --!syntax_v1
2400
- SELECT * FROM TwoShard WHERE Key = 2;
2401
- )" , TTxControl::BeginTx (TTxSettings::StaleRO ()).CommitTx ()).ExtractValueSync ();
2402
- AssertSuccessResult (result);
2403
-
2404
- CompareYson (R"(
2405
- [
2406
- [[2u];["Two"];[0]];
2407
- ]
2408
- )" , FormatResultSetYson (result.GetResultSet (0 )));
2409
-
2410
- // No followers distributed
2411
- result = session.ExecuteDataQuery (R"(
2412
- --!syntax_v1
2413
- SELECT * FROM TwoShard WHERE Value2 < 0 ORDER BY Key;
2414
- )" , TTxControl::BeginTx (TTxSettings::StaleRO ()).CommitTx ()).ExtractValueSync ();
2415
- AssertSuccessResult (result);
2416
-
2417
- CompareYson (R"(
2418
- [
2419
- [[1u];["One"];[-1]];
2420
- [[4000000001u];["BigOne"];[-1]]
2421
- ]
2422
- )" , FormatResultSetYson (result.GetResultSet (0 )));
2405
+ )" , " /Root/Table" );
2423
2406
}
2424
2407
2425
2408
Y_UNIT_TEST (StaleRO_Immediate) {
@@ -2444,6 +2427,70 @@ Y_UNIT_TEST_SUITE(KqpNewEngine) {
2444
2427
)" , FormatResultSetYson (result.GetResultSet (0 )));
2445
2428
}
2446
2429
2430
+ Y_UNIT_TEST_TWIN (StaleRO_IndexFollowers, EnableFollowers) {
2431
+ auto settings = TKikimrSettings ()
2432
+ .SetEnableForceFollowers (EnableFollowers)
2433
+ .SetWithSampleTables (false );
2434
+ TKikimrRunner kikimr (settings);
2435
+ auto db = kikimr.GetTableClient ();
2436
+ auto session = db.CreateSession ().GetValueSync ().GetSession ();
2437
+
2438
+ AssertSuccessResult (session.ExecuteSchemeQuery (Q_ (R"(
2439
+ CREATE TABLE Table (
2440
+ Key Uint64,
2441
+ Subkey Uint64,
2442
+ Value String,
2443
+ Order Uint32,
2444
+ PRIMARY KEY (Key, Subkey)
2445
+ );
2446
+
2447
+ ALTER TABLE Table ADD INDEX idx GLOBAL SYNC ON (Key, Order) COVER (Value);
2448
+ )" )).GetValueSync ());
2449
+
2450
+ if constexpr (EnableFollowers) {
2451
+ AssertSuccessResult (session.ExecuteSchemeQuery (Q_ (R"(
2452
+ ALTER TABLE Table ALTER INDEX idx SET READ_REPLICAS_SETTINGS "ANY_AZ:1";
2453
+ )" )).GetValueSync ());
2454
+ }
2455
+
2456
+ AssertSuccessResult (session.ExecuteDataQuery (Q_ (R"(
2457
+ UPSERT INTO Table (Key, Subkey, Value, Order) VALUES
2458
+ (1u, 2u, "One", 7u),
2459
+ (1u, 3u, "Two", 4u),
2460
+ (21u, 8u, "Three", 1u),
2461
+ (31u, 0u, "Four", 8u);
2462
+ )" ), TTxControl::BeginTx ().CommitTx ()).GetValueSync ());
2463
+
2464
+ auto result = session.ExecuteDataQuery (Q_ (R"(
2465
+ SELECT Key, Value FROM Table VIEW idx WHERE Key = 1 ORDER BY Order;
2466
+ )" ), TTxControl::BeginTx (TTxSettings::StaleRO ()).CommitTx ()).ExtractValueSync ();
2467
+ AssertSuccessResult (result);
2468
+
2469
+ CompareYson (R"(
2470
+ [
2471
+ [[1u];["Two"]];
2472
+ [[1u];["One"]];
2473
+ ]
2474
+ )" , FormatResultSetYson (result.GetResultSet (0 )));
2475
+
2476
+ // from main master - should NOT read
2477
+ CheckTableReads (session, " /Root/Table" , false , false );
2478
+ // from main followers - should NOT read
2479
+ CheckTableReads (session, " /Root/Table" , true , false );
2480
+
2481
+ if constexpr (EnableFollowers) {
2482
+ // from index master - should NOT read
2483
+ CheckTableReads (session, " /Root/Table/idx/indexImplTable" , false , false );
2484
+ // from index followers - should read
2485
+ CheckTableReads (session, " /Root/Table/idx/indexImplTable" , true , true );
2486
+ } else {
2487
+ // from index master - should read
2488
+ CheckTableReads (session, " /Root/Table/idx/indexImplTable" , false , true );
2489
+ // from index followers - should NOT read
2490
+ CheckTableReads (session, " /Root/Table/idx/indexImplTable" , true , false );
2491
+ }
2492
+ }
2493
+
2447
2494
Y_UNIT_TEST (ReadRangeWithParams) {
2448
2495
auto kikimr = DefaultKikimrRunner ();
2449
2496
auto db = kikimr.GetTableClient ();
0 commit comments