mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
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''
This commit is contained in:
5
mysql-test/include/have_binlog_format_mixed_or_row.inc
Normal file
5
mysql-test/include/have_binlog_format_mixed_or_row.inc
Normal file
@ -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
|
91
mysql-test/r/rpl_truncate_7ndb_2.result
Normal file
91
mysql-test/r/rpl_truncate_7ndb_2.result
Normal file
@ -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
|
@ -1,6 +1,7 @@
|
|||||||
|
|
||||||
--source include/have_ndb.inc
|
--source include/have_ndb.inc
|
||||||
--source include/master-slave.inc
|
--source include/master-slave.inc
|
||||||
|
--source include/have_binlog_format_mixed_or_row.inc
|
||||||
|
|
||||||
--disable_query_log
|
--disable_query_log
|
||||||
--disable_warnings
|
--disable_warnings
|
||||||
|
1
mysql-test/t/rpl_truncate_7ndb_2-master.opt
Normal file
1
mysql-test/t/rpl_truncate_7ndb_2-master.opt
Normal file
@ -0,0 +1 @@
|
|||||||
|
--binlog-format=mixed
|
6
mysql-test/t/rpl_truncate_7ndb_2.test
Normal file
6
mysql-test/t/rpl_truncate_7ndb_2.test
Normal file
@ -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
|
@ -4056,6 +4056,7 @@ int ha_ndbcluster::external_lock(THD *thd, int lock_type)
|
|||||||
DBUG_PRINT("warning", ("ops_pending != 0L"));
|
DBUG_PRINT("warning", ("ops_pending != 0L"));
|
||||||
m_ops_pending= 0;
|
m_ops_pending= 0;
|
||||||
}
|
}
|
||||||
|
thd->set_current_stmt_binlog_row_based_if_mixed();
|
||||||
DBUG_RETURN(error);
|
DBUG_RETURN(error);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4105,6 +4106,7 @@ int ha_ndbcluster::start_stmt(THD *thd, thr_lock_type lock_type)
|
|||||||
|
|
||||||
// Start of statement
|
// Start of statement
|
||||||
m_ops_pending= 0;
|
m_ops_pending= 0;
|
||||||
|
thd->set_current_stmt_binlog_row_based_if_mixed();
|
||||||
|
|
||||||
DBUG_RETURN(error);
|
DBUG_RETURN(error);
|
||||||
}
|
}
|
||||||
@ -5452,7 +5454,8 @@ void ha_ndbcluster::get_auto_increment(ulonglong offset, ulonglong increment,
|
|||||||
HA_CAN_BIT_FIELD | \
|
HA_CAN_BIT_FIELD | \
|
||||||
HA_PRIMARY_KEY_REQUIRED_FOR_POSITION | \
|
HA_PRIMARY_KEY_REQUIRED_FOR_POSITION | \
|
||||||
HA_PRIMARY_KEY_REQUIRED_FOR_DELETE | \
|
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):
|
ha_ndbcluster::ha_ndbcluster(TABLE_SHARE *table_arg):
|
||||||
handler(&ndbcluster_hton, 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);
|
my_net_init(&thd->net, 0);
|
||||||
thd->main_security_ctx.master_access= ~0;
|
thd->main_security_ctx.master_access= ~0;
|
||||||
thd->main_security_ctx.priv_user = 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
|
wait for mysql server to start
|
||||||
|
@ -661,8 +661,6 @@ class ha_ndbcluster: public handler
|
|||||||
|
|
||||||
bool low_byte_first() const;
|
bool low_byte_first() const;
|
||||||
|
|
||||||
virtual bool is_injective() const { return true; }
|
|
||||||
|
|
||||||
const char* index_type(uint key_number);
|
const char* index_type(uint key_number);
|
||||||
|
|
||||||
double scan_time();
|
double scan_time();
|
||||||
|
@ -3347,9 +3347,11 @@ pthread_handler_t ndb_binlog_thread_func(void *arg)
|
|||||||
ndb_binlog_thread_running= 1;
|
ndb_binlog_thread_running= 1;
|
||||||
if (opt_bin_log)
|
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;
|
ndb_binlog_running= TRUE;
|
||||||
|
thd->current_stmt_binlog_row_based= TRUE; // If in mixed mode
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -3305,7 +3305,7 @@ namespace
|
|||||||
const byte *before_record,
|
const byte *before_record,
|
||||||
const byte *after_record)
|
const byte *after_record)
|
||||||
{
|
{
|
||||||
if (table->file->is_injective())
|
if (table->file->ha_table_flags() & HA_HAS_OWN_BINLOGGING)
|
||||||
return 0;
|
return 0;
|
||||||
bool error= 0;
|
bool error= 0;
|
||||||
THD *const thd= table->in_use;
|
THD *const thd= table->in_use;
|
||||||
|
@ -116,6 +116,8 @@
|
|||||||
#define HA_ANY_INDEX_MAY_BE_UNIQUE (1 << 30)
|
#define HA_ANY_INDEX_MAY_BE_UNIQUE (1 << 30)
|
||||||
#define HA_NO_COPY_ON_ALTER (LL(1) << 31)
|
#define HA_NO_COPY_ON_ALTER (LL(1) << 31)
|
||||||
#define HA_HAS_RECORDS (LL(1) << 32) /* records() gives exact count*/
|
#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 */
|
/* bits in index_flags(index_number) for what you can do with index */
|
||||||
#define HA_READ_NEXT 1 /* TODO really use this flag */
|
#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_update_row(const byte * old_data, byte * new_data);
|
||||||
int ha_delete_row(const byte * buf);
|
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
|
SYNOPSIS
|
||||||
start_bulk_update()
|
start_bulk_update()
|
||||||
|
Reference in New Issue
Block a user