Bug #100327 Error when connecting db in parallel (multiple hosts in connection string)
Submitted: 27 Jul 2020 5:40 Modified: 27 Jul 2020 7:55
Reporter: JIYEONG LIM Email Updates:
Status: Verified Impact on me:
None 
Category:Connector / NET Severity:S3 (Non-critical)
Version:8.0.21 OS:Any
Assigned to: CPU Architecture:Any

[27 Jul 2020 5:40] JIYEONG LIM
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);
    }
});
[27 Jul 2020 7:55] MySQL Verification Team
Hello JIYEONG LIM,

Thank you for the report and feedback.

regards,
Umesh
[27 Jul 2020 7:56] MySQL Verification Team
Test results - C/NET 8.0.21

Attachment: 100327.results.txt (text/plain), 21.78 KiB.

[20 Mar 2022 9:51] rotem gubes
Hi,
I encounter the same issues.
Any update?