Skip to content

Commit d058f92

Browse files
committed
test
1 parent 0d16841 commit d058f92

File tree

5 files changed

+34
-101
lines changed

5 files changed

+34
-101
lines changed

src/Ydb.Sdk/src/Ado/PoolManager.cs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,14 @@ internal static class PoolManager
1010
internal static readonly ConcurrentDictionary<string, IDriver> Drivers = new();
1111
internal static readonly ConcurrentDictionary<string, ISessionSource> Pools = new();
1212

13-
internal static async Task<ISession> GetSession(
13+
internal static async ValueTask<ISessionSource> Get(
1414
YdbConnectionStringBuilder settings,
1515
CancellationToken cancellationToken
1616
)
1717
{
1818
if (Pools.TryGetValue(settings.ConnectionString, out var sessionPool))
1919
{
20-
return await sessionPool.OpenSession(cancellationToken);
20+
return sessionPool;
2121
}
2222

2323
await SemaphoreSlim.WaitAsync(cancellationToken);
@@ -26,7 +26,7 @@ CancellationToken cancellationToken
2626
{
2727
if (Pools.TryGetValue(settings.ConnectionString, out var pool))
2828
{
29-
return await pool.OpenSession(cancellationToken);
29+
return pool;
3030
}
3131

3232
var driver = Drivers.TryGetValue(settings.GrpcConnectionString, out var cacheDriver) &&
@@ -36,13 +36,12 @@ CancellationToken cancellationToken
3636

3737
driver.RegisterOwner();
3838

39-
ISessionSource newSessionPool = settings.EnableImplicitSession
40-
? new ImplicitSessionSource(driver)
41-
: new PoolingSessionSource<PoolingSession>(new PoolingSessionFactory(driver, settings), settings);
39+
var factory = new PoolingSessionFactory(driver, settings);
40+
var newSessionPool = new PoolingSessionSource<PoolingSession>(factory, settings);
4241

4342
Pools[settings.ConnectionString] = newSessionPool;
4443

45-
return await newSessionPool.OpenSession(cancellationToken);
44+
return newSessionPool;
4645
}
4746
finally
4847
{

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

Lines changed: 4 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -212,38 +212,14 @@ protected override async Task<DbDataReader> ExecuteDbDataReaderAsync(CommandBeha
212212

213213
var transaction = YdbConnection.CurrentTransaction;
214214

215-
if (Transaction != null && Transaction != transaction)
215+
if (Transaction != null && Transaction != transaction) // assert on legacy DbTransaction property
216216
{
217217
throw new InvalidOperationException("Transaction mismatched! (Maybe using another connection)");
218218
}
219219

220-
var useImplicit = YdbConnection.EnableImplicitSession && transaction is null;
221-
var session = useImplicit
222-
? new ImplicitSession(YdbConnection.Session.Driver, new ImplicitSessionSource(YdbConnection.Session.Driver))
223-
: YdbConnection.Session;
224-
225-
YdbDataReader ydbDataReader;
226-
try
227-
{
228-
var execResult = await session.ExecuteQuery(
229-
preparedSql.ToString(),
230-
ydbParameters,
231-
execSettings,
232-
transaction?.TransactionControl
233-
);
234-
235-
ydbDataReader = await YdbDataReader.CreateYdbDataReader(
236-
execResult,
237-
YdbConnection.OnNotSuccessStatusCode,
238-
transaction,
239-
cancellationToken
240-
);
241-
}
242-
finally
243-
{
244-
if (useImplicit)
245-
session.Dispose();
246-
}
220+
var ydbDataReader = await YdbDataReader.CreateYdbDataReader(await YdbConnection.Session.ExecuteQuery(
221+
preparedSql.ToString(), ydbParameters, execSettings, transaction?.TransactionControl
222+
), YdbConnection.OnNotSuccessStatusCode, transaction, cancellationToken);
247223

248224
YdbConnection.LastReader = ydbDataReader;
249225
YdbConnection.LastCommand = CommandText;

src/Ydb.Sdk/src/Ado/YdbConnection.cs

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Data.Common;
33
using System.Diagnostics.CodeAnalysis;
44
using Ydb.Sdk.Ado.BulkUpsert;
5+
using Ydb.Sdk.Ado.RetryPolicy;
56
using Ydb.Sdk.Ado.Session;
67
using static System.Data.IsolationLevel;
78

@@ -81,11 +82,7 @@ public YdbTransaction BeginTransaction(TransactionMode transactionMode = Transac
8182
return CurrentTransaction;
8283
}
8384

84-
public override void ChangeDatabase(string databaseName)
85-
{
86-
}
87-
88-
internal bool EnableImplicitSession => ConnectionStringBuilder.EnableImplicitSession;
85+
public override void ChangeDatabase(string databaseName) => throw new NotSupportedException();
8986

9087
public override void Close() => CloseAsync().GetAwaiter().GetResult();
9188

@@ -95,12 +92,28 @@ public override async Task OpenAsync(CancellationToken cancellationToken)
9592
{
9693
ThrowIfConnectionOpen();
9794

98-
Session = await PoolManager.GetSession(ConnectionStringBuilder, cancellationToken);
95+
var sessionSource = await PoolManager.Get(ConnectionStringBuilder, cancellationToken);
96+
97+
Session = await sessionSource.OpenSession(cancellationToken);
9998

10099
OnStateChange(ClosedToOpenEventArgs);
101100

102101
ConnectionState = ConnectionState.Open;
103102
}
103+
104+
internal async ValueTask OpenAsync(
105+
YdbRetryPolicyExecutor retryPolicyExecutor,
106+
CancellationToken cancellationToken = default
107+
)
108+
{
109+
ThrowIfConnectionOpen();
110+
111+
var sessionSource = await PoolManager.Get(ConnectionStringBuilder, cancellationToken);
112+
113+
Session = new RetryableSession(sessionSource, retryPolicyExecutor);
114+
115+
ConnectionState = ConnectionState.Open;
116+
}
104117

105118
public override async Task CloseAsync()
106119
{
@@ -160,7 +173,7 @@ public override string ConnectionString
160173
? ConnectionState.Broken
161174
: ConnectionState;
162175

163-
private ConnectionState ConnectionState { get; set; } = ConnectionState.Closed;
176+
private ConnectionState ConnectionState { get; set; } = ConnectionState.Closed; // Invoke AsyncOpen()
164177

165178
internal void OnNotSuccessStatusCode(StatusCode code) => _session.OnNotSuccessStatusCode(code);
166179

src/Ydb.Sdk/src/Ado/YdbDataSource.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ async ValueTask<YdbConnection> OpenConnectionAsync(CancellationToken cancellatio
8888

8989
try
9090
{
91-
await ydbConnection.OpenAsync(cancellationToken);
91+
await ydbConnection.OpenAsync(_retryPolicyExecutor, cancellationToken);
9292
return ydbConnection;
9393
}
9494
catch
@@ -390,7 +390,7 @@ public async ValueTask<YdbConnection> OpenRetryableConnectionAsync(CancellationT
390390
var ydbConnection = CreateDbConnection();
391391
try
392392
{
393-
await ydbConnection.OpenAsync(cancellationToken);
393+
await ydbConnection.OpenAsync(_retryPolicyExecutor, cancellationToken);
394394
return ydbConnection;
395395
}
396396
catch
@@ -408,7 +408,7 @@ public async ValueTask<YdbConnection> OpenRetryableConnectionAsync(
408408
var ydbConnection = CreateDbConnection();
409409
try
410410
{
411-
await ydbConnection.OpenAsync(cancellationToken);
411+
await ydbConnection.OpenAsync(_retryPolicyExecutor, cancellationToken);
412412
return ydbConnection;
413413
}
414414
catch
@@ -426,7 +426,7 @@ public async ValueTask<YdbConnection> OpenRetryableConnectionAsync(
426426
var ydbConnection = CreateDbConnection();
427427
try
428428
{
429-
await ydbConnection.OpenAsync(cancellationToken);
429+
await ydbConnection.OpenAsync(_retryPolicyExecutor, cancellationToken);
430430
return ydbConnection;
431431
}
432432
catch

src/Ydb.Sdk/test/Ydb.Sdk.Ado.Tests/YdbImplictConnectionTests.cs

Lines changed: 0 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -48,61 +48,6 @@ public void ImplicitSession_ConcurrentCommand_IsStillBlockedByBusyCheck()
4848
Assert.Equal("A command is already in progress: SELECT 1; SELECT 1;", ex.Message);
4949
}
5050

51-
[Fact]
52-
public async Task ImplicitSession_DisallowsTransactions_And_AllowsNonTransactionalCommands()
53-
{
54-
var table = $"Implicit_{Guid.NewGuid():N}";
55-
56-
await using var connection = CreateConnection();
57-
connection.ConnectionString += ";EnableImplicitSession=true";
58-
await connection.OpenAsync();
59-
60-
try
61-
{
62-
await using (var create = connection.CreateCommand())
63-
{
64-
create.CommandText = $"""
65-
CREATE TABLE {table} (
66-
Id Int32,
67-
Name Text,
68-
PRIMARY KEY (Id)
69-
)
70-
""";
71-
await create.ExecuteNonQueryAsync();
72-
}
73-
74-
await using (var insert = connection.CreateCommand())
75-
{
76-
insert.CommandText = $"INSERT INTO {table} (Id, Name) VALUES (1, 'A');";
77-
await insert.ExecuteNonQueryAsync();
78-
}
79-
80-
var tx = connection.BeginTransaction();
81-
await using (var insertTx = connection.CreateCommand())
82-
{
83-
insertTx.Transaction = tx;
84-
insertTx.CommandText = $"INSERT INTO {table} (Id, Name) VALUES (2, 'B');";
85-
var ex = await Assert.ThrowsAsync<YdbException>(async () => await insertTx.ExecuteNonQueryAsync());
86-
Assert.Contains("Transactions are not supported in implicit sessions", ex.Message);
87-
}
88-
89-
await tx.RollbackAsync();
90-
91-
await using (var check = connection.CreateCommand())
92-
{
93-
check.CommandText = $"SELECT COUNT(*) FROM {table};";
94-
var count = Convert.ToInt32(await check.ExecuteScalarAsync());
95-
Assert.Equal(1, count);
96-
}
97-
}
98-
finally
99-
{
100-
await using var drop = connection.CreateCommand();
101-
drop.CommandText = $"DROP TABLE {table}";
102-
await drop.ExecuteNonQueryAsync();
103-
}
104-
}
105-
10651
[Fact]
10752
public async Task ImplicitSession_Cancellation_AfterFirstResult_StillReturnsFirst()
10853
{

0 commit comments

Comments
 (0)