mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
Fix for BUG#6522 "Replication fails due to a rolled back transaction in the binlog"
When we are writing a transaction to the binlog, we log BEGIN/COMMIT with zero error code. Example: all statements of trans succeeded, connection lost and so implicit rollback: we don't want ER_NET* errors to be logged in the BEGIN/ROLLBACK events, while statement events have 0. If there was really a serious error code, it's already in the statement events. sql/log.cc: When we write the cached binlog segment to disk binlog at COMMIT/ROLLBACK time: imagine this is rollback due to net timeout, after all statements of the transaction succeeded. Then we want a zero-error code in BEGIN. In other words, if there was a really serious error code it's already in the transaction's statement events. sql/sql_table.cc: out of date comment
This commit is contained in:
@ -1370,6 +1370,14 @@ bool MYSQL_LOG::write(THD *thd, IO_CACHE *cache, bool commit_or_rollback)
|
|||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
Query_log_event qinfo(thd, "BEGIN", 5, TRUE);
|
Query_log_event qinfo(thd, "BEGIN", 5, TRUE);
|
||||||
|
/*
|
||||||
|
Imagine this is rollback due to net timeout, after all statements of
|
||||||
|
the transaction succeeded. Then we want a zero-error code in BEGIN.
|
||||||
|
In other words, if there was a really serious error code it's already
|
||||||
|
in the statement's events.
|
||||||
|
This is safer than thd->clear_error() against kills at shutdown.
|
||||||
|
*/
|
||||||
|
qinfo.error_code= 0;
|
||||||
/*
|
/*
|
||||||
Now this Query_log_event has artificial log_pos 0. It must be adjusted
|
Now this Query_log_event has artificial log_pos 0. It must be adjusted
|
||||||
to reflect the real position in the log. Not doing it would confuse the
|
to reflect the real position in the log. Not doing it would confuse the
|
||||||
@ -1403,6 +1411,7 @@ bool MYSQL_LOG::write(THD *thd, IO_CACHE *cache, bool commit_or_rollback)
|
|||||||
commit_or_rollback ? "COMMIT" : "ROLLBACK",
|
commit_or_rollback ? "COMMIT" : "ROLLBACK",
|
||||||
commit_or_rollback ? 6 : 8,
|
commit_or_rollback ? 6 : 8,
|
||||||
TRUE);
|
TRUE);
|
||||||
|
qinfo.error_code= 0;
|
||||||
qinfo.set_log_pos(this);
|
qinfo.set_log_pos(this);
|
||||||
if (qinfo.write(&log_file) || flush_io_cache(&log_file))
|
if (qinfo.write(&log_file) || flush_io_cache(&log_file))
|
||||||
goto err;
|
goto err;
|
||||||
|
@ -911,7 +911,6 @@ TABLE *create_table_from_items(THD *thd, HA_CREATE_INFO *create_info,
|
|||||||
}
|
}
|
||||||
table->file->extra(HA_EXTRA_WRITE_CACHE);
|
table->file->extra(HA_EXTRA_WRITE_CACHE);
|
||||||
DBUG_RETURN(table);
|
DBUG_RETURN(table);
|
||||||
/* Note that leaving the function resets binlogging properties */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user