Skip to content

Commit 4c69dc8

Browse files
author
Nirbhay Choubey
committed
MDEV#7501 : alter table exchange partition is not replicated in galera cluster
Added logic to replicate ALTER TABLE EXCHANGE PARTITION to other nodes in the cluster.
1 parent 82cecb1 commit 4c69dc8

File tree

3 files changed

+161
-1
lines changed

3 files changed

+161
-1
lines changed

mysql-test/suite/galera/r/partition.result

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,85 @@ pk i
2020
SELECT * FROM t1;
2121
pk i
2222
DROP TABLE t1;
23+
#
24+
# MDEV#7501 : alter table exchange partition is not replicated in
25+
# galera cluster
26+
#
27+
28+
# On node_1
29+
CREATE TABLE test.t1 (
30+
i INT UNSIGNED NOT NULL AUTO_INCREMENT,
31+
PRIMARY KEY (i)
32+
) ENGINE=INNODB
33+
PARTITION BY RANGE (i)
34+
(PARTITION p1 VALUES LESS THAN (10) ENGINE = INNODB,
35+
PARTITION p2 VALUES LESS THAN (20) ENGINE = INNODB,
36+
PARTITION pMax VALUES LESS THAN MAXVALUE ENGINE = INNODB);
37+
INSERT INTO test.t1 (i) VALUE (9),(19);
38+
CREATE TABLE test.p1 LIKE test.t1;
39+
ALTER TABLE test.p1 REMOVE PARTITIONING;
40+
ALTER TABLE test.t1 EXCHANGE PARTITION p1 WITH TABLE test.p1;
41+
SELECT * FROM test.t1;
42+
i
43+
19
44+
SELECT * FROM test.p1;
45+
i
46+
9
47+
48+
# On node_2
49+
SHOW CREATE TABLE t1;
50+
Table Create Table
51+
t1 CREATE TABLE `t1` (
52+
`i` int(10) unsigned NOT NULL AUTO_INCREMENT,
53+
PRIMARY KEY (`i`)
54+
) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=latin1
55+
/*!50100 PARTITION BY RANGE (i)
56+
(PARTITION p1 VALUES LESS THAN (10) ENGINE = InnoDB,
57+
PARTITION p2 VALUES LESS THAN (20) ENGINE = InnoDB,
58+
PARTITION pMax VALUES LESS THAN MAXVALUE ENGINE = InnoDB) */
59+
SHOW CREATE TABLE p1;
60+
Table Create Table
61+
p1 CREATE TABLE `p1` (
62+
`i` int(10) unsigned NOT NULL AUTO_INCREMENT,
63+
PRIMARY KEY (`i`)
64+
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1
65+
SELECT * FROM test.t1;
66+
i
67+
19
68+
SELECT * FROM test.p1;
69+
i
70+
9
71+
72+
# On node_1
73+
ALTER TABLE t1 TRUNCATE PARTITION p2;
74+
SELECT * FROM test.t1;
75+
i
76+
77+
# On node_2
78+
SELECT * FROM test.t1;
79+
i
80+
81+
# On node_1
82+
ALTER TABLE t1 DROP PARTITION p2;
83+
SHOW CREATE TABLE t1;
84+
Table Create Table
85+
t1 CREATE TABLE `t1` (
86+
`i` int(10) unsigned NOT NULL AUTO_INCREMENT,
87+
PRIMARY KEY (`i`)
88+
) ENGINE=InnoDB DEFAULT CHARSET=latin1
89+
/*!50100 PARTITION BY RANGE (i)
90+
(PARTITION p1 VALUES LESS THAN (10) ENGINE = InnoDB,
91+
PARTITION pMax VALUES LESS THAN MAXVALUE ENGINE = InnoDB) */
92+
93+
# On node_2
94+
SHOW CREATE TABLE t1;
95+
Table Create Table
96+
t1 CREATE TABLE `t1` (
97+
`i` int(10) unsigned NOT NULL AUTO_INCREMENT,
98+
PRIMARY KEY (`i`)
99+
) ENGINE=InnoDB DEFAULT CHARSET=latin1
100+
/*!50100 PARTITION BY RANGE (i)
101+
(PARTITION p1 VALUES LESS THAN (10) ENGINE = InnoDB,
102+
PARTITION pMax VALUES LESS THAN MAXVALUE ENGINE = InnoDB) */
103+
DROP TABLE t1, p1;
23104
# End of test

mysql-test/suite/galera/t/partition.test

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,5 +27,68 @@ SELECT * FROM t1;
2727
# Cleanup
2828
DROP TABLE t1;
2929

30+
31+
--echo #
32+
--echo # MDEV#7501 : alter table exchange partition is not replicated in
33+
--echo # galera cluster
34+
--echo #
35+
36+
--echo
37+
--echo # On node_1
38+
--connection node_1
39+
40+
CREATE TABLE test.t1 (
41+
i INT UNSIGNED NOT NULL AUTO_INCREMENT,
42+
PRIMARY KEY (i)
43+
) ENGINE=INNODB
44+
PARTITION BY RANGE (i)
45+
(PARTITION p1 VALUES LESS THAN (10) ENGINE = INNODB,
46+
PARTITION p2 VALUES LESS THAN (20) ENGINE = INNODB,
47+
PARTITION pMax VALUES LESS THAN MAXVALUE ENGINE = INNODB);
48+
49+
INSERT INTO test.t1 (i) VALUE (9),(19);
50+
CREATE TABLE test.p1 LIKE test.t1;
51+
ALTER TABLE test.p1 REMOVE PARTITIONING;
52+
53+
ALTER TABLE test.t1 EXCHANGE PARTITION p1 WITH TABLE test.p1;
54+
SELECT * FROM test.t1;
55+
SELECT * FROM test.p1;
56+
57+
--echo
58+
--echo # On node_2
59+
--connection node_2
60+
61+
SHOW CREATE TABLE t1;
62+
SHOW CREATE TABLE p1;
63+
64+
SELECT * FROM test.t1;
65+
SELECT * FROM test.p1;
66+
67+
--echo
68+
--echo # On node_1
69+
--connection node_1
70+
ALTER TABLE t1 TRUNCATE PARTITION p2;
71+
SELECT * FROM test.t1;
72+
73+
--echo
74+
--echo # On node_2
75+
--connection node_2
76+
SELECT * FROM test.t1;
77+
78+
--echo
79+
--echo # On node_1
80+
--connection node_1
81+
ALTER TABLE t1 DROP PARTITION p2;
82+
SHOW CREATE TABLE t1;
83+
84+
--echo
85+
--echo # On node_2
86+
--connection node_2
87+
SHOW CREATE TABLE t1;
88+
89+
90+
# Cleanup
91+
DROP TABLE t1, p1;
92+
3093
--source include/galera_end.inc
3194
--echo # End of test

sql/sql_partition_admin.cc

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -530,6 +530,21 @@ bool Sql_cmd_alter_table_exchange_partition::
530530
&alter_prelocking_strategy))
531531
DBUG_RETURN(true);
532532

