Skip to content

KeyNotFoundException in MySqlBulkLoader.GetAndRemoveStream() #757

@wangjia184

Description

@wangjia184

When loading a streaming into a table, MySqlBulkLoader.LoadAsync() may fail with KeyNotFoundException

  at System.ThrowHelper.ThrowKeyNotFoundException[T](T key)
   at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
   at MySql.Data.MySqlClient.MySqlBulkLoader.GetAndRemoveStream(String streamKey) in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlBulkLoader.cs:line 241
   at MySql.Data.MySqlClient.MySqlBulkLoader.<LoadAsync>d__80.MoveNext() in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlBulkLoader.cs:line 207
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult()

My code:

                MySqlBulkLoader loader = new MySqlBulkLoader(conn);
                loader.TableName = "tournament_result";
                loader.FieldTerminator = DataFileGenerator.FIELDS_TERMINATER;
                loader.EscapeCharacter = '\b';
                loader.LineTerminator = DataFileGenerator.LINES_TERMINATER;
                loader.Columns.Add("ID");
                loader.Columns.Add("UserID");
                loader.Columns.Add("Score");
                loader.Columns.Add("Rank");
                loader.Columns.Add("Comments");
                loader.Timeout = 60 * 5;
                loader.Local = true;
                loader.ConflictOption = MySqlBulkLoaderConflictOption.Replace;
                using (loader.SourceStream = generator.GetStream())
                {
                    await loader.LoadAsync().ConfigureAwait(false);
                }

The reason is that, when ExecuteNonQueryAsync fails, closeStream is not set to false but the key does not exist in s_sources.

KeyNotFoundException is raised in the finally block when calling GetAndRemoveSource

((IDisposable) GetAndRemoveSource(FileName!)).Dispose();

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions