Skip to content

Commit 624d9d2

Browse files
push force
1 parent 401e7d2 commit 624d9d2

File tree

8 files changed

+121
-333
lines changed

8 files changed

+121
-333
lines changed

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

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -33,24 +33,11 @@ CancellationToken cancellationToken
3333
!cacheDriver.IsDisposed
3434
? cacheDriver
3535
: Drivers[settings.GrpcConnectionString] = await settings.BuildDriver();
36-
3736
driver.RegisterOwner();
3837

39-
ISessionSource newSessionPool;
40-
41-
if (settings.MaxSessionPool > 0)
42-
{
43-
var factory = new PoolingSessionFactory(driver, settings);
44-
newSessionPool = new PoolingSessionSource<PoolingSession>(factory, settings);
45-
}
46-
else
47-
{
48-
newSessionPool = new ImplicitSessionSource(driver);
49-
}
50-
51-
Pools[settings.ConnectionString] = newSessionPool;
52-
53-
return newSessionPool;
38+
return Pools[settings.ConnectionString] = settings.EnableImplicitSession
39+
? new ImplicitSessionSource(driver)
40+
: new PoolingSessionSource<PoolingSession>(new PoolingSessionFactory(driver, settings), settings);
5441
}
5542
finally
5643
{

src/Ydb.Sdk/src/Ado/Session/ImplicitSession.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,5 +52,5 @@ public void OnNotSuccessStatusCode(StatusCode code)
5252

5353
public void Dispose() => _source.ReleaseLease();
5454

55-
private static YdbException NotSupportedTransaction => new("Transactions are not supported in implicit sessions");
55+
private static YdbException NotSupportedTransaction => new("Transactions are not supported in implicit session");
5656
}

src/Ydb.Sdk/src/Ado/Session/ImplicitSessionSource.cs

Lines changed: 10 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@ internal sealed class ImplicitSessionSource : ISessionSource
44
{
55
private readonly IDriver _driver;
66
private readonly ManualResetEventSlim _allReleased = new(false);
7-
8-
private int _state;
7+
private int _isDisposed;
98
private int _activeLeaseCount;
109

1110
internal ImplicitSessionSource(IDriver driver)
@@ -25,47 +24,32 @@ public ValueTask<ISession> OpenSession(CancellationToken cancellationToken)
2524

2625
private bool TryAcquireLease()
2726
{
28-
if (Volatile.Read(ref _state) == 2)
27+
if (Volatile.Read(ref _isDisposed) != 0)
2928
return false;
3029

31-
var newCount = Interlocked.Increment(ref _activeLeaseCount);
32-
33-
var state = Volatile.Read(ref _state);
30+
Interlocked.Increment(ref _activeLeaseCount);
3431

35-
if (state == 2 || (state == 1 && newCount == 1))
36-
{
37-
Interlocked.Decrement(ref _activeLeaseCount);
38-
return false;
39-
}
32+
if (Volatile.Read(ref _isDisposed) == 0)
33+
return true;
4034

41-
return true;
35+
Interlocked.Decrement(ref _activeLeaseCount);
36+
return false;
4237
}
4338

4439
internal void ReleaseLease()
4540
{
46-
if (Interlocked.Decrement(ref _activeLeaseCount) == 0 &&
47-
Volatile.Read(ref _state) != 0)
48-
{
41+
if (Interlocked.Decrement(ref _activeLeaseCount) == 0 && Volatile.Read(ref _isDisposed) != 0)
4942
_allReleased.Set();
50-
}
5143
}
5244

5345
public async ValueTask DisposeAsync()
5446
{
55-
if (Interlocked.CompareExchange(ref _state, 1, 0) != 0)
47+
if (Interlocked.CompareExchange(ref _isDisposed, 1, 0) != 0)
5648
return;
5749

5850
if (Volatile.Read(ref _activeLeaseCount) != 0)
5951
_allReleased.Wait();
6052

61-
try
62-
{
63-
Volatile.Write(ref _state, 2);
64-
await _driver.DisposeAsync();
65-
}
66-
finally
67-
{
68-
_allReleased.Dispose();
69-
}
53+
await _driver.DisposeAsync();
7054
}
7155
}

