From: Jon Olav Hauglid Date: October 21 2010 1:59pm Subject: bzr push into mysql-trunk-merge branch (jon.hauglid:3289 to 3290) List-Archive: http://lists.mysql.com/commits/121544 Message-Id: <201010211359.o9LDnBhx006990@rcsinet15.oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit 3290 Jon Olav Hauglid 2010-10-21 [merge] Merge from mysql-5.5-bugteam to mysql-trunk-merge No conflicts modified: storage/innobase/handler/ha_innodb.cc storage/innobase/include/trx0trx.h storage/innobase/trx/trx0trx.c 3289 Jon Olav Hauglid 2010-10-21 [merge] Merge from mysql-trunk-innodb to mysql-trunk-merge No conflicts removed: storage/innobase/handler/mysql_addons.cc storage/innobase/include/mysql_addons.h storage/innobase/mysql-test/ storage/innobase/mysql-test/patches/ storage/innobase/mysql-test/patches/README storage/innobase/mysql-test/patches/index_merge_innodb-explain.diff storage/innobase/mysql-test/patches/information_schema.diff storage/innobase/mysql-test/patches/innodb_change_buffering_basic.diff storage/innobase/mysql-test/patches/innodb_file_per_table.diff storage/innobase/mysql-test/patches/innodb_lock_wait_timeout.diff storage/innobase/mysql-test/patches/innodb_thread_concurrency_basic.diff storage/innobase/mysql-test/patches/partition_innodb.diff added: mysql-test/suite/innodb/r/innodb_bug56143.result mysql-test/suite/innodb/r/innodb_bug56632.result mysql-test/suite/innodb/r/innodb_bug56680.result mysql-test/suite/innodb/r/innodb_bug57252.result mysql-test/suite/innodb/t/innodb_bug56143.test mysql-test/suite/innodb/t/innodb_bug56632.test mysql-test/suite/innodb/t/innodb_bug56680.test mysql-test/suite/innodb/t/innodb_bug57252.test storage/innobase/include/dict0priv.h storage/innobase/include/dict0priv.ic modified: mysql-test/extra/rpl_tests/rpl_mixing_engines.inc mysql-test/extra/rpl_tests/rpl_mixing_engines.test mysql-test/r/not_partition.result mysql-test/r/partition_exchange.result mysql-test/suite/binlog/r/binlog_row_mix_innodb_myisam.result mysql-test/suite/binlog/r/binlog_stm_mix_innodb_myisam.result mysql-test/suite/innodb/r/innodb_monitor.result mysql-test/suite/innodb/t/innodb_monitor.test mysql-test/suite/perfschema/t/disabled.def mysql-test/suite/rpl/r/rpl_innodb_mixed_dml.result mysql-test/suite/rpl/r/rpl_mixed_mixing_engines.result mysql-test/suite/rpl/r/rpl_non_direct_mixed_mixing_engines.result mysql-test/suite/rpl/r/rpl_non_direct_row_mixing_engines.result mysql-test/suite/rpl/r/rpl_non_direct_stm_mixing_engines.result mysql-test/suite/rpl/r/rpl_row_mixing_engines.result mysql-test/suite/rpl/r/rpl_stm_mixing_engines.result mysql-test/suite/sys_vars/r/all_vars.result mysql-test/suite/sys_vars/t/all_vars.test mysql-test/t/partition_exchange.test sql/binlog.cc sql/share/errmsg-utf8.txt sql/sql_partition_admin.cc storage/innobase/CMakeLists.txt storage/innobase/Makefile.am storage/innobase/btr/btr0cur.c storage/innobase/btr/btr0sea.c storage/innobase/buf/buf0buddy.c storage/innobase/buf/buf0buf.c storage/innobase/buf/buf0flu.c storage/innobase/buf/buf0lru.c storage/innobase/buf/buf0rea.c storage/innobase/dict/dict0boot.c storage/innobase/dict/dict0crea.c storage/innobase/dict/dict0dict.c storage/innobase/dict/dict0load.c storage/innobase/fil/fil0fil.c storage/innobase/handler/ha_innodb.cc storage/innobase/handler/ha_innodb.h storage/innobase/handler/handler0alter.cc storage/innobase/handler/i_s.cc storage/innobase/ibuf/ibuf0ibuf.c storage/innobase/include/btr0cur.h storage/innobase/include/buf0buddy.h storage/innobase/include/buf0buddy.ic storage/innobase/include/buf0buf.h storage/innobase/include/buf0buf.ic storage/innobase/include/buf0flu.h storage/innobase/include/buf0types.h storage/innobase/include/data0type.h storage/innobase/include/dict0boot.h storage/innobase/include/dict0dict.h storage/innobase/include/dict0dict.ic storage/innobase/include/dict0mem.h storage/innobase/include/dict0types.h storage/innobase/include/fil0fil.h storage/innobase/include/ha_prototypes.h storage/innobase/include/ibuf0ibuf.h storage/innobase/include/lock0lock.h storage/innobase/include/os0sync.h storage/innobase/include/pars0sym.h storage/innobase/include/rem0rec.h storage/innobase/include/row0mysql.h storage/innobase/include/row0upd.h storage/innobase/include/srv0mon.h storage/innobase/include/srv0srv.h storage/innobase/lock/lock0lock.c storage/innobase/log/log0log.c storage/innobase/os/os0sync.c storage/innobase/pars/pars0pars.c storage/innobase/pars/pars0sym.c storage/innobase/plug.in storage/innobase/rem/rem0rec.c storage/innobase/row/row0ins.c storage/innobase/row/row0merge.c storage/innobase/row/row0mysql.c storage/innobase/row/row0purge.c storage/innobase/row/row0sel.c storage/innobase/row/row0uins.c storage/innobase/row/row0umod.c storage/innobase/row/row0upd.c storage/innobase/srv/srv0mon.c storage/innobase/srv/srv0srv.c storage/innobase/srv/srv0start.c storage/innobase/sync/sync0sync.c storage/innobase/trx/trx0i_s.c storage/innobase/trx/trx0roll.c === modified file 'storage/innobase/handler/ha_innodb.cc' --- a/storage/innobase/handler/ha_innodb.cc 2010-10-21 08:48:28 +0000 +++ b/storage/innobase/handler/ha_innodb.cc 2010-10-21 13:57:33 +0000 @@ -32,7 +32,6 @@ Place, Suite 330, Boston, MA 02111-1307 *****************************************************************************/ /* TODO list for the InnoDB handler in 5.0: - - Remove the flag trx->active_trans and look at trx->conc_state - fix savepoint functions to use savepoint storage area - Find out what kind of problems the OS X case-insensitivity causes to table and database names; should we 'normalize' the names like we do @@ -1520,7 +1519,7 @@ Gets the InnoDB transaction handle for a an InnoDB transaction struct if the corresponding MySQL thread struct still lacks one. @return InnoDB transaction handle */ -static +static inline trx_t* check_trx_exists( /*=============*/ @@ -1542,6 +1541,77 @@ check_trx_exists( return(trx); } +/*********************************************************************//** +Note that a transaction has been registered with MySQL. +@return true if transaction is registered with MySQL 2PC coordinator */ +static inline +bool +trx_is_registered_for_2pc( +/*=========================*/ + const trx_t* trx) /* in: transaction */ +{ + return(trx->is_registered == 1); +} + +/*********************************************************************//** +Note that a transaction owns the prepare_commit_mutex. */ +static inline +void +trx_owns_prepare_commit_mutex_set( +/*==============================*/ + trx_t* trx) /* in: transaction */ +{ + ut_a(trx_is_registered_for_2pc(trx)); + trx->owns_prepare_mutex = 1; +} + +/*********************************************************************//** +Note that a transaction has been registered with MySQL 2PC coordinator. */ +static inline +void +trx_register_for_2pc( +/*==================*/ + trx_t* trx) /* in: transaction */ +{ + trx->is_registered = 1; + ut_ad(trx->owns_prepare_mutex == 0); +} + +/*********************************************************************//** +Note that a transaction has been deregistered. */ +static inline +void +trx_deregister_from_2pc( +/*====================*/ + trx_t* trx) /* in: transaction */ +{ + trx->is_registered = 0; + trx->owns_prepare_mutex = 0; +} + +/*********************************************************************//** +Check whether atransaction owns the prepare_commit_mutex. +@return true if transaction owns the prepare commit mutex */ +static inline +bool +trx_has_prepare_commit_mutex( +/*=========================*/ + const trx_t* trx) /* in: transaction */ +{ + return(trx->owns_prepare_mutex == 1); +} + +/*********************************************************************//** +Check if transaction is started. +@reutrn true if transaction is in state started */ +static +bool +trx_is_started( +/*===========*/ + trx_t* trx) /* in: transaction */ +{ + return(trx->conc_state != TRX_NOT_STARTED); +} /*********************************************************************//** Construct ha_innobase handler. */ @@ -1605,48 +1675,31 @@ ha_innobase::update_thd() } /*********************************************************************//** -Registers that InnoDB takes part in an SQL statement, so that MySQL knows to -roll back the statement if the statement results in an error. This MUST be -called for every SQL statement that may be rolled back by MySQL. Calling this -several times to register the same statement is allowed, too. */ +Registers an InnoDB transaction with the MySQL 2PC coordinator, so that +the MySQL XA code knows to call the InnoDB prepare and commit, or rollback +for the transaction. This MUST be called for every transaction for which +the user may call commit or rollback. Calling this several times to register +the same transaction is allowed, too. This function also registers the +current SQL statement. */ static inline void -innobase_register_stmt( -/*===================*/ - handlerton* hton, /*!< in: Innobase hton */ - THD* thd) /*!< in: MySQL thd (connection) object */ +innobase_register_trx( +/*==================*/ + handlerton* hton, /* in: Innobase handlerton */ + THD* thd, /* in: MySQL thd (connection) object */ + trx_t* trx) /* in: transaction to register */ { - DBUG_ASSERT(hton == innodb_hton_ptr); - /* Register the statement */ trans_register_ha(thd, FALSE, hton); -} -/*********************************************************************//** -Registers an InnoDB transaction in MySQL, so that the MySQL XA code knows -to call the InnoDB prepare and commit, or rollback for the transaction. This -MUST be called for every transaction for which the user may call commit or -rollback. Calling this several times to register the same transaction is -allowed, too. -This function also registers the current SQL statement. */ -static inline -void -innobase_register_trx_and_stmt( -/*===========================*/ - handlerton *hton, /*!< in: Innobase handlerton */ - THD* thd) /*!< in: MySQL thd (connection) object */ -{ - /* NOTE that actually innobase_register_stmt() registers also - the transaction in the AUTOCOMMIT=1 mode. */ - - innobase_register_stmt(hton, thd); + if (!trx_is_registered_for_2pc(trx) + && thd_test_options(thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) { - if (thd_test_options(thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) { - - /* No autocommit mode, register for a transaction */ trans_register_ha(thd, TRUE, hton); } -} + trx_register_for_2pc(trx); +} + /* BACKGROUND INFO: HOW THE MYSQL QUERY CACHE WORKS WITH INNODB ------------------------------------------------------------ @@ -1792,14 +1845,8 @@ innobase_query_caching_of_table_permitte #ifdef __WIN__ innobase_casedn_str(norm_name); #endif - /* The call of row_search_.. will start a new transaction if it is - not yet started */ - if (trx->active_trans == 0) { - - innobase_register_trx_and_stmt(innodb_hton_ptr, thd); - trx->active_trans = 1; - } + innobase_register_trx(innodb_hton_ptr, thd, trx); if (row_search_check_if_query_cache_permitted(trx, norm_name)) { @@ -2066,14 +2113,7 @@ ha_innobase::init_table_handle_for_HANDL trx_assign_read_view(prebuilt->trx); - /* Set the MySQL flag to mark that there is an active transaction */ - - if (prebuilt->trx->active_trans == 0) { - - innobase_register_trx_and_stmt(ht, user_thd); - - prebuilt->trx->active_trans = 1; - } + innobase_register_trx(ht, user_thd, prebuilt->trx); /* We did the necessary inits in this function, no need to repeat them in row_search_for_mysql */ @@ -2573,12 +2613,10 @@ innobase_commit_low( /*================*/ trx_t* trx) /*!< in: transaction handle */ { - if (trx->conc_state == TRX_NOT_STARTED) { + if (trx_is_started(trx)) { - return; + trx_commit_for_mysql(trx); } - - trx_commit_for_mysql(trx); } /*****************************************************************//** @@ -2620,10 +2658,7 @@ innobase_start_trx_and_assign_read_view( /* Set the MySQL flag to mark that there is an active transaction */ - if (trx->active_trans == 0) { - innobase_register_trx_and_stmt(hton, thd); - trx->active_trans = 1; - } + innobase_register_trx(hton, current_thd, trx); DBUG_RETURN(0); } @@ -2657,29 +2692,19 @@ innobase_commit( trx_search_latch_release_if_reserved(trx); } - /* The flag trx->active_trans is set to 1 in - - 1. ::external_lock(), - 2. ::start_stmt(), - 3. innobase_query_caching_of_table_permitted(), - 4. innobase_savepoint(), - 5. ::init_table_handle_for_HANDLER(), - 6. innobase_start_trx_and_assign_read_view(), - 7. ::transactional_table_lock() - - and it is only set to 0 in a commit or a rollback. If it is 0 we know - there cannot be resources to be freed and we could return immediately. - For the time being, we play safe and do the cleanup though there should - be nothing to clean up. */ + /* Transaction is deregistered only in a commit or a rollback. If + it is deregistered we know there cannot be resources to be freed + and we could return immediately. For the time being, we play safe + and do the cleanup though there should be nothing to clean up. */ - if (trx->active_trans == 0 - && trx->conc_state != TRX_NOT_STARTED) { + if (!trx_is_registered_for_2pc(trx) && trx_is_started(trx)) { - sql_print_error("trx->active_trans == 0, but" - " trx->conc_state != TRX_NOT_STARTED"); + sql_print_error("Transaction not registered for MySQL 2PC, " + "but transaction is active"); } + if (all - || (!thd_test_options(thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN))) { + || (!thd_test_options(thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN))) { /* We were instructed to commit the whole transaction, or this is an SQL statement end and autocommit is on */ @@ -2734,15 +2759,15 @@ retry: mysql_mutex_unlock(&commit_cond_m); } - if (trx->active_trans == 2) { - + if (trx_has_prepare_commit_mutex(trx)) { + mysql_mutex_unlock(&prepare_commit_mutex); - } + } + + trx_deregister_from_2pc(trx); /* Now do a write + flush of logs. */ trx_commit_complete_for_mysql(trx); - trx->active_trans = 0; - } else { /* We just mark the SQL statement ended and do not do a transaction commit */ @@ -2811,10 +2836,10 @@ innobase_rollback( row_unlock_table_autoinc_for_mysql(trx); if (all - || !thd_test_options(thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) { + || !thd_test_options(thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) { error = trx_rollback_for_mysql(trx); - trx->active_trans = 0; + trx_deregister_from_2pc(trx); } else { error = trx_rollback_last_sql_stat_for_mysql(trx); } @@ -2957,8 +2982,8 @@ innobase_savepoint( innobase_release_stat_resources(trx); - /* cannot happen outside of transaction */ - DBUG_ASSERT(trx->active_trans); + /* Cannot happen outside of transaction */ + DBUG_ASSERT(trx_is_registered_for_2pc(trx)); /* TODO: use provided savepoint data area to store savepoint data */ char name[64]; @@ -2988,16 +3013,15 @@ innobase_close_connection( ut_a(trx); - if (trx->active_trans == 0 - && trx->conc_state != TRX_NOT_STARTED) { + if (!trx_is_registered_for_2pc(trx) && trx_is_started(trx)) { - sql_print_error("trx->active_trans == 0, but" - " trx->conc_state != TRX_NOT_STARTED"); + sql_print_error("Transaction not registered for MySQL 2PC, " + "but transaction is active"); } - if (trx->conc_state != TRX_NOT_STARTED && - global_system_variables.log_warnings) { + if (trx_is_started(trx) && global_system_variables.log_warnings) { + sql_print_warning( "MySQL is closing a connection that has an active " "InnoDB transaction. %llu row modifications will " @@ -4901,7 +4925,7 @@ no_commit: /* Altering to InnoDB format */ innobase_commit(ht, user_thd, 1); /* Note that this transaction is still active. */ - prebuilt->trx->active_trans = 1; + trx_register_for_2pc(prebuilt->trx); /* We will need an IX lock on the destination table. */ prebuilt->sql_stat_start = TRUE; } else { @@ -4917,7 +4941,7 @@ no_commit: locks, so they have to be acquired again. */ innobase_commit(ht, user_thd, 1); /* Note that this transaction is still active. */ - prebuilt->trx->active_trans = 1; + trx_register_for_2pc(prebuilt->trx); /* Re-acquire the table lock on the source table. */ row_lock_table_for_mysql(prebuilt, src_table, mode); /* We will need an IX lock on the destination table. */ @@ -8731,39 +8755,30 @@ ha_innobase::start_stmt( prepared for an update of a row */ prebuilt->select_lock_type = LOCK_X; - } else { - if (trx->isolation_level != TRX_ISO_SERIALIZABLE - && thd_sql_command(thd) == SQLCOM_SELECT - && lock_type == TL_READ) { - /* For other than temporary tables, we obtain - no lock for consistent read (plain SELECT). */ + } else if (trx->isolation_level != TRX_ISO_SERIALIZABLE + && thd_sql_command(thd) == SQLCOM_SELECT + && lock_type == TL_READ) { - prebuilt->select_lock_type = LOCK_NONE; - } else { - /* Not a consistent read: restore the - select_lock_type value. The value of - stored_select_lock_type was decided in: - 1) ::store_lock(), - 2) ::external_lock(), - 3) ::init_table_handle_for_HANDLER(), and - 4) ::transactional_table_lock(). */ + /* For other than temporary tables, we obtain + no lock for consistent read (plain SELECT). */ - prebuilt->select_lock_type = - prebuilt->stored_select_lock_type; - } - } + prebuilt->select_lock_type = LOCK_NONE; + } else { + /* Not a consistent read: restore the + select_lock_type value. The value of + stored_select_lock_type was decided in: + 1) ::store_lock(), + 2) ::external_lock(), + 3) ::init_table_handle_for_HANDLER(), and + 4) ::transactional_table_lock(). */ - trx->detailed_error[0] = '\0'; + prebuilt->select_lock_type = prebuilt->stored_select_lock_type; + } - /* Set the MySQL flag to mark that there is an active transaction */ - if (trx->active_trans == 0) { + *trx->detailed_error = 0; - innobase_register_trx_and_stmt(ht, thd); - trx->active_trans = 1; - } else { - innobase_register_stmt(ht, thd); - } + innobase_register_trx(ht, thd, trx); return(0); } @@ -8852,22 +8867,14 @@ ha_innobase::external_lock( if (lock_type != F_UNLCK) { /* MySQL is setting a new table lock */ - trx->detailed_error[0] = '\0'; + *trx->detailed_error = 0; - /* Set the MySQL flag to mark that there is an active - transaction */ - if (trx->active_trans == 0) { - - innobase_register_trx_and_stmt(ht, thd); - trx->active_trans = 1; - } else if (trx->n_mysql_tables_in_use == 0) { - innobase_register_stmt(ht, thd); - } + innobase_register_trx(ht, thd, trx); if (trx->isolation_level == TRX_ISO_SERIALIZABLE - && prebuilt->select_lock_type == LOCK_NONE - && thd_test_options(thd, - OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) { + && prebuilt->select_lock_type == LOCK_NONE + && thd_test_options( + thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) { /* To get serializable execution, we let InnoDB conceptually add 'LOCK IN SHARE MODE' to all SELECTs @@ -8937,19 +8944,20 @@ ha_innobase::external_lock( trx->mysql_n_tables_locked = 0; prebuilt->used_in_HANDLER = FALSE; - if (!thd_test_options(thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) { - if (trx->active_trans != 0) { + if (!thd_test_options( + thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) { + + if (trx_is_started(trx)) { innobase_commit(ht, thd, TRUE); } - } else { - if (trx->isolation_level <= TRX_ISO_READ_COMMITTED - && trx->global_read_view) { - /* At low transaction isolation levels we let - each consistent read set its own snapshot */ + } else if (trx->isolation_level <= TRX_ISO_READ_COMMITTED + && trx->global_read_view) { - read_view_close_for_mysql(trx); - } + /* At low transaction isolation levels we let + each consistent read set its own snapshot */ + + read_view_close_for_mysql(trx); } } @@ -9018,12 +9026,7 @@ ha_innobase::transactional_table_lock( /* MySQL is setting a new transactional table lock */ - /* Set the MySQL flag to mark that there is an active transaction */ - if (trx->active_trans == 0) { - - innobase_register_trx_and_stmt(ht, thd); - trx->active_trans = 1; - } + innobase_register_trx(ht, thd, trx); if (THDVAR(thd, table_locks) && thd_in_lock_tables(thd)) { ulint error = DB_SUCCESS; @@ -9036,7 +9039,8 @@ ha_innobase::transactional_table_lock( DBUG_RETURN((int) error); } - if (thd_test_options(thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) { + if (thd_test_options( + thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) { /* Store the current undo_no of the transaction so that we know where to roll back if we have @@ -10077,19 +10081,19 @@ innobase_xa_prepare( innobase_release_stat_resources(trx); - if (trx->active_trans == 0 && trx->conc_state != TRX_NOT_STARTED) { + if (!trx_is_registered_for_2pc(trx) && trx_is_started(trx)) { - sql_print_error("trx->active_trans == 0, but trx->conc_state != " - "TRX_NOT_STARTED"); + sql_print_error("Transaction not registered for MySQL 2PC, " + "but transaction is active"); } if (all - || (!thd_test_options(thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN))) { + || (!thd_test_options(thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN))) { /* We were instructed to prepare the whole transaction, or this is an SQL statement end and autocommit is on */ - ut_ad(trx->active_trans); + ut_ad(trx_is_registered_for_2pc(trx)); error = (int) trx_prepare_for_mysql(trx); } else { @@ -10113,9 +10117,10 @@ innobase_xa_prepare( srv_active_wake_master_thread(); - if (thd_sql_command(thd) != SQLCOM_XA_PREPARE && - (all || !thd_test_options(thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN))) - { + if (thd_sql_command(thd) != SQLCOM_XA_PREPARE + && (all + || !thd_test_options( + thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN))) { /* For ibbackup to work the order of transactions in binlog and InnoDB must be the same. Consider the situation @@ -10136,7 +10141,7 @@ innobase_xa_prepare( will be between XA PREPARE and XA COMMIT, and we don't want to block for undefined period of time. */ mysql_mutex_lock(&prepare_commit_mutex); - trx->active_trans = 2; + trx_owns_prepare_commit_mutex_set(trx); } return(error); @@ -10171,8 +10176,8 @@ static int innobase_commit_by_xid( /*===================*/ - handlerton *hton, - XID* xid) /*!< in: X/Open XA transaction identification */ + handlerton* hton, + XID* xid) /*!< in: X/Open XA transaction identification */ { trx_t* trx; === modified file 'storage/innobase/include/trx0trx.h' --- a/storage/innobase/include/trx0trx.h 2010-07-29 10:44:35 +0000 +++ b/storage/innobase/include/trx0trx.h 2010-10-21 13:57:33 +0000 @@ -470,6 +470,20 @@ struct trx_struct{ of view of concurrency control: TRX_ACTIVE, TRX_COMMITTED_IN_MEMORY, ... */ + /*------------------------------*/ + /* MySQL has a transaction coordinator to coordinate two phase + commit between multiple storage engines and the binary log. When + an engine participates in a transaction, it's responsible for + registering itself using the trans_register_ha() API. */ + unsigned is_registered:1;/* This flag is set to 1 after the + transaction has been registered with + the coordinator using the XA API, and + is set to 0 after commit or rollback. */ + unsigned owns_prepare_mutex:1;/* 1 if owns prepare mutex, if + this is set to 1 then registered should + also be set to 1. This is used in the + XA code */ + /*------------------------------*/ ulint isolation_level;/* TRX_ISO_REPEATABLE_READ, ... */ ulint check_foreigns; /* normally TRUE, but if the user wants to suppress foreign key checks, @@ -500,9 +514,6 @@ struct trx_struct{ in that case we must flush the log in trx_commit_complete_for_mysql() */ ulint duplicates; /*!< TRX_DUP_IGNORE | TRX_DUP_REPLACE */ - ulint active_trans; /*!< 1 - if a transaction in MySQL - is active. 2 - if prepare_commit_mutex - was taken */ ulint has_search_latch; /* TRUE if this trx has latched the search system latch in S-mode */ === modified file 'storage/innobase/trx/trx0trx.c' --- a/storage/innobase/trx/trx0trx.c 2010-10-19 08:25:09 +0000 +++ b/storage/innobase/trx/trx0trx.c 2010-10-21 13:57:33 +0000 @@ -106,7 +106,11 @@ trx_create( trx->is_purge = 0; trx->is_recovered = 0; trx->conc_state = TRX_NOT_STARTED; - trx->start_time = time(NULL); + + trx->is_registered = 0; + trx->owns_prepare_mutex = 0; + + trx->start_time = ut_time(); trx->isolation_level = TRX_ISO_REPEATABLE_READ; @@ -125,7 +129,6 @@ trx_create( trx->table_id = 0; trx->mysql_thd = NULL; - trx->active_trans = 0; trx->duplicates = 0; trx->n_mysql_tables_in_use = 0; No bundle (reason: useless for push emails).