3445 Jonas Oreland 2011-07-05
ndb - Raiders of the trailing share
added:
mysql-test/suite/ndb/include/ndb_share_check_shares.inc
mysql-test/suite/ndb/r/ndb_share.result
mysql-test/suite/ndb/t/ndb_share.cnf
mysql-test/suite/ndb/t/ndb_share.test
modified:
mysql-test/suite/ndb/r/ndb_basic.result
mysql-test/suite/ndb/t/ndb_basic.test
sql/ha_ndbcluster.cc
sql/ha_ndbcluster.h
sql/ha_ndbcluster_binlog.cc
3444 Jonas Oreland 2011-07-05
ndb - this fixes a (very) spurios warning with "CREATE TABLE IF NOT EXISTS", when util-threads reconnect
modified:
sql/ha_ndbcluster_binlog.cc
3443 Kent Boortz 2011-07-04 [merge]
Updated/added copyright headers
added:
storage/ndb/compile-cluster
modified:
configure.in
mysql-test/include/mtr_check.sql
mysql-test/include/mtr_warnings.sql
mysql-test/t/ctype_cp932_binlog_stm.test
sql/ha_ndbcluster_binlog.cc
storage/ndb/Makefile.am
storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp
storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp
storage/ndb/src/kernel/blocks/suma/Suma.cpp
storage/ndb/src/ndbapi/NdbTransaction.cpp
storage/ndb/test/ndbapi/testScan.cpp
storage/ndb/test/run-test/daily-basic-tests.txt
=== added file 'mysql-test/suite/ndb/include/ndb_share_check_shares.inc'
--- a/mysql-test/suite/ndb/include/ndb_share_check_shares.inc 1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/ndb/include/ndb_share_check_shares.inc 2011-07-05 14:19:56 +0000
@@ -0,0 +1,12 @@
+connection server1;
+--error 0,1193
+set global ndbcluster_check_shares=1;
+connection server2;
+--error 0,1193
+set global ndbcluster_check_shares=1;
+connection server3;
+--error 0,1193
+set global ndbcluster_check_shares=1;
+connection server4;
+--error 0,1193
+set global ndbcluster_check_shares=1;
=== modified file 'mysql-test/suite/ndb/r/ndb_basic.result'
--- a/mysql-test/suite/ndb/r/ndb_basic.result 2011-04-08 13:23:36 +0000
+++ b/mysql-test/suite/ndb/r/ndb_basic.result 2011-07-05 14:19:56 +0000
@@ -14,7 +14,7 @@ Ndb_pruned_scan_count #
Ndb_cluster_connection_pool #
Ndb_conflict_fn_max #
Ndb_conflict_fn_old #
-SHOW GLOBAL VARIABLES LIKE 'ndb%';
+SHOW GLOBAL VARIABLES LIKE 'ndb\_%';
Variable_name Value
ndb_autoincrement_prefetch_sz #
ndb_batch_size #
=== added file 'mysql-test/suite/ndb/r/ndb_share.result'
--- a/mysql-test/suite/ndb/r/ndb_share.result 1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/ndb/r/ndb_share.result 2011-07-05 14:19:56 +0000
@@ -0,0 +1,312 @@
+show variables like 'log_bin';
+Variable_name Value
+log_bin ON
+show variables like 'log_bin';
+Variable_name Value
+log_bin ON
+show variables like 'log_bin';
+Variable_name Value
+log_bin OFF
+show variables like 'log_bin';
+Variable_name Value
+log_bin OFF
+create table t1 (a int) engine=ndbcluster;
+drop table t1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+create table t1 (a int) engine=ndbcluster;
+drop table t1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+create table t1 (a int) engine=ndbcluster;
+rename table t1 to t2;
+drop table t2;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+create table t1 (a int) engine=ndbcluster;
+rename table t1 to t2;
+drop table t2;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+create table t1 (a int) engine=ndbcluster;
+alter offline table t1 add column b int default 77;
+drop table t1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+create table t1 (a int) engine=ndbcluster;
+alter offline table t1 add column b int default 77;
+drop table t1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+create table t1 (a int primary key) engine=ndbcluster;
+alter online table t1 add column b int column_format dynamic;
+drop table t1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+create table t1 (a int primary key) engine=ndbcluster;
+alter offline table t1 add column b int column_format dynamic;
+drop table t1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+create table t1 (a int) engine=ndbcluster;
+create table t2 (a int) engine=ndbcluster;
+rename table t1 to tmp, t2 to t1, tmp to t2;
+drop table t1, t2;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+create table t1 (a int) engine=ndbcluster;
+create table t2 (a int) engine=ndbcluster;
+rename table t1 to tmp, t2 to t1, tmp to t2;
+drop table t1, t2;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+create table t1 (a int) engine=myisam;
+create table t1 (a int) engine=myisam;
+create table t1 (a int) engine = ndb;
+drop table t1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+create table t1 (a int) engine = ndb;
+drop table t1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+create table t1 (a int) engine = ndb;
+drop table t1;
+desc t1;
+Field Type Null Key Default Extra
+a int(11) YES NULL
+drop table t1;
+desc t1;
+Field Type Null Key Default Extra
+a int(11) YES NULL
+drop table t1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+create table t1 (a int) engine=myisam;
+create table t1 (a int) engine=myisam;
+create table t1 (a int) engine = ndb;
+alter offline table t1 add column b int column_format dynamic;
+drop table t1;
+desc t1;
+Field Type Null Key Default Extra
+a int(11) YES NULL
+b int(11) YES NULL
+drop table t1;
+desc t1;
+Field Type Null Key Default Extra
+a int(11) YES NULL
+b int(11) YES NULL
+drop table t1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+create table t1 (a int) engine=myisam;
+create table t1 (a int) engine=myisam;
+create table t1 (a int primary key) engine = ndb;
+alter online table t1 add column b int column_format dynamic;
+drop table t1;
+desc t1;
+Field Type Null Key Default Extra
+a int(11) NO PRI NULL
+b int(11) YES NULL
+drop table t1;
+desc t1;
+Field Type Null Key Default Extra
+a int(11) NO PRI NULL
+b int(11) YES NULL
+drop table t1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+create table t1 (a int) engine=myisam;
+create table t1 (a int) engine=myisam;
+create table t1 (a int) engine = ndb;
+rename table t1 to t2;
+desc t2;
+Field Type Null Key Default Extra
+a int(11) YES NULL
+desc t2;
+Field Type Null Key Default Extra
+a int(11) YES NULL
+drop table t2;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+drop table t1;
+drop table t1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+create table if not exists t1 (a int) engine=ndbcluster;
+create table if not exists t1 (a int) engine=ndbcluster;
+create table if not exists t1 (a int) engine=ndbcluster;
+create table if not exists t1 (a int) engine=ndbcluster;
+drop table t1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+create table if not exists t1 (a int) engine=ndbcluster;
+create table if not exists t1 (a int) engine=ndbcluster;
+create table if not exists t1 (a int) engine=ndbcluster;
+create table if not exists t1 (a int) engine=ndbcluster;
+drop table t1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+create table if not exists t1 (a int) engine=ndbcluster;
+create table if not exists t1 (a int) engine=ndbcluster;
+create table if not exists t1 (a int) engine=ndbcluster;
+create table if not exists t1 (a int) engine=ndbcluster;
+drop table t1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+create table if not exists t1 (a int) engine=ndbcluster;
+create table if not exists t1 (a int) engine=ndbcluster;
+create table if not exists t1 (a int) engine=ndbcluster;
+create table if not exists t1 (a int) engine=ndbcluster;
+drop table t1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+create table if not exists t1 (a int) engine=ndbcluster;
+create table if not exists t1 (a int) engine=ndbcluster;
+create table if not exists t1 (a int) engine=ndbcluster;
+create table if not exists t1 (a int) engine=ndbcluster;
+drop table t1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+create table t1 (a int) engine=ndbcluster;
+drop table if exists t1;
+drop table if exists t1;
+drop table if exists t1;
+drop table if exists t1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+create table t1 (a int) engine=ndbcluster;
+drop table if exists t1;
+drop table if exists t1;
+drop table if exists t1;
+drop table if exists t1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+create table t1 (a int) engine=ndbcluster;
+drop table if exists t1;
+drop table if exists t1;
+drop table if exists t1;
+drop table if exists t1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+create table t1 (a int) engine=ndbcluster;
+drop table if exists t1;
+drop table if exists t1;
+drop table if exists t1;
+drop table if exists t1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+create table t1 (a int) engine=ndbcluster;
+drop table if exists t1;
+drop table if exists t1;
+drop table if exists t1;
+drop table if exists t1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+create table t1 (a int) engine=ndbcluster;
+create table t2 (a int) engine=ndbcluster;
+desc t1;
+Field Type Null Key Default Extra
+a int(11) YES NULL
+desc t2;
+Field Type Null Key Default Extra
+a int(11) YES NULL
+desc t1;
+Field Type Null Key Default Extra
+a int(11) YES NULL
+desc t2;
+Field Type Null Key Default Extra
+a int(11) YES NULL
+desc t1;
+Field Type Null Key Default Extra
+a int(11) YES NULL
+desc t2;
+Field Type Null Key Default Extra
+a int(11) YES NULL
+desc t1;
+Field Type Null Key Default Extra
+a int(11) YES NULL
+desc t2;
+Field Type Null Key Default Extra
+a int(11) YES NULL
+drop table t1, t2;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+create table t1 (a int) engine=ndbcluster;
+create table t2 (a int) engine=ndbcluster;
+desc t1;
+ERROR 42S02: Table 'test.t1' doesn't exist
+desc t2;
+ERROR 42S02: Table 'test.t2' doesn't exist
+desc t1;
+ERROR 42S02: Table 'test.t1' doesn't exist
+desc t2;
+ERROR 42S02: Table 'test.t2' doesn't exist
+desc t1;
+ERROR 42S02: Table 'test.t1' doesn't exist
+desc t2;
+ERROR 42S02: Table 'test.t2' doesn't exist
+desc t1;
+ERROR 42S02: Table 'test.t1' doesn't exist
+desc t2;
+ERROR 42S02: Table 'test.t2' doesn't exist
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
+set global ndbcluster_check_shares=1;
=== modified file 'mysql-test/suite/ndb/t/ndb_basic.test'
--- a/mysql-test/suite/ndb/t/ndb_basic.test 2011-04-08 13:23:36 +0000
+++ b/mysql-test/suite/ndb/t/ndb_basic.test 2011-07-05 14:19:56 +0000
@@ -16,7 +16,7 @@ drop database if exists mysqltest;
--replace_column 2 #
SHOW GLOBAL STATUS LIKE 'ndb%';
--replace_column 2 #
-SHOW GLOBAL VARIABLES LIKE 'ndb%';
+SHOW GLOBAL VARIABLES LIKE 'ndb\_%';
#
# Create a normal table with primary key
=== added file 'mysql-test/suite/ndb/t/ndb_share.cnf'
--- a/mysql-test/suite/ndb/t/ndb_share.cnf 1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/ndb/t/ndb_share.cnf 2011-07-05 14:19:56 +0000
@@ -0,0 +1,28 @@
+!include ../my.cnf
+
+[cluster_config.1]
+mysqld=,,,
+
+[mysqld.1.1]
+log-bin=mysqld-bin
+
+[mysqld.2.1]
+log-bin=mysqld-bin
+
+[mysqld.3.1]
+skip-log-bin
+
+[mysqld.4.1]
+skip-log-bin
+
+[ENV]
+
+NDB_CONNECTSTRING= @mysql_cluster.1.ndb_connectstring
+MYSQLD1_SOCK= @mysqld.1.1.socket
+MYSQLD1_PORT= @mysqld.1.1.port
+MYSQLD2_SOCK= @mysqld.2.1.socket
+MYSQLD2_PORT= @mysqld.2.1.port
+MYSQLD3_SOCK= @mysqld.3.1.socket
+MYSQLD3_PORT= @mysqld.3.1.port
+MYSQLD4_SOCK= @mysqld.4.1.socket
+MYSQLD4_PORT= @mysqld.4.1.port
=== added file 'mysql-test/suite/ndb/t/ndb_share.test'
--- a/mysql-test/suite/ndb/t/ndb_share.test 1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/ndb/t/ndb_share.test 2011-07-05 14:19:56 +0000
@@ -0,0 +1,364 @@
+-- source include/not_embedded.inc
+-- source include/have_ndb.inc
+-- source include/have_log_bin.inc
+
+connect (server1,127.0.0.1,root,,test,$MYSQLD1_PORT,);
+connect (server2,127.0.0.1,root,,test,$MYSQLD2_PORT,);
+connect (server3,127.0.0.1,root,,test,$MYSQLD3_PORT,);
+connect (server4,127.0.0.1,root,,test,$MYSQLD4_PORT,);
+
+connection server1;
+show variables like 'log_bin';
+connection server2;
+show variables like 'log_bin';
+connection server3;
+show variables like 'log_bin';
+connection server4;
+show variables like 'log_bin';
+
+#
+# Basic create+drop (from with and without log-bin)
+# no share should be present
+#
+connection server1;
+create table t1 (a int) engine=ndbcluster;
+drop table t1;
+--source suite/ndb/include/ndb_share_check_shares.inc
+
+connection server3;
+create table t1 (a int) engine=ndbcluster;
+drop table t1;
+--source suite/ndb/include/ndb_share_check_shares.inc
+
+#
+# Basic create+rename+drop (from with and without log-bin)
+# no share should be present
+#
+connection server1;
+create table t1 (a int) engine=ndbcluster;
+rename table t1 to t2;
+drop table t2;
+--source suite/ndb/include/ndb_share_check_shares.inc
+
+connection server2;
+create table t1 (a int) engine=ndbcluster;
+rename table t1 to t2;
+drop table t2;
+--source suite/ndb/include/ndb_share_check_shares.inc
+
+#
+# Basic create+offline-alter+drop (from with and without log-bin)
+# no share should be present
+#
+connection server1;
+create table t1 (a int) engine=ndbcluster;
+alter offline table t1 add column b int default 77;
+drop table t1;
+--source suite/ndb/include/ndb_share_check_shares.inc
+
+connection server2;
+create table t1 (a int) engine=ndbcluster;
+alter offline table t1 add column b int default 77;
+drop table t1;
+--source suite/ndb/include/ndb_share_check_shares.inc
+
+#
+# Basic create+online-alter+drop (from with and without log-bin)
+# no share should be present
+#
+connection server1;
+create table t1 (a int primary key) engine=ndbcluster;
+alter online table t1 add column b int column_format dynamic;
+drop table t1;
+--source suite/ndb/include/ndb_share_check_shares.inc
+
+connection server2;
+create table t1 (a int primary key) engine=ndbcluster;
+alter offline table t1 add column b int column_format dynamic;
+drop table t1;
+--source suite/ndb/include/ndb_share_check_shares.inc
+
+#
+# Basic create+multi-rename+drop (from with and without log-bin)
+# no share should be present
+#
+connection server1;
+create table t1 (a int) engine=ndbcluster;
+create table t2 (a int) engine=ndbcluster;
+rename table t1 to tmp, t2 to t1, tmp to t2;
+drop table t1, t2;
+--source suite/ndb/include/ndb_share_check_shares.inc
+
+connection server2;
+create table t1 (a int) engine=ndbcluster;
+create table t2 (a int) engine=ndbcluster;
+rename table t1 to tmp, t2 to t1, tmp to t2;
+drop table t1, t2;
+--source suite/ndb/include/ndb_share_check_shares.inc
+
+#
+# Now...lets get nastier 1
+# create myisam tables on other servers...and then create ndb table
+#
+connection server2;
+create table t1 (a int) engine=myisam;
+connection server4;
+create table t1 (a int) engine=myisam;
+
+connection server1;
+create table t1 (a int) engine = ndb;
+drop table t1;
+--source suite/ndb/include/ndb_share_check_shares.inc
+
+connection server3;
+create table t1 (a int) engine = ndb;
+drop table t1;
+--source suite/ndb/include/ndb_share_check_shares.inc
+
+connection server1;
+create table t1 (a int) engine = ndb;
+
+connection server2;
+drop table t1;
+desc t1; # force discovery
+
+connection server4;
+drop table t1;
+desc t1; # force discovery
+
+connection server1;
+drop table t1;
+--source suite/ndb/include/ndb_share_check_shares.inc
+
+#
+# Now...lets get nastier 2
+# create myisam tables on other servers...and then create ndb table
+# and off-line alter them
+connection server2;
+create table t1 (a int) engine=myisam;
+connection server4;
+create table t1 (a int) engine=myisam;
+
+connection server1;
+create table t1 (a int) engine = ndb;
+alter offline table t1 add column b int column_format dynamic;
+
+connection server2;
+drop table t1;
+desc t1; # force discovery
+
+connection server4;
+drop table t1;
+desc t1; # force discovery
+
+connection server1;
+drop table t1;
+--source suite/ndb/include/ndb_share_check_shares.inc
+
+#
+# Now...lets get nastier 3
+# create myisam tables on other servers...and then create ndb table
+# and online alter them
+connection server2;
+create table t1 (a int) engine=myisam;
+connection server4;
+create table t1 (a int) engine=myisam;
+
+connection server1;
+create table t1 (a int primary key) engine = ndb;
+alter online table t1 add column b int column_format dynamic;
+
+connection server2;
+drop table t1;
+desc t1; # force discovery
+
+connection server4;
+drop table t1;
+desc t1; # force discovery
+
+connection server1;
+drop table t1;
+--source suite/ndb/include/ndb_share_check_shares.inc
+
+#
+# Now...lets get nastier 4
+# create myisam tables on other servers...and then create ndb table
+# and rename them
+connection server2;
+create table t1 (a int) engine=myisam;
+connection server4;
+create table t1 (a int) engine=myisam;
+
+connection server1;
+create table t1 (a int) engine = ndb;
+rename table t1 to t2;
+
+connection server2;
+desc t2; # force discovery
+
+connection server4;
+desc t2; # force discovery
+
+connection server1;
+drop table t2;
+--source suite/ndb/include/ndb_share_check_shares.inc
+
+connection server2;
+drop table t1;
+
+connection server4;
+drop table t1;
+--source suite/ndb/include/ndb_share_check_shares.inc
+
+#
+# Now...create table if not exists
+#
+--disable_warnings
+let $1=5;
+while ($1)
+{
+ dec $1;
+ connection server1;
+ --send create table if not exists t1 (a int) engine=ndbcluster
+ connection server2;
+ --send create table if not exists t1 (a int) engine=ndbcluster
+ connection server3;
+ --send create table if not exists t1 (a int) engine=ndbcluster
+ connection server4;
+ --send create table if not exists t1 (a int) engine=ndbcluster
+ connection server1;
+ --reap
+ connection server2;
+ --reap
+ connection server3;
+ --reap
+ connection server4;
+ --reap
+ connection server1;
+ drop table t1;
+ --source suite/ndb/include/ndb_share_check_shares.inc
+}
+--enable_warnings
+
+#
+# Now...drop table if exists
+#
+--disable_warnings
+let $1=5;
+while ($1)
+{
+ dec $1;
+ connection server1;
+ create table t1 (a int) engine=ndbcluster;
+
+ connection server1;
+ --send drop table if exists t1
+ connection server2;
+ --send drop table if exists t1
+ connection server3;
+ --send drop table if exists t1
+ connection server4;
+ --send drop table if exists t1
+ connection server1;
+ --reap
+ connection server2;
+ --reap
+ connection server3;
+ --reap
+ connection server4;
+ --reap
+ --source suite/ndb/include/ndb_share_check_shares.inc
+}
+--enable_warnings
+
+#
+# Now...restart
+#
+connection server1;
+create table t1 (a int) engine=ndbcluster;
+
+connection server3;
+create table t2 (a int) engine=ndbcluster;
+
+--exec $NDB_MGM --no-defaults -e "all restart -n" >> $NDB_TOOLS_OUTPUT
+--exec $NDB_TOOLS_DIR/ndb_waiter --no-defaults --ndb-connectstring="$NDB_CONNECTSTRING" --not-started >> $NDB_TOOLS_OUTPUT
+--exec $NDB_MGM --no-defaults -e "all start" >> $NDB_TOOLS_OUTPUT
+--exec $NDB_TOOLS_DIR/ndb_waiter --no-defaults --ndb-connectstring="$NDB_CONNECTSTRING" >> $NDB_TOOLS_OUTPUT
+
+# Wait for mysqld to reconnect and exit from readonly mode
+--disable_query_log
+connection server1;
+--source include/ndb_not_readonly.inc
+connection server2;
+--source include/ndb_not_readonly.inc
+connection server3;
+--source include/ndb_not_readonly.inc
+connection server4;
+--source include/ndb_not_readonly.inc
+--enable_query_log
+
+connection server1;
+desc t1;
+desc t2;
+connection server2;
+desc t1;
+desc t2;
+connection server3;
+desc t1;
+desc t2;
+connection server4;
+desc t1;
+desc t2;
+
+connection server1;
+drop table t1, t2;
+--source suite/ndb/include/ndb_share_check_shares.inc
+
+#
+# Now...restart -i
+#
+connection server1;
+create table t1 (a int) engine=ndbcluster;
+
+connection server3;
+create table t2 (a int) engine=ndbcluster;
+
+--exec $NDB_MGM --no-defaults -e "all restart -i -n" >> $NDB_TOOLS_OUTPUT
+--exec $NDB_TOOLS_DIR/ndb_waiter --no-defaults --ndb-connectstring="$NDB_CONNECTSTRING" --not-started >> $NDB_TOOLS_OUTPUT
+--exec $NDB_MGM --no-defaults -e "all start" >> $NDB_TOOLS_OUTPUT
+--exec $NDB_TOOLS_DIR/ndb_waiter --no-defaults --ndb-connectstring="$NDB_CONNECTSTRING" >> $NDB_TOOLS_OUTPUT
+
+# Wait for mysqld to reconnect and exit from readonly mode
+--disable_query_log
+connection server1;
+--source include/ndb_not_readonly.inc
+connection server2;
+--source include/ndb_not_readonly.inc
+connection server3;
+--source include/ndb_not_readonly.inc
+connection server4;
+--source include/ndb_not_readonly.inc
+--enable_query_log
+
+connection server1;
+--error 1146
+desc t1;
+--error 1146
+desc t2;
+connection server2;
+--error 1146
+desc t1;
+--error 1146
+desc t2;
+connection server3;
+--error 1146
+desc t1;
+--error 1146
+desc t2;
+connection server4;
+--error 1146
+desc t1;
+--error 1146
+desc t2;
+
+--source suite/ndb/include/ndb_share_check_shares.inc
=== modified file 'sql/ha_ndbcluster.cc'
--- a/sql/ha_ndbcluster.cc 2011-06-30 15:55:35 +0000
+++ b/sql/ha_ndbcluster.cc 2011-07-05 14:19:56 +0000
@@ -7829,13 +7829,50 @@ int ha_ndbcluster::rename_table(const ch
Delete table from NDB Cluster.
*/
+static
+void
+delete_table_drop_share(NDB_SHARE* share, const char * path)
+{
+ if (share)
+ {
+ pthread_mutex_lock(&ndbcluster_mutex);
+do_drop:
+ if (share->state != NSS_DROPPED)
+ {
+ /*
+ The share kept by the server has not been freed, free it
+ */
+ share->state= NSS_DROPPED;
+ /* ndb_share reference create free */
+ DBUG_PRINT("NDB_SHARE", ("%s create free use_count: %u",
+ share->key, share->use_count));
+ free_share(&share, TRUE);
+ }
+ /* ndb_share reference temporary free */
+ DBUG_PRINT("NDB_SHARE", ("%s temporary free use_count: %u",
+ share->key, share->use_count));
+ free_share(&share, TRUE);
+ pthread_mutex_unlock(&ndbcluster_mutex);
+ }
+ else if (path)
+ {
+ pthread_mutex_lock(&ndbcluster_mutex);
+ share= get_share(path, 0, FALSE, TRUE);
+ if (share)
+ {
+ goto do_drop;
+ }
+ pthread_mutex_unlock(&ndbcluster_mutex);
+ }
+}
+
/* static version which does not need a handler */
int
-ha_ndbcluster::delete_table(THD *thd, ha_ndbcluster *h, Ndb *ndb,
- const char *path,
- const char *db,
- const char *table_name)
+ha_ndbcluster::drop_table(THD *thd, ha_ndbcluster *h, Ndb *ndb,
+ const char *path,
+ const char *db,
+ const char *table_name)
{
DBUG_ENTER("ha_ndbcluster::ndbcluster_delete_table");
NDBDICT *dict= ndb->getDictionary();
@@ -7931,26 +7968,7 @@ retry_temporary_error1:
if (res)
{
/* the drop table failed for some reason, drop the share anyways */
- if (share)
- {
- pthread_mutex_lock(&ndbcluster_mutex);
- if (share->state != NSS_DROPPED)
- {
- /*
- The share kept by the server has not been freed, free it
- */
- share->state= NSS_DROPPED;
- /* ndb_share reference create free */
- DBUG_PRINT("NDB_SHARE", ("%s create free use_count: %u",
- share->key, share->use_count));
- free_share(&share, TRUE);
- }
- /* ndb_share reference temporary free */
- DBUG_PRINT("NDB_SHARE", ("%s temporary free use_count: %u",
- share->key, share->use_count));
- free_share(&share, TRUE);
- pthread_mutex_unlock(&ndbcluster_mutex);
- }
+ delete_table_drop_share(share, 0);
DBUG_RETURN(res);
}
@@ -7990,26 +8008,7 @@ retry_temporary_error1:
SOT_DROP_TABLE, 0, 0, 1);
}
- if (share)
- {
- pthread_mutex_lock(&ndbcluster_mutex);
- if (share->state != NSS_DROPPED)
- {
- /*
- The share kept by the server has not been freed, free it
- */
- share->state= NSS_DROPPED;
- /* ndb_share reference create free */
- DBUG_PRINT("NDB_SHARE", ("%s create free use_count: %u",
- share->key, share->use_count));
- free_share(&share, TRUE);
- }
- /* ndb_share reference temporary free */
- DBUG_PRINT("NDB_SHARE", ("%s temporary free use_count: %u",
- share->key, share->use_count));
- free_share(&share, TRUE);
- pthread_mutex_unlock(&ndbcluster_mutex);
- }
+ delete_table_drop_share(share, 0);
DBUG_RETURN(0);
}
@@ -8030,6 +8029,7 @@ int ha_ndbcluster::delete_table(const ch
dropped inside ndb.
Just drop local files.
*/
+ delete_table_drop_share(0, name);
DBUG_RETURN(handler::delete_table(name));
}
@@ -8064,8 +8064,8 @@ int ha_ndbcluster::delete_table(const ch
If it was already gone it might have been dropped
remotely, give a warning and then drop .ndb file.
*/
- if (!(error= delete_table(thd, this, ndb, name,
- m_dbname, m_tabname)) ||
+ if (!(error= drop_table(thd, this, ndb, name,
+ m_dbname, m_tabname)) ||
error == HA_ERR_NO_SUCH_TABLE)
{
/* Call ancestor function to delete .ndb file */
@@ -8986,7 +8986,7 @@ int ndbcluster_drop_database_impl(THD *t
{
tablename_to_filename(tabname, tmp, FN_REFLEN - (tmp - full_path)-1);
pthread_mutex_lock(&LOCK_open);
- if (ha_ndbcluster::delete_table(thd, 0, ndb, full_path, dbname, tabname))
+ if (ha_ndbcluster::drop_table(thd, 0, ndb, full_path, dbname, tabname))
{
const NdbError err= dict->getNdbError();
if (err.code != 709 && err.code != 723)
@@ -9611,6 +9611,24 @@ ndbcluster_init_error:
DBUG_RETURN(TRUE);
}
+#ifndef DBUG_OFF
+static
+const char*
+get_share_state_string(NDB_SHARE_STATE s)
+{
+ switch(s) {
+ case NSS_INITIAL:
+ return "NSS_INITIAL";
+ case NSS_ALTERED:
+ return "NSS_ALTERED";
+ case NSS_DROPPED:
+ return "NSS_DROPPED";
+ }
+ assert(false);
+ return "<unknown>";
+}
+#endif
+
int ndbcluster_binlog_end(THD *thd);
static int ndbcluster_end(handlerton *hton, ha_panic_function type)
@@ -9626,17 +9644,22 @@ static int ndbcluster_end(handlerton *ht
{
pthread_mutex_lock(&ndbcluster_mutex);
+ uint save = ndbcluster_open_tables.records;
while (ndbcluster_open_tables.records)
{
NDB_SHARE *share=
(NDB_SHARE*) my_hash_element(&ndbcluster_open_tables, 0);
#ifndef DBUG_OFF
- fprintf(stderr, "NDB: table share %s with use_count %d not freed\n",
- share->key, share->use_count);
+ fprintf(stderr,
+ "NDB: table share %s with use_count %d state: %s(%u) not freed\n",
+ share->key, share->use_count,
+ get_share_state_string(share->state),
+ (uint)share->state);
#endif
ndbcluster_real_free_share(&share);
}
pthread_mutex_unlock(&ndbcluster_mutex);
+ DBUG_ASSERT(save == 0);
}
my_hash_free(&ndbcluster_open_tables);
@@ -11760,8 +11783,6 @@ pthread_handler_t ndb_util_thread_func(v
if (ndb_extra_logging && ndb_binlog_running)
sql_print_information("NDB Binlog: Ndb tables initially read only.");
- /* create tables needed by the replication */
- ndbcluster_setup_binlog_table_shares(thd);
set_timespec(abstime, 0);
for (;;)
@@ -13716,6 +13737,54 @@ SHOW_VAR ndb_status_variables_export[]=
{NullS, NullS, SHOW_LONG}
};
+#ifndef DBUG_OFF
+
+static
+void
+dbug_check_shares(THD*, st_mysql_sys_var*, void*, const void*)
+{
+ sql_print_information("dbug_check_shares");
+ for (uint i= 0; i < ndbcluster_open_tables.records; i++)
+ {
+ NDB_SHARE * share = (NDB_SHARE*)my_hash_element(&ndbcluster_open_tables, i);
+ sql_print_information(" %s.%s: state: %s(%u) use_count: %u",
+ share->db, share->table_name,
+ get_share_state_string(share->state),
+ (unsigned)share->state,
+ share->use_count);
+ }
+
+ /**
+ * Only shares in mysql database may be open...
+ */
+ for (uint i= 0; i < ndbcluster_open_tables.records; i++)
+ {
+ NDB_SHARE * share = (NDB_SHARE*)my_hash_element(&ndbcluster_open_tables, i);
+ DBUG_ASSERT(strcmp(share->db, "mysql") == 0);
+ }
+}
+
+static MYSQL_THDVAR_UINT(
+ check_shares, /* name */
+ PLUGIN_VAR_RQCMDARG,
+ "Debug, only...check that no shares are lingering...",
+ NULL, /* check func */
+ dbug_check_shares, /* update func */
+ 0, /* default */
+ 0, /* min */
+ 1, /* max */
+ 0 /* block */
+);
+
+#endif
+
+static struct st_mysql_sys_var* system_variables[]= {
+#ifndef DBUG_OFF
+ MYSQL_SYSVAR(check_shares),
+#endif
+ NULL
+};
+
struct st_mysql_storage_engine ndbcluster_storage_engine=
{ MYSQL_HANDLERTON_INTERFACE_VERSION };
@@ -13731,7 +13800,7 @@ mysql_declare_plugin(ndbcluster)
NULL, /* Plugin Deinit */
0x0100 /* 1.0 */,
ndb_status_variables_export,/* status variables */
- NULL, /* system variables */
+ system_variables, /* system variables */
NULL /* config options */
}
mysql_declare_plugin_end;
=== modified file 'sql/ha_ndbcluster.h'
--- a/sql/ha_ndbcluster.h 2011-06-30 15:55:35 +0000
+++ b/sql/ha_ndbcluster.h 2011-07-05 14:19:56 +0000
@@ -608,10 +608,11 @@ private:
NDB_SHARE *share);
void check_read_before_write_removal();
- static int delete_table(THD *thd, ha_ndbcluster *h, Ndb *ndb,
- const char *path,
- const char *db,
- const char *table_name);
+ static int drop_table(THD *thd, ha_ndbcluster *h, Ndb *ndb,
+ const char *path,
+ const char *db,
+ const char *table_name);
+
int add_index_impl(THD *thd, TABLE *table_arg,
KEY *key_info, uint num_of_keys);
int create_ndb_index(THD *thd, const char *name, KEY *key_info, bool unique);
=== modified file 'sql/ha_ndbcluster_binlog.cc'
--- a/sql/ha_ndbcluster_binlog.cc 2011-07-04 12:36:04 +0000
+++ b/sql/ha_ndbcluster_binlog.cc 2011-07-05 14:19:56 +0000
@@ -1191,7 +1191,12 @@ static int ndbcluster_create_ndb_apply_s
" end_pos BIGINT UNSIGNED NOT NULL, "
" PRIMARY KEY USING HASH (server_id) ) ENGINE=NDB CHARACTER SET latin1");
- const int no_print_error[6]= {ER_TABLE_EXISTS_ERROR,
+ const int no_print_error[]= { ER_TABLE_EXISTS_ERROR,
+ /**
+ * 157(no-connection) has no special ER_
+ * but simply gives ER_CANT_CREATE_TABLE
+ */
+ ER_CANT_CREATE_TABLE,
701,
702,
721, // Table already exist
@@ -1268,7 +1273,12 @@ static int ndbcluster_create_schema_tabl
" type INT UNSIGNED NOT NULL,"
" PRIMARY KEY USING HASH (db,name) ) ENGINE=NDB CHARACTER SET latin1");
- const int no_print_error[6]= {ER_TABLE_EXISTS_ERROR,
+ const int no_print_error[]= { ER_TABLE_EXISTS_ERROR,
+ /**
+ * 157(no-connection) has no special ER_
+ * but simply gives ER_CANT_CREATE_TABLE
+ */
+ ER_CANT_CREATE_TABLE,
701,
702,
721, // Table already exist
@@ -6628,6 +6638,58 @@ restart_cluster_failure:
thd_ndb= NULL;
}
+ /**
+ * release all extra references from tables
+ */
+ {
+ if (ndb_extra_logging > 9)
+ sql_print_information("NDB Binlog: Release extra share references");
+
+ pthread_mutex_lock(&ndbcluster_mutex);
+ for (uint i= 0; i < ndbcluster_open_tables.records;)
+ {
+ NDB_SHARE * share = (NDB_SHARE*)my_hash_element(&ndbcluster_open_tables,
+ i);
+ if (share->state != NSS_DROPPED)
+ {
+ /*
+ The share kept by the server has not been freed, free it
+ */
+ share->state= NSS_DROPPED;
+ /* ndb_share reference create free */
+ DBUG_PRINT("NDB_SHARE", ("%s create free use_count: %u",
+ share->key, share->use_count));
+ free_share(&share, TRUE);
+
+ /**
+ * This might have altered hash table...not sure if it's stable..
+ * so we'll restart instead
+ */
+ i = 0;
+ }
+ else
+ {
+ i++;
+ }
+ }
+ pthread_mutex_unlock(&ndbcluster_mutex);
+ }
+
+ close_cached_tables((THD*) 0, (TABLE_LIST*) 0, FALSE, FALSE, FALSE);
+ if (ndb_extra_logging > 15)
+ {
+ sql_print_information("NDB Binlog: remaining open tables: ");
+ for (uint i= 0; i < ndbcluster_open_tables.records; i++)
+ {
+ NDB_SHARE* share = (NDB_SHARE*)my_hash_element(&ndbcluster_open_tables,i);
+ sql_print_information(" %s.%s state: %u use_count: %u",
+ share->db,
+ share->table_name,
+ (uint)share->state,
+ share->use_count);
+ }
+ }
+
if (do_ndbcluster_binlog_close_connection == BCCC_restart)
{
pthread_mutex_lock(&injector_mutex);
No bundle (reason: useless for push emails).
| Thread |
|---|
| • bzr push into mysql-5.1-telco-6.3 branch (jonas.oreland:3443 to 3445) | Jonas Oreland | 5 Jul |