533+
#ifdef WITH_WSREP
534+
/* Forward declaration */
535+
TABLE *find_temporary_table(THD *thd, const TABLE_LIST *tl);
536+
537+
if ((!thd->is_current_stmt_binlog_format_row() ||
538+
/* TODO: Do we really need to check for temp tables in this case? */
539+
!find_temporary_table(thd, table_list)) &&
540+
wsrep_to_isolation_begin(thd, table_list->db, table_list->table_name,
541+
NULL))
542+
{
543+
WSREP_WARN("ALTER TABLE EXCHANGE PARTITION isolation failure");
544+
DBUG_RETURN(TRUE);
545+
}
546+
#endif /* WITH_WSREP */
547+
533548
part_table= table_list->table;
534549
swap_table= swap_table_list->table;
535550

@@ -764,6 +779,7 @@ bool Sql_cmd_alter_table_truncate_partition::execute(THD *thd)
764779
DBUG_RETURN(TRUE);
765780

766781
#ifdef WITH_WSREP
782+
/* Forward declaration */
767783
TABLE *find_temporary_table(THD *thd, const TABLE_LIST *tl);
768784

769785
if ((!thd->is_current_stmt_binlog_format_row() ||
@@ -772,7 +788,7 @@ bool Sql_cmd_alter_table_truncate_partition::execute(THD *thd)
772788
thd, first_table->db, first_table->table_name, NULL)
773789
)
774790
{
775-
WSREP_WARN("ALTER TABLE isolation failure");
791+
WSREP_WARN("ALTER TABLE TRUNCATE PARTITION isolation failure");
776792
DBUG_RETURN(TRUE);
777793
}
778794
#endif /* WITH_WSREP */

0 commit comments

Comments
 (0)