From b58e990c748d77637f127a819b41f440e60e1d7d Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 22 Jun 2006 22:44:21 +0300 Subject: [PATCH] Fixed failure with rpl_truncate_7ndb.test when using statement based replication. is_injective -> table_flag() HA_HAS_OWN_BINLOGGING (Faster and easier to understand) Allow cluster_binlogging also in mixed replication mode. mysql-test/t/rpl_truncate_7ndb.test: Ensure that test is only run with mixed or row based replication sql/ha_ndbcluster.cc: Enforce row based replication if a cluster table is used sql/ha_ndbcluster.h: Remove is_injective() (Is now a table flag) sql/ha_ndbcluster_binlog.cc: Use cluster binlogging also in mixed binary logging (Using a cluster table will enforce row based replication in mixed mode, so this should be ok) sql/handler.cc: is_injective -> HA_HAS_OWN_BINLOGGING sql/handler.h: is_injective -> HA_HAS_OWN_BINLOGGING mysql-test/include/have_binlog_format_mixed_or_row.inc: New BitKeeper file ``mysql-test/include/have_binlog_format_mixed_or_row.inc'' mysql-test/r/rpl_truncate_7ndb_2.result: New BitKeeper file ``mysql-test/r/rpl_truncate_7ndb_2.result'' mysql-test/t/rpl_truncate_7ndb_2-master.opt: New BitKeeper file ``mysql-test/t/rpl_truncate_7ndb_2-master.opt'' mysql-test/t/rpl_truncate_7ndb_2.test: New BitKeeper file ``mysql-test/t/rpl_truncate_7ndb_2.test'' --- .../have_binlog_format_mixed_or_row.inc | 5 + mysql-test/r/rpl_truncate_7ndb_2.result | 91 +++++++++++++++++++ mysql-test/t/rpl_truncate_7ndb.test | 1 + mysql-test/t/rpl_truncate_7ndb_2-master.opt | 1 + mysql-test/t/rpl_truncate_7ndb_2.test | 6 ++ sql/ha_ndbcluster.cc | 8 +- sql/ha_ndbcluster.h | 2 - sql/ha_ndbcluster_binlog.cc | 4 +- sql/handler.cc | 2 +- sql/handler.h | 8 +- 10 files changed, 116 insertions(+), 12 deletions(-) create mode 100644 mysql-test/include/have_binlog_format_mixed_or_row.inc create mode 100644 mysql-test/r/rpl_truncate_7ndb_2.result create mode 100644 mysql-test/t/rpl_truncate_7ndb_2-master.opt create mode 100644 mysql-test/t/rpl_truncate_7ndb_2.test diff --git a/mysql-test/include/have_binlog_format_mixed_or_row.inc b/mysql-test/include/have_binlog_format_mixed_or_row.inc new file mode 100644 index 00000000000..c38b8f3d601 --- /dev/null +++ b/mysql-test/include/have_binlog_format_mixed_or_row.inc @@ -0,0 +1,5 @@ +--require r/have_binlog_format_row.require +--disable_query_log +--replace_result MIXED ROW +show variables like "binlog_format"; +--enable_query_log diff --git a/mysql-test/r/rpl_truncate_7ndb_2.result b/mysql-test/r/rpl_truncate_7ndb_2.result new file mode 100644 index 00000000000..0e1b21d31aa --- /dev/null +++ b/mysql-test/r/rpl_truncate_7ndb_2.result @@ -0,0 +1,91 @@ +stop slave; +drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9; +reset master; +reset slave; +drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9; +start slave; +**** On Master **** +CREATE TABLE t1 (a INT PRIMARY KEY, b LONG) ENGINE=NDB; +INSERT INTO t1 VALUES (1,1), (2,2); +SELECT * FROM t1 ORDER BY a,b; +a b +1 1 +2 2 +**** On Slave **** +INSERT INTO t1 VALUE (3,3); +SELECT * FROM t1 ORDER BY a,b; +a b +1 1 +2 2 +3 3 +**** On Master **** +TRUNCATE TABLE t1; +SELECT * FROM t1 ORDER BY a,b; +a b +**** On Slave **** +SELECT * FROM t1 ORDER BY a,b; +a b +**** On Master **** +DROP TABLE t1; +SHOW BINLOG EVENTS; +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 4 Format_desc 1 102 Server ver: SERVER_VERSION, Binlog ver: 4 +master-bin.000001 102 Query 1 219 use `test`; CREATE TABLE t1 (a INT PRIMARY KEY, b LONG) ENGINE=NDB +master-bin.000001 219 Query 1 283 BEGIN +master-bin.000001 283 Table_map 1 40 table_id: # (test.t1) +master-bin.000001 323 Table_map 1 93 table_id: # (cluster.apply_status) +master-bin.000001 376 Write_rows 1 135 table_id: # +master-bin.000001 418 Write_rows 1 182 table_id: # flags: STMT_END_F +master-bin.000001 465 Query 1 530 COMMIT +master-bin.000001 530 Query 1 610 use `test`; TRUNCATE TABLE t1 +master-bin.000001 610 Query 1 686 use `test`; DROP TABLE t1 +**** On Master **** +CREATE TABLE t1 (a INT PRIMARY KEY, b LONG) ENGINE=NDB; +INSERT INTO t1 VALUES (1,1), (2,2); +SELECT * FROM t1 ORDER BY a,b; +a b +1 1 +2 2 +**** On Slave **** +INSERT INTO t1 VALUE (3,3); +SELECT * FROM t1 ORDER BY a,b; +a b +1 1 +2 2 +3 3 +**** On Master **** +DELETE FROM t1; +SELECT * FROM t1 ORDER BY a,b; +a b +**** On Slave **** +SELECT * FROM t1 ORDER BY a,b; +a b +3 3 +**** On Master **** +DROP TABLE t1; +SHOW BINLOG EVENTS; +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 4 Format_desc 1 102 Server ver: SERVER_VERSION, Binlog ver: 4 +master-bin.000001 102 Query 1 219 use `test`; CREATE TABLE t1 (a INT PRIMARY KEY, b LONG) ENGINE=NDB +master-bin.000001 219 Query 1 283 BEGIN +master-bin.000001 283 Table_map 1 40 table_id: # (test.t1) +master-bin.000001 323 Table_map 1 93 table_id: # (cluster.apply_status) +master-bin.000001 376 Write_rows 1 135 table_id: # +master-bin.000001 418 Write_rows 1 182 table_id: # flags: STMT_END_F +master-bin.000001 465 Query 1 530 COMMIT +master-bin.000001 530 Query 1 610 use `test`; TRUNCATE TABLE t1 +master-bin.000001 610 Query 1 686 use `test`; DROP TABLE t1 +master-bin.000001 686 Query 1 803 use `test`; CREATE TABLE t1 (a INT PRIMARY KEY, b LONG) ENGINE=NDB +master-bin.000001 803 Query 1 867 BEGIN +master-bin.000001 867 Table_map 1 40 table_id: # (test.t1) +master-bin.000001 907 Table_map 1 93 table_id: # (cluster.apply_status) +master-bin.000001 960 Write_rows 1 135 table_id: # +master-bin.000001 1002 Write_rows 1 182 table_id: # flags: STMT_END_F +master-bin.000001 1049 Query 1 1114 COMMIT +master-bin.000001 1114 Query 1 1178 BEGIN +master-bin.000001 1178 Table_map 1 40 table_id: # (test.t1) +master-bin.000001 1218 Table_map 1 93 table_id: # (cluster.apply_status) +master-bin.000001 1271 Write_rows 1 135 table_id: # +master-bin.000001 1313 Delete_rows 1 174 table_id: # flags: STMT_END_F +master-bin.000001 1352 Query 1 1417 COMMIT +master-bin.000001 1417 Query 1 1493 use `test`; DROP TABLE t1 diff --git a/mysql-test/t/rpl_truncate_7ndb.test b/mysql-test/t/rpl_truncate_7ndb.test index f4bbadbf718..2921e7df45a 100644 --- a/mysql-test/t/rpl_truncate_7ndb.test +++ b/mysql-test/t/rpl_truncate_7ndb.test @@ -1,6 +1,7 @@ --source include/have_ndb.inc --source include/master-slave.inc +--source include/have_binlog_format_mixed_or_row.inc --disable_query_log --disable_warnings diff --git a/mysql-test/t/rpl_truncate_7ndb_2-master.opt b/mysql-test/t/rpl_truncate_7ndb_2-master.opt new file mode 100644 index 00000000000..01cf3e0520f --- /dev/null +++ b/mysql-test/t/rpl_truncate_7ndb_2-master.opt @@ -0,0 +1 @@ +--binlog-format=mixed diff --git a/mysql-test/t/rpl_truncate_7ndb_2.test b/mysql-test/t/rpl_truncate_7ndb_2.test new file mode 100644 index 00000000000..4ee6c98d463 --- /dev/null +++ b/mysql-test/t/rpl_truncate_7ndb_2.test @@ -0,0 +1,6 @@ +# Same test as rpl_truncate_7ndb.test, but with mixed mode +# This is marked with 'big_test' just because the rpl_truncate_7ndb test is +# so slow... + +--source include/big_test.inc +--source t/rpl_truncate_7ndb.test diff --git a/sql/ha_ndbcluster.cc b/sql/ha_ndbcluster.cc index f45320bf51a..0004234edd3 100644 --- a/sql/ha_ndbcluster.cc +++ b/sql/ha_ndbcluster.cc @@ -4056,6 +4056,7 @@ int ha_ndbcluster::external_lock(THD *thd, int lock_type) DBUG_PRINT("warning", ("ops_pending != 0L")); m_ops_pending= 0; } + thd->set_current_stmt_binlog_row_based_if_mixed(); DBUG_RETURN(error); } @@ -4105,7 +4106,8 @@ int ha_ndbcluster::start_stmt(THD *thd, thr_lock_type lock_type) // Start of statement m_ops_pending= 0; - + thd->set_current_stmt_binlog_row_based_if_mixed(); + DBUG_RETURN(error); } @@ -5452,7 +5454,8 @@ void ha_ndbcluster::get_auto_increment(ulonglong offset, ulonglong increment, HA_CAN_BIT_FIELD | \ HA_PRIMARY_KEY_REQUIRED_FOR_POSITION | \ HA_PRIMARY_KEY_REQUIRED_FOR_DELETE | \ - HA_PARTIAL_COLUMN_READ + HA_PARTIAL_COLUMN_READ | \ + HA_HAS_OWN_BINLOGGING ha_ndbcluster::ha_ndbcluster(TABLE_SHARE *table_arg): handler(&ndbcluster_hton, table_arg), @@ -7954,6 +7957,7 @@ pthread_handler_t ndb_util_thread_func(void *arg __attribute__((unused))) my_net_init(&thd->net, 0); thd->main_security_ctx.master_access= ~0; thd->main_security_ctx.priv_user = 0; + thd->current_stmt_binlog_row_based= TRUE; // If in mixed mode /* wait for mysql server to start diff --git a/sql/ha_ndbcluster.h b/sql/ha_ndbcluster.h index df3c5791713..f2e2ff9ddc2 100644 --- a/sql/ha_ndbcluster.h +++ b/sql/ha_ndbcluster.h @@ -661,8 +661,6 @@ class ha_ndbcluster: public handler bool low_byte_first() const; - virtual bool is_injective() const { return true; } - const char* index_type(uint key_number); double scan_time(); diff --git a/sql/ha_ndbcluster_binlog.cc b/sql/ha_ndbcluster_binlog.cc index b4ea5fb0e80..516446d4c22 100644 --- a/sql/ha_ndbcluster_binlog.cc +++ b/sql/ha_ndbcluster_binlog.cc @@ -3347,9 +3347,11 @@ pthread_handler_t ndb_binlog_thread_func(void *arg) ndb_binlog_thread_running= 1; if (opt_bin_log) { - if (global_system_variables.binlog_format == BINLOG_FORMAT_ROW) + if (global_system_variables.binlog_format == BINLOG_FORMAT_ROW || + global_system_variables.binlog_format == BINLOG_FORMAT_MIXED) { ndb_binlog_running= TRUE; + thd->current_stmt_binlog_row_based= TRUE; // If in mixed mode } else { diff --git a/sql/handler.cc b/sql/handler.cc index 0895c6cf454..a160315dbe9 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -3305,7 +3305,7 @@ namespace const byte *before_record, const byte *after_record) { - if (table->file->is_injective()) + if (table->file->ha_table_flags() & HA_HAS_OWN_BINLOGGING) return 0; bool error= 0; THD *const thd= table->in_use; diff --git a/sql/handler.h b/sql/handler.h index 52843b78266..1e16ab35261 100644 --- a/sql/handler.h +++ b/sql/handler.h @@ -116,6 +116,8 @@ #define HA_ANY_INDEX_MAY_BE_UNIQUE (1 << 30) #define HA_NO_COPY_ON_ALTER (LL(1) << 31) #define HA_HAS_RECORDS (LL(1) << 32) /* records() gives exact count*/ +/* Has it's own method of binlog logging */ +#define HA_HAS_OWN_BINLOGGING (LL(1) << 33) /* bits in index_flags(index_number) for what you can do with index */ #define HA_READ_NEXT 1 /* TODO really use this flag */ @@ -1053,12 +1055,6 @@ public: int ha_update_row(const byte * old_data, byte * new_data); int ha_delete_row(const byte * buf); - /* - If the handler does it's own injection of the rows, this member function - should return 'true'. - */ - virtual bool is_injective() const { return false; } - /* SYNOPSIS start_bulk_update()