@@ -2334,92 +2334,75 @@ Y_UNIT_TEST_SUITE(KqpNewEngine) {
23342334 }
23352335 }
23362336
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 );
23412341
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` (
23452349 Key Uint64,
23462350 Value String,
23472351 PRIMARY KEY (Key)
23482352 )
23492353 WITH (
2350- PARTITION_AT_KEYS = (10, 20, 30),
2351- READ_REPLICAS_SETTINGS = "ANY_AZ:1"
2354+ PARTITION_AT_KEYS = (10, 20, 30)
2355+ %s
23522356 );
2353- )" ).GetValueSync ());
2357+ )" ).c_str (), EnableFollowers ? " , READ_REPLICAS_SETTINGS = \" ANY_AZ:3\" " : " " )
2358+ ).GetValueSync ());
23542359
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
23592362 (1u, "One"),
23602363 (11u, "Two"),
23612364 (21u, "Three"),
23622365 (31u, "Four");
2363- )" , TTxControl::BeginTx ().CommitTx ()).GetValueSync ());
2366+ )" ) , TTxControl::BeginTx ().CommitTx ()).GetValueSync ());
23642367
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);
23682368
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 )));
23752373
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"(
23772391 [
23782392 [[21u];["Three"]];
23792393 ]
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" );
23882395
2389- CompareYson (R"(
2396+ // distributed
2397+ checkRead (Q_ (R"(
2398+ SELECT * FROM Table WHERE Value != "One" ORDER BY Key;
2399+ )" ), R"(
23902400 [
23912401 [[11u];["Two"]];
23922402 [[21u];["Three"]];
23932403 [[31u];["Four"]];
23942404 ]
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" );
24232406 }
24242407
24252408 Y_UNIT_TEST (StaleRO_Immediate) {
@@ -2444,6 +2427,70 @@ Y_UNIT_TEST_SUITE(KqpNewEngine) {
24442427 )" , FormatResultSetYson (result.GetResultSet (0 )));
24452428 }
24462429
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+
24472494 Y_UNIT_TEST (ReadRangeWithParams) {
24482495 auto kikimr = DefaultKikimrRunner ();
24492496 auto db = kikimr.GetTableClient ();
0 commit comments