@@ -4969,4 +4969,41 @@ Y_UNIT_TEST_SUITE(DataShardReadIteratorBatchMode) {
4969
4969
4970
4970
}
4971
4971
4972
+ Y_UNIT_TEST_SUITE (DataShardReadIteratorFastCancel) {
4973
+
4974
+ Y_UNIT_TEST (ShouldProcessFastCancel) {
4975
+ TTestHelper helper;
4976
+
4977
+ auto request1 = helper.GetBaseReadRequest (" table-1" , 1 );
4978
+ AddRangeQuery<ui32>(*request1, { 1 }, true , { 1 }, true );
4979
+ auto readResult1 = helper.SendRead (" table-1" , request1.release ());
4980
+ CheckResult (helper.Tables .at (" table-1" ).UserTable , *readResult1, {
4981
+ {1 , 1 , 1 , 100 },
4982
+ });
4983
+ UNIT_ASSERT (readResult1->Record .GetFinished ());
4984
+
4985
+ auto & runtime = *helper.Server ->GetRuntime ();
4986
+ auto sender = runtime.AllocateEdgeActor ();
4987
+ auto shardActor = ResolveTablet (runtime, helper.Tables .at (" table-1" ).TabletId );
4988
+
4989
+ auto request2 = helper.GetBaseReadRequest (" table-1" , 2 );
4990
+ AddRangeQuery<ui32>(*request2, { 1 }, true , { 1 }, true );
4991
+ auto request3 = helper.GetBaseReadRequest (" table-1" , 3 );
4992
+ AddRangeQuery<ui32>(*request3, { 1 }, true , { 1 }, true );
4993
+ auto cancel2 = std::make_unique<TEvDataShard::TEvReadCancel>();
4994
+ cancel2->Record .SetReadId (2 );
4995
+ auto cancel3 = std::make_unique<TEvDataShard::TEvReadCancel>();
4996
+ cancel3->Record .SetReadId (3 );
4997
+
4998
+ runtime.Send (new IEventHandle (shardActor, sender, request2.release ()), 0 , true );
4999
+ runtime.Send (new IEventHandle (shardActor, sender, request3.release ()), 0 , true );
5000
+ runtime.Send (new IEventHandle (shardActor, sender, cancel2.release ()), 0 , true );
5001
+ runtime.Send (new IEventHandle (shardActor, sender, cancel3.release ()), 0 , true );
5002
+
5003
+ auto ev = runtime.GrabEdgeEvent <TEvDataShard::TEvReadResult>(sender, TDuration::Seconds (1 ));
5004
+ UNIT_ASSERT_C (!ev, " Unexpected response received (should have been cancelled)" );
5005
+ }
5006
+
5007
+ }
5008
+
4972
5009
} // namespace NKikimr
0 commit comments