1
1
#include < ydb/core/kqp/ut/common/kqp_ut_common.h>
2
2
3
+ #include < ydb/core/base/blobstorage.h>
3
4
#include < ydb/core/tx/datashard/datashard.h>
4
5
#include < yql/essentials/parser/pg_catalog/catalog.h>
5
6
#include < yql/essentials/parser/pg_wrapper/interface/codec.h>
@@ -367,7 +368,12 @@ Y_UNIT_TEST_SUITE(KqpKv) {
367
368
CompareYson (Sprintf (" [[[%du];[%du]]]" , valueToReturn_1, valueToReturn_2), TString{res});
368
369
}
369
370
370
- Y_UNIT_TEST_TWIN (ReadRows_ExternalBlobs, NewPrecharge) {
371
+ template <typename FutureT>
372
+ auto GetValue (TKikimrRunner& kikimr, FutureT&& future) {
373
+ return kikimr.GetTestServer ().GetRuntime ()->WaitFuture (future);
374
+ }
375
+
376
+ Y_UNIT_TEST_TWIN (ReadRows_ExternalBlobs, UseExtBlobsPrecharge) {
371
377
NKikimrConfig::TImmediateControlsConfig controls;
372
378
373
379
if (NewPrecharge) {
@@ -379,11 +385,16 @@ Y_UNIT_TEST_SUITE(KqpKv) {
379
385
auto settings = TKikimrSettings ()
380
386
.SetFeatureFlags (flags)
381
387
.SetWithSampleTables (false )
382
- .SetControls (controls);
388
+ .SetUseRealThreads (false )
389
+ .SetControls (controls)
390
+ .SetGrpcServerOptions (NYdbGrpc::TServerOptions ()
391
+ .SetGRpcShutdownDeadline (TDuration::MilliSeconds (0 ))
392
+ );
393
+
383
394
auto kikimr = TKikimrRunner{settings};
384
395
385
396
auto db = kikimr.GetTableClient ();
386
- auto session = db.CreateSession (). GetValueSync ( ).GetSession ();
397
+ auto session = GetValue (kikimr, db.CreateSession ()).GetSession ();
387
398
const auto tableName = " /Root/TestTable" ;
388
399
const auto keyColumnName_1 = " blob_id" ;
389
400
const auto keyColumnName_2 = " chunk_num" ;
@@ -400,7 +411,7 @@ Y_UNIT_TEST_SUITE(KqpKv) {
400
411
builder.SetPrimaryKeyColumns ({keyColumnName_1, keyColumnName_2});
401
412
builder.AddNullableColumn (dataColumnName, EPrimitiveType::String);
402
413
403
- auto result = session.CreateTable (tableName, builder.Build ()). GetValueSync ( );
414
+ auto result = GetValue (kikimr, session.CreateTable (tableName, builder.Build ()));
404
415
UNIT_ASSERT_C (result.IsSuccess (), result.GetIssues ().ToString ());
405
416
406
417
TString largeValue (1_MB, ' L' );
@@ -417,9 +428,27 @@ Y_UNIT_TEST_SUITE(KqpKv) {
417
428
}
418
429
rows.EndList ();
419
430
420
- auto upsertResult = db.BulkUpsert (tableName, rows.Build ()). GetValueSync ( );
431
+ auto upsertResult = GetValue (kikimr, db.BulkUpsert (tableName, rows.Build ()));
421
432
UNIT_ASSERT_C (upsertResult.IsSuccess (), upsertResult.GetIssues ().ToString ());
422
433
434
+ auto server = &kikimr.GetTestServer ();
435
+
436
+ WaitForCompaction (server, tableName);
437
+
438
+ ui32 blobRequestCount = 0 ;
439
+
440
+ auto holder = server->GetRuntime ()->AddObserver <TEvBlobStorage::TEvGet>([&blobRequestCount](TEvBlobStorage::TEvGet::TPtr& ev) {
441
+ const auto & msg = ev->Get ();
442
+ for (size_t i = 0 ; i < msg->QuerySize ; i++) {
443
+ const auto & id = msg->Queries [i].Id ;
444
+
445
+ if (id.BlobSize () == 1_MB + 8 /* * ext blob meta */ ) {
446
+ blobRequestCount++;
447
+ break ;
448
+ }
449
+ }
450
+ });
451
+
423
452
NYdb::TValueBuilder keys;
424
453
keys.BeginList ();
425
454
for (int i = 0 ; i < 10 ; i++) {
@@ -431,11 +460,7 @@ Y_UNIT_TEST_SUITE(KqpKv) {
431
460
}
432
461
keys.EndList ();
433
462
434
- auto server = &kikimr.GetTestServer ();
435
-
436
- WaitForCompaction (server, tableName);
437
-
438
- auto selectResult = db.ReadRows (tableName, keys.Build ()).GetValueSync ();
463
+ auto selectResult = GetValue (kikimr, db.ReadRows (tableName, keys.Build ()));
439
464
440
465
UNIT_ASSERT_C (selectResult.IsSuccess (), selectResult.GetIssues ().ToString ());
441
466
@@ -444,10 +469,83 @@ Y_UNIT_TEST_SUITE(KqpKv) {
444
469
445
470
UNIT_ASSERT (parser.TryNextRow ());
446
471
447
- auto val = parser.GetValue (0 );
448
- TValueParser valParser (val);
449
- TUuidValue v = valParser.GetUuid ();
450
- Cout << v.ToString () << Endl;
472
+ UNIT_ASSERT_VALUES_EQUAL (UseExtBlobsPrecharge ? 2 : 10 , blobRequestCount);
473
+ }
474
+
475
+ Y_UNIT_TEST (ReadRows_TimeoutCancelsReads) {
476
+ auto settings = TKikimrSettings ()
477
+ .SetWithSampleTables (false )
478
+ .SetUseRealThreads (false )
479
+ .SetGrpcServerOptions (NYdbGrpc::TServerOptions ()
480
+ .SetGRpcShutdownDeadline (TDuration::MilliSeconds (0 ))
481
+ );
482
+
483
+ auto kikimr = TKikimrRunner{settings};
484
+
485
+ auto db = kikimr.GetTableClient ();
486
+ auto session = GetValue (kikimr, db.CreateSession ()).GetSession ();
487
+ const auto tableName = " /Root/TestTable" ;
488
+ const auto keyColumnName = " blob_id" ;
489
+ const auto dataColumnName = " data" ;
490
+
491
+ TTableBuilder builder;
492
+ builder.AddNonNullableColumn (keyColumnName, EPrimitiveType::Int32);
493
+ builder.SetPrimaryKeyColumn (keyColumnName);
494
+ builder.AddNullableColumn (dataColumnName, EPrimitiveType::String);
495
+ builder.SetUniformPartitions (2 );
496
+ TExplicitPartitions partitions;
497
+ partitions.AppendSplitPoints (TValueBuilder ().BeginTuple ().AddElement ().OptionalInt32 (5 ).EndTuple ().Build ());
498
+ builder.SetPartitionAtKeys (partitions);
499
+
500
+ auto result = GetValue (kikimr, session.CreateTable (tableName, builder.Build ()));
501
+ UNIT_ASSERT_C (result.IsSuccess (), result.GetIssues ().ToString ());
502
+
503
+ NYdb::TValueBuilder rows;
504
+ rows.BeginList ();
505
+ for (int i = 0 ; i < 10 ; i++) {
506
+ rows.AddListItem ()
507
+ .BeginStruct ()
508
+ .AddMember (keyColumnName).Int32 (i)
509
+ .AddMember (dataColumnName).String (" foo" )
510
+ .EndStruct ();
511
+ }
512
+ rows.EndList ();
513
+
514
+ auto upsertResult = GetValue (kikimr, db.BulkUpsert (tableName, rows.Build ()));
515
+ UNIT_ASSERT_C (upsertResult.IsSuccess (), upsertResult.GetIssues ().ToString ());
516
+
517
+ ui32 cancelCount = 0 ;
518
+ bool droppedOneResult = false ;
519
+
520
+ kikimr.GetTestServer ().GetRuntime ()->SetObserverFunc ([&](TAutoPtr<IEventHandle>& ev) {
521
+ if (auto *evRead = ev->CastAsLocal <TEvDataShard::TEvReadResult>()) {
522
+ if (droppedOneResult) {
523
+ // Drop one of two results, so only one cancel would be sent to the DataShard
524
+ return TTestActorRuntime::EEventAction::PROCESS;
525
+ }
526
+ droppedOneResult = true ;
527
+ return TTestActorRuntime::EEventAction::DROP;
528
+ }
529
+ if (auto *evReadCancel = ev->CastAsLocal <TEvDataShard::TEvReadCancel>()) {
530
+ cancelCount++;
531
+ }
532
+ return TTestActorRuntime::EEventAction::PROCESS;
533
+ });
534
+
535
+ NYdb::TValueBuilder keys;
536
+ keys.BeginList ();
537
+ for (int i = 0 ; i < 10 ; i++) {
538
+ keys.AddListItem ()
539
+ .BeginStruct ()
540
+ .AddMember (keyColumnName).Int32 (i)
541
+ .EndStruct ();
542
+ }
543
+ keys.EndList ();
544
+
545
+ auto selectResult = GetValue (kikimr, db.ReadRows (tableName, keys.Build ()));
546
+
547
+ UNIT_ASSERT (!selectResult.IsSuccess ());
548
+ UNIT_ASSERT_VALUES_EQUAL (cancelCount, 1 );
451
549
}
452
550
453
551
TVector<::ReadRowsPgParam> readRowsPgParams
0 commit comments