Skip to content

Commit 1bbcd9b

Browse files
YdbCommand: Execute* methods don't propagate cancellation token to the server stream, there is used only for initializing the YdbDataReader.
1 parent bdbd5b1 commit 1bbcd9b

File tree

4 files changed

+28
-8
lines changed

4 files changed

+28
-8
lines changed

src/Ydb.Sdk/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
- `YdbCommand`: `Execute*` methods don't propagate cancellation token to the server stream, there is used only for initializing the `YdbDataReader`.
12
- `YdbCommand`: Cancellation token propagation in `Execute*` methods
23
- `YdbConnection`: Cancellation token propagation in `OpenAsync` method.
34
- `YdbDataReader`: Cancellation token propagation in `ReadAsync` and `NextResultAsync` methods.

src/Ydb.Sdk/src/Ado/YdbCommand.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,6 @@ protected override async Task<DbDataReader> ExecuteDbDataReaderAsync(CommandBeha
201201
var execSettings = CommandTimeout > 0
202202
? new ExecuteQuerySettings { TransportTimeout = TimeSpan.FromSeconds(CommandTimeout) }
203203
: new ExecuteQuerySettings();
204-
execSettings.CancellationToken = cancellationToken;
205204

206205
var transaction = YdbConnection.CurrentTransaction;
207206

@@ -211,9 +210,9 @@ protected override async Task<DbDataReader> ExecuteDbDataReaderAsync(CommandBeha
211210
}
212211

213212
var ydbDataReader = await YdbDataReader.CreateYdbDataReader(
214-
await YdbConnection.Session.ExecuteQuery(
215-
preparedSql.ToString(), ydbParameters, execSettings, transaction?.TransactionControl
216-
), YdbConnection.OnStatus, transaction
213+
await YdbConnection.Session
214+
.ExecuteQuery(preparedSql.ToString(), ydbParameters, execSettings, transaction?.TransactionControl),
215+
YdbConnection.OnStatus, transaction, cancellationToken
217216
);
218217

219218
YdbConnection.LastReader = ydbDataReader;

src/Ydb.Sdk/src/Ado/YdbDataReader.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,17 +65,19 @@ private YdbDataReader(
6565
internal static async Task<YdbDataReader> CreateYdbDataReader(
6666
IServerStream<ExecuteQueryResponsePart> resultSetStream,
6767
Action<Status> onStatus,
68-
YdbTransaction? ydbTransaction = null)
68+
YdbTransaction? ydbTransaction = null,
69+
CancellationToken cancellationToken = default
70+
)
6971
{
7072
var ydbDataReader = new YdbDataReader(resultSetStream, onStatus, ydbTransaction);
71-
await ydbDataReader.Init();
73+
await ydbDataReader.Init(cancellationToken);
7274

7375
return ydbDataReader;
7476
}
7577

76-
private async Task Init()
78+
private async Task Init(CancellationToken cancellationToken)
7779
{
78-
if (State.IsConsumed == await NextExecPart(CancellationToken.None))
80+
if (State.IsConsumed == await NextExecPart(cancellationToken))
7981
{
8082
throw new YdbException("YDB server closed the stream");
8183
}

src/Ydb.Sdk/tests/Ado/YdbConnectionTests.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,24 @@ public async Task YdbCommand_WhenCancelTokenIsCanceled_ThrowYdbException()
261261
Assert.True(ydbDataReader.IsClosed);
262262
}
263263

264+
[Fact]
265+
public async Task ExecuteMethods_WhenExecutedYdbDataReaderThenCancelTokenIsCanceled_ReturnValues()
266+
{
267+
await using var connection = await CreateOpenConnectionAsync();
268+
var ydbCommand = new YdbCommand(connection) { CommandText = "SELECT 1; SELECT 1; "};
269+
var cts = new CancellationTokenSource();
270+
var ydbDataReader = await ydbCommand.ExecuteReaderAsync(cts.Token);
271+
272+
await ydbDataReader.ReadAsync(cts.Token);
273+
Assert.Equal(1, ydbDataReader.GetValue(0));
274+
Assert.True(await ydbDataReader.NextResultAsync(cts.Token));
275+
cts.Cancel();
276+
await ydbDataReader.ReadAsync(cts.Token);
277+
Assert.Equal(1, ydbDataReader.GetValue(0));
278+
// ReSharper disable once MethodSupportsCancellation
279+
Assert.False(await ydbDataReader.NextResultAsync());
280+
}
281+
264282
private List<Task> GenerateTasks() => Enumerable.Range(0, 100).Select(async i =>
265283
{
266284
await using var connection = await CreateOpenConnectionAsync();

0 commit comments

Comments
 (0)