summaryrefslogtreecommitdiff
path: root/innobase
diff options
context:
space:
mode:
authorunknown <heikki@hundin.mysql.fi>2005-03-21 22:10:42 +0200
committerunknown <heikki@hundin.mysql.fi>2005-03-21 22:10:42 +0200
commit7656b6da717418b1f87fa7bec1c81ccdb6892442 (patch)
treee9c4f4ff80947fec41834df84038181c71044b1e /innobase
parentafe45b7328145a07090fcc2b62d4a72028578aa1 (diff)
downloadmariadb-git-7656b6da717418b1f87fa7bec1c81ccdb6892442.tar.gz
trx0trx.c, trx0trx.h:
If MySQL wrote to its binlog, but for some reason trx->update_undo and trx->insert_undo were NULL in InnoDB, then trx->commit_lsn was garbage, and InnoDB could assert in the log flush of trx_commit_complete_for_mysql() (Bug #9277) innobase/include/trx0trx.h: If MySQL wrote to its binlog, but for some reason trx->update_undo and trx->insert_undo were NULL in InnoDB, then trx->commit_lsn was garbage, and InnoDB could assert in the log flush of trx_commit_complete_for_mysql() (Bug #9277) innobase/trx/trx0trx.c: If MySQL wrote to its binlog, but for some reason trx->update_undo and trx->insert_undo were NULL in InnoDB, then trx->commit_lsn was garbage, and InnoDB could assert in the log flush of trx_commit_complete_for_mysql() (Bug #9277)
Diffstat (limited to 'innobase')
-rw-r--r--innobase/include/trx0trx.h6
-rw-r--r--innobase/trx/trx0trx.c10
2 files changed, 15 insertions, 1 deletions
diff --git a/innobase/include/trx0trx.h b/innobase/include/trx0trx.h
index 3be16e8f46d..4c93f25009f 100644
--- a/innobase/include/trx0trx.h
+++ b/innobase/include/trx0trx.h
@@ -346,6 +346,12 @@ struct trx_struct{
in MySQL's binlog write, we will
flush the log to disk later in
a separate call */
+ ibool must_flush_log_later;/* this flag is set to TRUE in
+ trx_commit_off_kernel() if
+ flush_log_later was TRUE, and there
+ were modifications by the transaction;
+ in that case we must flush the log
+ in trx_commit_complete_for_mysql() */
dulint commit_lsn; /* lsn at the time of the commit */
ibool dict_operation; /* TRUE if the trx is used to create
a table, create an index, or drop a
diff --git a/innobase/trx/trx0trx.c b/innobase/trx/trx0trx.c
index 576827966ab..e2a24c2f63c 100644
--- a/innobase/trx/trx0trx.c
+++ b/innobase/trx/trx0trx.c
@@ -96,6 +96,7 @@ trx_create(
trx->check_unique_secondary = TRUE;
trx->flush_log_later = FALSE;
+ trx->must_flush_log_later = FALSE;
trx->dict_operation = FALSE;
@@ -634,6 +635,8 @@ trx_commit_off_kernel(
#endif /* UNIV_SYNC_DEBUG */
rseg = trx->rseg;
+
+ trx->must_flush_log_later = FALSE;
if (trx->insert_undo != NULL || trx->update_undo != NULL) {
@@ -798,6 +801,7 @@ trx_commit_off_kernel(
if (trx->flush_log_later) {
/* Do nothing yet */
+ trx->must_flush_log_later = TRUE;
} else if (srv_flush_log_at_trx_commit == 0) {
/* Do nothing */
} else if (srv_flush_log_at_trx_commit == 1) {
@@ -1516,7 +1520,9 @@ trx_commit_complete_for_mysql(
trx->op_info = (char*)"flushing log";
- if (srv_flush_log_at_trx_commit == 0) {
+ if (!trx->must_flush_log_later) {
+ /* Do nothing */
+ } if (srv_flush_log_at_trx_commit == 0) {
/* Do nothing */
} else if (srv_flush_log_at_trx_commit == 1) {
if (srv_unix_file_flush_method == SRV_UNIX_NOSYNC) {
@@ -1538,6 +1544,8 @@ trx_commit_complete_for_mysql(
ut_error;
}
+ trx->must_flush_log_later = FALSE;
+
trx->op_info = (char*)"";
return(0);