summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Lindström <jplindst@mariadb.org>2013-11-25 14:04:49 +0200
committerJan Lindström <jplindst@mariadb.org>2013-11-25 14:04:49 +0200
commit4f85baab95f50448930a8c9915f7178aa121e66e (patch)
tree198e4126b168136140aa00aa8c3c5e3c25ec102b
parent0e248e62bdaf881f8b07b97e361d44ee30933bc1 (diff)
downloadmariadb-git-4f85baab95f50448930a8c9915f7178aa121e66e.tar.gz
Merged revisions 3931--3942 from from lp:~codership/codership-mysql/5.5-23.
------------------------------------------------------------ revno: 3942 committer: Seppo Jaakola <seppo.jaakola@codership.com> branch nick: wsrep-5.5-23 timestamp: Thu 2013-11-07 17:37:10 +0200 message: References: lp:1248921 - checking if index is foreign earlier to adhere to lat ch order protocol ------------------------------------------------------------ revno: 3941 fixes bug: https://launchpad.net/bugs/1248908 committer: Teemu Ollakka <teemu.ollakka@codership.com> branch nick: 5.5-23 timestamp: Thu 2013-11-07 14:31:04 +0200 message: References lp:1248908 - Fixed access to trx sys header Pass trx sys header as argument for trx_sys_update_wsrep_checkpoint() and trx_sys_update_mysql_binlog_offset() to avoid successive calls to trx_sysf_get(). ------------------------------------------------------------ revno: 3940 fixes bug: https://launchpad.net/bugs/1244100 committer: Teemu Ollakka <teemu.ollakka@codership.com> branch nick: 5.5-23 timestamp: Tue 2013-11-05 15:31:12 +0200 message: References lp:1244100 - assign value for check_purge before return ------------------------------------------------------------ revno: 3939 fixes bug: https://launchpad.net/bugs/1247978 committer: Teemu Ollakka <teemu.ollakka@codership.com> branch nick: 5.5-23 timestamp: Tue 2013-11-05 01:01:36 +0200 message: References lp:1247978 - force release transactional MDL locks if wsrep is on a nd no active transaction at the end of mysql_execute_command() ------------------------------------------------------------ revno: 3938 committer: Vladislav Klyachin <vladislav.klyachin@codership.com> branch nick: 5.5-23 timestamp: Sun 2013-11-03 20:48:06 +0400 message: References lp:1232789 - fix FLUSH STATUS zeroes up wsrep_cluster_size and wsre p_local_index ------------------------------------------------------------ revno: 3937 5kB/s - committer: Vladislav Klyachin <vladislav.klyachin@codership.com> branch nick: 5.5-23 timestamp: Sun 2013-11-03 17:06:31 +0400 message: References lp:587170 - reset auto_increment_* vars to defaults for TOI operati ons ------------------------------------------------------------ revno: 3936 committer: Vladislav Klyachin <vladislav.klyachin@codership.com> branch nick: 5.5-23 timestamp: Sun 2013-11-03 00:10:45 +0400 message: References lp:1072839 - fix for memory leaks with wsrep variables ------------------------------------------------------------ revno: 3935 committer: Seppo Jaakola <seppo.jaakola@codership.com> branch nick: wsrep-5.5-23 timestamp: Wed 2013-10-30 14:34:32 +0200 message: References: lp:1246257 - skipping replication for CREATE TEMPORARY TABLE LIKE. .. constructs ------------------------------------------------------------ revno: 3934 6kB/s \ fixes bug: https://launchpad.net/bugs/1241760 committer: Teemu Ollakka <teemu.ollakka@codership.com> branch nick: 5.5-23 timestamp: Mon 2013-10-28 11:01:53 +0200 message: References lp:1241760 - save thd->db to wsrep_thd_shadow before replay ------------------------------------------------------------ revno: 3933 fixes bug: https://launchpad.net/bugs/1206129 committer: Teemu Ollakka <teemu.ollakka@codership.com> branch nick: 5.5-23 timestamp: Sun 2013-10-27 18:15:12 +0200 message: References lp:1206129 - check binlog_hton->commit() return value, call wsrep_p ost_commit() instead of wsrep_cleanup_transaction() ------------------------------------------------------------ revno: 3932 fixes bug: https://launchpad.net/bugs/1244661 committer: Teemu Ollakka <teemu.ollakka@codership.com> branch nick: 5.5-23 timestamp: Sun 2013-10-27 13:14:02 +0200 message: References lp:1244661 - added wsrep_register_hton() to trans_rollback_implicit () ------------------------------------------------------------ revno: 3931 fixes bug: https://launchpad.net/bugs/1244667 committer: Teemu Ollakka <teemu.ollakka@codership.com> branch nick: 5.5-23 timestamp: Sun 2013-10-27 11:08:49 +0200 message: References lp:1244667 - restore thd->server_status after replay
-rw-r--r--sql/log.cc1
-rw-r--r--sql/mdl.h7
-rw-r--r--sql/mysqld.cc4
-rw-r--r--sql/sql_alter.cc21
-rw-r--r--sql/sql_class.h2
-rw-r--r--sql/sql_parse.cc26
-rw-r--r--sql/sql_table.cc13
-rw-r--r--sql/sys_vars.cc10
-rw-r--r--sql/transaction.cc1
-rw-r--r--storage/innobase/handler/ha_innodb.cc14
-rw-r--r--storage/innobase/include/trx0sys.h9
-rw-r--r--storage/innobase/row/row0upd.c43
-rw-r--r--storage/innobase/trx/trx0sys.c19
-rw-r--r--storage/innobase/trx/trx0trx.c12
-rw-r--r--storage/xtradb/handler/ha_innodb.cc14
-rw-r--r--storage/xtradb/include/trx0sys.h6
-rw-r--r--storage/xtradb/row/row0upd.c43
-rw-r--r--storage/xtradb/trx/trx0sys.c14
-rw-r--r--storage/xtradb/trx/trx0trx.c6
19 files changed, 198 insertions, 67 deletions
diff --git a/sql/log.cc b/sql/log.cc
index 0fb6cd18690..64174a9a454 100644
--- a/sql/log.cc
+++ b/sql/log.cc
@@ -5555,6 +5555,7 @@ int MYSQL_BIN_LOG::rotate(bool force_rotate, bool* check_purge)
#ifdef WITH_WSREP
if (WSREP_ON && wsrep_to_isolation)
{
+ *check_purge= false;
WSREP_DEBUG("avoiding binlog rotate due to TO isolation: %d",
wsrep_to_isolation);
DBUG_RETURN(0);
diff --git a/sql/mdl.h b/sql/mdl.h
index 50a2c2d815a..1363a07e7ab 100644
--- a/sql/mdl.h
+++ b/sql/mdl.h
@@ -666,6 +666,13 @@ public:
m_tickets[MDL_EXPLICIT].is_empty());
}
+#ifdef WITH_WSREP
+ inline bool has_transactional_locks() const
+ {
+ return !m_tickets[MDL_TRANSACTION].is_empty();
+ }
+#endif /* WITH_WSREP */
+
MDL_savepoint mdl_savepoint()
{
return MDL_savepoint(m_tickets[MDL_STATEMENT].front(),
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index 3b0009b5ca9..2bcd946c672 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -7924,8 +7924,8 @@ SHOW_VAR status_vars[]= {
{"wsrep_cluster_state_uuid", (char*) &wsrep_cluster_state_uuid,SHOW_CHAR_PTR},
{"wsrep_cluster_conf_id", (char*) &wsrep_cluster_conf_id, SHOW_LONGLONG},
{"wsrep_cluster_status", (char*) &wsrep_cluster_status, SHOW_CHAR_PTR},
- {"wsrep_cluster_size", (char*) &wsrep_cluster_size, SHOW_LONG},
- {"wsrep_local_index", (char*) &wsrep_local_index, SHOW_LONG},
+ {"wsrep_cluster_size", (char*) &wsrep_cluster_size, SHOW_LONG_NOFLUSH},
+ {"wsrep_local_index", (char*) &wsrep_local_index, SHOW_LONG_NOFLUSH},
{"wsrep_provider_name", (char*) &wsrep_provider_name, SHOW_CHAR_PTR},
{"wsrep_provider_version", (char*) &wsrep_provider_version, SHOW_CHAR_PTR},
{"wsrep_provider_vendor", (char*) &wsrep_provider_vendor, SHOW_CHAR_PTR},
diff --git a/sql/sql_alter.cc b/sql/sql_alter.cc
index 00691633aa8..75d27016317 100644
--- a/sql/sql_alter.cc
+++ b/sql/sql_alter.cc
@@ -102,15 +102,20 @@ bool Alter_table_statement::execute(THD *thd)
#ifdef WITH_WSREP
TABLE *find_temporary_table(THD *thd, const TABLE_LIST *tl);
- if ((!thd->is_current_stmt_binlog_format_row() ||
- !find_temporary_table(thd, first_table)) &&
- wsrep_to_isolation_begin(thd,
- lex->name.str ? select_lex->db : NULL,
- lex->name.str ? lex->name.str : NULL,
- first_table))
+ if (!thd->is_current_stmt_binlog_format_row() ||
+ !find_temporary_table(thd, first_table))
{
- WSREP_WARN("ALTER TABLE isolation failure");
- DBUG_RETURN(TRUE);
+ if (wsrep_to_isolation_begin(thd,
+ lex->name.str ? select_lex->db : NULL,
+ lex->name.str ? lex->name.str : NULL,
+ first_table))
+ {
+ WSREP_WARN("ALTER TABLE isolation failure");
+ DBUG_RETURN(TRUE);
+ }
+
+ thd->variables.auto_increment_offset = 1;
+ thd->variables.auto_increment_increment = 1;
}
#endif /* WITH_WSREP */
result= mysql_alter_table(thd, select_lex->db, lex->name.str,
diff --git a/sql/sql_class.h b/sql/sql_class.h
index 3d2442b7922..4a84c91c228 100644
--- a/sql/sql_class.h
+++ b/sql/sql_class.h
@@ -52,6 +52,8 @@ struct wsrep_thd_shadow {
enum wsrep_exec_mode wsrep_exec_mode;
Vio *vio;
ulong tx_isolation;
+ char *db;
+ size_t db_length;
};
#endif
class Reprepare_observer;
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index 156acd9c2f7..df1493c8cb1 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -2906,6 +2906,9 @@ case SQLCOM_PREPARE:
else
{
#ifdef WITH_WSREP
+ /* in STATEMENT format, we probably have to replicate also temporary
+ tables, like mysql replication does
+ */
if (!thd->is_current_stmt_binlog_format_row() ||
!(create_info.options & HA_LEX_CREATE_TMP_TABLE))
WSREP_TO_ISOLATION_BEGIN(create_table->db, create_table->table_name,
@@ -4985,7 +4988,22 @@ finish:
{
thd->mdl_context.release_statement_locks();
}
- WSREP_TO_ISOLATION_END
+ WSREP_TO_ISOLATION_END;
+
+#ifdef WITH_WSREP
+ /*
+ Force release of transactional locks if not in active MST and wsrep is on.
+ */
+ if (WSREP(thd) &&
+ ! thd->in_sub_stmt &&
+ ! thd->in_active_multi_stmt_transaction() &&
+ thd->mdl_context.has_transactional_locks())
+ {
+ WSREP_DEBUG("Forcing release of transactional locks for thd %lu",
+ thd->thread_id);
+ thd->mdl_context.release_transactional_locks();
+ }
+#endif /* WITH_WSREP */
DBUG_RETURN(res || thd->is_error());
}
@@ -8423,6 +8441,10 @@ void wsrep_prepare_bf_thd(THD *thd, struct wsrep_thd_shadow* shadow)
shadow->tx_isolation = thd->variables.tx_isolation;
thd->variables.tx_isolation = ISO_READ_COMMITTED;
thd->tx_isolation = ISO_READ_COMMITTED;
+
+ shadow->db = thd->db;
+ shadow->db_length = thd->db_length;
+ thd->reset_db(NULL, 0);
}
void wsrep_return_from_bf_mode(THD *thd, struct wsrep_thd_shadow* shadow)
@@ -8431,6 +8453,8 @@ void wsrep_return_from_bf_mode(THD *thd, struct wsrep_thd_shadow* shadow)
thd->wsrep_exec_mode = shadow->wsrep_exec_mode;
thd->net.vio = shadow->vio;
thd->variables.tx_isolation = shadow->tx_isolation;
+
+ thd->reset_db(shadow->db, shadow->db_length);
}
void wsrep_replication_process(THD *thd)
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index 06c5b51a438..bd1b4c600fc 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -4778,12 +4778,23 @@ bool mysql_create_like_table(THD* thd, TABLE_LIST* table, TABLE_LIST* src_table,
break;
}
}
- if (!is_tmp_table)
+ if (create_info->options & HA_LEX_CREATE_TMP_TABLE)
+ {
+ /* CREATE TEMPORARY TABLE LIKE must be skipped from replication */
+ WSREP_DEBUG("CREATE TEMPORARY TABLE LIKE... skipped replication\n %s",
+ thd->query());
+ }
+ else if (!is_tmp_table)
{
+ /* this is straight CREATE TABLE LIKE... eith no tmp tables */
WSREP_TO_ISOLATION_BEGIN(table->db, table->table_name, NULL);
}
else
{
+ /* here we have CREATE TABLE LIKE <temporary table>
+ the temporary table definition will be needed in slaves to
+ enable the create to succeed
+ */
TABLE_LIST tbl;
bzero((void*) &tbl, sizeof(tbl));
tbl.db= src_table->db;
diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc
index 5b4cc4ddb64..88dee072b89 100644
--- a/sql/sys_vars.cc
+++ b/sql/sys_vars.cc
@@ -3645,7 +3645,7 @@ static Sys_var_charptr Sys_wsrep_data_home_dir(
static Sys_var_charptr Sys_wsrep_cluster_name(
"wsrep_cluster_name", "Name for the cluster",
- GLOBAL_VAR(wsrep_cluster_name), CMD_LINE(REQUIRED_ARG),
+ PREALLOCATED GLOBAL_VAR(wsrep_cluster_name), CMD_LINE(REQUIRED_ARG),
IN_FS_CHARSET, DEFAULT(wsrep_cluster_name),
NO_MUTEX_GUARD, NOT_IN_BINLOG,
ON_CHECK(wsrep_cluster_name_check),
@@ -3663,13 +3663,13 @@ static Sys_var_charptr Sys_wsrep_cluster_address (
static Sys_var_charptr Sys_wsrep_node_name (
"wsrep_node_name", "Node name",
- GLOBAL_VAR(wsrep_node_name), CMD_LINE(REQUIRED_ARG),
+ PREALLOCATED GLOBAL_VAR(wsrep_node_name), CMD_LINE(REQUIRED_ARG),
IN_FS_CHARSET, DEFAULT(wsrep_node_name),
NO_MUTEX_GUARD, NOT_IN_BINLOG);
static Sys_var_charptr Sys_wsrep_node_address (
"wsrep_node_address", "Node address",
- GLOBAL_VAR(wsrep_node_address), CMD_LINE(REQUIRED_ARG),
+ PREALLOCATED GLOBAL_VAR(wsrep_node_address), CMD_LINE(REQUIRED_ARG),
IN_FS_CHARSET, DEFAULT(wsrep_node_address),
NO_MUTEX_GUARD, NOT_IN_BINLOG,
ON_CHECK(wsrep_node_address_check),
@@ -3677,7 +3677,7 @@ static Sys_var_charptr Sys_wsrep_node_address (
static Sys_var_charptr Sys_wsrep_node_incoming_address(
"wsrep_node_incoming_address", "Client connection address",
- GLOBAL_VAR(wsrep_node_incoming_address),CMD_LINE(REQUIRED_ARG),
+ PREALLOCATED GLOBAL_VAR(wsrep_node_incoming_address),CMD_LINE(REQUIRED_ARG),
IN_FS_CHARSET, DEFAULT(wsrep_node_incoming_address),
NO_MUTEX_GUARD, NOT_IN_BINLOG);
@@ -3769,7 +3769,7 @@ static Sys_var_mybool Sys_wsrep_on (
static Sys_var_charptr Sys_wsrep_start_position (
"wsrep_start_position", "global transaction position to start from ",
- GLOBAL_VAR(wsrep_start_position),
+ PREALLOCATED GLOBAL_VAR(wsrep_start_position),
CMD_LINE(REQUIRED_ARG, OPT_WSREP_START_POSITION),
IN_FS_CHARSET, DEFAULT(wsrep_start_position),
NO_MUTEX_GUARD, NOT_IN_BINLOG,
diff --git a/sql/transaction.cc b/sql/transaction.cc
index 7976adf38a5..2d1c94e6b52 100644
--- a/sql/transaction.cc
+++ b/sql/transaction.cc
@@ -298,7 +298,6 @@ bool trans_rollback(THD *thd)
DBUG_RETURN(test(res));
}
-
/**
Commit the single statement transaction.
diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc
index b291f0957b8..8e9b7827779 100644
--- a/storage/innobase/handler/ha_innodb.cc
+++ b/storage/innobase/handler/ha_innodb.cc
@@ -5688,9 +5688,9 @@ no_commit:
DBUG_RETURN(1);
}
- binlog_hton->commit(binlog_hton, user_thd, 1);
-
- wsrep_cleanup_transaction(user_thd);
+ if (binlog_hton->commit(binlog_hton, user_thd, 1))
+ DBUG_RETURN(1);
+ wsrep_post_commit(user_thd, TRUE);
#endif /* WITH_WSREP */
/* Source table is not in InnoDB format:
no need to re-acquire locks on it. */
@@ -5711,8 +5711,9 @@ no_commit:
case WSREP_TRX_ERROR:
DBUG_RETURN(1);
}
- binlog_hton->commit(binlog_hton, user_thd, 1);
- wsrep_cleanup_transaction(user_thd);
+ if (binlog_hton->commit(binlog_hton, user_thd, 1))
+ DBUG_RETURN(1);
+ wsrep_post_commit(user_thd, TRUE);
#endif /* WITH_WSREP */
/* Ensure that there are no other table locks than
LOCK_IX and LOCK_AUTO_INC on the destination table. */
@@ -12748,7 +12749,8 @@ static int innobase_wsrep_set_checkpoint(handlerton* hton, const XID* xid)
if (wsrep_is_wsrep_xid(xid)) {
mtr_t mtr;
mtr_start(&mtr);
- trx_sys_update_wsrep_checkpoint(xid, &mtr);
+ trx_sysf_t* sys_header = trx_sysf_get(&mtr);
+ trx_sys_update_wsrep_checkpoint(xid, sys_header, &mtr);
mtr_commit(&mtr);
return 0;
} else {
diff --git a/storage/innobase/include/trx0sys.h b/storage/innobase/include/trx0sys.h
index 21e4f961b7c..b8f1973d9c5 100644
--- a/storage/innobase/include/trx0sys.h
+++ b/storage/innobase/include/trx0sys.h
@@ -309,6 +309,9 @@ trx_sys_update_mysql_binlog_offset(
ib_int64_t offset, /*!< in: position in that log file */
ulint field, /*!< in: offset of the MySQL log info field in
the trx sys header */
+#ifdef WITH_WSREP
+ trx_sysf_t* sys_header, /*!< in: trx sys header */
+#endif /* WITH_WSREP */
mtr_t* mtr); /*!< in: mtr */
/*****************************************************************//**
Prints to stderr the MySQL binlog offset info in the trx system header if
@@ -321,8 +324,10 @@ trx_sys_print_mysql_binlog_offset(void);
/** Update WSREP checkpoint XID in sys header. */
void
trx_sys_update_wsrep_checkpoint(
- const XID* xid, /*!< in: WSREP XID */
- mtr_t* mtr); /*!< in: mtr */
+ const XID* xid, /*!< in: WSREP XID */
+ trx_sysf_t* sys_header, /*!< in: sys_header */
+ mtr_t* mtr); /*!< in: mtr */
+
void
/** Read WSREP checkpoint XID from sys header. */
trx_sys_read_wsrep_checkpoint(
diff --git a/storage/innobase/row/row0upd.c b/storage/innobase/row/row0upd.c
index 856947b62c4..186be33d2bd 100644
--- a/storage/innobase/row/row0upd.c
+++ b/storage/innobase/row/row0upd.c
@@ -1727,10 +1727,16 @@ row_upd_sec_index_entry(
trx_t* trx = thr_get_trx(thr);
ulint mode = BTR_MODIFY_LEAF;
enum row_search_result search_result;
+#ifdef WITH_WSREP
+ ibool foreign;
+#endif /* WITH_WSREP */
index = node->index;
referenced = row_upd_index_is_referenced(index, trx);
+#ifdef WITH_WSREP
+ foreign = wsrep_row_upd_index_is_foreign(index, trx);
+#endif /* WITH_WSREP */
heap = mem_heap_create(1024);
@@ -1814,15 +1820,16 @@ row_upd_sec_index_entry(
index, offsets, thr, &mtr);
}
#ifdef WITH_WSREP
- if (err == DB_SUCCESS && !referenced &&
- !(parent && que_node_get_type(parent) == QUE_NODE_UPDATE &&
- ((upd_node_t*)parent)->cascade_node == node) &&
- wsrep_row_upd_index_is_foreign(index, trx)
+ if (err == DB_SUCCESS && !referenced &&
+ !(parent && que_node_get_type(parent) ==
+ QUE_NODE_UPDATE &&
+ ((upd_node_t*)parent)->cascade_node == node) &&
+ foreign
) {
ulint* offsets =
rec_get_offsets(
- rec, index, NULL, ULINT_UNDEFINED,
- &heap);
+ rec, index, NULL,
+ ULINT_UNDEFINED, &heap);
err = wsrep_row_upd_check_foreign_constraints(
node, &pcur, index->table,
index, offsets, thr, &mtr);
@@ -1996,6 +2003,9 @@ row_upd_clust_rec_by_insert(
que_thr_t* thr, /*!< in: query thread */
ibool referenced,/*!< in: TRUE if index may be referenced in
a foreign key constraint */
+#ifdef WITH_WSREP
+ ibool foreign, /*!< in: TRUE if index is foreign key index */
+#endif /* WITH_WSREP */
mtr_t* mtr) /*!< in/out: mtr; gets committed here */
{
mem_heap_t* heap;
@@ -2092,7 +2102,7 @@ err_exit:
if (!referenced &&
!(parent && que_node_get_type(parent) == QUE_NODE_UPDATE &&
((upd_node_t*)parent)->cascade_node == node) &&
- wsrep_row_upd_index_is_foreign(index, trx)
+ foreign
) {
err = wsrep_row_upd_check_foreign_constraints(
node, pcur, table, index, offsets, thr, mtr);
@@ -2313,6 +2323,9 @@ row_upd_del_mark_clust_rec(
ibool referenced,
/*!< in: TRUE if index may be referenced in
a foreign key constraint */
+#ifdef WITH_WSREP
+ ibool foreign,/*!< in: TRUE if index is foreign key index */
+#endif /* WITH_WSREP */
mtr_t* mtr) /*!< in: mtr; gets committed here */
{
btr_pcur_t* pcur;
@@ -2360,7 +2373,7 @@ row_upd_del_mark_clust_rec(
!(parent && que_node_get_type(parent) == QUE_NODE_UPDATE &&
((upd_node_t*)parent)->cascade_node == node) &&
thr_get_trx(thr) &&
- wsrep_row_upd_index_is_foreign(index, thr_get_trx(thr))
+ foreign
) {
err = wsrep_row_upd_check_foreign_constraints(
node, pcur, index->table, index, offsets, thr, mtr);
@@ -2409,11 +2422,17 @@ row_upd_clust_step(
ulint offsets_[REC_OFFS_NORMAL_SIZE];
ulint* offsets;
ibool referenced;
+#ifdef WITH_WSREP
+ ibool foreign;
+#endif /* WITH_WSREP */
rec_offs_init(offsets_);
index = dict_table_get_first_index(node->table);
referenced = row_upd_index_is_referenced(index, thr_get_trx(thr));
+#ifdef WITH_WSREP
+ foreign = wsrep_row_upd_index_is_foreign(index, thr_get_trx(thr));
+#endif /* WITH_WSREP */
pcur = node->pcur;
@@ -2483,7 +2502,11 @@ row_upd_clust_step(
if (node->is_delete) {
err = row_upd_del_mark_clust_rec(
+#ifdef WITH_WSREP
+ node, index, offsets, thr, referenced, foreign, mtr);
+#else
node, index, offsets, thr, referenced, mtr);
+#endif /* WITH_WSREP */
if (err == DB_SUCCESS) {
node->state = UPD_NODE_UPDATE_ALL_SEC;
@@ -2534,7 +2557,11 @@ exit_func:
externally! */
err = row_upd_clust_rec_by_insert(
+#ifdef WITH_WSREP
+ node, index, thr, referenced, foreign, mtr);
+#else
node, index, thr, referenced, mtr);
+#endif /* WITH_WSREP */
if (err != DB_SUCCESS) {
diff --git a/storage/innobase/trx/trx0sys.c b/storage/innobase/trx/trx0sys.c
index 7ea746ff7eb..a0fcc2b2370 100644
--- a/storage/innobase/trx/trx0sys.c
+++ b/storage/innobase/trx/trx0sys.c
@@ -695,10 +695,14 @@ trx_sys_update_mysql_binlog_offset(
ib_int64_t offset, /*!< in: position in that log file */
ulint field, /*!< in: offset of the MySQL log info field in
the trx sys header */
+#ifdef WITH_WSREP
+ trx_sysf_t* sys_header, /*!< in: trx sys header */
+#endif /* WITH_WSREP */
mtr_t* mtr) /*!< in: mtr */
{
+#ifndef WITH_WSREP
trx_sysf_t* sys_header;
-
+#endif /* !WITH_WSREP */
if (ut_strlen(file_name) >= TRX_SYS_MYSQL_LOG_NAME_LEN) {
/* We cannot fit the name to the 512 bytes we have reserved */
@@ -706,7 +710,9 @@ trx_sys_update_mysql_binlog_offset(
return;
}
+#ifndef WITH_WSREP
sys_header = trx_sysf_get(mtr);
+#endif /* !WITH_WSREP */
if (mach_read_from_4(sys_header + field
+ TRX_SYS_MYSQL_LOG_MAGIC_N_FLD)
@@ -815,10 +821,10 @@ void read_wsrep_xid_uuid(const XID* xid, unsigned char* buf)
void
trx_sys_update_wsrep_checkpoint(
- const XID* xid, /*!< in: transaction XID */
- mtr_t* mtr) /*!< in: mtr */
+ const XID* xid, /*!< in: transaction XID */
+ trx_sysf_t* sys_header, /*!< in: sys_header */
+ mtr_t* mtr) /*!< in: mtr */
{
- trx_sysf_t* sys_header;
#ifdef UNIV_DEBUG
{
@@ -839,10 +845,9 @@ trx_sys_update_wsrep_checkpoint(
}
#endif /* UNIV_DEBUG */
- ut_ad(xid && mtr);
+ ut_ad(xid && mtr && sys_header);
ut_a(xid->formatID == -1 || wsrep_is_wsrep_xid(xid));
- sys_header = trx_sysf_get(mtr);
if (mach_read_from_4(sys_header + TRX_SYS_WSREP_XID_INFO
+ TRX_SYS_WSREP_XID_MAGIC_N_FLD)
!= TRX_SYS_WSREP_XID_MAGIC_N) {
@@ -890,7 +895,7 @@ trx_sys_read_wsrep_checkpoint(XID* xid)
!= TRX_SYS_WSREP_XID_MAGIC_N) {
memset(xid, 0, sizeof(*xid));
xid->formatID = -1;
- trx_sys_update_wsrep_checkpoint(xid, &mtr);
+ trx_sys_update_wsrep_checkpoint(xid, sys_header, &mtr);
mtr_commit(&mtr);
return;
}
diff --git a/storage/innobase/trx/trx0trx.c b/storage/innobase/trx/trx0trx.c
index d7fea8f4091..ce43c80e826 100644
--- a/storage/innobase/trx/trx0trx.c
+++ b/storage/innobase/trx/trx0trx.c
@@ -826,6 +826,9 @@ trx_write_serialisation_history(
/*============================*/
trx_t* trx) /*!< in: transaction */
{
+#ifdef WITH_WSREP
+ trx_sysf_t* sys_header;
+#endif /* WITH_WSREP */
mtr_t mtr;
trx_rseg_t* rseg;
@@ -876,10 +879,11 @@ trx_write_serialisation_history(
mutex_exit(&rseg->mutex);
#ifdef WITH_WSREP
+ sys_header = trx_sysf_get(&mtr);
/* Update latest MySQL wsrep XID in trx sys header. */
if (wsrep_is_wsrep_xid(&trx->xid))
{
- trx_sys_update_wsrep_checkpoint(&trx->xid, &mtr);
+ trx_sys_update_wsrep_checkpoint(&trx->xid, sys_header, &mtr);
}
#endif /* WITH_WSREP */
@@ -893,7 +897,11 @@ trx_write_serialisation_history(
trx_sys_update_mysql_binlog_offset(
trx->mysql_log_file_name,
trx->mysql_log_offset,
- TRX_SYS_MYSQL_LOG_INFO, &mtr);
+ TRX_SYS_MYSQL_LOG_INFO,
+#ifdef WITH_WSREP
+ sys_header,
+#endif /* WITH_WSREP */
+ &mtr);
trx->mysql_log_file_name = NULL;
}
diff --git a/storage/xtradb/handler/ha_innodb.cc b/storage/xtradb/handler/ha_innodb.cc
index 617c29a6536..8c56cd2a189 100644
--- a/storage/xtradb/handler/ha_innodb.cc
+++ b/storage/xtradb/handler/ha_innodb.cc
@@ -6643,9 +6643,9 @@ no_commit:
DBUG_RETURN(1);
}
- binlog_hton->commit(binlog_hton, user_thd, 1);
-
- wsrep_cleanup_transaction(user_thd);
+ if (binlog_hton->commit(binlog_hton, user_thd, 1))
+ DBUG_RETURN(1);
+ wsrep_post_commit(user_thd, TRUE);
#endif /* WITH_WSREP */
/* Source table is not in InnoDB format:
no need to re-acquire locks on it. */
@@ -6666,8 +6666,9 @@ no_commit:
case WSREP_TRX_ERROR:
DBUG_RETURN(1);
}
- binlog_hton->commit(binlog_hton, user_thd, 1);
- wsrep_cleanup_transaction(user_thd);
+ if (binlog_hton->commit(binlog_hton, user_thd, 1))
+ DBUG_RETURN(1);
+ wsrep_post_commit(user_thd, TRUE);
#endif /* WITH_WSREP */
/* Ensure that there are no other table locks than
LOCK_IX and LOCK_AUTO_INC on the destination table. */
@@ -14005,7 +14006,8 @@ static int innobase_wsrep_set_checkpoint(handlerton* hton, const XID* xid)
if (wsrep_is_wsrep_xid(xid)) {
mtr_t mtr;
mtr_start(&mtr);
- trx_sys_update_wsrep_checkpoint(xid, &mtr);
+ trx_sysf_t* sys_header = trx_sysf_get(&mtr);
+ trx_sys_update_wsrep_checkpoint(xid, sys_header, &mtr);
mtr_commit(&mtr);
return 0;
} else {
diff --git a/storage/xtradb/include/trx0sys.h b/storage/xtradb/include/trx0sys.h
index fbc828f9d63..69457a4c9b1 100644
--- a/storage/xtradb/include/trx0sys.h
+++ b/storage/xtradb/include/trx0sys.h
@@ -359,8 +359,10 @@ trx_sys_print_mysql_binlog_offset(void);
/** Update WSREP checkpoint XID in sys header. */
void
trx_sys_update_wsrep_checkpoint(
- const XID* xid, /*!< in: WSREP XID */
- mtr_t* mtr); /*!< in: mtr */
+ const XID* xid, /*!< in: WSREP XID */
+ trx_sysf_t* sys_header, /*!< in: sys_header */
+ mtr_t* mtr); /*!< in: mtr */
+
void
/** Read WSREP checkpoint XID from sys header. */
trx_sys_read_wsrep_checkpoint(
diff --git a/storage/xtradb/row/row0upd.c b/storage/xtradb/row/row0upd.c
index 445a580e1e8..06c12f8eb2d 100644
--- a/storage/xtradb/row/row0upd.c
+++ b/storage/xtradb/row/row0upd.c
@@ -1745,10 +1745,16 @@ row_upd_sec_index_entry(
trx_t* trx = thr_get_trx(thr);
ulint mode = BTR_MODIFY_LEAF;
enum row_search_result search_result;
+#ifdef WITH_WSREP
+ ibool foreign;
+#endif /* WITH_WSREP */
index = node->index;
referenced = row_upd_index_is_referenced(index, trx);
+#ifdef WITH_WSREP
+ foreign = wsrep_row_upd_index_is_foreign(index, trx);
+#endif /* WITH_WSREP */
heap = mem_heap_create(1024);
@@ -1833,15 +1839,16 @@ row_upd_sec_index_entry(
index, offsets, thr, &mtr);
}
#ifdef WITH_WSREP
- if (err == DB_SUCCESS && !referenced &&
- !(parent && que_node_get_type(parent) == QUE_NODE_UPDATE &&
- ((upd_node_t*)parent)->cascade_node == node) &&
- wsrep_row_upd_index_is_foreign(index, trx)
+ if (err == DB_SUCCESS && !referenced &&
+ !(parent && que_node_get_type(parent) ==
+ QUE_NODE_UPDATE &&
+ ((upd_node_t*)parent)->cascade_node == node) &&
+ foreign
) {
ulint* offsets =
rec_get_offsets(
- rec, index, NULL, ULINT_UNDEFINED,
- &heap);
+ rec, index, NULL,
+ ULINT_UNDEFINED, &heap);
err = wsrep_row_upd_check_foreign_constraints(
node, &pcur, index->table,
index, offsets, thr, &mtr);
@@ -2015,6 +2022,9 @@ row_upd_clust_rec_by_insert(
que_thr_t* thr, /*!< in: query thread */
ibool referenced,/*!< in: TRUE if index may be referenced in
a foreign key constraint */
+#ifdef WITH_WSREP
+ ibool foreign, /*!< in: TRUE if index is foreign key index */
+#endif /* WITH_WSREP */
mtr_t* mtr) /*!< in/out: mtr; gets committed here */
{
mem_heap_t* heap;
@@ -2113,7 +2123,7 @@ err_exit:
if (!referenced &&
!(parent && que_node_get_type(parent) == QUE_NODE_UPDATE &&
((upd_node_t*)parent)->cascade_node == node) &&
- wsrep_row_upd_index_is_foreign(index, trx)
+ foreign
) {
err = wsrep_row_upd_check_foreign_constraints(
node, pcur, table, index, offsets, thr, mtr);
@@ -2339,6 +2349,9 @@ row_upd_del_mark_clust_rec(
ibool referenced,
/*!< in: TRUE if index may be referenced in
a foreign key constraint */
+#ifdef WITH_WSREP
+ ibool foreign,/*!< in: TRUE if index is foreign key index */
+#endif /* WITH_WSREP */
mtr_t* mtr) /*!< in: mtr; gets committed here */
{
btr_pcur_t* pcur;
@@ -2386,7 +2399,7 @@ row_upd_del_mark_clust_rec(
!(parent && que_node_get_type(parent) == QUE_NODE_UPDATE &&
((upd_node_t*)parent)->cascade_node == node) &&
thr_get_trx(thr) &&
- wsrep_row_upd_index_is_foreign(index, thr_get_trx(thr))
+ foreign
) {
err = wsrep_row_upd_check_foreign_constraints(
node, pcur, index->table, index, offsets, thr, mtr);
@@ -2435,11 +2448,17 @@ row_upd_clust_step(
ulint offsets_[REC_OFFS_NORMAL_SIZE];
ulint* offsets;
ibool referenced;
+#ifdef WITH_WSREP
+ ibool foreign;
+#endif /* WITH_WSREP */
rec_offs_init(offsets_);
index = dict_table_get_first_index(node->table);
referenced = row_upd_index_is_referenced(index, thr_get_trx(thr));
+#ifdef WITH_WSREP
+ foreign = wsrep_row_upd_index_is_foreign(index, thr_get_trx(thr));
+#endif /* WITH_WSREP */
pcur = node->pcur;
@@ -2510,7 +2529,11 @@ row_upd_clust_step(
if (node->is_delete) {
err = row_upd_del_mark_clust_rec(
+#ifdef WITH_WSREP
+ node, index, offsets, thr, referenced, foreign, mtr);
+#else
node, index, offsets, thr, referenced, mtr);
+#endif /* WITH_WSREP */
if (err == DB_SUCCESS) {
node->state = UPD_NODE_UPDATE_ALL_SEC;
@@ -2561,7 +2584,11 @@ exit_func:
externally! */
err = row_upd_clust_rec_by_insert(
+#ifdef WITH_WSREP
+ node, index, thr, referenced, foreign, mtr);
+#else
node, index, thr, referenced, mtr);
+#endif /* WITH_WSREP */
if (err != DB_SUCCESS) {
diff --git a/storage/xtradb/trx/trx0sys.c b/storage/xtradb/trx/trx0sys.c
index f75a81c731b..0730907bbe1 100644
--- a/storage/xtradb/trx/trx0sys.c
+++ b/storage/xtradb/trx/trx0sys.c
@@ -868,6 +868,9 @@ trx_sys_update_mysql_binlog_offset(
mtr_t* mtr) /*!< in: mtr */
{
const char* file_name;
+#ifndef WITH_WSREP
+ trx_sysf_t* sys_header;
+#endif /* !WITH_WSREP */
if (ut_strlen(file_name_in) >= TRX_SYS_MYSQL_MASTER_LOG_NAME_LEN) {
@@ -986,10 +989,10 @@ void read_wsrep_xid_uuid(const XID* xid, unsigned char* buf)
void
trx_sys_update_wsrep_checkpoint(
- const XID* xid, /*!< in: transaction XID */
- mtr_t* mtr) /*!< in: mtr */
+ const XID* xid, /*!< in: transaction XID */
+ trx_sysf_t* sys_header, /*!< in: sys_header */
+ mtr_t* mtr) /*!< in: mtr */
{
- trx_sysf_t* sys_header;
#ifdef UNIV_DEBUG
{
@@ -1010,10 +1013,9 @@ trx_sys_update_wsrep_checkpoint(
}
#endif /* UNIV_DEBUG */
- ut_ad(xid && mtr);
+ ut_ad(xid && mtr && sys_header);
ut_a(xid->formatID == -1 || wsrep_is_wsrep_xid(xid));
- sys_header = trx_sysf_get(mtr);
if (mach_read_from_4(sys_header + TRX_SYS_WSREP_XID_INFO
+ TRX_SYS_WSREP_XID_MAGIC_N_FLD)
!= TRX_SYS_WSREP_XID_MAGIC_N) {
@@ -1061,7 +1063,7 @@ trx_sys_read_wsrep_checkpoint(XID* xid)
!= TRX_SYS_WSREP_XID_MAGIC_N) {
memset(xid, 0, sizeof(*xid));
xid->formatID = -1;
- trx_sys_update_wsrep_checkpoint(xid, &mtr);
+ trx_sys_update_wsrep_checkpoint(xid, sys_header, &mtr);
mtr_commit(&mtr);
return;
}
diff --git a/storage/xtradb/trx/trx0trx.c b/storage/xtradb/trx/trx0trx.c
index fe806f880b0..f1809188c00 100644
--- a/storage/xtradb/trx/trx0trx.c
+++ b/storage/xtradb/trx/trx0trx.c
@@ -1064,10 +1064,11 @@ trx_write_serialisation_history(
mutex_exit(&rseg->mutex);
#ifdef WITH_WSREP
+ sys_header = trx_sysf_get(&mtr);
/* Update latest MySQL wsrep XID in trx sys header. */
if (wsrep_is_wsrep_xid(&trx->xid))
{
- trx_sys_update_wsrep_checkpoint(&trx->xid, &mtr);
+ trx_sys_update_wsrep_checkpoint(&trx->xid, sys_header, &mtr);
}
#endif /* WITH_WSREP */
@@ -1085,7 +1086,8 @@ trx_write_serialisation_history(
sys_header,
trx->mysql_log_file_name,
trx->mysql_log_offset,
- TRX_SYS_MYSQL_LOG_INFO, &mtr);
+ TRX_SYS_MYSQL_LOG_INFO,
+ &mtr);
trx->mysql_log_file_name = NULL;
}