From: magnus.blaudd Date: June 25 2012 1:14pm Subject: bzr push into mysql-5.5-cluster-7.3 branch (magnus.blaudd:3893 to 3894) List-Archive: http://lists.mysql.com/commits/144308 Message-Id: <20120625131443.14834.49347.3894@peek02.se.oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit 3894 magnus.blaudd@stripped 2012-06-25 [merge] Merge 7.2 -> 7.3 modified: mysql-test/suite/ndb/r/ndb_alter_table_online.result mysql-test/suite/ndb/r/ndb_index_stat_restart.result mysql-test/suite/ndb/r/ndb_reconnect.result mysql-test/suite/ndb/t/ndb_alter_table_online.test mysql-test/suite/ndb/t/ndb_reconnect.test mysql-test/suite/ndb_big/my.cnf sql/ha_ndbcluster.cc sql/ha_ndbcluster_binlog.cc sql/ndb_thd_ndb.h sql/sql_show.cc sql/sql_show.h sql/sql_table.cc storage/ndb/include/kernel/ndb_limits.h storage/ndb/include/kernel/signaldata/CreateTable.hpp storage/ndb/include/kernel/signaldata/DictTabInfo.hpp storage/ndb/include/kernel/signaldata/ScanTab.hpp storage/ndb/include/ndb_version.h.in storage/ndb/src/common/debugger/signaldata/DictTabInfo.cpp storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp storage/ndb/src/kernel/blocks/dbdih/Dbdih.hpp storage/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp storage/ndb/src/kernel/blocks/ndbcntr/NdbcntrMain.cpp storage/ndb/src/kernel/blocks/ndbfs/AsyncIoThread.hpp storage/ndb/src/kernel/blocks/ndbfs/Ndbfs.cpp storage/ndb/src/kernel/blocks/suma/Suma.hpp storage/ndb/src/kernel/vm/SimulatedBlock.hpp storage/ndb/src/kernel/vm/mt.cpp storage/ndb/src/ndbapi/NdbDictionary.cpp storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp storage/ndb/src/ndbapi/NdbQueryOperation.cpp storage/ndb/src/ndbapi/NdbScanOperation.cpp storage/ndb/test/include/NdbBackup.hpp storage/ndb/test/include/NdbConfig.hpp storage/ndb/test/ndbapi/testBackup.cpp storage/ndb/test/ndbapi/testBasic.cpp storage/ndb/test/ndbapi/testSystemRestart.cpp storage/ndb/test/ndbapi/testTimeout.cpp storage/ndb/test/ndbapi/testUpgrade.cpp storage/ndb/test/run-test/daily-basic-tests.txt support-files/mysql.spec.sh 3893 magnus.blaudd@stripped 2012-06-13 [merge] Merge 7.2 -> 7.3 removed: mysql-test/suite/innodb/include/innodb-index.inc mysql-test/t/cache_innodb-master.opt added: mysql-test/include/show_slave_hosts.inc mysql-test/r/blackhole.result mysql-test/r/bug12427262.result mysql-test/r/partition_cache.result mysql-test/suite/innodb/r/innodb_bug11766634.result mysql-test/suite/innodb/r/innodb_bug12902967.result mysql-test/suite/innodb/r/innodb_bug13635833.result mysql-test/suite/innodb/r/innodb_bug14007649.result mysql-test/suite/innodb/t/innodb_bug11766634-master.opt mysql-test/suite/innodb/t/innodb_bug11766634.test mysql-test/suite/innodb/t/innodb_bug12902967.test mysql-test/suite/innodb/t/innodb_bug13635833.test mysql-test/suite/innodb/t/innodb_bug14007649.test mysql-test/suite/rpl/r/rpl_auto_increment_bug45679.result mysql-test/suite/rpl/r/rpl_parallel_show_binlog_events_purge_logs.result mysql-test/suite/rpl/r/rpl_report_port.result mysql-test/suite/rpl/r/rpl_row_merge_engine.result mysql-test/suite/rpl/r/rpl_stm_relay_ign_space.result mysql-test/suite/rpl/t/rpl_auto_increment_bug45679.test mysql-test/suite/rpl/t/rpl_parallel_show_binlog_events_purge_logs.test mysql-test/suite/rpl/t/rpl_report_port-master.opt mysql-test/suite/rpl/t/rpl_report_port.test mysql-test/suite/rpl/t/rpl_row_merge_engine.test mysql-test/suite/rpl/t/rpl_stm_relay_ign_space-slave.opt mysql-test/suite/rpl/t/rpl_stm_relay_ign_space.test mysql-test/t/blackhole.test mysql-test/t/bug12427262.test mysql-test/t/partition_cache.test sql/mem_root_array.h storage/ndb/clusterj/clusterj-test/src/main/java/testsuite/clusterj/QueryOrderingTest.java storage/ndb/clusterj/clusterj-tie/src/test/java/testsuite/clusterj/tie/QueryOrderingTest.java storage/ndb/tools/ndb_blob_tool.cpp renamed: mysql-test/include/rpl_multi_engine2.inc => mysql-test/suite/ndb_rpl/t/ndb_rpl_multi_engine2.inc modified: VERSION client/mysqldump.c client/mysqlslap.c config.h.cmake configure.cmake include/my_base.h include/violite.h libmysqld/lib_sql.cc mysql-test/extra/rpl_tests/rpl_row_basic.test mysql-test/include/query_cache.inc mysql-test/mysql-test-run.pl mysql-test/r/alter_table.result mysql-test/r/cache_innodb.result mysql-test/r/cast.result mysql-test/r/ctype_ucs.result mysql-test/r/errors.result mysql-test/r/filesort_debug.result mysql-test/r/func_in.result mysql-test/r/gis.result mysql-test/r/help.result mysql-test/r/mysqld--help-notwin.result mysql-test/r/mysqld--help-win.result mysql-test/r/mysqldump.result mysql-test/r/mysqlslap.result mysql-test/r/partition_innodb.result mysql-test/r/partition_pruning.result mysql-test/r/ps.result mysql-test/r/select.result mysql-test/r/sp-bugs.result mysql-test/r/sp-code.result mysql-test/r/sp.result mysql-test/r/sp_notembedded.result mysql-test/r/sql_mode.result mysql-test/r/subselect.result mysql-test/r/subselect_innodb.result mysql-test/r/user_var.result mysql-test/r/view.result mysql-test/r/xa.result mysql-test/suite/binlog/r/binlog_grant.result mysql-test/suite/binlog/r/binlog_sql_mode.result mysql-test/suite/binlog/r/binlog_unsafe.result mysql-test/suite/binlog/t/binlog_grant.test mysql-test/suite/binlog/t/binlog_sql_mode.test mysql-test/suite/binlog/t/binlog_unsafe.test mysql-test/suite/innodb/r/innodb-autoinc.result mysql-test/suite/innodb/t/innodb-autoinc.test mysql-test/suite/innodb/t/innodb_bug34300.test mysql-test/suite/ndb/r/ndb_alter_table_online.result mysql-test/suite/ndb/r/ndb_basic.result mysql-test/suite/ndb/r/ndb_condition_pushdown.result mysql-test/suite/ndb/r/ndb_gis.result mysql-test/suite/ndb/r/ndb_join_pushdown_default.result mysql-test/suite/ndb/t/ndb_alter_table_online.test mysql-test/suite/ndb/t/ndb_join_pushdown.inc mysql-test/suite/ndb_rpl/r/ndb_rpl_dd_advance.result mysql-test/suite/ndb_rpl/t/ndb_rpl_2multi_basic.inc mysql-test/suite/ndb_rpl/t/ndb_rpl_dd_advance.test mysql-test/suite/rpl/r/rpl_filter_tables_not_exist.result mysql-test/suite/rpl/r/rpl_known_bugs_detection.result mysql-test/suite/rpl/r/rpl_row_basic_2myisam.result mysql-test/suite/rpl/r/rpl_row_basic_3innodb.result mysql-test/suite/rpl/r/rpl_row_basic_allow_batching.result mysql-test/suite/rpl/r/rpl_show_slave_hosts.result mysql-test/suite/rpl/t/rpl_filter_tables_not_exist.test mysql-test/suite/rpl/t/rpl_show_slave_hosts.test mysql-test/suite/sys_vars/t/report_port_basic.test mysql-test/t/alter_table.test mysql-test/t/cast.test mysql-test/t/ctype_ucs.test mysql-test/t/errors.test mysql-test/t/filesort_debug.test mysql-test/t/func_in.test mysql-test/t/gis.test mysql-test/t/help.test mysql-test/t/mysqldump.test mysql-test/t/mysqlslap.test mysql-test/t/partition_innodb.test mysql-test/t/ps.test mysql-test/t/select.test mysql-test/t/sp-bugs.test mysql-test/t/sp-code.test mysql-test/t/sp.test mysql-test/t/sp_notembedded.test mysql-test/t/sql_mode.test mysql-test/t/subselect.test mysql-test/t/subselect_innodb.test mysql-test/t/user_var.test mysql-test/t/view.test mysql-test/t/xa.test mysys/lf_alloc-pin.c mysys/my_handler_errors.h mysys/stacktrace.c sql/field.cc sql/field.h sql/field_conv.cc sql/filesort.cc sql/ha_ndbcluster.cc sql/ha_ndbcluster_push.cc sql/ha_partition.cc sql/ha_partition.h sql/handler.cc sql/handler.h sql/item.cc sql/item.h sql/item_cmpfunc.h sql/item_subselect.cc sql/item_timefunc.cc sql/log.cc sql/log.h sql/log_event.cc sql/log_event.h sql/log_event_old.cc sql/mysqld.cc sql/password.c sql/rpl_rli.cc sql/rpl_rli.h sql/rpl_utility.cc sql/rpl_utility.h sql/share/errmsg-utf8.txt sql/signal_handler.cc sql/slave.cc sql/sp_head.cc sql/spatial.cc sql/sql_base.cc sql/sql_class.cc sql/sql_class.h sql/sql_lex.cc sql/sql_lex.h sql/sql_parse.cc sql/sql_prepare.cc sql/sql_repl.cc sql/sql_select.cc sql/sql_show.cc sql/sql_table.cc sql/sql_view.cc sql/sys_vars.cc sql/table.cc sql/transaction.cc storage/blackhole/ha_blackhole.cc storage/example/ha_example.cc storage/innobase/btr/btr0btr.c storage/innobase/btr/btr0cur.c storage/innobase/btr/btr0pcur.c storage/innobase/buf/buf0buf.c storage/innobase/buf/buf0flu.c storage/innobase/buf/buf0lru.c storage/innobase/dict/dict0dict.c storage/innobase/dict/dict0load.c storage/innobase/fil/fil0fil.c storage/innobase/fsp/fsp0fsp.c storage/innobase/handler/ha_innodb.cc storage/innobase/handler/ha_innodb.h storage/innobase/handler/handler0alter.cc storage/innobase/ibuf/ibuf0ibuf.c storage/innobase/include/btr0btr.h storage/innobase/include/buf0buf.h storage/innobase/include/buf0lru.h storage/innobase/include/buf0types.h storage/innobase/include/db0err.h storage/innobase/include/dict0dict.h storage/innobase/include/dict0dict.ic storage/innobase/include/dict0mem.h storage/innobase/include/fil0fil.h storage/innobase/include/mtr0mtr.ic storage/innobase/include/srv0srv.h storage/innobase/include/sync0rw.h storage/innobase/include/sync0rw.ic storage/innobase/include/trx0purge.h storage/innobase/include/univ.i storage/innobase/lock/lock0lock.c storage/innobase/log/log0log.c storage/innobase/row/row0ins.c storage/innobase/row/row0merge.c storage/innobase/row/row0mysql.c storage/innobase/row/row0row.c storage/innobase/srv/srv0srv.c storage/innobase/srv/srv0start.c storage/innobase/sync/sync0arr.c storage/innobase/trx/trx0purge.c storage/innobase/ut/ut0ut.c storage/myisam/ha_myisam.cc storage/myisam/mi_dynrec.c storage/ndb/clusterj/clusterj-api/src/main/java/com/mysql/clusterj/Query.java storage/ndb/clusterj/clusterj-core/src/main/java/com/mysql/clusterj/core/query/CandidateIndexImpl.java storage/ndb/clusterj/clusterj-core/src/main/java/com/mysql/clusterj/core/query/InPredicateImpl.java storage/ndb/clusterj/clusterj-core/src/main/java/com/mysql/clusterj/core/query/PredicateImpl.java storage/ndb/clusterj/clusterj-core/src/main/java/com/mysql/clusterj/core/query/QueryDomainTypeImpl.java storage/ndb/clusterj/clusterj-core/src/main/java/com/mysql/clusterj/core/query/QueryExecutionContextImpl.java storage/ndb/clusterj/clusterj-core/src/main/java/com/mysql/clusterj/core/query/QueryImpl.java storage/ndb/clusterj/clusterj-core/src/main/java/com/mysql/clusterj/core/store/ScanOperation.java storage/ndb/clusterj/clusterj-core/src/main/resources/com/mysql/clusterj/core/Bundle.properties storage/ndb/clusterj/clusterj-jdbc/src/main/java/com/mysql/clusterj/jdbc/SQLExecutor.java storage/ndb/clusterj/clusterj-openjpa/CMakeLists.txt storage/ndb/clusterj/clusterj-test/src/main/java/testsuite/clusterj/AbstractQueryTest.java storage/ndb/clusterj/clusterj-tie/src/main/java/com/mysql/clusterj/tie/NdbRecordIndexScanOperationImpl.java storage/ndb/clusterj/clusterj-tie/src/main/java/com/mysql/clusterj/tie/NdbRecordScanOperationImpl.java storage/ndb/clusterj/clusterj-tie/src/main/java/com/mysql/clusterj/tie/ScanOperationImpl.java storage/ndb/clusterj/clusterj-unit/src/main/java/junit/framework/TestCase.java storage/ndb/include/ndb_config.h.in storage/ndb/include/ndb_version.h.in storage/ndb/include/ndbapi/Ndb.hpp storage/ndb/include/ndbapi/NdbScanOperation.hpp storage/ndb/include/portlib/NdbSleep.h storage/ndb/include/transporter/TransporterRegistry.hpp storage/ndb/ndb_configure.cmake storage/ndb/src/common/transporter/TCP_Transporter.cpp storage/ndb/src/common/transporter/Transporter.cpp storage/ndb/src/common/transporter/Transporter.hpp storage/ndb/src/common/util/HashMap2.cpp storage/ndb/src/common/util/version.cpp storage/ndb/src/kernel/blocks/dblqh/Dblqh.hpp storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp storage/ndb/src/ndbapi/Ndb.cpp storage/ndb/src/ndbapi/Ndbinit.cpp storage/ndb/src/ndbapi/Ndblist.cpp storage/ndb/test/ndbapi/flexAsynch.cpp storage/ndb/tools/CMakeLists.txt storage/perfschema/pfs_instr.cc vio/viosocket.c === modified file 'mysql-test/suite/ndb/r/ndb_alter_table_online.result' --- a/mysql-test/suite/ndb/r/ndb_alter_table_online.result 2012-06-13 19:32:58 +0000 +++ b/mysql-test/suite/ndb/r/ndb_alter_table_online.result 2012-06-21 10:12:34 +0000 @@ -649,3 +649,39 @@ alter online table t1 add e varchar(20) ERROR 42000: This version of MySQL doesn't yet support 'alter online table t1 add e varchar(20) default 'x' column_format dynamic' alter online table t1 add e varchar(20) default null column_format dynamic; drop table t1; +CREATE TABLE categorylinks ( +cl_from int(10) unsigned NOT NULL DEFAULT '0', +cl_to varbinary(255) NOT NULL DEFAULT '', +cl_sortkey varbinary(70) NOT NULL DEFAULT '', +cl_timestamp timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE +CURRENT_TIMESTAMP, +UNIQUE KEY cl_from (cl_from,cl_to), +KEY cl_sortkey (cl_to,cl_sortkey,cl_from), +KEY cl_timestamp (cl_to,cl_timestamp) +) ENGINE=ndb DEFAULT CHARSET=binary; +ALTER TABLE categorylinks +CHANGE COLUMN cl_sortkey cl_sortkey varbinary(230) NOT NULL default +'', +ADD COLUMN cl_sortkey_prefix varchar(255) binary NOT NULL default '', +ADD COLUMN cl_collation varbinary(32) NOT NULL default '', +ADD COLUMN cl_type ENUM('page', 'subcat', 'file') NOT NULL default +'page', +ADD INDEX (cl_collation), +DROP INDEX cl_sortkey, +ADD INDEX cl_sortkey (cl_to, cl_type, cl_sortkey, cl_from); +SHOW CREATE TABLE categorylinks; +Table Create Table +categorylinks CREATE TABLE `categorylinks` ( + `cl_from` int(10) unsigned NOT NULL DEFAULT '0', + `cl_to` varbinary(255) NOT NULL DEFAULT '', + `cl_sortkey` varbinary(230) NOT NULL DEFAULT '', + `cl_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `cl_sortkey_prefix` varbinary(255) NOT NULL DEFAULT '', + `cl_collation` varbinary(32) NOT NULL DEFAULT '', + `cl_type` enum('page','subcat','file') NOT NULL DEFAULT 'page', + UNIQUE KEY `cl_from` (`cl_from`,`cl_to`), + KEY `cl_timestamp` (`cl_to`,`cl_timestamp`), + KEY `cl_collation` (`cl_collation`), + KEY `cl_sortkey` (`cl_to`,`cl_type`,`cl_sortkey`,`cl_from`) +) ENGINE=ndbcluster DEFAULT CHARSET=binary +DROP TABLE categorylinks; === modified file 'mysql-test/suite/ndb/r/ndb_index_stat_restart.result' --- a/mysql-test/suite/ndb/r/ndb_index_stat_restart.result 2012-03-27 09:47:51 +0000 +++ b/mysql-test/suite/ndb/r/ndb_index_stat_restart.result 2012-06-15 10:58:32 +0000 @@ -44,7 +44,7 @@ Ndb_index_stat_cache_clean 0 set global ndb_dbg_check_shares=1; drop table if exists t1; Warnings: -Warning 155 Table 'test.t1' doesn't exist +Note 1051 Unknown table 't1' create table t1 ( a int primary key, b int, === modified file 'mysql-test/suite/ndb/r/ndb_reconnect.result' --- a/mysql-test/suite/ndb/r/ndb_reconnect.result 2009-02-03 13:35:56 +0000 +++ b/mysql-test/suite/ndb/r/ndb_reconnect.result 2012-06-14 11:48:36 +0000 @@ -26,3 +26,33 @@ a b c 1 row 1 2 insert into t1 values (2, "row 1", 37); drop table t1; +create table t1(a int, b varchar(10), c date) engine=ndb; +CREATE TRIGGER trg1 BEFORE UPDATE ON t1 FOR EACH ROW BEGIN +SET new.c = '1901-01-01 01:01:01'; +End // +insert into t1 values (1, "row 1", NULL),(2, "row 2", NULL); +select * from t1 order by a; +a b c +1 row 1 NULL +2 row 2 NULL +create table t2(a int, b varchar(10), c date) engine=myisam; +CREATE TRIGGER trg2 BEFORE UPDATE ON t2 FOR EACH ROW BEGIN +SET new.c = '1901-01-01 01:01:01'; +End // +create table t1(a int, b varchar(10), c date) engine=ndb; +CREATE TRIGGER trg1 BEFORE UPDATE ON t1 FOR EACH ROW BEGIN +SET new.c = '1902-02-02 02:02:02'; +End // +insert into t1 values (1, "row 1", NULL),(2, "row 2", NULL); +select * from t1 order by a; +a b c +1 row 1 NULL +2 row 2 NULL +create table t2(a int, b varchar(10), c date) engine=myisam; +ERROR 42S01: Table 't2' already exists +drop table t2; +create table t2(a int, b varchar(10), c date) engine=myisam; +CREATE TRIGGER trg2 BEFORE UPDATE ON t2 FOR EACH ROW BEGIN +SET new.c = '1901-01-01 01:01:01'; +End // +drop table t1, t2; === modified file 'mysql-test/suite/ndb/t/ndb_alter_table_online.test' --- a/mysql-test/suite/ndb/t/ndb_alter_table_online.test 2012-06-13 19:32:58 +0000 +++ b/mysql-test/suite/ndb/t/ndb_alter_table_online.test 2012-06-21 10:12:34 +0000 @@ -703,3 +703,33 @@ create table t1(a int(10) unsigned not n alter online table t1 add e varchar(20) default 'x' column_format dynamic; alter online table t1 add e varchar(20) default null column_format dynamic; drop table t1; + +# +# Bug #12755722 61528: INNODB BACKEND CRASHES ON ALTER TABLE STATEMENT (MYSQL SERVER HAS GONE AWAY +# + +CREATE TABLE categorylinks ( + cl_from int(10) unsigned NOT NULL DEFAULT '0', + cl_to varbinary(255) NOT NULL DEFAULT '', + cl_sortkey varbinary(70) NOT NULL DEFAULT '', + cl_timestamp timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE +CURRENT_TIMESTAMP, + UNIQUE KEY cl_from (cl_from,cl_to), + KEY cl_sortkey (cl_to,cl_sortkey,cl_from), + KEY cl_timestamp (cl_to,cl_timestamp) +) ENGINE=ndb DEFAULT CHARSET=binary; + +ALTER TABLE categorylinks + CHANGE COLUMN cl_sortkey cl_sortkey varbinary(230) NOT NULL default +'', + ADD COLUMN cl_sortkey_prefix varchar(255) binary NOT NULL default '', + ADD COLUMN cl_collation varbinary(32) NOT NULL default '', + ADD COLUMN cl_type ENUM('page', 'subcat', 'file') NOT NULL default +'page', + ADD INDEX (cl_collation), + DROP INDEX cl_sortkey, + ADD INDEX cl_sortkey (cl_to, cl_type, cl_sortkey, cl_from); + +SHOW CREATE TABLE categorylinks; + +DROP TABLE categorylinks; \ No newline at end of file === modified file 'mysql-test/suite/ndb/t/ndb_reconnect.test' --- a/mysql-test/suite/ndb/t/ndb_reconnect.test 2009-06-06 13:04:45 +0000 +++ b/mysql-test/suite/ndb/t/ndb_reconnect.test 2012-06-15 09:14:25 +0000 @@ -76,3 +76,69 @@ insert into t1 values (2, "row 1", 37); # cleanup drop table t1; + +# +#Bug #13824846 FRM FILES ARE CREATED FOR MYSQLD, BUT TABLE DOES NOT EXIST IN CLUSTER +# + +connection default; +create table t1(a int, b varchar(10), c date) engine=ndb; +delimiter //; +CREATE TRIGGER trg1 BEFORE UPDATE ON t1 FOR EACH ROW BEGIN + SET new.c = '1901-01-01 01:01:01'; +End // +delimiter ;// + +insert into t1 values (1, "row 1", NULL),(2, "row 2", NULL); +select * from t1 order by a; + +create table t2(a int, b varchar(10), c date) engine=myisam; +delimiter //; +CREATE TRIGGER trg2 BEFORE UPDATE ON t2 FOR EACH ROW BEGIN + SET new.c = '1901-01-01 01:01:01'; +End // +delimiter ;// + +# drop the ndb table inside ndb +system exec $NDB_DROP_TABLE --no-defaults -d test t1 >> $NDB_TOOLS_OUTPUT ; + +# Restart cluster nodes and clear all meta-data +--exec $NDB_MGM --no-defaults --ndb-connectstring="$NDB_CONNECTSTRING" -e "all restart" >> $NDB_TOOLS_OUTPUT +# Wait for all nodes to enter "started" +--exec $NDB_WAITER --no-defaults --ndb-connectstring="$NDB_CONNECTSTRING" >> $NDB_TOOLS_OUTPUT + +# +# Wait until the connection to the +# cluster has been restored or timeout occurs +# +connection default; +--disable_result_log +--disable_query_log +--source include/ndb_not_readonly.inc +--enable_result_log +--enable_query_log + +# Create the table again to check there are no conflicts +create table t1(a int, b varchar(10), c date) engine=ndb; +delimiter //; +CREATE TRIGGER trg1 BEFORE UPDATE ON t1 FOR EACH ROW BEGIN + SET new.c = '1902-02-02 02:02:02'; +End // +delimiter ;// + +insert into t1 values (1, "row 1", NULL),(2, "row 2", NULL); +select * from t1 order by a; + +# Check that only ndb tables have been cleaned away +--error ER_TABLE_EXISTS_ERROR +create table t2(a int, b varchar(10), c date) engine=myisam; +drop table t2; +create table t2(a int, b varchar(10), c date) engine=myisam; +delimiter //; +CREATE TRIGGER trg2 BEFORE UPDATE ON t2 FOR EACH ROW BEGIN + SET new.c = '1901-01-01 01:01:01'; +End // +delimiter ;// + +# cleanup +drop table t1, t2; === modified file 'mysql-test/suite/ndb_big/my.cnf' --- a/mysql-test/suite/ndb_big/my.cnf 2011-11-10 13:33:56 +0000 +++ b/mysql-test/suite/ndb_big/my.cnf 2012-06-20 07:36:18 +0000 @@ -16,7 +16,7 @@ mysqld= DataMemory=700M IndexMemory=220M -MaxNoOfConcurrentOperations=32768 +MaxNoOfConcurrentOperations=262144 StringMemory=25 MaxNoOfTables=12800 MaxNoOfOrderedIndexes=12800 === modified file 'sql/ha_ndbcluster.cc' --- a/sql/ha_ndbcluster.cc 2012-06-13 19:43:03 +0000 +++ b/sql/ha_ndbcluster.cc 2012-06-25 13:08:47 +0000 @@ -11605,8 +11605,19 @@ ndbcluster_find_files(handlerton *hton, { DBUG_PRINT("info", ("NDB says %s does not exists", file_name->str)); it.remove(); - // Put in list of tables to remove from disk - delete_list.push_back(thd->strdup(file_name->str)); + if (thd == injector_thd && + thd_ndb->options & TNTO_NO_REMOVE_STRAY_FILES) + { + /* + Don't delete anything when called from + the binlog thread. This is a kludge to avoid + that something is deleted when "Ndb schema dist" + uses find_files() to check for "local tables in db" + */ + } + else + // Put in list of tables to remove from disk + delete_list.push_back(thd->strdup(file_name->str)); } } === modified file 'sql/ha_ndbcluster_binlog.cc' --- a/sql/ha_ndbcluster_binlog.cc 2012-03-28 15:55:23 +0000 +++ b/sql/ha_ndbcluster_binlog.cc 2012-06-15 10:08:39 +0000 @@ -1090,6 +1090,51 @@ static void ndb_notify_tables_writable() } /* + + */ + +static void clean_away_stray_files(THD *thd) +{ + /* + Clean-up any stray files for non-existing NDB tables + */ + LOOKUP_FIELD_VALUES lookup_field_values; + bool with_i_schema; + List db_names; + List_iterator_fast it(db_names); + LEX_STRING *db_name; + List tab_names; + char path[FN_REFLEN + 1]; + + DBUG_ENTER("clean_away_stray_files"); + bzero((char*) &lookup_field_values, sizeof(LOOKUP_FIELD_VALUES)); + if (make_db_list(thd, &db_names, &lookup_field_values, &with_i_schema)) + { + thd->clear_error(); + DBUG_PRINT("info", ("Failed to find databases")); + DBUG_VOID_RETURN; + } + it.rewind(); + while ((db_name= it++)) + { + DBUG_PRINT("info", ("Found database %s", db_name->str)); + if (strcmp(NDB_REP_DB, db_name->str)) /* Skip system database */ + { + sql_print_information("NDB: Cleaning stray tables from database '%s'", + db_name->str); + build_table_filename(path, sizeof(path) - 1, db_name->str, "", "", 0); + if (find_files(thd, &tab_names, db_name->str, path, NullS, 0) + != FIND_FILES_OK) + { + thd->clear_error(); + DBUG_PRINT("info", ("Failed to find tables")); + } + } + } + DBUG_VOID_RETURN; +} + +/* Ndb has no representation of the database schema objects. The mysql.ndb_schema table contains the latest schema operations done via a mysqld, and thus reflects databases created/dropped/altered @@ -1227,7 +1272,7 @@ static int ndbcluster_find_all_databases if (database_exists) { /* drop missing database */ - sql_print_information("NDB: Discovered reamining database '%s'", db); + sql_print_information("NDB: Discovered remaining database '%s'", db); } } } @@ -1442,6 +1487,8 @@ ndb_binlog_setup(THD *thd) } } + clean_away_stray_files(thd); + if (ndbcluster_find_all_databases(thd)) { return false; === modified file 'sql/ndb_thd_ndb.h' --- a/sql/ndb_thd_ndb.h 2011-12-20 13:26:37 +0000 +++ b/sql/ndb_thd_ndb.h 2012-06-15 10:08:39 +0000 @@ -46,6 +46,7 @@ enum THD_NDB_TRANS_OPTIONS TNTO_INJECTED_APPLY_STATUS= 1 << 0 ,TNTO_NO_LOGGING= 1 << 1 ,TNTO_TRANSACTIONS_OFF= 1 << 2 + ,TNTO_NO_REMOVE_STRAY_FILES= 1 << 3 }; class Thd_ndb === modified file 'sql/sql_show.cc' --- a/sql/sql_show.cc 2012-06-08 11:56:49 +0000 +++ b/sql/sql_show.cc 2012-06-15 10:08:39 +0000 @@ -2400,11 +2400,13 @@ void calc_sum_of_all_status(STATUS_VAR * /* This is only used internally, but we need it here as a forward reference */ extern ST_SCHEMA_TABLE schema_tables[]; +#ifdef MCP_WL1735 typedef struct st_lookup_field_values { LEX_STRING db_value, table_value; bool wild_db_value, wild_table_value; } LOOKUP_FIELD_VALUES; +#endif /* === modified file 'sql/sql_show.h' --- a/sql/sql_show.h 2011-08-31 10:39:08 +0000 +++ b/sql/sql_show.h 2012-06-15 10:08:39 +0000 @@ -35,6 +35,14 @@ typedef struct st_schema_table ST_SCHEMA struct TABLE; typedef struct system_status_var STATUS_VAR; +#ifndef MCP_WL1735 +typedef struct st_lookup_field_values +{ + LEX_STRING db_value, table_value; + bool wild_db_value, wild_table_value; +} LOOKUP_FIELD_VALUES; +#endif + enum find_files_result { FIND_FILES_OK, FIND_FILES_OOM, @@ -81,6 +89,12 @@ enum find_files_result { #define IS_FILES_STATUS 36 #define IS_FILES_EXTRA 37 +#ifndef MCP_WL1735 +int make_db_list(THD *thd, List *files, + LOOKUP_FIELD_VALUES *lookup_field_vals, + bool *with_i_schema); +#endif + find_files_result find_files(THD *thd, List *files, const char *db, const char *path, const char *wild, bool dir); === modified file 'sql/sql_table.cc' --- a/sql/sql_table.cc 2012-06-08 11:56:49 +0000 +++ b/sql/sql_table.cc 2012-06-21 10:12:34 +0000 @@ -5394,8 +5394,11 @@ compare_tables(THD *thd, for(; key_part != end; key_part++) { /* Mark field to be part of new key */ - if ((field= table->field[key_part->fieldnr])) + if (key_part->fieldnr < table->s->fields) + { + field= table->field[key_part->fieldnr]; field->flags|= FIELD_IN_ADD_INDEX; + } } *table_changes= IS_EQUAL_NO; DBUG_PRINT("info", ("index changed: '%s'", table_key->name)); @@ -5429,16 +5432,18 @@ compare_tables(THD *thd, end= key_part + new_key->key_parts; for(; key_part != end; key_part++) { - /* - Check if all fields in key are declared - NOT NULL - */ if (key_part->fieldnr < table->s->fields) { - /* Mark field to be part of new key */ field= table->field[key_part->fieldnr]; + /* Mark field to be part of new key */ field->flags|= FIELD_IN_ADD_INDEX; - is_not_null= (is_not_null && (!field->maybe_null())); + /* + Check if all fields in key are declared + NOT NULL + */ + is_not_null= + (is_not_null && + (!field->maybe_null())); } else { === modified file 'storage/ndb/include/kernel/ndb_limits.h' --- a/storage/ndb/include/kernel/ndb_limits.h 2012-02-23 15:41:31 +0000 +++ b/storage/ndb/include/kernel/ndb_limits.h 2012-06-21 15:24:52 +0000 @@ -96,8 +96,26 @@ #define MAX_KEY_SIZE_IN_WORDS 1023 #define MAX_FRM_DATA_SIZE 6000 #define MAX_NULL_BITS 4096 -#define MAX_FRAGMENT_DATA_BYTES (4+(2 * 8 * MAX_REPLICAS * MAX_NDB_NODES)) +/* + * Fragmentation data are Uint16, first two are #replicas, + * and #fragments, then for each fragment, first log-part-id + * then nodeid for each replica. + * See creation in Dbdih::execCREATE_FRAGMENTATION_REQ() + * and read in Dbdih::execDIADDTABREQ() + */ +#define MAX_FRAGMENT_DATA_ENTRIES (2 + (1 + MAX_REPLICAS) * MAX_NDB_PARTITIONS) +#define MAX_FRAGMENT_DATA_BYTES (2 * MAX_FRAGMENT_DATA_ENTRIES) +#define MAX_FRAGMENT_DATA_WORDS ((MAX_FRAGMENT_DATA_BYTES + 3) / 4) + +#if NDB_VERSION_D < NDB_MAKE_VERSION(7,2,0) +#define MAX_NDB_PARTITIONS 240 +#else #define MAX_NDB_PARTITIONS 1024 +#endif + +#define NDB_PARTITION_BITS 16 +#define NDB_PARTITION_MASK ((Uint32)((1 << NDB_PARTITION_BITS) - 1)) + #define MAX_RANGE_DATA (131072+MAX_NDB_PARTITIONS) //0.5 MByte of list data #define MAX_WORDS_META_FILE 24576 @@ -191,7 +209,22 @@ */ #define LCP_RESTORE_BUFFER (4*32) -#define NDB_DEFAULT_HASHMAP_BUCKTETS 240 + +/** + * Support at least one partition per LDM. And + * also try to make size a multiple of all possible + * data node counts, so that all partitions are + * related to the same number of hashmap buckets + * as possible, otherwise some partitions will be + * bigger than others. + */ + +#if NDB_VERSION_D < NDB_MAKE_VERSION(7,2,0) +#define NDB_DEFAULT_HASHMAP_BUCKETS 240 +#else +#define NDB_DEFAULT_HASHMAP_BUCKETS (48 * 16 * 5) /* 3840 */ +#endif +#define NDB_DEFAULT_HASHMAP_BUCKETS_BYTES (2 * NDB_DEFAULT_HASHMAP_BUCKETS) /** * Bits/mask used for coding/decoding blockno/blockinstance @@ -220,6 +253,16 @@ #define NDB_FILE_BUFFER_SIZE (256*1024) +/* + * NDB_FS_RW_PAGES must be big enough for biggest request, + * probably PACK_TABLE_PAGES (see Dbdih.hpp) + */ +#if NDB_VERSION_D < NDB_MAKE_VERSION(7,2,0) +#define NDB_FS_RW_PAGES 32 +#else +#define NDB_FS_RW_PAGES 134 +#endif + /** * MAX_ATTRIBUTES_IN_TABLE old handling */ @@ -257,4 +300,22 @@ #define MAX_INDEX_STAT_VALUE_CSIZE 512 /* Longvarbinary(2048) */ #define MAX_INDEX_STAT_VALUE_FORMAT 1 +#ifdef NDB_STATIC_ASSERT + +static inline void ndb_limits_constraints() +{ + NDB_STATIC_ASSERT(MAX_NDB_PARTITIONS <= NDB_DEFAULT_HASHMAP_BUCKETS); + + NDB_STATIC_ASSERT(MAX_NDB_PARTITIONS - 1 <= NDB_PARTITION_MASK); + + // MAX_NDB_NODES should be 48, but code assumes it is 49 + STATIC_CONST(MAX_NDB_DATA_NODES = MAX_DATA_NODE_ID); + NDB_STATIC_ASSERT(MAX_NDB_NODES == MAX_NDB_DATA_NODES + 1); + + // Default partitioning is 1 partition per LDM + NDB_STATIC_ASSERT(MAX_NDB_DATA_NODES * MAX_NDBMT_LQH_THREADS <= MAX_NDB_PARTITIONS); +} + +#endif + #endif === modified file 'storage/ndb/include/kernel/signaldata/CreateTable.hpp' --- a/storage/ndb/include/kernel/signaldata/CreateTable.hpp 2011-07-05 12:46:07 +0000 +++ b/storage/ndb/include/kernel/signaldata/CreateTable.hpp 2012-06-21 15:24:52 +0000 @@ -76,7 +76,8 @@ struct CreateTableRef { NoLoggingTemporaryTable = 778, InvalidHashMap = 790, TableDefinitionTooBig = 793, - FeatureRequiresUpgrade = 794 + FeatureRequiresUpgrade = 794, + TooManyFragments = 1224 }; Uint32 senderRef; === modified file 'storage/ndb/include/kernel/signaldata/DictTabInfo.hpp' --- a/storage/ndb/include/kernel/signaldata/DictTabInfo.hpp 2011-07-05 12:46:07 +0000 +++ b/storage/ndb/include/kernel/signaldata/DictTabInfo.hpp 2012-06-21 15:24:52 +0000 @@ -360,7 +360,7 @@ public: char FrmData[MAX_FRM_DATA_SIZE]; Uint32 FragmentCount; Uint32 ReplicaDataLen; - Uint16 ReplicaData[MAX_FRAGMENT_DATA_BYTES]; + Uint16 ReplicaData[MAX_FRAGMENT_DATA_ENTRIES]; Uint32 FragmentDataLen; Uint16 FragmentData[3*MAX_NDB_PARTITIONS]; @@ -802,7 +802,7 @@ struct DictHashMapInfo { struct HashMap { char HashMapName[MAX_TAB_NAME_SIZE]; Uint32 HashMapBuckets; - Uint16 HashMapValues[512]; + Uint16 HashMapValues[NDB_DEFAULT_HASHMAP_BUCKETS]; Uint32 HashMapObjectId; Uint32 HashMapVersion; HashMap() {} === modified file 'storage/ndb/include/kernel/signaldata/ScanTab.hpp' --- a/storage/ndb/include/kernel/signaldata/ScanTab.hpp 2011-09-02 09:16:56 +0000 +++ b/storage/ndb/include/kernel/signaldata/ScanTab.hpp 2012-06-21 15:24:52 +0000 @@ -132,7 +132,14 @@ private: /** * Request Info * - p = Parallelism - 8 Bits -> Max 256 (Bit 0-7) + p = Parallelism - 8 Bits -> Max 255 (Bit 0-7). + Note: these bits are ignored since + 7.0.34, 7.1.23, 7.2.7 and should be + zero-filled until future reuse. + For signal sent to old nodes they + should be filled in. + Check version with + ndbd_scan_tabreq_implicit_parallelism(). l = Lock mode - 1 Bit 8 h = Hold lock mode - 1 Bit 10 c = Read Committed - 1 Bit 11 === modified file 'storage/ndb/include/ndb_version.h.in' --- a/storage/ndb/include/ndb_version.h.in 2012-06-13 19:32:58 +0000 +++ b/storage/ndb/include/ndb_version.h.in 2012-06-21 15:24:52 +0000 @@ -1,5 +1,5 @@ /* - Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved. + Copyright (c) 2004, 2010, 2011, 2012, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -750,6 +750,28 @@ ndbd_128_instances_address(Uint32 x) return x >= NDBD_128_INSTANCES_ADDRESS_72; } +#define NDBD_SCAN_TABREQ_IMPLICIT_PARALLELISM_70 NDB_MAKE_VERSION(7,0,34) +#define NDBD_SCAN_TABREQ_IMPLICIT_PARALLELISM_71 NDB_MAKE_VERSION(7,1,23) +#define NDBD_SCAN_TABREQ_IMPLICIT_PARALLELISM_72 NDB_MAKE_VERSION(7,2,7) + +static +inline +int +ndbd_scan_tabreq_implicit_parallelism(Uint32 x) +{ + const Uint32 major = (x >> 16) & 0xFF; + const Uint32 minor = (x >> 8) & 0xFF; + + if (major == 7 && minor < 2) + { + if (minor == 0) + return x >= NDBD_SCAN_TABREQ_IMPLICIT_PARALLELISM_70; + else if (minor == 1) + return x >= NDBD_SCAN_TABREQ_IMPLICIT_PARALLELISM_71; + } + return x >= NDBD_SCAN_TABREQ_IMPLICIT_PARALLELISM_72; +} + #define NDBD_FIXED_LOOKUP_QUERY_ABORT_72 NDB_MAKE_VERSION(7,2,5) static === modified file 'storage/ndb/src/common/debugger/signaldata/DictTabInfo.cpp' --- a/storage/ndb/src/common/debugger/signaldata/DictTabInfo.cpp 2011-07-05 12:46:07 +0000 +++ b/storage/ndb/src/common/debugger/signaldata/DictTabInfo.cpp 2012-06-21 15:24:52 +0000 @@ -48,8 +48,8 @@ DictTabInfo::TableMapping[] = { DTIMAP2(Table, FrmLen, FrmLen, 0, MAX_FRM_DATA_SIZE), DTIMAPB(Table, FrmData, FrmData, 0, MAX_FRM_DATA_SIZE, FrmLen), DTIMAP2(Table, FragmentCount, FragmentCount, 0, MAX_NDB_PARTITIONS), - DTIMAP2(Table, ReplicaDataLen, ReplicaDataLen, 0, 2*MAX_FRAGMENT_DATA_BYTES), - DTIMAPB(Table, ReplicaData, ReplicaData, 0, 2*MAX_FRAGMENT_DATA_BYTES, ReplicaDataLen), + DTIMAP2(Table, ReplicaDataLen, ReplicaDataLen, 0, MAX_FRAGMENT_DATA_BYTES), + DTIMAPB(Table, ReplicaData, ReplicaData, 0, MAX_FRAGMENT_DATA_BYTES, ReplicaDataLen), DTIMAP2(Table, FragmentDataLen, FragmentDataLen, 0, 6*MAX_NDB_PARTITIONS), DTIMAPB(Table, FragmentData, FragmentData, 0, 6*MAX_NDB_PARTITIONS, FragmentDataLen), DTIMAP2(Table, TablespaceDataLen, TablespaceDataLen, 0, 8*MAX_NDB_PARTITIONS), @@ -337,14 +337,15 @@ const SimpleProperties::SP2StructMapping DictHashMapInfo::Mapping[] = { DHMIMAPS(HashMap, HashMapName, HashMapName, 0, MAX_TAB_NAME_SIZE), - DHMIMAP2(HashMap, HashMapBuckets, HashMapBuckets, 0, 256), + DHMIMAP2(HashMap, HashMapBuckets, HashMapBuckets, 0, NDB_DEFAULT_HASHMAP_BUCKETS), DTIMAP(HashMap, HashMapObjectId, HashMapObjectId), DTIMAP(HashMap, HashMapVersion, HashMapVersion), /** * This *should* change to Uint16 or similar once endian is pushed */ - DHMIMAPB(HashMap, HashMapValues, HashMapValues, 0, 256*2, HashMapBuckets) + DHMIMAPB(HashMap, HashMapValues, HashMapValues, 0, + NDB_DEFAULT_HASHMAP_BUCKETS_BYTES, HashMapBuckets) }; //static === modified file 'storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp' --- a/storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp 2012-02-23 15:41:31 +0000 +++ b/storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp 2012-06-21 15:24:52 +0000 @@ -4931,9 +4931,12 @@ void Dbdict::handleTabInfoInit(Signal * tablePtr.p->fragmentCount = fragments = get_default_fragments(signal); } + tabRequire(fragments <= MAX_NDB_PARTITIONS, + CreateTableRef::TooManyFragments); + char buf[MAX_TAB_NAME_SIZE+1]; BaseString::snprintf(buf, sizeof(buf), "DEFAULT-HASHMAP-%u-%u", - NDB_DEFAULT_HASHMAP_BUCKTETS, + NDB_DEFAULT_HASHMAP_BUCKETS, fragments); DictObject* dictObj = get_object(buf); if (dictObj && dictObj->m_type == DictTabInfo::HashMap) @@ -6452,17 +6455,18 @@ Dbdict::createTab_dih(Signal* signal, Sc // fragmentation in long signal section { - Uint32 page[1024]; + Uint32 page[MAX_FRAGMENT_DATA_WORDS]; LinearSectionPtr ptr[3]; Uint32 noOfSections = 0; const Uint32 size = fragSec.getSize(); + ndbrequire(size <= NDB_ARRAY_SIZE(page)); // wl3600_todo add ndbrequire on SR, NR if (size != 0) { jam(); LocalArenaPoolImpl op_sec_pool(op_ptr.p->m_trans_ptr.p->m_arena,c_opSectionBufferPool); - bool ok = copyOut(op_sec_pool, fragSec, page, 1024); + bool ok = copyOut(op_sec_pool, fragSec, page, size); ndbrequire(ok); ptr[noOfSections].sz = size; ptr[noOfSections].p = page; @@ -23053,7 +23057,7 @@ Dbdict::createNodegroup_subOps(Signal* s * and still continue transaction * but that i dont know how */ - Uint32 buckets = 240; + Uint32 buckets = NDB_DEFAULT_HASHMAP_BUCKETS; Uint32 fragments = get_default_fragments(signal, 1); char buf[MAX_TAB_NAME_SIZE+1]; BaseString::snprintf(buf, sizeof(buf), "DEFAULT-HASHMAP-%u-%u", @@ -28615,7 +28619,7 @@ Dbdict::createHashMap_parse(Signal* sign if (impl_req->requestType & CreateHashMapReq::CreateDefault) { jam(); - impl_req->buckets = NDB_DEFAULT_HASHMAP_BUCKTETS; + impl_req->buckets = NDB_DEFAULT_HASHMAP_BUCKETS; impl_req->fragments = 0; } @@ -28628,6 +28632,13 @@ Dbdict::createHashMap_parse(Signal* sign fragments = get_default_fragments(signal); } + if (fragments > MAX_NDB_PARTITIONS) + { + jam(); + setError(error, CreateTableRef::TooManyFragments, __LINE__); + return; + } + BaseString::snprintf(hm.HashMapName, sizeof(hm.HashMapName), "DEFAULT-HASHMAP-%u-%u", buckets, @@ -28858,13 +28869,18 @@ Dbdict::createHashMap_parse(Signal* sign Uint32 tmp = 0; for (Uint32 i = 0; im_map[i] = (Uint8)hm.HashMapValues[i]; + map_ptr.p->m_map[i] = hm.HashMapValues[i]; if (hm.HashMapValues[i] > tmp) tmp = hm.HashMapValues[i]; } map_ptr.p->m_fragments = tmp + 1; } + if (map_ptr.p->m_fragments > MAX_NDB_PARTITIONS) + { + jam(); + setError(error, CreateTableRef::TooManyFragments, __LINE__); + goto error; + } if (ERROR_INSERTED(6211)) { === modified file 'storage/ndb/src/kernel/blocks/dbdih/Dbdih.hpp' --- a/storage/ndb/src/kernel/blocks/dbdih/Dbdih.hpp 2012-02-03 13:37:34 +0000 +++ b/storage/ndb/src/kernel/blocks/dbdih/Dbdih.hpp 2012-06-21 15:24:52 +0000 @@ -100,12 +100,30 @@ /*#########*/ /* SIZES */ /*#########*/ -#define ZPAGEREC 100 +/* + * Only pages enough for one table needed, since only + * one metadata change at the time is allowed. + */ +#define ZPAGEREC PACK_TABLE_PAGES #define ZCREATE_REPLICA_FILE_SIZE 4 #define ZPROXY_MASTER_FILE_SIZE 10 #define ZPROXY_FILE_SIZE 10 #endif +/* + * Pack table into pages. + * See use of writePageWord() in + * packTableIntoPagesLab() and helper + * functions to determine the constants + * below. + */ +#define MAX_CRASHED_REPLICAS 8 +#define PACK_REPLICAS_WORDS (4 + 4 * MAX_LCP_STORED + 2 * MAX_CRASHED_REPLICAS) +#define PACK_FRAGMENT_WORDS (6 + 2 * MAX_REPLICAS * PACK_REPLICAS_WORDS) +#define PACK_TABLE_WORDS (10 + MAX_NDB_PARTITIONS * PACK_FRAGMENT_WORDS) +#define PACK_TABLE_PAGE_WORDS (2048 - 32) +#define PACK_TABLE_PAGES ((PACK_TABLE_WORDS + PACK_TABLE_PAGE_WORDS - 1) / PACK_TABLE_PAGE_WORDS) + class Dbdih: public SimulatedBlock { #ifdef ERROR_INSERT typedef void (Dbdih::* SendFunction)(Signal*, Uint32, Uint32); @@ -515,12 +533,12 @@ public: Method method; Storage tabStorage; - Uint32 pageRef[32]; + Uint32 pageRef[PACK_TABLE_PAGES]; // TODO: makedynamic //----------------------------------------------------------------------------- // Each entry in this array contains a reference to 16 fragment records in a // row. Thus finding the correct record is very quick provided the fragment id. //----------------------------------------------------------------------------- - Uint32 startFid[MAX_NDB_NODES * MAX_FRAG_PER_LQH / NO_OF_FRAGS_PER_CHUNK]; + Uint32 startFid[(MAX_NDB_PARTITIONS - 1) / NO_OF_FRAGS_PER_CHUNK + 1]; Uint32 tabFile[2]; Uint32 connectrec; @@ -547,7 +565,7 @@ public: Uint8 kvalue; Uint8 noOfBackups; - Uint8 noPages; + Uint16 noPages; Uint16 tableType; Uint16 primaryTableId; === modified file 'storage/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp' --- a/storage/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp 2012-04-24 14:41:37 +0000 +++ b/storage/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp 2012-06-21 15:24:52 +0000 @@ -85,7 +85,6 @@ extern EventLogger * g_eventLogger; #define SYSFILE ((Sysfile *)&sysfileData[0]) -#define MAX_CRASHED_REPLICAS 8 #define ZINIT_CREATE_GCI Uint32(0) #define ZINIT_REPLICA_LAST_GCI Uint32(-1) @@ -7981,7 +7980,7 @@ void Dbdih::execDIADDTABREQ(Signal* sign } union { - Uint16 fragments[2 + MAX_FRAG_PER_LQH*MAX_REPLICAS*MAX_NDB_NODES]; + Uint16 fragments[MAX_FRAGMENT_DATA_ENTRIES]; Uint32 align; }; (void)align; // kill warning @@ -17457,6 +17456,7 @@ void Dbdih::writeTabfile(Signal* signal, signal->theData[4] = ZVAR_NO_WORD; signal->theData[5] = tab->noPages; + NDB_STATIC_ASSERT(NDB_ARRAY_SIZE(tab->pageRef) <= NDB_FS_RW_PAGES); Uint32 section[2 * NDB_ARRAY_SIZE(tab->pageRef)]; for (Uint32 i = 0; i < tab->noPages; i++) { === modified file 'storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp' --- a/storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp 2012-05-07 07:51:09 +0000 +++ b/storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp 2012-06-25 11:35:54 +0000 @@ -5025,6 +5025,7 @@ void Dbtc::seizeApiConnectCopy(Signal* s ptrCheckGuard(locApiConnectptr, TapiConnectFilesize, localApiConnectRecord); cfirstfreeApiConnectCopy = locApiConnectptr.p->nextApiConnect; locApiConnectptr.p->nextApiConnect = RNIL; + ndbassert(regApiPtr->apiCopyRecord == RNIL); regApiPtr->apiCopyRecord = locApiConnectptr.i; tc_clearbit(regApiPtr->m_flags, ApiConnectRecord::TF_TRIGGER_PENDING); @@ -5067,7 +5068,9 @@ void Dbtc::execDIVERIFYCONF(Signal* sign * WE WILL INSERT THE TRANSACTION INTO ITS PROPER QUEUE OF * TRANSACTIONS FOR ITS GLOBAL CHECKPOINT. *-------------------------------------------------------------------------*/ - if (TApifailureNr != Tfailure_nr) { + if (TApifailureNr != Tfailure_nr || + ERROR_INSERTED(8094)) { + jam(); DIVER_node_fail_handling(signal, Tgci); return; }//if @@ -5563,7 +5566,12 @@ Dbtc::sendApiCommit(Signal* signal) err8055: Ptr copyPtr; UintR TapiConnectFilesize = capiConnectFilesize; + /** + * Unlink copy connect record from main connect record to allow main record + * re-use. + */ copyPtr.i = regApiPtr.p->apiCopyRecord; + regApiPtr.p->apiCopyRecord = RNIL; UintR TapiFailState = regApiPtr.p->apiFailState; ApiConnectRecord *localApiConnectRecord = apiConnectRecord; @@ -6209,6 +6217,7 @@ void Dbtc::handleGcp(Signal* signal, Ptr void Dbtc::releaseApiConCopy(Signal* signal) { ApiConnectRecord * const regApiPtr = apiConnectptr.p; + ndbassert(regApiPtr->nextApiConnect == RNIL); UintR TfirstfreeApiConnectCopyOld = cfirstfreeApiConnectCopy; cfirstfreeApiConnectCopy = apiConnectptr.i; regApiPtr->nextApiConnect = TfirstfreeApiConnectCopyOld; @@ -10443,9 +10452,7 @@ void Dbtc::execSCAN_TABREQ(Signal* signa const Uint32 buddyPtr = (tmpXX == 0xFFFFFFFF ? RNIL : tmpXX); Uint32 currSavePointId = 0; - Uint32 scanConcurrency = scanTabReq->getParallelism(ri); Uint32 noOprecPerFrag = ScanTabReq::getScanBatch(ri); - Uint32 scanParallel = scanConcurrency; Uint32 errCode; ScanRecordPtr scanptr; @@ -10461,6 +10468,9 @@ void Dbtc::execSCAN_TABREQ(Signal* signa SectionHandle handle(this, signal); SegmentedSectionPtr api_op_ptr; handle.getSection(api_op_ptr, 0); + // Scan parallelism is determined by the number of receiver ids sent + Uint32 scanParallel = api_op_ptr.sz; + Uint32 scanConcurrency = scanParallel; Uint32 * apiPtr = signal->theData+25; // temp storage copy(apiPtr, api_op_ptr); @@ -12255,6 +12265,7 @@ void Dbtc::initApiConnect(Signal* signal apiConnectptr.p->currSavePointId = 0; apiConnectptr.p->m_transaction_nodes.clear(); apiConnectptr.p->singleUserMode = 0; + apiConnectptr.p->apiCopyRecord = RNIL; }//for apiConnectptr.i = tiacTmp - 1; ptrCheckGuard(apiConnectptr, capiConnectFilesize, apiConnectRecord); @@ -12284,6 +12295,7 @@ void Dbtc::initApiConnect(Signal* signal apiConnectptr.p->currSavePointId = 0; apiConnectptr.p->m_transaction_nodes.clear(); apiConnectptr.p->singleUserMode = 0; + apiConnectptr.p->apiCopyRecord = RNIL; }//for apiConnectptr.i = (2 * tiacTmp) - 1; ptrCheckGuard(apiConnectptr, capiConnectFilesize, apiConnectRecord); @@ -12313,6 +12325,7 @@ void Dbtc::initApiConnect(Signal* signal apiConnectptr.p->currSavePointId = 0; apiConnectptr.p->m_transaction_nodes.clear(); apiConnectptr.p->singleUserMode = 0; + apiConnectptr.p->apiCopyRecord = RNIL; }//for apiConnectptr.i = (3 * tiacTmp) - 1; ptrCheckGuard(apiConnectptr, capiConnectFilesize, apiConnectRecord); @@ -12573,6 +12586,19 @@ void Dbtc::releaseAbortResources(Signal* TcConnectRecordPtr rarTcConnectptr; c_counters.cabortCount++; + if (apiConnectptr.p->apiCopyRecord != RNIL) + { + // Put apiCopyRecord back in free list. + jam(); + ApiConnectRecordPtr copyPtr; + copyPtr.i = apiConnectptr.p->apiCopyRecord; + ptrCheckGuard(copyPtr, capiConnectFilesize, apiConnectRecord); + ndbassert(copyPtr.p->apiCopyRecord == RNIL); + ndbassert(copyPtr.p->nextApiConnect == RNIL); + copyPtr.p->nextApiConnect = cfirstfreeApiConnectCopy; + cfirstfreeApiConnectCopy = copyPtr.i; + apiConnectptr.p->apiCopyRecord = RNIL; + } if (apiConnectptr.p->cachePtr != RNIL) { cachePtr.i = apiConnectptr.p->cachePtr; ptrCheckGuard(cachePtr, ccacheFilesize, cacheRecord); @@ -12675,6 +12701,8 @@ void Dbtc::releaseApiCon(Signal* signal, TlocalApiConnectptr.i = TapiConnectPtr; ptrCheckGuard(TlocalApiConnectptr, capiConnectFilesize, apiConnectRecord); + ndbassert(TlocalApiConnectptr.p->apiCopyRecord == RNIL); + ndbassert(TlocalApiConnectptr.p->nextApiConnect == RNIL); TlocalApiConnectptr.p->nextApiConnect = cfirstfreeApiConnect; cfirstfreeApiConnect = TlocalApiConnectptr.i; setApiConTimer(TlocalApiConnectptr.i, 0, __LINE__); === modified file 'storage/ndb/src/kernel/blocks/ndbcntr/NdbcntrMain.cpp' --- a/storage/ndb/src/kernel/blocks/ndbcntr/NdbcntrMain.cpp 2012-02-23 15:41:31 +0000 +++ b/storage/ndb/src/kernel/blocks/ndbcntr/NdbcntrMain.cpp 2012-06-21 15:24:52 +0000 @@ -2182,7 +2182,7 @@ Ndbcntr::createHashMap(Signal* signal, U req->requestInfo = 0; req->transId = c_schemaTransId; req->transKey = c_schemaTransKey; - req->buckets = 240; + req->buckets = NDB_DEFAULT_HASHMAP_BUCKETS; req->fragments = 0; sendSignal(DBDICT_REF, GSN_CREATE_HASH_MAP_REQ, signal, CreateHashMapReq::SignalLength, JBB); === modified file 'storage/ndb/src/kernel/blocks/ndbfs/AsyncIoThread.hpp' --- a/storage/ndb/src/kernel/blocks/ndbfs/AsyncIoThread.hpp 2011-07-05 12:46:07 +0000 +++ b/storage/ndb/src/kernel/blocks/ndbfs/AsyncIoThread.hpp 2012-06-21 15:24:52 +0000 @@ -82,7 +82,7 @@ public: char *buf; size_t size; off_t offset; - } pages[32]; + } pages[NDB_FS_RW_PAGES]; } readWrite; struct { const char * buf; === modified file 'storage/ndb/src/kernel/blocks/ndbfs/Ndbfs.cpp' --- a/storage/ndb/src/kernel/blocks/ndbfs/Ndbfs.cpp 2011-11-18 06:47:23 +0000 +++ b/storage/ndb/src/kernel/blocks/ndbfs/Ndbfs.cpp 2012-06-21 15:24:52 +0000 @@ -585,7 +585,7 @@ Ndbfs::execFSCLOSEREQ(Signal * signal) void Ndbfs::readWriteRequest(int action, Signal * signal) { - Uint32 theData[25 + 2 * 32]; + Uint32 theData[25 + 2 * NDB_FS_RW_PAGES]; memcpy(theData, signal->theData, 4 * signal->getLength()); SectionHandle handle(this, signal); if (handle.m_cnt > 0) === modified file 'storage/ndb/src/kernel/blocks/suma/Suma.hpp' --- a/storage/ndb/src/kernel/blocks/suma/Suma.hpp 2011-12-02 13:16:43 +0000 +++ b/storage/ndb/src/kernel/blocks/suma/Suma.hpp 2012-06-21 15:24:52 +0000 @@ -119,11 +119,13 @@ public: void suma_ndbrequire(bool v); // wl4391_todo big enough for now + // Keep m_fragDesc within 32 bit, + // m_dummy is used to pass value. union FragmentDescriptor { struct { - Uint8 m_fragmentNo; + Uint16 m_fragmentNo; Uint8 m_lqhInstanceKey; - Uint16 m_nodeId; + Uint8 m_nodeId; } m_fragDesc; Uint32 m_dummy; }; === modified file 'storage/ndb/src/kernel/vm/SimulatedBlock.hpp' --- a/storage/ndb/src/kernel/vm/SimulatedBlock.hpp 2012-02-23 15:41:31 +0000 +++ b/storage/ndb/src/kernel/vm/SimulatedBlock.hpp 2012-06-21 15:24:52 +0000 @@ -1362,10 +1362,10 @@ SectionHandle::~SectionHandle() struct Hash2FragmentMap { - STATIC_CONST( MAX_MAP = 240 ); + STATIC_CONST( MAX_MAP = NDB_DEFAULT_HASHMAP_BUCKETS ); Uint32 m_cnt; Uint32 m_fragments; - Uint8 m_map[MAX_MAP]; + Uint16 m_map[MAX_MAP]; Uint32 nextPool; Uint32 m_object_id; }; === modified file 'storage/ndb/src/kernel/vm/mt.cpp' --- a/storage/ndb/src/kernel/vm/mt.cpp 2012-05-23 06:40:37 +0000 +++ b/storage/ndb/src/kernel/vm/mt.cpp 2012-06-18 13:54:07 +0000 @@ -4106,10 +4106,10 @@ may_communicate(unsigned from, unsigned } else if (is_tc_thread(from)) { - // TC threads can communicate with LQH-, main- and itself + // TC threads can communicate with SPJ-, LQH-, main- and itself return is_main_thread(to) || is_ldm_thread(to) || - (to == from); + is_tc_thread(to); // Cover both SPJs and itself } else { @@ -4426,12 +4426,13 @@ compute_jb_pages(struct EmulatorData * e job_queue_pages_per_thread; /** - * TC threads can communicate with LQH threads and main threads. + * TC threads can communicate with SPJ-, LQH- and main threads. * Cannot communicate with receive threads and other TC threads, - * but it can communicate with itself. + * but as SPJ is located together with TC, it is counted as it + * communicate with all TC threads. */ tot += num_tc_threads * - (num_lqh_threads + num_main_threads + 1) * + (num_lqh_threads + num_main_threads + num_tc_threads) * job_queue_pages_per_thread; /** === modified file 'storage/ndb/src/ndbapi/NdbDictionary.cpp' --- a/storage/ndb/src/ndbapi/NdbDictionary.cpp 2012-02-23 15:41:31 +0000 +++ b/storage/ndb/src/ndbapi/NdbDictionary.cpp 2012-06-21 15:24:52 +0000 @@ -1896,7 +1896,7 @@ NdbDictionary::Dictionary::getDefaultHas { BaseString tmp; tmp.assfmt("DEFAULT-HASHMAP-%u-%u", - NDB_DEFAULT_HASHMAP_BUCKTETS, fragments); + NDB_DEFAULT_HASHMAP_BUCKETS, fragments); return getHashMap(dst, tmp.c_str()); } @@ -1928,12 +1928,12 @@ NdbDictionary::Dictionary::initDefaultHa { BaseString tmp; tmp.assfmt("DEFAULT-HASHMAP-%u-%u", - NDB_DEFAULT_HASHMAP_BUCKTETS, fragments); + NDB_DEFAULT_HASHMAP_BUCKETS, fragments); dst.setName(tmp.c_str()); Vector map; - for (Uint32 i = 0; im_hash_map.push_back(tmp.m_map[i]); } } @@ -8216,6 +8216,7 @@ NdbDictInterface::create_hashmap(const N hm.HashMapBuckets = src.getMapLen(); for (Uint32 i = 0; i m_fragments; - Vector m_hash_map; + Vector m_hash_map; Uint64 m_max_rows; Uint64 m_min_rows; === modified file 'storage/ndb/src/ndbapi/NdbQueryOperation.cpp' --- a/storage/ndb/src/ndbapi/NdbQueryOperation.cpp 2012-05-08 09:23:25 +0000 +++ b/storage/ndb/src/ndbapi/NdbQueryOperation.cpp 2012-06-25 13:08:47 +0000 @@ -3105,7 +3105,21 @@ NdbQueryImpl::doSend(int nodeId, bool la ScanTabReq::setViaSPJFlag(reqInfo, 1); ScanTabReq::setPassAllConfsFlag(reqInfo, 1); - ScanTabReq::setParallelism(reqInfo, getRootFragCount()); + + Uint32 nodeVersion = impl->getNodeNdbVersion(nodeId); + if (!ndbd_scan_tabreq_implicit_parallelism(nodeVersion)) + { + // Implicit parallelism implies support for greater + // parallelism than storable explicitly in old reqInfo. + Uint32 fragments = getRootFragCount(); + if (fragments > PARALLEL_MASK) + { + setErrorCode(Err_SendFailed /* TODO: TooManyFragments, to too old cluster version */); + return -1; + } + ScanTabReq::setParallelism(reqInfo, fragments); + } + ScanTabReq::setRangeScanFlag(reqInfo, rangeScan); ScanTabReq::setDescendingFlag(reqInfo, descending); ScanTabReq::setTupScanFlag(reqInfo, tupScan); @@ -5205,7 +5219,7 @@ int NdbQueryOperationImpl::setParallelis getQuery().setErrorCode(Err_FunctionNotImplemented); return -1; } - else if (parallelism < 1 || parallelism > MAX_NDB_PARTITIONS) + else if (parallelism < 1 || parallelism > NDB_PARTITION_MASK) { getQuery().setErrorCode(Err_ParameterError); return -1; === modified file 'storage/ndb/src/ndbapi/NdbScanOperation.cpp' --- a/storage/ndb/src/ndbapi/NdbScanOperation.cpp 2011-11-16 08:17:17 +0000 +++ b/storage/ndb/src/ndbapi/NdbScanOperation.cpp 2012-06-21 15:24:52 +0000 @@ -1413,6 +1413,9 @@ NdbScanOperation::processTableScanDefs(N return -1; }//if + NdbImpl* impl = theNdb->theImpl; + Uint32 nodeId = theNdbCon->theDBnode; + Uint32 nodeVersion = impl->getNodeNdbVersion(nodeId); theSCAN_TABREQ->setSignal(GSN_SCAN_TABREQ, refToBlock(theNdbCon->m_tcRef)); ScanTabReq * req = CAST_PTR(ScanTabReq, theSCAN_TABREQ->getDataPtrSend()); req->apiConnectPtr = theNdbCon->theTCConPtr; @@ -1424,7 +1427,17 @@ NdbScanOperation::processTableScanDefs(N req->first_batch_size = batch; // Save user specified batch size Uint32 reqInfo = 0; - ScanTabReq::setParallelism(reqInfo, parallel); + if (!ndbd_scan_tabreq_implicit_parallelism(nodeVersion)) + { + // Implicit parallelism implies support for greater + // parallelism than storable explicitly in old reqInfo. + if (parallel > PARALLEL_MASK) + { + setErrorCodeAbort(4000 /* TODO: TooManyFragments, to too old cluster version */); + return -1; + } + ScanTabReq::setParallelism(reqInfo, parallel); + } ScanTabReq::setScanBatch(reqInfo, 0); ScanTabReq::setRangeScanFlag(reqInfo, rangeScan); ScanTabReq::setTupScanFlag(reqInfo, tupScan); === modified file 'storage/ndb/test/include/NdbBackup.hpp' --- a/storage/ndb/test/include/NdbBackup.hpp 2011-07-05 12:46:07 +0000 +++ b/storage/ndb/test/include/NdbBackup.hpp 2012-06-25 13:08:04 +0000 @@ -26,8 +26,8 @@ class NdbBackup : public NdbConfig { public: - NdbBackup(int _own_id, const char* _addr = 0) - : NdbConfig(_own_id, _addr) {}; + NdbBackup(const char* _addr = 0) + : NdbConfig(_addr) {}; int start(unsigned & _backup_id, int flags = 2, === modified file 'storage/ndb/test/include/NdbConfig.hpp' --- a/storage/ndb/test/include/NdbConfig.hpp 2011-02-02 00:40:07 +0000 +++ b/storage/ndb/test/include/NdbConfig.hpp 2012-06-25 12:55:27 +0000 @@ -27,15 +27,12 @@ class NdbConfig : public NdbRestarter { public: - NdbConfig(int own_id, const char* addr = 0) - : NdbRestarter(addr), - ownNodeId(own_id) {}; + NdbConfig(const char* addr = 0) + : NdbRestarter(addr) + {}; bool getProperty(unsigned nodeid, unsigned type, unsigned key, Uint32 * val); - bool getHostName(unsigned int node_id, const char ** hostname); - //protected: - int ownNodeId; }; #endif === modified file 'storage/ndb/test/ndbapi/testBackup.cpp' --- a/storage/ndb/test/ndbapi/testBackup.cpp 2011-12-08 14:37:07 +0000 +++ b/storage/ndb/test/ndbapi/testBackup.cpp 2012-06-25 12:55:27 +0000 @@ -35,7 +35,7 @@ int clearOldBackups(NDBT_Context* ctx, NDBT_Step* step) { strcpy(tabname, ctx->getTab()->getName()); - NdbBackup backup(GETNDB(step)->getNodeId()); + NdbBackup backup; backup.clearOldBackups(); return NDBT_OK; } @@ -70,7 +70,7 @@ int setSlave(NDBT_Context* ctx, NDBT_Ste } int runAbort(NDBT_Context* ctx, NDBT_Step* step){ - NdbBackup backup(GETNDB(step)->getNodeId()+1); + NdbBackup backup; NdbRestarter restarter; @@ -104,7 +104,7 @@ int runAbort(NDBT_Context* ctx, NDBT_Ste } int runFail(NDBT_Context* ctx, NDBT_Step* step){ - NdbBackup backup(GETNDB(step)->getNodeId()+1); + NdbBackup backup; NdbRestarter restarter; @@ -138,7 +138,7 @@ int runFail(NDBT_Context* ctx, NDBT_Step } int runBackupOne(NDBT_Context* ctx, NDBT_Step* step){ - NdbBackup backup(GETNDB(step)->getNodeId()+1); + NdbBackup backup; unsigned backupId = 0; if (backup.start(backupId) == -1){ @@ -151,7 +151,7 @@ int runBackupOne(NDBT_Context* ctx, NDBT } int runBackupRandom(NDBT_Context* ctx, NDBT_Step* step){ - NdbBackup backup(GETNDB(step)->getNodeId()+1); + NdbBackup backup; unsigned backupId = rand() % (MAX_BACKUPS); if (backup.start(backupId) == -1){ @@ -165,7 +165,7 @@ int runBackupRandom(NDBT_Context* ctx, N int runBackupLoop(NDBT_Context* ctx, NDBT_Step* step){ - NdbBackup backup(GETNDB(step)->getNodeId()+1); + NdbBackup backup; int loops = ctx->getNumLoops(); while(!ctx->isTestStopped() && loops--) @@ -233,7 +233,7 @@ int runDropTablesRestart(NDBT_Context* c } int runRestoreOne(NDBT_Context* ctx, NDBT_Step* step){ - NdbBackup backup(GETNDB(step)->getNodeId()+1); + NdbBackup backup; unsigned backupId = ctx->getProperty("BackupId"); ndbout << "Restoring backup " << backupId << endl; @@ -379,7 +379,7 @@ int runBackupBank(NDBT_Context* ctx, NDB int l = 0; int maxSleep = 30; // Max seconds between each backup Ndb* pNdb = GETNDB(step); - NdbBackup backup(GETNDB(step)->getNodeId()+1); + NdbBackup backup; unsigned minBackupId = ~0; unsigned maxBackupId = 0; unsigned backupId = 0; @@ -425,7 +425,7 @@ int runBackupBank(NDBT_Context* ctx, NDB int runRestoreBankAndVerify(NDBT_Context* ctx, NDBT_Step* step){ NdbRestarter restarter; - NdbBackup backup(GETNDB(step)->getNodeId()+1); + NdbBackup backup; unsigned minBackupId = ctx->getProperty("MinBackupId"); unsigned maxBackupId = ctx->getProperty("MaxBackupId"); unsigned backupId = minBackupId; @@ -499,7 +499,7 @@ int runRestoreBankAndVerify(NDBT_Context return result; } int runBackupUndoWaitStarted(NDBT_Context* ctx, NDBT_Step* step){ - NdbBackup backup(GETNDB(step)->getNodeId()+1); + NdbBackup backup; unsigned backupId = 0; int undoError = 10041; NdbRestarter restarter; @@ -567,7 +567,7 @@ int runChangeUndoDataDuringBackup(NDBT_C hugoTrans.closeTransaction(pNdb); // make sure backup have finish - NdbBackup backup(GETNDB(step)->getNodeId()+1); + NdbBackup backup; // start log event if(backup.startLogEvent() != 0) { @@ -651,7 +651,7 @@ int runVerifyUndoData(NDBT_Context* ctx, int runBug57650(NDBT_Context* ctx, NDBT_Step* step) { - NdbBackup backup(GETNDB(step)->getNodeId()+1); + NdbBackup backup; NdbRestarter res; int node0 = res.getNode(NdbRestarter::NS_RANDOM); === modified file 'storage/ndb/test/ndbapi/testBasic.cpp' --- a/storage/ndb/test/ndbapi/testBasic.cpp 2011-06-20 07:17:57 +0000 +++ b/storage/ndb/test/ndbapi/testBasic.cpp 2012-06-25 12:55:27 +0000 @@ -24,6 +24,7 @@ #include #include #include +#include /** * TODO @@ -3002,6 +3003,63 @@ int runRefreshTuple(NDBT_Context* ctx, N return rc; }; +// An 'assert' that is always executed, so that 'cond' may have side effects. +#ifdef NDEBUG +#define ASSERT_ALWAYS(cond) if(!(cond)){abort();} +#else +#define ASSERT_ALWAYS assert +#endif + +// Regression test for bug #14208924 +static int +runLeakApiConnectObjects(NDBT_Context* ctx, NDBT_Step* step) +{ + NdbRestarter restarter; + /** + * This error insert inc ombination with bug #14208924 will + * cause TC to leak ApiConnectRecord objects. + */ + restarter.insertErrorInAllNodes(8094); + + Ndb* const ndb = GETNDB(step); + Uint32 maxTrans = 0; + NdbConfig conf; + ASSERT_ALWAYS(conf.getProperty(conf.getMasterNodeId(), + NODE_TYPE_DB, + CFG_DB_NO_TRANSACTIONS, + &maxTrans)); + ASSERT_ALWAYS(maxTrans > 0); + + HugoOperations hugoOps(*ctx->getTab()); + // One ApiConnectRecord object is leaked for each iteration. + for (uint i = 0; i < maxTrans+1; i++) + { + ASSERT_ALWAYS(hugoOps.startTransaction(ndb) == 0); + ASSERT_ALWAYS(hugoOps.pkInsertRecord(ndb, i) == 0); + NdbTransaction* const trans = hugoOps.getTransaction(); + /** + * The error insert causes trans->execute(Commit) to fail with error code + * 286 even if the bug is fixed. Therefore, we ignore this error code. + */ + if (trans->execute(Commit) != 0 && + trans->getNdbError().code != 286) + { + g_err << "trans->execute() gave unexpected error : " + << trans->getNdbError() << endl; + restarter.insertErrorInAllNodes(0); + return NDBT_FAILED; + } + ASSERT_ALWAYS(hugoOps.closeTransaction(ndb) == 0); + } + restarter.insertErrorInAllNodes(0); + + UtilTransactions utilTrans(*ctx->getTab()); + if (utilTrans.clearTable(ndb) != 0){ + return NDBT_FAILED; + } + return NDBT_OK; +} + enum PreRefreshOps { PR_NONE, @@ -3584,6 +3642,10 @@ TESTCASE("899", "") STEP(runTest899); FINALIZER(runEnd899); } +TESTCASE("LeakApiConnectObjects", "") +{ + INITIALIZER(runLeakApiConnectObjects); +} TESTCASE("RefreshLocking", "Test Refresh locking properties") { === modified file 'storage/ndb/test/ndbapi/testSystemRestart.cpp' --- a/storage/ndb/test/ndbapi/testSystemRestart.cpp 2012-01-20 10:15:22 +0000 +++ b/storage/ndb/test/ndbapi/testSystemRestart.cpp 2012-06-25 13:08:04 +0000 @@ -38,7 +38,7 @@ int runLoadTable(NDBT_Context* ctx, NDBT int clearOldBackups(NDBT_Context* ctx, NDBT_Step* step) { - NdbBackup backup(GETNDB(step)->getNodeId()); + NdbBackup backup; backup.clearOldBackups(); return NDBT_OK; } @@ -1391,7 +1391,7 @@ int runSR_DD_1(NDBT_Context* ctx, NDBT_S int result = NDBT_OK; Uint32 loops = ctx->getNumLoops(); NdbRestarter restarter; - NdbBackup backup(GETNDB(step)->getNodeId()+1); + NdbBackup backup; bool lcploop = ctx->getProperty("LCP", (unsigned)0); bool all = ctx->getProperty("ALL", (unsigned)0); @@ -1491,7 +1491,7 @@ int runSR_DD_2(NDBT_Context* ctx, NDBT_S Uint32 loops = ctx->getNumLoops(); Uint32 rows = ctx->getNumRecords(); NdbRestarter restarter; - NdbBackup backup(GETNDB(step)->getNodeId()+1); + NdbBackup backup; bool lcploop = ctx->getProperty("LCP", (unsigned)0); bool all = ctx->getProperty("ALL", (unsigned)0); int error = (int)ctx->getProperty("ERROR", (unsigned)0); @@ -1597,7 +1597,7 @@ int runSR_DD_3(NDBT_Context* ctx, NDBT_S Uint32 loops = ctx->getNumLoops(); Uint32 rows = ctx->getNumRecords(); NdbRestarter restarter; - NdbBackup backup(GETNDB(step)->getNodeId()+1); + NdbBackup backup; bool lcploop = ctx->getProperty("LCP", (unsigned)0); bool all = ctx->getProperty("ALL", (unsigned)0); int error = (int)ctx->getProperty("ERROR", (unsigned)0); === modified file 'storage/ndb/test/ndbapi/testTimeout.cpp' --- a/storage/ndb/test/ndbapi/testTimeout.cpp 2011-07-05 12:46:07 +0000 +++ b/storage/ndb/test/ndbapi/testTimeout.cpp 2012-06-25 13:08:04 +0000 @@ -32,9 +32,8 @@ setTransactionTimeout(NDBT_Context* ctx, NdbRestarter restarter; int timeout = ctx->getProperty("TransactionInactiveTimeout",TIMEOUT); - NdbConfig conf(GETNDB(step)->getNodeId()+1); - unsigned int nodeId = conf.getMasterNodeId(); - if (!conf.getProperty(nodeId, + NdbConfig conf; + if (!conf.getProperty(conf.getMasterNodeId(), NODE_TYPE_DB, CFG_DB_TRANSACTION_INACTIVE_TIMEOUT, &g_org_timeout)){ @@ -66,9 +65,8 @@ setDeadlockTimeout(NDBT_Context* ctx, ND NdbRestarter restarter; int timeout = ctx->getProperty("TransactionDeadlockTimeout", TIMEOUT); - NdbConfig conf(GETNDB(step)->getNodeId()+1); - unsigned int nodeId = conf.getMasterNodeId(); - if (!conf.getProperty(nodeId, + NdbConfig conf; + if (!conf.getProperty(conf.getMasterNodeId(), NODE_TYPE_DB, CFG_DB_TRANSACTION_DEADLOCK_TIMEOUT, &g_org_deadlock)) @@ -88,9 +86,8 @@ getDeadlockTimeout(NDBT_Context* ctx, ND NdbRestarter restarter; Uint32 val = 0; - NdbConfig conf(GETNDB(step)->getNodeId()+1); - unsigned int nodeId = conf.getMasterNodeId(); - if (!conf.getProperty(nodeId, + NdbConfig conf; + if (!conf.getProperty(conf.getMasterNodeId(), NODE_TYPE_DB, CFG_DB_TRANSACTION_DEADLOCK_TIMEOUT, &val)) @@ -308,9 +305,8 @@ int runDeadlockTimeoutTrans(NDBT_Context int stepNo = step->getStepNo(); Uint32 deadlock_timeout; - NdbConfig conf(GETNDB(step)->getNodeId()+1); - unsigned int nodeId = conf.getMasterNodeId(); - if (!conf.getProperty(nodeId, + NdbConfig conf; + if (!conf.getProperty(conf.getMasterNodeId(), NODE_TYPE_DB, CFG_DB_TRANSACTION_DEADLOCK_TIMEOUT, &deadlock_timeout)){ === modified file 'storage/ndb/test/ndbapi/testUpgrade.cpp' --- a/storage/ndb/test/ndbapi/testUpgrade.cpp 2012-05-03 09:54:05 +0000 +++ b/storage/ndb/test/ndbapi/testUpgrade.cpp 2012-06-25 12:55:27 +0000 @@ -896,7 +896,7 @@ runPostUpgradeChecks(NDBT_Context* ctx, * automatically by NDBT... * so when we enter here, this is already tested */ - NdbBackup backup(GETNDB(step)->getNodeId()+1); + NdbBackup backup; ndbout << "Starting backup..." << flush; if (backup.start() != 0) === modified file 'storage/ndb/test/run-test/daily-basic-tests.txt' --- a/storage/ndb/test/run-test/daily-basic-tests.txt 2012-04-24 14:41:37 +0000 +++ b/storage/ndb/test/run-test/daily-basic-tests.txt 2012-06-25 11:35:54 +0000 @@ -1867,3 +1867,7 @@ max-time: 300 cmd: testDict args: -n IndexStatCreate T1 +max-time: 300 +cmd: testBasic +args: -n LeakApiConnectObjects T1 + === modified file 'support-files/mysql.spec.sh' --- a/support-files/mysql.spec.sh 2012-05-23 09:04:42 +0000 +++ b/support-files/mysql.spec.sh 2012-06-25 10:23:35 +0000 @@ -1032,6 +1032,8 @@ echo "=====" %doc %attr(644, root, man) %{_mandir}/man1/resolve_stack_dump.1* %doc %attr(644, root, man) %{_mandir}/man1/resolveip.1* +%doc %attr(644, root, man) %{_mandir}/man1/ndb-common-options.1* + %ghost %config(noreplace,missingok) %{_sysconfdir}/my.cnf %attr(755, root, root) %{_bindir}/innochecksum @@ -1063,6 +1065,7 @@ echo "=====" %attr(755, root, root) %{_bindir}/resolve_stack_dump %attr(755, root, root) %{_bindir}/resolveip +%attr(755, root, root) %{_bindir}/ndb_blob_tool %attr(755, root, root) %{_bindir}/ndb_config %attr(755, root, root) %{_bindir}/ndb_delete_all %attr(755, root, root) %{_bindir}/ndb_desc No bundle (reason: useless for push emails).