-
Notifications
You must be signed in to change notification settings - Fork 256
Description
We somehow had a DbConnectionInterceptor that opens a connection on ConnectionOpening. I thought it could be done
In EF Core, ConnectionOpened is invoked regardless of IsSuppressed value, so the interceptor should've opened the connection when IsSuppressed is true.
https://github.com/dotnet/efcore/blob/6cacf97e1093965928d27e99a7b3f90d25c0b01b/src/EFCore.Relational/Storage/RelationalConnection.cs#L758-L767
But after this change (#3349), we had errors (reproduced below) and connection leaks (couldn't reproduce in the test).
Here's the repro:
public sealed class TestContext : DbContext
{
public TestContext(DbContextOptions<TestContext> options)
: base(options)
{
}
}
public sealed class ConnectionOpeningInterceptor : DbConnectionInterceptor
{
public override async ValueTask<InterceptionResult> ConnectionOpeningAsync(
DbConnection connection, ConnectionEventData eventData, InterceptionResult result,
CancellationToken cancellationToken = default)
{
await connection.OpenAsync(cancellationToken);
return InterceptionResult.Suppress();
}
}
var services = new ServiceCollection();
services.AddDbContext<TestContext>(options =>
{
options.UseNpgsql("connection string");
options.AddInterceptors(new ConnectionOpeningInterceptor());
});
await using var serviceProvider = services.BuildServiceProvider();
var context = serviceProvider.GetRequiredService<TestContext>();
var relationalDatabaseCreator = context.GetService<IRelationalDatabaseCreator>();
await relationalDatabaseCreator.ExistsAsync(); // okay, but doesn't close connection
await relationalDatabaseCreator.ExistsAsync(); // throws exception on the second invocationI think the change slightly broke the semantics of the interceptor.
Before the change, The invocation of ConnectionOpening was always followed by the matching invocations of ConnectionOpened and ConnectionClosing or ConnectionDisposing if there were no errors.
But after the change, there is always one more invocation of ConnectionOpening
We removed the interceptor, so it doesn't necessarily need to be fixed for me, but I leave this issue as a future note.