Bug #89632 MySql.Data.MySqlClient.MySqlConnection.set_Reader(MySqlDataReader value) 6.9.11
Submitted: 12 Feb 2018 20:07 Modified: 14 Feb 2018 12:27
Reporter: Jo kjhjkh Email Updates:
Status: Can't repeat Impact on me:
None 
Category:Connector / NET Severity:S2 (Serious)
Version:6.9.11 OS:Any
Assigned to: CPU Architecture:Any

[12 Feb 2018 20:07] Jo kjhjkh
Description:
We updated our library from 6.9.10 to 6.9.11 and now sometime we have this issue

Here is the stack :

System.NullReferenceException: Object reference not set to an instance of an object.
at MySql.Data.MySqlClient.MySqlConnection.set_Reader(MySqlDataReader value): 
at MySql.Data.MySqlClient.MySqlDataReader.Close(): 
at MySql.Data.MySqlClient.MySqlDataReader.Dispose(Boolean disposing): 
at MySql.Data.MySqlClient.MySqlDataReader.Finalize(): 

We have around 10 000 clients using the connector and we got around 10 reports/every day since the update.

How to repeat:
Random

Suggested fix:
A change between 6.9.10 and 6.9.11.
[12 Feb 2018 20:15] Jo kjhjkh
issue

Attachment: img.png (image/png, text), 29.93 KiB.

[13 Feb 2018 12:01] Chiranjeevi Battula
Hello !!,

Thank you for the bug report.
Could you please provide repeatable steps (exact steps/sample project, MySQl version, full stack trace etc. - please make it as private if you prefer) to confirm this issue at our end?

Thanks,
Chiranjeevi.
[13 Feb 2018 13:33] Jo kjhjkh
Could you please provide repeatable steps (exact steps/sample project, MySQl version, full stack trace etc. - please make it as private if you prefer) to confirm this issue at our end?

It happen randomly after a while with the datareader

I think it's due to this fix in 6.9.11

Instances of the DataReader class did not close connections implicitly as expected when CommandBehavior was set to CloseConnection. This fix ensures that the connection is closed properly when the DataReader object no longer exists. (Bug #27277013)

Here is the connection that I use

        public MySQL(string sServer, uint sPort, string sDatabase, string sUsername, string sPassword)
        {
            var builder = new MySqlConnectionStringBuilder
            {
                Server = sServer,
                Port = sPort,
                UserID = sUsername,
                Password = sPassword,
                Database = sDatabase,
                CharacterSet = "utf8",
                AllowZeroDateTime = true,
                ConvertZeroDateTime = true,
                AllowUserVariables = true,
                MaximumPoolSize = 1024
            };

            connection.ConnectionString = builder.GetConnectionString(true);
            command = connection.CreateCommand();
        }

Hope this help,
[14 Feb 2018 12:27] Chiranjeevi Battula
Hello !!,

Thank you for the feedback.
I could not repeat the issue at our end using with Visual Studio 2017, Connector/NET 6.9.11 and 6.10.6 versions.
If you can provide more information, feel free to add it to this bug and change the status back to 'Open'.

Thank you for your interest in MySQL.

Thanks,
Chiranjeevi.
[1 Jun 2018 14:41] Gregory Fishbein
We have noticed the same issue with 6.9.11. When a query times out the stream in this line is null on the dispose of the MySqlDataReader:

    public int GetResult(ref int affectedRow, ref long insertedId)
    {
      try
      {
        this.packet = this.stream.ReadPacket();
[1 Jun 2018 15:00] Gregory Fishbein
It looks like it is calling this to flush out the results in the data reader:
            while (this.NextResult())
          ;

but the driver underneath is disposed already so it throws this error.

            this.resultSet = this.driver.NextResult(this.Statement.StatementId, false);
[1 Jun 2018 15:01] Gregory Fishbein
our call stack is slightly different, but similar:

 	MySql.Data.dll!MySql.Data.MySqlClient.NativeDriver.GetResult(ref int affectedRow, ref long insertedId) 
 	MySql.Data.dll!MySql.Data.MySqlClient.Driver.NextResult(int statementId, bool force) 
>	MySql.Data.dll!MySql.Data.MySqlClient.MySqlDataReader.NextResult() 
 	MySql.Data.dll!MySql.Data.MySqlClient.MySqlDataReader.Close() 
 	MySql.Data.dll!MySql.Data.MySqlClient.MySqlDataReader.Dispose(bool disposing) 
 	MySql.Data.dll!MySql.Data.MySqlClient.MySqlDataReader.~MySqlDataReader()