Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/Ydb.Sdk/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
- ADO.NET: PoolingSessionSource 2.0 based on Npgsql pooling algorithm.
- Added new ADO.NET options:
- `MinSessionPool`: The minimum connection pool size.
- `SessionIdleTimeout`: The time (in seconds) to wait before closing idle session in the pool if the count of all sessions exceeds `MinSessionPool`.
Expand Down
2 changes: 2 additions & 0 deletions src/Ydb.Sdk/src/Ado/Session/ISession.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ namespace Ydb.Sdk.Ado.Session;

internal interface ISession
{
bool IsBroken { get; }

ValueTask<IServerStream<ExecuteQueryResponsePart>> ExecuteQuery(
string query,
Dictionary<string, YdbValue> parameters,
Expand Down
2 changes: 1 addition & 1 deletion src/Ydb.Sdk/src/Ado/Session/ISessionSource.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ namespace Ydb.Sdk.Ado.Session;

internal interface ISessionSource<TSession> where TSession : ISession
{
ValueTask<TSession> OpenSession();
ValueTask<TSession> OpenSession(CancellationToken cancellationToken = default);

void Return(TSession session);
}
2 changes: 2 additions & 0 deletions src/Ydb.Sdk/src/Ado/Session/ImplicitSession.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ public ImplicitSession(IDriver driver)
_driver = driver;
}

public bool IsBroken => false;

public ValueTask<IServerStream<ExecuteQueryResponsePart>> ExecuteQuery(
string query,
Dictionary<string, YdbValue> parameters,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

namespace Ydb.Sdk.Ado.Session;

internal class Session : IPoolingSession
internal class PoolingSession : IPoolingSession
{
private const string SessionBalancer = "session-balancer";

Expand All @@ -18,20 +18,20 @@ internal class Session : IPoolingSession
private readonly IDriver _driver;
private readonly PoolingSessionSource _poolingSessionSource;
private readonly YdbConnectionStringBuilder _settings;
private readonly ILogger<Session> _logger;
private readonly ILogger<PoolingSession> _logger;

private volatile bool _isActive;
private volatile bool _isBroken;

private string SessionId { get; set; } = string.Empty;
private long NodeId { get; set; }

public bool IsActive => _isActive;
public bool IsBroken => _isBroken;

internal Session(
internal PoolingSession(
IDriver driver,
PoolingSessionSource poolingSessionSource,
YdbConnectionStringBuilder settings,
ILogger<Session> logger
ILogger<PoolingSession> logger
)
{
_driver = driver;
Expand Down Expand Up @@ -109,7 +109,7 @@ StatusCode.Unavailable or
{
_logger.LogWarning("Session[{SessionId}] is deactivated. Reason StatusCode: {Code}", SessionId, code);

_isActive = false;
_isBroken = true;
}
}

Expand Down Expand Up @@ -176,7 +176,7 @@ public async Task Open(CancellationToken cancellationToken)

OnNotSuccessStatusCode(statusCode);

if (!IsActive)
if (IsBroken)
{
return;
}
Expand Down Expand Up @@ -204,7 +204,7 @@ public async Task Open(CancellationToken cancellationToken)
}
finally
{
_isActive = false;
_isBroken = true;
}
}, cancellationToken);

Expand All @@ -215,7 +215,12 @@ public async Task DeleteSession()
{
try
{
_isActive = false;
if (_isBroken)
{
return;
}

_isBroken = true;

var deleteSessionResponse = await _driver.UnaryCall(
QueryService.DeleteSessionMethod,
Expand Down
20 changes: 20 additions & 0 deletions src/Ydb.Sdk/src/Ado/Session/PoolingSessionFactory.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
using Microsoft.Extensions.Logging;

namespace Ydb.Sdk.Ado.Session;

internal class PoolingSessionFactory : IPoolingSessionFactory
{
private readonly IDriver _driver;
private readonly YdbConnectionStringBuilder _settings;
private readonly ILogger<PoolingSession> _logger;

public PoolingSessionFactory(IDriver driver, YdbConnectionStringBuilder settings, ILogger<PoolingSession> logger)
{
_driver = driver;
_settings = settings;
_logger = logger;
}

public IPoolingSession NewSession(PoolingSessionSource source) =>
new PoolingSession(_driver, source, _settings, _logger);
}
Loading
Loading