1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-30 16:24:05 +03:00

Fix for BUG#1391:

"If LOAD DATA INFILE 'small_file' fails on master, slave leaves temp files"
(the bug is in the master)


mysql-test/r/rpl_loaddata.result:
  result update
mysql-test/std_data/rpl_loaddata2.dat:
  change to introduce a unique key violation
mysql-test/t/rpl_loaddata.test:
  testcase for bug#1391.
sql/sql_load.cc:
  fix for bug#1391:
  for a small file, we had in the binlog only the Create_file, not the Delete_file
  (the Create_file was written when the READ_INFO was destroyed).
This commit is contained in:
unknown
2003-09-25 00:14:46 +02:00
parent 699f3175fe
commit dae13b5415
4 changed files with 52 additions and 17 deletions

View File

@ -282,22 +282,31 @@ int mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list,
ha_autocommit_or_rollback(thd,error);
if (!opt_old_rpl_compat && mysql_bin_log.is_open())
{
/*
Make sure last block (the one which caused the error) gets logged.
This is needed because otherwise after write of
(to the binlog, not to read_info (which is a cache))
Delete_file_log_event the bad block will remain in read_info (because
pre_read is not called at the end of the last block; remember pre_read
is called whenever a new block is read from disk).
At the end of mysql_load(), the destructor of read_info will call
end_io_cache() which will flush read_info, so we will finally have
this in the binlog:
Append_block # The last successfull block
Delete_file
Append_block # The failing block
which is nonsense.
Or could also be (for a small file)
Create_file # The failing block
which is nonsense (Delete_file is not written in this case, because:
Create_file has not been written, so Delete_file is not written, then
when read_info is destroyed end_io_cache() is called which writes
Create_file.
*/
read_info.end_io_cache();
/* If the file was not empty, wrote_create_file is true */
if (lf_info.wrote_create_file)
{
/*
Make sure last block (the one which caused the error) gets logged.
This is needed because otherwise after write of
(to the binlog, not to read_info (which is a cache))
Delete_file_log_event the bad block will remain in read_info.
At the end of mysql_load(), the destructor of read_info will call
end_io_cache() which will flush read_info, so we will finally have
this in the binlog:
Append_block # The last successfull block
Delete_file
Append_block # The failing block
which is nonsense.
*/
read_info.end_io_cache();
Delete_file_log_event d(thd, db, log_delayed);
mysql_bin_log.write(&d);
}
@ -327,7 +336,7 @@ int mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list,
}
else
{
read_info.end_io_cache(); // make sure last block gets logged
read_info.end_io_cache();
if (lf_info.wrote_create_file)
{
Execute_load_log_event e(thd, db, log_delayed);