src/Ydb.Sdk/src/Ado/YdbConnectionStringBuilder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -510,7 +510,7 @@ static YdbConnectionOption()
510510
"DisableServerBalancer", "Disable Server Balancer");
511511
AddOption(new YdbConnectionOption<bool>(BoolExtractor,
512512
(builder, enableImplicitSession) => builder.EnableImplicitSession = enableImplicitSession),
513-
"EnableImplicitSession", "ImplicitSession");
513+
"EnableImplicitSession", "Enable Implicit Session");
514514
}
515515

516516
private static void AddOption(YdbConnectionOption option, params string[] keys)

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

Lines changed: 0 additions & 117 deletions
Original file line numberDiff line numberDiff line change
@@ -204,123 +204,6 @@ public async Task ExecuteScalar_WhenSelectNoRows_ReturnNull()
204204
.ExecuteScalarAsync());
205205
}
206206

207-
[Fact]
208-
public async Task ImplicitSession_SimpleScalar_Works()
209-
{
210-
await using var connection = CreateConnection();
211-
connection.ConnectionString += ";EnableImplicitSession=true";
212-
await connection.OpenAsync();
213-
214-
var cmd = connection.CreateCommand();
215-
cmd.CommandText = "SELECT 40 + 2;";
216-
var scalar = await cmd.ExecuteScalarAsync();
217-
Assert.Equal(42, Convert.ToInt32(scalar));
218-
}
219-
220-
[Fact]
221-
public async Task ImplicitSession_RepeatedScalars_WorksManyTimes()
222-
{
223-
await using var connection = CreateConnection();
224-
connection.ConnectionString += ";EnableImplicitSession=true";
225-
await connection.OpenAsync();
226-
227-
for (var i = 0; i < 30; i++)
228-
{
229-
var cmd = connection.CreateCommand();
230-
cmd.CommandText = $"SELECT {i};";
231-
var scalar = await cmd.ExecuteScalarAsync();
232-
Assert.Equal(i, Convert.ToInt32(scalar));
233-
}
234-
}
235-
236-
[Fact]
237-
public void ImplicitSession_ConcurrentCommand_IsStillBlockedByBusyCheck()
238-
{
239-
using var connection = CreateConnection();
240-
connection.ConnectionString += ";EnableImplicitSession=true";
241-
connection.Open();
242-
243-
var cmd = connection.CreateCommand();
244-
cmd.CommandText = "SELECT 1; SELECT 1;";
245-
using var reader = cmd.ExecuteReader();
246-
247-
var ex = Assert.Throws<YdbOperationInProgressException>(() => cmd.ExecuteReader());
248-
Assert.Equal("A command is already in progress: SELECT 1; SELECT 1;", ex.Message);
249-
}
250-
251-
[Fact]
252-
public async Task ImplicitSession_WithExplicitTransaction_UsesExplicitSessionAndCommits()
253-
{
254-
var table = $"Implicit_{Guid.NewGuid():N}";
255-
256-
await using var connection = CreateConnection();
257-
connection.ConnectionString += ";EnableImplicitSession=true";
258-
await connection.OpenAsync();
259-
260-
try
261-
{
262-
await using (var create = connection.CreateCommand())
263-
{
264-
create.CommandText = $"""
265-
CREATE TABLE {table} (
266-
Id Int32,
267-
Name Text,
268-
PRIMARY KEY (Id)
269-
)
270-
""";
271-
await create.ExecuteNonQueryAsync();
272-
}
273-
274-
var tx = connection.BeginTransaction();
275-
await using (var insert = connection.CreateCommand())
276-
{
277-
insert.Transaction = tx;
278-
insert.CommandText = $"INSERT INTO {table} (Id, Name) VALUES (1, 'A');";
279-
await insert.ExecuteNonQueryAsync();
280-
insert.CommandText = $"INSERT INTO {table} (Id, Name) VALUES (2, 'B');";
281-
await insert.ExecuteNonQueryAsync();
282-
}
283-
284-
await tx.CommitAsync();
285-
286-
await using (var check = connection.CreateCommand())
287-
{
288-
check.CommandText = $"SELECT COUNT(*) FROM {table};";
289-
var count = Convert.ToInt32(await check.ExecuteScalarAsync());
290-
Assert.Equal(2, count);
291-
}
292-
}
293-
finally
294-
{
295-
await using var drop = connection.CreateCommand();
296-
drop.CommandText = $"DROP TABLE {table}";
297-
await drop.ExecuteNonQueryAsync();
298-
}
299-
}
300-
301-
[Fact]
302-
public async Task ImplicitSession_Cancellation_AfterFirstResult_StillReturnsFirst()
303-
{
304-
await using var connection = CreateConnection();
305-
connection.ConnectionString += ";EnableImplicitSession=true";
306-
await connection.OpenAsync();
307-
308-
var cmd = new YdbCommand(connection) { CommandText = "SELECT 1; SELECT 1;" };
309-
using var cts = new CancellationTokenSource();
310-
311-
var reader = await cmd.ExecuteReaderAsync(cts.Token);
312-
313-
await reader.ReadAsync(cts.Token);
314-
Assert.Equal(1, reader.GetValue(0));
315-
Assert.True(await reader.NextResultAsync(cts.Token));
316-
317-
await cts.CancelAsync();
318-
319-
await reader.ReadAsync(cts.Token);
320-
Assert.Equal(1, reader.GetValue(0));
321-
Assert.False(await reader.NextResultAsync());
322-
}
323-
324207
public class Data<T>(DbType dbType, T expected, bool isNullable = false)
325208
{
326209
public bool IsNullable { get; } = isNullable || expected == null;

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

Lines changed: 8 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -475,115 +475,35 @@ public async Task BulkUpsertImporter_ThrowsOnNonexistentTable()
475475
await Assert.ThrowsAsync<YdbException>(async () => { await importer.FlushAsync(); });
476476
}
477477

