Description:
When multiple hosts are specified in connection string and connected to DB in parallel, the following errors occur intermittently.
-------------------------------------------------------------------------
Results from .NET Core 3.1.
Error NO 1.
Object reference not set to an instance of an object.
at MySql.Data.Failover.FailoverManager.AttemptConnection(MySqlConnection connection, String originalConnectionString, String& connectionString, Boolean mySqlPoolManager)
at MySql.Data.MySqlClient.MySqlConnection.Open()
at System.Data.Common.DbConnection.OpenAsync(CancellationToken cancellationToken)
--- End of stack trace from previous location where exception was thrown ---
at ConsoleApp1.Program.<>c__DisplayClass0_0.<<Main>b__0>d.MoveNext() in Program.cs:line 38
Error No 2.
Collection was modified; enumeration operation may not execute.
at System.Collections.Generic.Dictionary`2.KeyCollection.Enumerator.MoveNext()
at System.Data.Common.DbConnectionStringBuilder.get_ConnectionString()
at System.Data.Common.DbConnectionStringBuilder.set_ConnectionString(String value)
at MySql.Data.MySqlClient.MySqlConnection.Open()
at System.Data.Common.DbConnection.OpenAsync(CancellationToken cancellationToken)
--- End of stack trace from previous location where exception was thrown ---
at ConsoleApp1.Program.<>c__DisplayClass0_0.<<Main>b__0>d.MoveNext() in Program.cs:line 38
Error No 3.
Authentication to host 'xxx.xxx.xxx.xxx' for user 'xxxxx' using method 'mysql_native_password' failed with message: Access denied for user ''@'xxx.xxx.xxx.xxx' (using password: NO)
at MySql.Data.MySqlClient.Authentication.MySqlAuthenticationPlugin.AuthenticationFailed(Exception ex)
at MySql.Data.MySqlClient.Authentication.MySqlAuthenticationPlugin.ReadPacket()
at MySql.Data.MySqlClient.Authentication.MySqlAuthenticationPlugin.Authenticate(Boolean reset)
at MySql.Data.MySqlClient.NativeDriver.Open()
at MySql.Data.MySqlClient.Driver.Open()
at MySql.Data.MySqlClient.Driver.Create(MySqlConnectionStringBuilder settings)
at MySql.Data.MySqlClient.MySqlPool.CreateNewPooledConnection()
at MySql.Data.MySqlClient.MySqlPool.GetPooledConnection()
at MySql.Data.MySqlClient.MySqlPool.TryToGetDriver()
at MySql.Data.MySqlClient.MySqlPool.GetConnection()
at MySql.Data.MySqlClient.MySqlConnection.Open()
at System.Data.Common.DbConnection.OpenAsync(CancellationToken cancellationToken)
--- End of stack trace from previous location where exception was thrown ---
at ConsoleApp1.Program.<>c__DisplayClass0_0.<<Main>b__0>d.MoveNext() in Program.cs:line 38
How to repeat:
string strConn = "server=(address=xxx.xxx.xxx.xxa:3306,priority=100),(address=xxx.xxx.xxx.xxb:3306,priority=90),(address=xxx.xxx.xxx.xxc:3306,priority=80);uid=xxxx;password=xxxxx;connectiontimeout=60;defaultcommandtimeout=200;allowuservariables=True";
ParallelOptions po = new ParallelOptions();
po.MaxDegreeOfParallelism = Environment.ProcessorCount;
Parallel.For(0, 1000, po, async j =>
{
Console.WriteLine(j);
try
{
using (var conn = new MySqlConnection(strConn))
{
await conn.OpenAsync(); //Errors here.
await conn.CloseAsync();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message + "\r\n" + ex.StackTrace);
}
});