diff options
-rw-r--r-- | mysql-test/suite/galera/r/galera_defaults.result | 2 | ||||
-rw-r--r-- | mysql-test/suite/galera/r/galera_var_max_ws_rows.result | 22 | ||||
-rw-r--r-- | mysql-test/suite/galera/t/galera_var_max_ws_rows.test | 37 | ||||
-rw-r--r-- | sql/handler.cc | 6 | ||||
-rw-r--r-- | sql/wsrep_hton.cc | 1 |
5 files changed, 64 insertions, 4 deletions
diff --git a/mysql-test/suite/galera/r/galera_defaults.result b/mysql-test/suite/galera/r/galera_defaults.result index e15301c019e..6442cfebcb0 100644 --- a/mysql-test/suite/galera/r/galera_defaults.result +++ b/mysql-test/suite/galera/r/galera_defaults.result @@ -29,7 +29,7 @@ WSREP_DRUPAL_282555_WORKAROUND OFF WSREP_FORCED_BINLOG_FORMAT NONE WSREP_LOAD_DATA_SPLITTING ON WSREP_LOG_CONFLICTS OFF -WSREP_MAX_WS_ROWS 131072 +WSREP_MAX_WS_ROWS 0 WSREP_MAX_WS_SIZE 1073741824 WSREP_MYSQL_REPLICATION_BUNDLE 0 WSREP_NOTIFY_CMD diff --git a/mysql-test/suite/galera/r/galera_var_max_ws_rows.result b/mysql-test/suite/galera/r/galera_var_max_ws_rows.result index e41f0f96c95..6e239c70a3e 100644 --- a/mysql-test/suite/galera/r/galera_var_max_ws_rows.result +++ b/mysql-test/suite/galera/r/galera_var_max_ws_rows.result @@ -89,5 +89,27 @@ DELETE FROM t1 WHERE f2 = 2; SELECT COUNT(*) = 0 FROM t1; COUNT(*) = 0 1 +SET AUTOCOMMIT = ON; +SET GLOBAL wsrep_max_ws_rows = 1; +START TRANSACTION; +INSERT INTO t1 (f2) VALUES (1); +INSERT INTO t1 (f2) VALUES (2); +ERROR HY000: wsrep_max_ws_rows exceeded +INSERT INTO t1 (f2) VALUES (1); +INSERT INTO t1 (f2) VALUES (2); +SET AUTOCOMMIT = OFF; +START TRANSACTION; +INSERT INTO t1 (f2) VALUES (1); +INSERT INTO t1 (f2) VALUES (2); +ERROR HY000: wsrep_max_ws_rows exceeded +INSERT INTO t1 (f2) VALUES (1); +INSERT INTO t1 (f2) VALUES (2); +ERROR HY000: wsrep_max_ws_rows exceeded +START TRANSACTION; +INSERT INTO t1 (f2) VALUES (1); +START TRANSACTION; +INSERT INTO t1 (f2) VALUES (1); +INSERT INTO t1 (f2) VALUES (2); +ERROR HY000: wsrep_max_ws_rows exceeded DROP TABLE t1; DROP TABLE ten; diff --git a/mysql-test/suite/galera/t/galera_var_max_ws_rows.test b/mysql-test/suite/galera/t/galera_var_max_ws_rows.test index d086142d1e1..944238bf1aa 100644 --- a/mysql-test/suite/galera/t/galera_var_max_ws_rows.test +++ b/mysql-test/suite/galera/t/galera_var_max_ws_rows.test @@ -110,6 +110,43 @@ DELETE FROM t1 WHERE f2 = 2; SELECT COUNT(*) = 0 FROM t1; + +# Test that wsrep_max_ws_rows is reset when switching autocommit mode + +SET AUTOCOMMIT = ON; +SET GLOBAL wsrep_max_ws_rows = 1; + +START TRANSACTION; +INSERT INTO t1 (f2) VALUES (1); +--error ER_ERROR_DURING_COMMIT +INSERT INTO t1 (f2) VALUES (2); + +INSERT INTO t1 (f2) VALUES (1); +INSERT INTO t1 (f2) VALUES (2); + + +SET AUTOCOMMIT = OFF; +START TRANSACTION; +INSERT INTO t1 (f2) VALUES (1); +--error ER_ERROR_DURING_COMMIT +INSERT INTO t1 (f2) VALUES (2); + +INSERT INTO t1 (f2) VALUES (1); +--error ER_ERROR_DURING_COMMIT +INSERT INTO t1 (f2) VALUES (2); + + +# Test that wsrep_max_ws_rows is reset on implicit commits + +START TRANSACTION; +INSERT INTO t1 (f2) VALUES (1); + +START TRANSACTION; +INSERT INTO t1 (f2) VALUES (1); +--error ER_ERROR_DURING_COMMIT +INSERT INTO t1 (f2) VALUES (2); + + --disable_query_log --eval SET GLOBAL wsrep_max_ws_rows = $wsrep_max_ws_rows_orig --enable_query_log diff --git a/sql/handler.cc b/sql/handler.cc index 6fa937faa84..0eef23ad753 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -6104,7 +6104,7 @@ int handler::ha_write_row(uchar *buf) current_thd->wsrep_exec_mode != REPL_RECV && current_thd->wsrep_affected_rows > wsrep_max_ws_rows) { - current_thd->transaction_rollback_request= TRUE; + trans_rollback_stmt(current_thd) || trans_rollback(current_thd); my_message(ER_ERROR_DURING_COMMIT, "wsrep_max_ws_rows exceeded", MYF(0)); DBUG_RETURN(ER_ERROR_DURING_COMMIT); } @@ -6148,7 +6148,7 @@ int handler::ha_update_row(const uchar *old_data, uchar *new_data) current_thd->wsrep_exec_mode != REPL_RECV && current_thd->wsrep_affected_rows > wsrep_max_ws_rows) { - current_thd->transaction_rollback_request= TRUE; + trans_rollback_stmt(current_thd) || trans_rollback(current_thd); my_message(ER_ERROR_DURING_COMMIT, "wsrep_max_ws_rows exceeded", MYF(0)); return ER_ERROR_DURING_COMMIT; } @@ -6186,7 +6186,7 @@ int handler::ha_delete_row(const uchar *buf) current_thd->wsrep_exec_mode != REPL_RECV && current_thd->wsrep_affected_rows > wsrep_max_ws_rows) { - current_thd->transaction_rollback_request= TRUE; + trans_rollback_stmt(current_thd) || trans_rollback(current_thd); my_message(ER_ERROR_DURING_COMMIT, "wsrep_max_ws_rows exceeded", MYF(0)); return ER_ERROR_DURING_COMMIT; } diff --git a/sql/wsrep_hton.cc b/sql/wsrep_hton.cc index e5ff462eb19..e1bf63cd31f 100644 --- a/sql/wsrep_hton.cc +++ b/sql/wsrep_hton.cc @@ -42,6 +42,7 @@ void wsrep_cleanup_transaction(THD *thd) thd->wsrep_trx_meta.gtid= WSREP_GTID_UNDEFINED; thd->wsrep_trx_meta.depends_on= WSREP_SEQNO_UNDEFINED; thd->wsrep_exec_mode= LOCAL_STATE; + thd->wsrep_affected_rows= 0; return; } |