1
0
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:
unknown
2004-11-10 15:07:55 +01:00
parent 442b2d89b1
commit 12fbc41f5f
2 changed files with 9 additions and 1 deletions

View File

@ -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;

View File

@ -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 */
} }