478-
[Fact]
479-
public async Task EnableImplicitSession_WhenTrue_ButInsideTransaction_UsesPooledSession()
480-
{
481-
var cs = ConnectionString + ";EnableImplicitSession=true";
482-
483-
await using var conn = new YdbConnection(cs);
484-
await conn.OpenAsync();
485-
486-
using var tx = conn.BeginTransaction();
487-
var cmd = conn.CreateCommand();
488-
cmd.Transaction = tx;
489-
cmd.CommandText = "SELECT 1";
490-
var result = Convert.ToInt64(await cmd.ExecuteScalarAsync());
491-
Assert.Equal(1L, result);
492-
493-
Assert.IsNotType<ImplicitSession>(conn.Session);
494-
}
495-
496-
[Fact]
497-
public async Task EnableImplicitSession_WhenFalse_AlwaysUsesPooledSession()
498-
{
499-
var cs = ConnectionString + ";EnableImplicitSession=false";
500-
501-
await using var conn = new YdbConnection(cs);
502-
await conn.OpenAsync();
503-
504-
var cmd = conn.CreateCommand();
505-
cmd.CommandText = "SELECT CAST(1 AS Int64)";
506-
var result = (long)(await cmd.ExecuteScalarAsync())!;
507-
Assert.Equal(1L, result);
508-
509-
Assert.IsNotType<ImplicitSession>(conn.Session);
510-
}
511-
512-
[Fact]
513-
public async Task EnableImplicitSession_DifferentConnectionStrings_HaveDifferentImplicitPools()
514-
{
515-
var cs1 = ConnectionString + ";EnableImplicitSession=true;MinSessionPool=0;DisableDiscovery=false";
516-
var cs2 = ConnectionString + ";EnableImplicitSession=true;MinSessionPool=1;DisableDiscovery=false";
517-
518-
await using var conn1 = new YdbConnection(cs1);
519-
await conn1.OpenAsync();
520-
var s1 = conn1.Session;
521-
522-
await using var conn2 = new YdbConnection(cs2);
523-
await conn2.OpenAsync();
524-
var s2 = conn2.Session;
525-
526-
Assert.NotEqual(s1, s2);
527-
}
528-
529-
[Fact]
530-
public async Task EnableImplicitSession_TwoSequentialCommands_ReusesSameSession()
531-
{
532-
var cs = ConnectionString + ";EnableImplicitSession=true";
533-
await using var conn = new YdbConnection(cs);
534-
await conn.OpenAsync();
535-
536-
var cmd1 = conn.CreateCommand();
537-
cmd1.CommandText = "SELECT 1;";
538-
await cmd1.ExecuteScalarAsync();
539-
540-
var s1 = conn.Session;
541-
542-
var cmd2 = conn.CreateCommand();
543-
cmd2.CommandText = "SELECT 2;";
544-
await cmd2.ExecuteScalarAsync();
545-
546-
var s2 = conn.Session;
547-
548-
Assert.Equal(s1, s2);
549-
}
550-
551478
[Fact]
552479
public async Task ClearPool_FireAndForget_DoesNotBlock_And_PoolsRecreate()
553480
{
554-
var csBase =
555-
ConnectionString +
556-
";UseTls=false" +
557-
";DisableDiscovery=true" +
558-
";CreateSessionTimeout=3" +
559-
";ConnectTimeout=3" +
560-
";KeepAlivePingDelay=0;KeepAlivePingTimeout=0";
561-
562-
var csPooled = csBase;
563-
var csImplicit = csBase + ";EnableImplicitSession=true";
481+
var csPooled = ConnectionString +
482+
"UseTls=false;DisableDiscovery=true;" +
483+
"CreateSessionTimeout=3;ConnectTimeout=3;" +
484+
"KeepAlivePingDelay=0;KeepAlivePingTimeout=0";
485+
var csImplicit = csPooled + ";EnableImplicitSession=true";
564486

565487
await using (var warmPooled = new YdbConnection(csPooled))
566488
{
567489
await warmPooled.OpenAsync();
568-
using var cmd = warmPooled.CreateCommand();
490+
await using var cmd = warmPooled.CreateCommand();
569491
cmd.CommandText = "SELECT 1";
570492
Assert.Equal(1L, Convert.ToInt64(await cmd.ExecuteScalarAsync()));
571493
}
572494

573495
await using (var warmImplicit = new YdbConnection(csImplicit))
574496
{
575497
await warmImplicit.OpenAsync();
576-
using var cmd = warmImplicit.CreateCommand();
498+
await using var cmd = warmImplicit.CreateCommand();
577499
cmd.CommandText = "SELECT 1";
578500
Assert.Equal(1L, Convert.ToInt64(await cmd.ExecuteScalarAsync()));
579501
}
580502

581503
var clearPooledTask = YdbConnection.ClearPool(new YdbConnection(csPooled));
582504
var clearImplicitTask = YdbConnection.ClearPool(new YdbConnection(csImplicit));
583505

584-
var done = await Task.WhenAny(Task.WhenAll(clearPooledTask, clearImplicitTask),
585-
Task.Delay(TimeSpan.FromSeconds(2)));
586-
Assert.True(done != Task.Delay(TimeSpan.FromSeconds(2)), "ClearPool() must not block.");
506+
await Task.WhenAll(clearPooledTask, clearImplicitTask);
587507

588508
await using (var checkPooled = new YdbConnection(csPooled))
589509
{
@@ -601,15 +521,4 @@ public async Task ClearPool_FireAndForget_DoesNotBlock_And_PoolsRecreate()
601521
Assert.Equal(1L, Convert.ToInt64(await cmd.ExecuteScalarAsync()));
602522
}
603523
}
604-
605-
[Fact]
606-
public async Task EnableImplicitSession_WithDisableDiscovery_Works()
607-
{
608-
var cs = ConnectionString + ";EnableImplicitSession=true;DisableDiscovery=true";
609-
await using var conn = new YdbConnection(cs);
610-
await conn.OpenAsync();
611-
using var cmd = conn.CreateCommand();
612-
cmd.CommandText = "SELECT 1";
613-
Assert.Equal(1L, Convert.ToInt64(await cmd.ExecuteScalarAsync()));
614-
}
615524
}

0 commit comments

Comments
 (0)