3012 Jonas Oreland 2009-09-16
ndb - temporarily disable martins new testcase in mtr to keep other sources of red to creep in while problem is being resolved
modified:
mysql-test/suite/ndb/t/ndb_alter_table_online.test
3011 Magnus Blåudd 2009-09-16 [merge]
Merge
modified:
storage/ndb/src/mgmsrv/MgmtSrvr.cpp
3010 Martin Skold 2009-09-15 [merge]
Merge
added:
storage/ndb/test/run-test/conf-ndb07.cnf
modified:
storage/ndb/src/common/portlib/NdbDir.cpp
storage/ndb/src/kernel/blocks/ERROR_codes.txt
storage/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp
storage/ndb/src/ndbapi/Ndb.cpp
storage/ndb/test/ndbapi/testSystemRestart.cpp
storage/ndb/test/run-test/Makefile.am
storage/ndb/test/src/UtilTransactions.cpp
3009 Martin Skold 2009-09-15 [merge]
Merge
modified:
mysql-test/suite/ndb/r/ndb_alter_table_online.result
mysql-test/suite/ndb/t/ndb_alter_table_online.test
sql/ha_ndbcluster.cc
3008 Jonas Oreland 2009-09-15 [merge]
ndb merge 63 to 70
modified:
storage/ndb/test/run-test/daily-basic-tests.txt
storage/ndb/test/run-test/daily-devel-tests.txt
3007 Magnus Blåudd 2009-09-14 [merge]
Merge
modified:
storage/ndb/include/kernel/signaldata/FsOpenReq.hpp
storage/ndb/src/kernel/blocks/ndbfs/PosixAsyncFile.cpp
storage/ndb/src/kernel/blocks/ndbfs/Win32AsyncFile.cpp
3006 Frazer Clement 2009-09-14 [merge]
Merge 6.3->7.0
modified:
mysql-test/suite/rpl_ndb/r/rpl_ndb_slave_lsu.result
mysql-test/suite/rpl_ndb/t/rpl_ndb_slave_lsu.test
storage/ndb/src/kernel/blocks/ERROR_codes.txt
storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp
storage/ndb/test/ndbapi/testNodeRestart.cpp
3005 Frazer Clement 2009-09-14 [merge]
Merge 6.3->7.0
modified:
mysql-test/extra/rpl_tests/rpl_ndb_multi_binlog_update.test
mysql-test/suite/rpl_ndb/r/rpl_ndb_slave_lsu.result
3004 Frazer Clement 2009-09-11 [merge]
Merge 6.3->7,0
modified:
mysql-test/suite/rpl_ndb/r/rpl_ndb_circular.result
mysql-test/suite/rpl_ndb/t/rpl_ndb_circular.test
3003 Frazer Clement 2009-09-11 [merge]
Merge 6.3->7.0
added:
mysql-test/extra/rpl_tests/rpl_ndb_multi_binlog_update.cnf
mysql-test/extra/rpl_tests/rpl_ndb_multi_binlog_update.test
mysql-test/suite/rpl_ndb/r/rpl_ndb_slave_lsu.result
mysql-test/suite/rpl_ndb/t/rpl_ndb_slave_lsu.cnf
mysql-test/suite/rpl_ndb/t/rpl_ndb_slave_lsu.test
modified:
mysql-test/suite/ndb_binlog/r/ndb_binlog_ddl_multi.result
mysql-test/suite/ndb_binlog/r/ndb_binlog_log_bin.result
mysql-test/suite/ndb_binlog/r/ndb_binlog_multi.result
mysql-test/suite/rpl_ndb/r/rpl_ndb_circular.result
mysql-test/suite/rpl_ndb/t/rpl_ndb_circular.test
mysql-test/suite/rpl_ndb/t/rpl_ndb_circular_2ch.cnf
sql/ha_ndbcluster_binlog.cc
3002 Magnus Blaudd 2009-09-11 [merge]
Merge
modified:
storage/ndb/src/kernel/blocks/dblqh/Dblqh.hpp
storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp
storage/ndb/src/mgmsrv/main.cpp
3001 Magnus Blaudd 2009-09-11
ndb - fix warning in NdbDir
modified:
storage/ndb/include/portlib/NdbDir.hpp
storage/ndb/src/common/portlib/NdbDir.cpp
3000 Magnus Blaudd 2009-09-10
ndb - fix compiler error
modified:
storage/ndb/include/portlib/NdbDir.hpp
2999 Magnus Blaudd 2009-09-10 [merge]
Merge dir funtions
renamed:
storage/ndb/src/mgmsrv/DirIterator.cpp => storage/ndb/src/common/portlib/NdbDir.cpp
storage/ndb/src/mgmsrv/DirIterator.hpp => storage/ndb/include/portlib/NdbDir.hpp
modified:
storage/ndb/src/common/portlib/CMakeLists.txt
storage/ndb/src/common/portlib/Makefile.am
storage/ndb/src/mgmsrv/CMakeLists.txt
storage/ndb/src/mgmsrv/ConfigManager.cpp
storage/ndb/src/mgmsrv/Makefile.am
storage/ndb/src/mgmsrv/main.cpp
storage/ndb/src/common/portlib/NdbDir.cpp
storage/ndb/include/portlib/NdbDir.hpp
2998 Jonas Oreland 2009-09-09 [merge]
merge 63 to 70
modified:
storage/ndb/src/common/util/NdbOut.cpp
storage/ndb/src/common/util/ndb_init.cpp
2997 Jonas Oreland 2009-09-09 [merge]
merge 70-main
renamed:
mysql-test/std_data/ndb_config_config.ini => mysql-test/suite/ndb/ndb_config_config.ini
mysql-test/std_data/ndb_config_mycnf1.cnf => mysql-test/suite/ndb/ndb_config_mycnf1.cnf
mysql-test/std_data/ndb_config_mycnf2.cnf => mysql-test/suite/ndb/ndb_config_mycnf2.cnf
modified:
mysql-test/suite/ndb/t/ndb_config.test
mysql-test/suite/ndb/t/ndb_config2.test
storage/ndb/src/mgmsrv/ConfigInfo.cpp
storage/ndb/src/mgmsrv/InitConfigFileParser.cpp
storage/ndb/src/mgmsrv/main.cpp
mysql-test/suite/ndb/ndb_config_config.ini
2996 Jonas Oreland 2009-09-09
ndb - bug#47215
1) Fix so that CREATE_TAB_REF doesnt cause node-crash
2) Fix calculation of TUP_TABLE_DESC by moving to TUP
that knows how compute it
modified:
storage/ndb/include/kernel/kernel_config_parameters.h
storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp
storage/ndb/src/kernel/blocks/dbtup/DbtupGen.cpp
storage/ndb/src/kernel/vm/Configuration.cpp
2995 Jonas Oreland 2009-09-09
ndb - bug#44908
Out of fragment records in DIH, adjust for no of
LQH instances and add proper error message
(which *should* not happen, hence marked internal error)
modified:
storage/ndb/src/kernel/vm/Configuration.cpp
storage/ndb/src/ndbapi/ndberror.c
2994 Jonas Oreland 2009-09-09 [merge]
merge 63 to 70
modified:
storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp
storage/ndb/src/kernel/vm/Rope.hpp
storage/ndb/src/mgmsrv/ConfigInfo.cpp
2993 Magnus Blåudd 2009-09-09 [merge]
Merge
modified:
storage/ndb/src/kernel/blocks/dbdih/DbdihInit.cpp
2992 Magnus Blstorage/ndb/include/portlib/NdbThread.h
storage/ndb/src/common/portlib/NdbThread.c
storage/ndb/src/common/transporter/TransporterRegistry.cpp
storage/ndb/src/common/util/SocketServer.cpp
storage/ndb/src/cw/cpcd/Monitor.cpp
storage/ndb/src/kernel/vm/WatchDog.cpp
storage/ndb/src/mgmclient/CommandInterpreter.cpp
storage/ndb/src/mgmsrv/MgmtSrvr.cpp
storage/ndb/src/mgmsrv/MgmtThread.hpp
storage/ndb/src/ndbapi/ClusterMgr.cpp
storage/ndb/src/ndbapi/TransporterFacade.cpp
storage/ndb/src/ndbapi/ndb_cluster_connection.cpp
storage/ndb/test/src/NDBT_Test.cpp
2991 Magnus Blåudd 2009-09-08 [merge]
Merge 6.3 to 7.0
modified:
storage/ndb/src/common/util/ndb_init.cpp
2990 Jorgen Austvik 2009-09-08 [merge]
merge 6.3 to 7.0
modified:
storage/ndb/include/util/NdbOut.hpp
storage/ndb/src/common/util/NdbOut.cpp
storage/ndb/src/common/util/ndb_init.cpp
2989 Martin Skold 2009-09-08 [merge]
Merge
modified:
mysql-test/suite/ndb/t/ndb_restore.test
sql/ha_ndbcluster.cc
sql/ha_ndbcluster.h
storage/ndb/include/ndbapi/NdbBlob.hpp
storage/ndb/src/ndbapi/NdbBlob.cpp
storage/ndb/tools/restore/Restore.cpp
2988 Frazer Clement 2009-09-07 [merge]
Merge 6.3->7.0
modified:
storage/ndb/test/ndbapi/testNdbApi.cpp
2987 Jonas Oreland 2009-09-07 [merge]
merge 63 to 70
modified:
storage/ndb/test/ndbapi/testSystemRestart.cpp
2986 Jonas Oreland 2009-09-07
ndb - created testSystemRestart -n SR_DD_3* which focuses much more on updates
(rather that DD_1/2 which focuses mainly on insert/delete)
modified:
storage/ndb/test/ndbapi/testSystemRestart.cpp
storage/ndb/test/run-test/daily-basic-tests.txt
2985 Jonas Oreland 2009-09-04 [merge]
merge 63 to 70
modified:
storage/ndb/src/kernel/blocks/dbtup/DbtupDiskAlloc.cpp
2984 Jonas Oreland 2009-09-04 [merge]
merge 63 to 70
modified:
sql/ha_ndbcluster.cc
storage/ndb/include/kernel/AttributeHeader.hpp
storage/ndb/include/ndbapi/NdbDictionary.hpp
storage/ndb/src/kernel/blocks/dbtup/Dbtup.hpp
storage/ndb/src/kernel/blocks/dbtup/DbtupDiskAlloc.cpp
storage/ndb/src/kernel/blocks/dbtup/DbtupMeta.cpp
storage/ndb/src/kernel/blocks/dbtup/DbtupRoutines.cpp
storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp
storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp
storage/ndb/src/ndbapi/ndb_cluster_connection.cpp
storage/ndb/tools/desc.cpp
2983 Frazer Clement 2009-09-03
Bug#47039 : Ndbmtd specific fix. Route API_FAILREQ via CMVMI to ensure correct ordering
modified:
storage/ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp
storage/ndb/src/kernel/blocks/cmvmi/Cmvmi.hpp
storage/ndb/src/kernel/blocks/qmgr/Qmgr.hpp
storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp
=== added file 'mysql-test/extra/rpl_tests/rpl_ndb_multi_binlog_update.cnf'
=== added file 'mysql-test/extra/rpl_tests/rpl_ndb_multi_binlog_update.cnf'
--- a/mysql-test/extra/rpl_tests/rpl_ndb_multi_binlog_update.cnf 1970-01-01 00:00:00 +0000
+++ b/mysql-test/extra/rpl_tests/rpl_ndb_multi_binlog_update.cnf 2009-09-11 10:34:36 +0000
@@ -0,0 +1,112 @@
+!include include/default_ndbd.cnf
+
+[cluster_config.1]
+# NoOfReplicas refers to NDBD nodes/nodegroup
+NoOfReplicas= 2
+ndbd=,
+ndb_mgmd=
+# 3 MySQLDS attached to Cluster 1
+mysqld=,,
+
+
+
+[cluster_config.slave]
+# NoOfReplicas refers to NDBD nodes/nodegroup
+NoOfReplicas= 2
+ndbd=,
+ndb_mgmd=
+# 3 MySQLDs attached to Cluster 2
+mysqld=,,
+
+
+
+[mysqld]
+open-files-limit= 1024
+local-infile
+default-character-set= latin1
+connect-timeout= 60
+log-bin-trust-function-creators=1
+key_buffer_size= 1M
+sort_buffer= 256K
+max_heap_table_size= 1M
+loose-innodb_data_file_path= ibdata1:10M:autoextend
+slave-net-timeout=120
+ndbcluster
+
+
+
+[mysqld.1.1]
+server-id= 1
+log-bin= master-bin
+binlog_format=row
+
+
+
+[mysqld.2.1]
+server-id= 2
+# Note no binary log
+
+
+
+[mysqld.3.1]
+server-id= 3
+log-bin= master-bin
+binlog_format=row
+
+
+
+[mysqld.1.slave]
+# Note no binlog on this slave
+server-id= 4
+init-rpl-role= slave
+skip-slave-start
+loose-skip-innodb
+slave-load-tmpdir= ../../../tmp
+ndb_connectstring= @mysql_cluster.slave.ndb_connectstring
+
+
+
+[mysqld.2.slave]
+# Note binlog on this slave, but not logging slave updates
+server-id= 5
+init-rpl-role= slave
+skip-slave-start
+loose-skip-innodb
+slave-load-tmpdir= ../../../tmp
+ndb_connectstring= @mysql_cluster.slave.ndb_connectstring
+log-bin= slave-master-bin
+binlog_format=row
+
+
+
+[mysqld.3.slave]
+# Note binlog on this slave, with slave updates logged
+server-id= 6
+init-rpl-role= slave
+skip-slave-start
+loose-skip-innodb
+slave-load-tmpdir= ../../../tmp
+ndb_connectstring= @mysql_cluster.slave.ndb_connectstring
+log-bin= slave-master-bin
+binlog_format=row
+log-slave-updates
+
+
+
+[ENV]
+MASTER_MYPORT= @mysqld.1.1.port
+MASTER_MYPORT1= @mysqld.2.1.port
+MASTER_MYSOCK1= @mysqld.2.1.socket
+MASTER_MYPORT2= @mysqld.3.1.port
+MASTER_MYSOCK2= @mysqld.3.1.socket
+SLAVE_MYPORT= @mysqld.1.slave.port
+SLAVE_MYSOCK= @mysqld.1.slave.socket
+SLAVE_MYPORT1= @mysqld.2.slave.port
+SLAVE_MYSOCK1= @mysqld.2.slave.socket
+SLAVE_MYPORT2= @mysqld.3.slave.port
+SLAVE_MYSOCK2= @mysqld.3.slave.socket
+
+
+NDB_CONNECTSTRING= @mysql_cluster.1.ndb_connectstring
+NDB_CONNECTSTRING_SLAVE= @mysql_cluster.slave.ndb_connectstring
+NDB_BACKUP_DIR= @cluster_config.ndbd.1.1.BackupDataDir
=== added file 'mysql-test/extra/rpl_tests/rpl_ndb_multi_binlog_update.test'
--- a/mysql-test/extra/rpl_tests/rpl_ndb_multi_binlog_update.test 1970-01-01 00:00:00 +0000
+++ b/mysql-test/extra/rpl_tests/rpl_ndb_multi_binlog_update.test 2009-09-14 10:33:19 +0000
@@ -0,0 +1,196 @@
+###############################################################################
+# Description: Performs binloggable and non binloggable DDL and DML at each
+# MySQLD in pair of clusters with (at least) 3 MySQLDs each.
+# Then connects to each MySQLD and examines the contents of
+# its Binlog.
+# Expected contents depends on the configuration of Binlogging
+# in the cluster used.
+# Default from rpl_ndb_multi_binlog_update.test is as shown
+# below.
+#
+# Testing scenario: Cluster 1 replicates to Cluster 2
+#
+# Key : BL= Binlogging, LSU = LogSlaveUpdates = On
+#
+# BL BL
+# cluster 1 [ srv_master srv_master1 srv_master2 ]
+# |
+# |-----------------------
+# v v v
+# cluster 2 [ srv_slave srv_slave1 srv_slave2 ]
+# BL BL LSU
+#
+# Cluster 1:
+# - Schema change originates on all severs in Cluster 1
+# - MySQLD1 which is binlogging master.
+# Identification: connection (srv_master), config (mysqld.1.1).
+# - MySQLD2 which is not binlogging.
+# Identification: connection (srv_master1), config (mysqld.1.2).
+# - MySQLD3 which is binlogging but not currently master.
+# Identification: connection (srv_master2), config (mysqld.1.3).
+#
+# Cluster 2:
+# - MySQLD1:
+# Can act as slave, not binlogging
+# Identification: connection (srv_slave), config (mysqld.1.slave).
+# - MySQLD2:
+# Can act as slave, binlogging, log-slave-updates = off
+# Identification: connection (srv_slave1), config (mysqld.2.slave).
+# - MySQLD3
+# Can act as slave, binlogging, log-slave-updates = on
+# Identification: connection (srv_slave2), config (mysqld.3.slave).
+#
+# See rpl_ndb_multi_binlog_update.test for default configuration.
+# Originally motivated by bug#45756
+# See rpl_ndb_slave_lsu.test for full testcase
+#
+# Preconditions :
+# - Connections srv_master, srv_master1, srv_master2, srv_slave,
+# srv_slave1, srv_slave2 exist.
+# - $which_slave contains the name of the slave server performing
+# the replication slave role.
+#
+###############################################################################
+
+###############################################################################
+# Checking Replication
+###############################################################################
+--echo *** Generating slave cluster originated binloggable changes ***
+connection srv_slave;
+CREATE TABLE bug_45756_slave_logged_1 (a int) engine = NDB;
+INSERT INTO bug_45756_slave_logged_1 VALUES (1);
+DROP TABLE bug_45756_slave_logged_1;
+
+connection srv_slave1;
+CREATE TABLE bug_45756_slave_logged_2 (a int) engine = NDB;
+INSERT INTO bug_45756_slave_logged_2 VALUES (1);
+DROP TABLE bug_45756_slave_logged_2;
+
+connection srv_slave2;
+CREATE TABLE bug_45756_slave_logged_3 (a int) engine = NDB;
+INSERT INTO bug_45756_slave_logged_3 VALUES (1);
+DROP TABLE bug_45756_slave_logged_3;
+
+--echo ***Generating slave cluster non-binloggable changes***
+connection srv_slave;
+SET SQL_LOG_BIN= 0;
+CREATE TABLE bug_45756_slave_not_logged_1 (a int) engine = NDB;
+INSERT INTO bug_45756_slave_not_logged_1 VALUES (1);
+DROP TABLE bug_45756_slave_not_logged_1;
+SET SQL_LOG_BIN= 1;
+
+connection srv_slave1;
+SET SQL_LOG_BIN= 0;
+CREATE TABLE bug_45756_slave_not_logged_2 (a int) engine = NDB;
+INSERT INTO bug_45756_slave_not_logged_2 VALUES (1);
+DROP TABLE bug_45756_slave_not_logged_2;
+SET SQL_LOG_BIN= 1;
+
+connection srv_slave2;
+SET SQL_LOG_BIN= 0;
+CREATE TABLE bug_45756_slave_not_logged_3 (a int) engine = NDB;
+INSERT INTO bug_45756_slave_not_logged_3 VALUES (1);
+DROP TABLE bug_45756_slave_not_logged_3;
+SET SQL_LOG_BIN= 1;
+
+--echo *** Generating data to be replicated ***
+connection srv_master;
+CREATE TABLE bug45756_master_logged_1 (a int) engine = NDB;
+INSERT INTO bug45756_master_logged_1 VALUES (1);
+DROP TABLE bug45756_master_logged_1;
+
+connection srv_master1;
+CREATE TABLE bug45756_master_logged_2 (a int) engine = NDB;
+INSERT INTO bug45756_master_logged_2 VALUES (1);
+DROP TABLE bug45756_master_logged_2;
+
+connection srv_master2;
+CREATE TABLE bug45756_master_logged_3 (a int) engine = NDB;
+INSERT INTO bug45756_master_logged_3 VALUES (1);
+DROP TABLE bug45756_master_logged_3;
+
+--echo *** Generating changes not to be replicated ***
+connection srv_master;
+SET SQL_LOG_BIN= 0;
+CREATE TABLE bug45756_master_not_logged_1 (a int) engine = NDB;
+INSERT INTO bug45756_master_not_logged_1 VALUES (1);
+DROP TABLE bug45756_master_not_logged_1;
+SET SQL_LOG_BIN= 1;
+
+connection srv_master1;
+SET SQL_LOG_BIN= 0;
+CREATE TABLE bug45756_master_not_logged_2 (a int) engine = NDB;
+INSERT INTO bug45756_master_not_logged_2 VALUES (1);
+DROP TABLE bug45756_master_not_logged_2;
+SET SQL_LOG_BIN= 1;
+
+connection srv_master2;
+SET SQL_LOG_BIN= 0;
+CREATE TABLE bug45756_master_not_logged_3 (a int) engine = NDB;
+INSERT INTO bug45756_master_not_logged_3 VALUES (1);
+DROP TABLE bug45756_master_not_logged_3;
+SET SQL_LOG_BIN= 1;
+
+connection srv_master;
+sync_slave_with_master $which_slave;
+
+--echo *** Checking binlog contents on every server in both clusters ***
+connection srv_master;
+--echo
+--echo
+--echo
+--echo connection srv_master;
+show variables like 'server_id';
+show variables like 'log_bin';
+show variables like 'log_slave_updates';
+--source include/show_binlog_events2.inc
+
+connection srv_master1;
+--echo
+--echo
+--echo
+--echo connection srv_master1;
+show variables like 'server_id';
+show variables like 'log_bin';
+show variables like 'log_slave_updates';
+--source include/show_binlog_events2.inc
+
+connection srv_master2;
+--echo
+--echo
+--echo
+--echo connection srv_master2;
+show variables like 'server_id';
+show variables like 'log_bin';
+show variables like 'log_slave_updates';
+--source include/show_binlog_events2.inc
+
+connection srv_slave;
+--echo
+--echo
+--echo
+--echo connection srv_slave;
+show variables like 'server_id';
+show variables like 'log_bin';
+show variables like 'log_slave_updates';
+--source include/show_binlog_events2.inc
+
+connection srv_slave1;
+--echo
+--echo
+--echo
+--echo connection srv_slave1;
+show variables like 'server_id';
+show variables like 'log_bin';
+show variables like 'log_slave_updates';
+--source include/show_binlog_events2.inc
+
+connection srv_slave2;
+--echo
+--echo
+--echo
+--echo connection srv_slave2;
+show variables like 'server_id';
+show variables like 'log_bin';
+show variables like 'log_slave_updates';
+--source include/show_binlog_events2.inc
=== renamed file 'mysql-test/std_data/ndb_config_config.ini' => 'mysql-test/suite/ndb/ndb_config_config.ini'
--- a/mysql-test/std_data/ndb_config_config.ini 2009-02-02 10:35:33 +0000
+++ b/mysql-test/suite/ndb/ndb_config_config.ini 2009-08-31 12:59:43 +0000
@@ -1,3 +1,6 @@
+[SYSTEM]
+Name=cluster1
+
[ndbd default]
NoOfReplicas= 2
MaxNoOfConcurrentTransactions= 64
=== renamed file 'mysql-test/std_data/ndb_config_mycnf1.cnf' => 'mysql-test/suite/ndb/ndb_config_mycnf1.cnf'
=== renamed file 'mysql-test/std_data/ndb_config_mycnf2.cnf' => 'mysql-test/suite/ndb/ndb_config_mycnf2.cnf'
=== modified file 'mysql-test/suite/ndb/r/ndb_alter_table_online.result'
--- a/mysql-test/suite/ndb/r/ndb_alter_table_online.result 2009-07-13 13:22:46 +0000
+++ b/mysql-test/suite/ndb/r/ndb_alter_table_online.result 2009-09-15 14:10:32 +0000
@@ -691,6 +691,30 @@
Attributes:
pk1 Int PRIMARY KEY DISTRIBUTION KEY AT=FIXED ST=MEMORY
b Int NULL AT=FIXED ST=MEMORY
+DROP TABLE t1;
+********************
+* bug#44695 ALTER TABLE during START BACKUP crashes mysqld
+********************
+CREATE TABLE t1(k INT NOT NULL PRIMARY KEY AUTO_INCREMENT) ROW_FORMAT=DYNAMIC ENGINE=NDB;
+INSERT INTO t1 VALUES (NULL);
+INSERT INTO t1 SELECT NULL FROM t1;
+INSERT INTO t1 SELECT NULL FROM t1;
+INSERT INTO t1 SELECT NULL FROM t1;
+INSERT INTO t1 SELECT NULL FROM t1;
+INSERT INTO t1 SELECT NULL FROM t1;
+INSERT INTO t1 SELECT NULL FROM t1;
+INSERT INTO t1 SELECT NULL FROM t1;
+INSERT INTO t1 SELECT NULL FROM t1;
+INSERT INTO t1 SELECT NULL FROM t1;
+INSERT INTO t1 SELECT NULL FROM t1;
+INSERT INTO t1 SELECT NULL FROM t1;
+INSERT INTO t1 SELECT NULL FROM t1;
+INSERT INTO t1 SELECT NULL FROM t1;
+INSERT INTO t1 SELECT NULL FROM t1;
+SELECT COUNT(*) FROM t1;
+COUNT(*)
+16384
+ALTER ONLINE TABLE t1 ADD b INT;
********************
* Cleanup Section
********************
=== modified file 'mysql-test/suite/ndb/t/ndb_alter_table_online.test'
--- a/mysql-test/suite/ndb/t/ndb_alter_table_online.test 2009-07-13 13:22:46 +0000
+++ b/mysql-test/suite/ndb/t/ndb_alter_table_online.test 2009-09-16 09:23:53 +0000
@@ -731,6 +731,39 @@
source show_attributes.inc;
+DROP TABLE t1;
+
+--echo ********************
+--echo * bug#44695 ALTER TABLE during START BACKUP crashes mysqld
+--echo ********************
+# Testing failure of online alter during ongoing backup
+
+CREATE TABLE t1(k INT NOT NULL PRIMARY KEY AUTO_INCREMENT) ROW_FORMAT=DYNAMIC ENGINE=NDB;
+# create some data to slow down backup
+INSERT INTO t1 VALUES (NULL);
+INSERT INTO t1 SELECT NULL FROM t1;
+INSERT INTO t1 SELECT NULL FROM t1;
+INSERT INTO t1 SELECT NULL FROM t1;
+INSERT INTO t1 SELECT NULL FROM t1;
+INSERT INTO t1 SELECT NULL FROM t1;
+INSERT INTO t1 SELECT NULL FROM t1;
+INSERT INTO t1 SELECT NULL FROM t1;
+INSERT INTO t1 SELECT NULL FROM t1;
+INSERT INTO t1 SELECT NULL FROM t1;
+INSERT INTO t1 SELECT NULL FROM t1;
+INSERT INTO t1 SELECT NULL FROM t1;
+INSERT INTO t1 SELECT NULL FROM t1;
+INSERT INTO t1 SELECT NULL FROM t1;
+INSERT INTO t1 SELECT NULL FROM t1;
+SELECT COUNT(*) FROM t1;
+#--exec $NDB_MGM --no-defaults --ndb-connectstring="$NDB_CONNECTSTRING" -e "start backup nowait" >> $NDB_TOOLS_OUTPUT
+--disable_warnings
+--error 0,762,1296
+ALTER ONLINE TABLE t1 ADD b INT;
+# waut for backup to complete
+--sleep 10
+
+--enable_warnings
--echo ********************
--echo * Cleanup Section
--echo ********************
=== modified file 'mysql-test/suite/ndb/t/ndb_config.test'
--- a/mysql-test/suite/ndb/t/ndb_config.test 2009-03-20 09:57:27 +0000
+++ b/mysql-test/suite/ndb/t/ndb_config.test 2009-08-31 12:59:43 +0000
@@ -14,31 +14,31 @@
--exec $NDB_CONFIG --no-defaults --query=nodeid --type=ndbd --host=localhost 2> /dev/null
echo == 5 ==;
---exec $NDB_CONFIG --no-defaults --query=type,nodeid,host --config-file=$MYSQL_TEST_DIR/std_data/ndb_config_config.ini 2> /dev/null
+--exec $NDB_CONFIG --no-defaults --query=type,nodeid,host --config-file=$MYSQL_TEST_DIR/suite/ndb/ndb_config_config.ini 2> /dev/null
# End of 4.1 tests
echo == 6 ==;
---exec $NDB_CONFIG --defaults-group-suffix=.jonas --defaults-file=$MYSQL_TEST_DIR/std_data/ndb_config_mycnf1.cnf --query=type,nodeid,host,IndexMemory,DataMemory --mycnf 2> /dev/null
+--exec $NDB_CONFIG --defaults-group-suffix=.jonas --defaults-file=$MYSQL_TEST_DIR/suite/ndb/ndb_config_mycnf1.cnf --query=type,nodeid,host,IndexMemory,DataMemory --mycnf 2> /dev/null
echo == 7 ==;
---exec $NDB_CONFIG --defaults-group-suffix=.cluster0 --defaults-file=$MYSQL_TEST_DIR/std_data/ndb_config_mycnf2.cnf --query=type,nodeid,host --mycnf 2> /dev/null
+--exec $NDB_CONFIG --defaults-group-suffix=.cluster0 --defaults-file=$MYSQL_TEST_DIR/suite/ndb/ndb_config_mycnf2.cnf --query=type,nodeid,host --mycnf 2> /dev/null
echo == 8 ==;
---exec $NDB_CONFIG --defaults-group-suffix=.cluster1 --defaults-file=$MYSQL_TEST_DIR/std_data/ndb_config_mycnf2.cnf --query=type,nodeid,host --mycnf 2> /dev/null
+--exec $NDB_CONFIG --defaults-group-suffix=.cluster1 --defaults-file=$MYSQL_TEST_DIR/suite/ndb/ndb_config_mycnf2.cnf --query=type,nodeid,host --mycnf 2> /dev/null
echo == 9 ==;
---exec $NDB_CONFIG --defaults-group-suffix=.cluster2 --defaults-file=$MYSQL_TEST_DIR/std_data/ndb_config_mycnf2.cnf --query=type,nodeid,host --mycnf 2> /dev/null
+--exec $NDB_CONFIG --defaults-group-suffix=.cluster2 --defaults-file=$MYSQL_TEST_DIR/suite/ndb/ndb_config_mycnf2.cnf --query=type,nodeid,host --mycnf 2> /dev/null
echo == 10 ==;
---exec $NDB_CONFIG --defaults-group-suffix=.cluster2 --defaults-file=$MYSQL_TEST_DIR/std_data/ndb_config_mycnf2.cnf --connections --query=type,nodeid1,nodeid2,group,nodeidserver --mycnf 2> /dev/null
+--exec $NDB_CONFIG --defaults-group-suffix=.cluster2 --defaults-file=$MYSQL_TEST_DIR/suite/ndb/ndb_config_mycnf2.cnf --connections --query=type,nodeid1,nodeid2,group,nodeidserver --mycnf 2> /dev/null
echo == 11 ==;
---exec $NDB_CONFIG --no-defaults --query=nodeid --host=localhost --config-file=$MYSQL_TEST_DIR/std_data/ndb_config_config.ini 2> /dev/null
+--exec $NDB_CONFIG --no-defaults --query=nodeid --host=localhost --config-file=$MYSQL_TEST_DIR/suite/ndb/ndb_config_config.ini 2> /dev/null
echo == 12 ==;
---exec $NDB_CONFIG --no-defaults --query=nodeid --host=1.2.3.4 --config-file=$MYSQL_TEST_DIR/std_data/ndb_config_config.ini 2> /dev/null
+--exec $NDB_CONFIG --no-defaults --query=nodeid --host=1.2.3.4 --config-file=$MYSQL_TEST_DIR/suite/ndb/ndb_config_config.ini 2> /dev/null
echo == 13 ==;
---exec $NDB_CONFIG --no-defaults --query=nodeid --host=127.0.0.1 --config-file=$MYSQL_TEST_DIR/std_data/ndb_config_config.ini 2> /dev/null
+--exec $NDB_CONFIG --no-defaults --query=nodeid --host=127.0.0.1 --config-file=$MYSQL_TEST_DIR/suite/ndb/ndb_config_config.ini 2> /dev/null
echo == 14 == ndb_config --configinfo;
--exec $NDB_CONFIG --configinfo > /dev/null
=== modified file 'mysql-test/suite/ndb/t/ndb_config2.test'
--- a/mysql-test/suite/ndb/t/ndb_config2.test 2008-11-27 01:19:14 +0000
+++ b/mysql-test/suite/ndb/t/ndb_config2.test 2009-08-31 12:59:43 +0000
@@ -3,4 +3,4 @@
# Following doesn't work in all configurations (if shm is not defined)
---exec $NDB_CONFIG --defaults-group-suffix=.cluster2 --defaults-file=$MYSQL_TEST_DIR/std_data/ndb_config_mycnf2.cnf --connections --query=type,nodeid1,nodeid2,group,nodeidserver --mycnf 2> /dev/null
+--exec $NDB_CONFIG --defaults-group-suffix=.cluster2 --defaults-file=$MYSQL_TEST_DIR/suite/ndb/ndb_config_mycnf2.cnf --connections --query=type,nodeid1,nodeid2,group,nodeidserver --mycnf 2> /dev/null
=== modified file 'mysql-test/suite/ndb/t/ndb_restore.test'
--- a/mysql-test/suite/ndb/t/ndb_restore.test 2009-04-09 15:25:11 +0000
+++ b/mysql-test/suite/ndb/t/ndb_restore.test 2009-09-08 12:10:53 +0000
@@ -477,3 +477,13 @@
# should evaluate to true == 1
select epoch > (1 << 32) from mysql.ndb_apply_status where server_id=0;
+#
+# Bug#40428 core dumped when restore backup log file(redo log)
+#
+--exec $NDB_RESTORE --print --print_meta -b 1 -n 1 $MYSQL_TEST_DIR/std_data/ndb_backup50 >> $NDB_TOOLS_OUTPUT
+
+#
+# Bug #33040 ndb_restore crashes with --print_log
+#
+--exec $NDB_RESTORE --print_log -b 1 -n 1 $MYSQL_TEST_DIR/std_data/ndb_backup50 >> $NDB_TOOLS_OUTPUT
+
=== modified file 'mysql-test/suite/ndb_binlog/r/ndb_binlog_ddl_multi.result'
--- a/mysql-test/suite/ndb_binlog/r/ndb_binlog_ddl_multi.result 2009-02-01 21:05:19 +0000
+++ b/mysql-test/suite/ndb_binlog/r/ndb_binlog_ddl_multi.result 2009-09-11 10:34:36 +0000
@@ -10,14 +10,14 @@
create table t2 (a int primary key) engine=ndb;
show binlog events from <binlog_start>;
Log_name Pos Event_type Server_id End_log_pos Info
-mysqld-bin.000001 # Query 1 # create database mysqltest
-mysqld-bin.000001 # Query 1 # use `mysqltest`; create table t1 (a int primary key) engine=ndb
+mysqld-bin.000001 # Query 2 # create database mysqltest
+mysqld-bin.000001 # Query 2 # use `mysqltest`; create table t1 (a int primary key) engine=ndb
mysqld-bin.000001 # Query 2 # use `test`; create table t2 (a int primary key) engine=ndb
show binlog events from <binlog_start>;
Log_name Pos Event_type Server_id End_log_pos Info
mysqld-bin.000001 # Query 1 # create database mysqltest
mysqld-bin.000001 # Query 1 # use `mysqltest`; create table t1 (a int primary key) engine=ndb
-mysqld-bin.000001 # Query 2 # use `test`; create table t2 (a int primary key) engine=ndb
+mysqld-bin.000001 # Query 1 # use `test`; create table t2 (a int primary key) engine=ndb
reset master;
reset master;
alter table t2 add column (b int);
@@ -25,19 +25,19 @@
Warning 1478 Converted FIXED field to DYNAMIC to enable on-line ADD COLUMN
show binlog events from <binlog_start>;
Log_name Pos Event_type Server_id End_log_pos Info
-mysqld-bin.000001 # Query 2 # use `test`; alter table t2 add column (b int)
+mysqld-bin.000001 # Query 1 # use `test`; alter table t2 add column (b int)
reset master;
reset master;
ALTER DATABASE mysqltest CHARACTER SET latin1;
drop table mysqltest.t1;
show binlog events from <binlog_start>;
Log_name Pos Event_type Server_id End_log_pos Info
-mysqld-bin.000001 # Query 2 # ALTER DATABASE mysqltest CHARACTER SET latin1
-mysqld-bin.000001 # Query 2 # use `mysqltest`; drop table `mysqltest`.`t1`
+mysqld-bin.000001 # Query 1 # ALTER DATABASE mysqltest CHARACTER SET latin1
+mysqld-bin.000001 # Query 1 # use `mysqltest`; drop table `mysqltest`.`t1`
show binlog events from <binlog_start>;
Log_name Pos Event_type Server_id End_log_pos Info
-mysqld-bin.000001 # Query 2 # ALTER DATABASE mysqltest CHARACTER SET latin1
-mysqld-bin.000001 # Query 2 # use `mysqltest`; drop table `mysqltest`.`t1`
+mysqld-bin.000001 # Query 1 # ALTER DATABASE mysqltest CHARACTER SET latin1
+mysqld-bin.000001 # Query 1 # use `mysqltest`; drop table `mysqltest`.`t1`
reset master;
reset master;
use test;
@@ -52,8 +52,8 @@
mysqld-bin.000001 # Write_rows 2 # table_id: #
mysqld-bin.000001 # Write_rows 2 # table_id: # flags: STMT_END_F
mysqld-bin.000001 # Query 2 # COMMIT
-mysqld-bin.000001 # Query 1 # drop database mysqltest
-mysqld-bin.000001 # Query 1 # use `test`; create table t1 (a int primary key) engine=ndb
+mysqld-bin.000001 # Query 2 # drop database mysqltest
+mysqld-bin.000001 # Query 2 # use `test`; create table t1 (a int primary key) engine=ndb
drop table t2;
reset master;
reset master;
@@ -87,63 +87,63 @@
ENGINE =NDB;
show binlog events from <binlog_start>;
Log_name Pos Event_type Server_id End_log_pos Info
-mysqld-bin.000001 # Query 1 # CREATE LOGFILE GROUP lg1
+mysqld-bin.000001 # Query 2 # CREATE LOGFILE GROUP lg1
ADD UNDOFILE 'undofile.dat'
INITIAL_SIZE 16M
UNDO_BUFFER_SIZE = 1M
ENGINE=NDB
-mysqld-bin.000001 # Query 1 # ALTER LOGFILE GROUP lg1
+mysqld-bin.000001 # Query 2 # ALTER LOGFILE GROUP lg1
ADD UNDOFILE 'undofile02.dat'
INITIAL_SIZE = 4M
ENGINE=NDB
-mysqld-bin.000001 # Query 1 # CREATE TABLESPACE ts1
+mysqld-bin.000001 # Query 2 # CREATE TABLESPACE ts1
ADD DATAFILE 'datafile.dat'
USE LOGFILE GROUP lg1
INITIAL_SIZE 12M
ENGINE NDB
-mysqld-bin.000001 # Query 1 # ALTER TABLESPACE ts1
+mysqld-bin.000001 # Query 2 # ALTER TABLESPACE ts1
ADD DATAFILE 'datafile02.dat'
INITIAL_SIZE = 4M
ENGINE=NDB
-mysqld-bin.000001 # Query 1 # ALTER TABLESPACE ts1
+mysqld-bin.000001 # Query 2 # ALTER TABLESPACE ts1
DROP DATAFILE 'datafile.dat'
ENGINE = NDB
-mysqld-bin.000001 # Query 1 # ALTER TABLESPACE ts1
+mysqld-bin.000001 # Query 2 # ALTER TABLESPACE ts1
DROP DATAFILE 'datafile02.dat'
ENGINE = NDB
-mysqld-bin.000001 # Query 1 # DROP TABLESPACE ts1
+mysqld-bin.000001 # Query 2 # DROP TABLESPACE ts1
ENGINE = NDB
-mysqld-bin.000001 # Query 1 # DROP LOGFILE GROUP lg1
+mysqld-bin.000001 # Query 2 # DROP LOGFILE GROUP lg1
ENGINE =NDB
show binlog events from <binlog_start>;
Log_name Pos Event_type Server_id End_log_pos Info
-mysqld-bin.000001 # Query 1 # CREATE LOGFILE GROUP lg1
+mysqld-bin.000001 # Query 2 # CREATE LOGFILE GROUP lg1
ADD UNDOFILE 'undofile.dat'
INITIAL_SIZE 16M
UNDO_BUFFER_SIZE = 1M
ENGINE=NDB
-mysqld-bin.000001 # Query 1 # ALTER LOGFILE GROUP lg1
+mysqld-bin.000001 # Query 2 # ALTER LOGFILE GROUP lg1
ADD UNDOFILE 'undofile02.dat'
INITIAL_SIZE = 4M
ENGINE=NDB
-mysqld-bin.000001 # Query 1 # CREATE TABLESPACE ts1
+mysqld-bin.000001 # Query 2 # CREATE TABLESPACE ts1
ADD DATAFILE 'datafile.dat'
USE LOGFILE GROUP lg1
INITIAL_SIZE 12M
ENGINE NDB
-mysqld-bin.000001 # Query 1 # ALTER TABLESPACE ts1
+mysqld-bin.000001 # Query 2 # ALTER TABLESPACE ts1
ADD DATAFILE 'datafile02.dat'
INITIAL_SIZE = 4M
ENGINE=NDB
-mysqld-bin.000001 # Query 1 # ALTER TABLESPACE ts1
+mysqld-bin.000001 # Query 2 # ALTER TABLESPACE ts1
DROP DATAFILE 'datafile.dat'
ENGINE = NDB
-mysqld-bin.000001 # Query 1 # ALTER TABLESPACE ts1
+mysqld-bin.000001 # Query 2 # ALTER TABLESPACE ts1
DROP DATAFILE 'datafile02.dat'
ENGINE = NDB
-mysqld-bin.000001 # Query 1 # DROP TABLESPACE ts1
+mysqld-bin.000001 # Query 2 # DROP TABLESPACE ts1
ENGINE = NDB
-mysqld-bin.000001 # Query 1 # DROP LOGFILE GROUP lg1
+mysqld-bin.000001 # Query 2 # DROP LOGFILE GROUP lg1
ENGINE =NDB
drop table t1;
reset master;
@@ -158,13 +158,13 @@
rename table t3 to t4, t2 to t3, t1 to t2, t4 to t1;
show binlog events from <binlog_start>;
Log_name Pos Event_type Server_id End_log_pos Info
-mysqld-bin.000001 # Query 1 # use `test`; create table t1 (a int key) engine=ndb
-mysqld-bin.000001 # Query 1 # use `test`; create table t2 (a int key) engine=ndb
-mysqld-bin.000001 # Query 1 # use `test`; create table t3 (a int key) engine=ndb
-mysqld-bin.000001 # Query 1 # use `test`; rename table `test`.`t3` to `test`.`t4`
-mysqld-bin.000001 # Query 1 # use `test`; rename table `test`.`t2` to `test`.`t3`
-mysqld-bin.000001 # Query 1 # use `test`; rename table `test`.`t1` to `test`.`t2`
-mysqld-bin.000001 # Query 1 # use `test`; rename table `test`.`t4` to `test`.`t1`
+mysqld-bin.000001 # Query 2 # use `test`; create table t1 (a int key) engine=ndb
+mysqld-bin.000001 # Query 2 # use `test`; create table t2 (a int key) engine=ndb
+mysqld-bin.000001 # Query 2 # use `test`; create table t3 (a int key) engine=ndb
+mysqld-bin.000001 # Query 2 # use `test`; rename table `test`.`t3` to `test`.`t4`
+mysqld-bin.000001 # Query 2 # use `test`; rename table `test`.`t2` to `test`.`t3`
+mysqld-bin.000001 # Query 2 # use `test`; rename table `test`.`t1` to `test`.`t2`
+mysqld-bin.000001 # Query 2 # use `test`; rename table `test`.`t4` to `test`.`t1`
drop table t1;
drop table t2;
drop table t3;
@@ -181,14 +181,14 @@
drop table t2;
show binlog events from <binlog_start>;
Log_name Pos Event_type Server_id End_log_pos Info
-mysqld-bin.000001 # Query 1 # use `test`; create table t1 (a int key) engine=ndb
+mysqld-bin.000001 # Query 2 # use `test`; create table t1 (a int key) engine=ndb
mysqld-bin.000001 # Query 2 # BEGIN
mysqld-bin.000001 # Table_map 2 # table_id: # (test.t1)
mysqld-bin.000001 # Table_map 2 # table_id: # (mysql.ndb_apply_status)
mysqld-bin.000001 # Write_rows 2 # table_id: #
mysqld-bin.000001 # Write_rows 2 # table_id: # flags: STMT_END_F
mysqld-bin.000001 # Query 2 # COMMIT
-mysqld-bin.000001 # Query 1 # use `test`; rename table `test`.`t1` to `test`.`t2`
+mysqld-bin.000001 # Query 2 # use `test`; rename table `test`.`t1` to `test`.`t2`
mysqld-bin.000001 # Query 2 # BEGIN
mysqld-bin.000001 # Table_map 2 # table_id: # (test.t2)
mysqld-bin.000001 # Table_map 2 # table_id: # (mysql.ndb_apply_status)
=== modified file 'mysql-test/suite/ndb_binlog/r/ndb_binlog_log_bin.result'
--- a/mysql-test/suite/ndb_binlog/r/ndb_binlog_log_bin.result 2009-02-01 21:05:19 +0000
+++ b/mysql-test/suite/ndb_binlog/r/ndb_binlog_log_bin.result 2009-09-11 10:34:36 +0000
@@ -53,10 +53,10 @@
insert into t2 values (1,1);
show binlog events from <binlog_start>;
Log_name Pos Event_type Server_id End_log_pos Info
-mysqld-bin.000001 # Query 1 # use `mysqltest`; drop table `mysqltest`.`t1`
-mysqld-bin.000001 # Query 1 # use `mysqltest`; drop table `mysqltest`.`t2`
-mysqld-bin.000001 # Query 1 # use `mysqltest`; create table t1 (d int key, e int) engine=ndb
-mysqld-bin.000001 # Query 1 # use `mysqltest`; create table t2 (d int key, e int) engine=ndb
+mysqld-bin.000001 # Query 2 # use `mysqltest`; drop table `mysqltest`.`t1`
+mysqld-bin.000001 # Query 2 # use `mysqltest`; drop table `mysqltest`.`t2`
+mysqld-bin.000001 # Query 2 # use `mysqltest`; create table t1 (d int key, e int) engine=ndb
+mysqld-bin.000001 # Query 2 # use `mysqltest`; create table t2 (d int key, e int) engine=ndb
mysqld-bin.000001 # Query 2 # BEGIN
mysqld-bin.000001 # Table_map 2 # table_id: # (mysqltest.t1)
mysqld-bin.000001 # Table_map 2 # table_id: # (mysql.ndb_apply_status)
=== modified file 'mysql-test/suite/ndb_binlog/r/ndb_binlog_multi.result'
--- a/mysql-test/suite/ndb_binlog/r/ndb_binlog_multi.result 2009-02-01 21:05:19 +0000
+++ b/mysql-test/suite/ndb_binlog/r/ndb_binlog_multi.result 2009-09-11 10:34:36 +0000
@@ -30,7 +30,7 @@
DROP TABLE t2;
show binlog events from <binlog_start>;
Log_name Pos Event_type Server_id End_log_pos Info
-mysqld-bin.000001 # Query 2 # use `test`; CREATE TABLE t2 (a INT PRIMARY KEY, b int) ENGINE = NDB
+mysqld-bin.000001 # Query 1 # use `test`; CREATE TABLE t2 (a INT PRIMARY KEY, b int) ENGINE = NDB
mysqld-bin.000001 # Query 1 # BEGIN
mysqld-bin.000001 # Table_map 1 # table_id: # (test.t2)
mysqld-bin.000001 # Table_map 1 # table_id: # (mysql.ndb_apply_status)
=== modified file 'mysql-test/suite/rpl_ndb/r/rpl_ndb_circular.result'
--- a/mysql-test/suite/rpl_ndb/r/rpl_ndb_circular.result 2009-02-11 10:27:14 +0000
+++ b/mysql-test/suite/rpl_ndb/r/rpl_ndb_circular.result 2009-09-11 15:44:36 +0000
@@ -57,6 +57,31 @@
Last_SQL_Errno 0
Last_SQL_Error
Master_Bind
+Slave Binlog contains all ops as log_slave_updates is on
+show variables like 'server_id';
+Variable_name Value
+server_id 2
+show variables like 'log_bin';
+Variable_name Value
+log_bin ON
+show variables like 'log_slave_updates';
+Variable_name Value
+log_slave_updates ON
+show binlog events from <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+slave-bin.000001 # Query 2 # use `test`; CREATE TABLE t1 (a int key, b int) ENGINE=ndb
+slave-bin.000001 # Query 2 # BEGIN
+slave-bin.000001 # Table_map 2 # table_id: # (test.t1)
+slave-bin.000001 # Table_map 2 # table_id: # (mysql.ndb_apply_status)
+slave-bin.000001 # Write_rows 2 # table_id: #
+slave-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
+slave-bin.000001 # Query 2 # COMMIT
+slave-bin.000001 # Query 2 # BEGIN
+slave-bin.000001 # Table_map 2 # table_id: # (test.t1)
+slave-bin.000001 # Table_map 2 # table_id: # (mysql.ndb_apply_status)
+slave-bin.000001 # Write_rows 2 # table_id: #
+slave-bin.000001 # Write_rows 2 # table_id: # flags: STMT_END_F
+slave-bin.000001 # Query 2 # COMMIT
SELECT * FROM t1 ORDER BY a;
a b
1 2
@@ -101,5 +126,23 @@
Last_SQL_Errno 0
Last_SQL_Error
Master_Bind
+Master Binlog contains only Master ops as log_slave_updates is off
+show variables like 'server_id';
+Variable_name Value
+server_id 1
+show variables like 'log_bin';
+Variable_name Value
+log_bin ON
+show variables like 'log_slave_updates';
+Variable_name Value
+log_slave_updates OFF
+show binlog events from <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Query 1 # BEGIN
+master-bin.000001 # Table_map 1 # table_id: # (test.t1)
+master-bin.000001 # Table_map 1 # table_id: # (mysql.ndb_apply_status)
+master-bin.000001 # Write_rows 1 # table_id: #
+master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
+master-bin.000001 # Query 1 # COMMIT
STOP SLAVE;
DROP TABLE t1;
=== added file 'mysql-test/suite/rpl_ndb/r/rpl_ndb_slave_lsu.result'
--- a/mysql-test/suite/rpl_ndb/r/rpl_ndb_slave_lsu.result 1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/rpl_ndb/r/rpl_ndb_slave_lsu.result 2009-09-14 12:45:19 +0000
@@ -0,0 +1,819 @@
+*** Configuring connections ***
+*** Configuring replication via Slave ***
+STOP SLAVE;
+RESET MASTER;
+RESET MASTER;
+RESET MASTER;
+RESET MASTER;
+RESET SLAVE;
+CHANGE MASTER TO MASTER_HOST="127.0.0.1",MASTER_PORT=MASTER_PORT,MASTER_USER="root";;
+START SLAVE;
+*** Generating slave cluster originated binloggable changes ***
+CREATE TABLE bug_45756_slave_logged_1 (a int) engine = NDB;
+INSERT INTO bug_45756_slave_logged_1 VALUES (1);
+DROP TABLE bug_45756_slave_logged_1;
+CREATE TABLE bug_45756_slave_logged_2 (a int) engine = NDB;
+INSERT INTO bug_45756_slave_logged_2 VALUES (1);
+DROP TABLE bug_45756_slave_logged_2;
+CREATE TABLE bug_45756_slave_logged_3 (a int) engine = NDB;
+INSERT INTO bug_45756_slave_logged_3 VALUES (1);
+DROP TABLE bug_45756_slave_logged_3;
+***Generating slave cluster non-binloggable changes***
+SET SQL_LOG_BIN= 0;
+CREATE TABLE bug_45756_slave_not_logged_1 (a int) engine = NDB;
+INSERT INTO bug_45756_slave_not_logged_1 VALUES (1);
+DROP TABLE bug_45756_slave_not_logged_1;
+SET SQL_LOG_BIN= 1;
+SET SQL_LOG_BIN= 0;
+CREATE TABLE bug_45756_slave_not_logged_2 (a int) engine = NDB;
+INSERT INTO bug_45756_slave_not_logged_2 VALUES (1);
+DROP TABLE bug_45756_slave_not_logged_2;
+SET SQL_LOG_BIN= 1;
+SET SQL_LOG_BIN= 0;
+CREATE TABLE bug_45756_slave_not_logged_3 (a int) engine = NDB;
+INSERT INTO bug_45756_slave_not_logged_3 VALUES (1);
+DROP TABLE bug_45756_slave_not_logged_3;
+SET SQL_LOG_BIN= 1;
+*** Generating data to be replicated ***
+CREATE TABLE bug45756_master_logged_1 (a int) engine = NDB;
+INSERT INTO bug45756_master_logged_1 VALUES (1);
+DROP TABLE bug45756_master_logged_1;
+CREATE TABLE bug45756_master_logged_2 (a int) engine = NDB;
+INSERT INTO bug45756_master_logged_2 VALUES (1);
+DROP TABLE bug45756_master_logged_2;
+CREATE TABLE bug45756_master_logged_3 (a int) engine = NDB;
+INSERT INTO bug45756_master_logged_3 VALUES (1);
+DROP TABLE bug45756_master_logged_3;
+*** Generating changes not to be replicated ***
+SET SQL_LOG_BIN= 0;
+CREATE TABLE bug45756_master_not_logged_1 (a int) engine = NDB;
+INSERT INTO bug45756_master_not_logged_1 VALUES (1);
+DROP TABLE bug45756_master_not_logged_1;
+SET SQL_LOG_BIN= 1;
+SET SQL_LOG_BIN= 0;
+CREATE TABLE bug45756_master_not_logged_2 (a int) engine = NDB;
+INSERT INTO bug45756_master_not_logged_2 VALUES (1);
+DROP TABLE bug45756_master_not_logged_2;
+SET SQL_LOG_BIN= 1;
+SET SQL_LOG_BIN= 0;
+CREATE TABLE bug45756_master_not_logged_3 (a int) engine = NDB;
+INSERT INTO bug45756_master_not_logged_3 VALUES (1);
+DROP TABLE bug45756_master_not_logged_3;
+SET SQL_LOG_BIN= 1;
+*** Checking binlog contents on every server in both clusters ***
+
+
+
+connection srv_master;
+show variables like 'server_id';
+Variable_name Value
+server_id 1
+show variables like 'log_bin';
+Variable_name Value
+log_bin ON
+show variables like 'log_slave_updates';
+Variable_name Value
+log_slave_updates OFF
+show binlog events from <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Query 1 # use `test`; CREATE TABLE bug45756_master_logged_1 (a int) engine = NDB
+master-bin.000001 # Query 1 # BEGIN
+master-bin.000001 # Table_map 1 # table_id: # (test.bug45756_master_logged_1)
+master-bin.000001 # Table_map 1 # table_id: # (mysql.ndb_apply_status)
+master-bin.000001 # Write_rows 1 # table_id: #
+master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
+master-bin.000001 # Query 1 # COMMIT
+master-bin.000001 # Query 1 # use `test`; DROP TABLE bug45756_master_logged_1
+master-bin.000001 # Query 1 # use `test`; CREATE TABLE bug45756_master_logged_2 (a int) engine = NDB
+master-bin.000001 # Query 1 # BEGIN
+master-bin.000001 # Table_map 1 # table_id: # (test.bug45756_master_logged_2)
+master-bin.000001 # Table_map 1 # table_id: # (mysql.ndb_apply_status)
+master-bin.000001 # Write_rows 1 # table_id: #
+master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
+master-bin.000001 # Query 1 # COMMIT
+master-bin.000001 # Query 1 # use `test`; drop table `test`.`bug45756_master_logged_2`
+master-bin.000001 # Query 1 # use `test`; CREATE TABLE bug45756_master_logged_3 (a int) engine = NDB
+master-bin.000001 # Query 1 # BEGIN
+master-bin.000001 # Table_map 1 # table_id: # (test.bug45756_master_logged_3)
+master-bin.000001 # Table_map 1 # table_id: # (mysql.ndb_apply_status)
+master-bin.000001 # Write_rows 1 # table_id: #
+master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
+master-bin.000001 # Query 1 # COMMIT
+master-bin.000001 # Query 1 # use `test`; drop table `test`.`bug45756_master_logged_3`
+
+
+
+connection srv_master1;
+show variables like 'server_id';
+Variable_name Value
+server_id 2
+show variables like 'log_bin';
+Variable_name Value
+log_bin OFF
+show variables like 'log_slave_updates';
+Variable_name Value
+log_slave_updates OFF
+show binlog events from <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+
+
+
+connection srv_master2;
+show variables like 'server_id';
+Variable_name Value
+server_id 3
+show variables like 'log_bin';
+Variable_name Value
+log_bin ON
+show variables like 'log_slave_updates';
+Variable_name Value
+log_slave_updates OFF
+show binlog events from <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Query 3 # use `test`; CREATE TABLE bug45756_master_logged_1 (a int) engine = NDB
+master-bin.000001 # Query 3 # BEGIN
+master-bin.000001 # Table_map 3 # table_id: # (test.bug45756_master_logged_1)
+master-bin.000001 # Table_map 3 # table_id: # (mysql.ndb_apply_status)
+master-bin.000001 # Write_rows 3 # table_id: #
+master-bin.000001 # Write_rows 3 # table_id: # flags: STMT_END_F
+master-bin.000001 # Query 3 # COMMIT
+master-bin.000001 # Query 3 # use `test`; drop table `test`.`bug45756_master_logged_1`
+master-bin.000001 # Query 3 # use `test`; CREATE TABLE bug45756_master_logged_2 (a int) engine = NDB
+master-bin.000001 # Query 3 # BEGIN
+master-bin.000001 # Table_map 3 # table_id: # (test.bug45756_master_logged_2)
+master-bin.000001 # Table_map 3 # table_id: # (mysql.ndb_apply_status)
+master-bin.000001 # Write_rows 3 # table_id: #
+master-bin.000001 # Write_rows 3 # table_id: # flags: STMT_END_F
+master-bin.000001 # Query 3 # COMMIT
+master-bin.000001 # Query 3 # use `test`; drop table `test`.`bug45756_master_logged_2`
+master-bin.000001 # Query 3 # use `test`; CREATE TABLE bug45756_master_logged_3 (a int) engine = NDB
+master-bin.000001 # Query 3 # BEGIN
+master-bin.000001 # Table_map 3 # table_id: # (test.bug45756_master_logged_3)
+master-bin.000001 # Table_map 3 # table_id: # (mysql.ndb_apply_status)
+master-bin.000001 # Write_rows 3 # table_id: #
+master-bin.000001 # Write_rows 3 # table_id: # flags: STMT_END_F
+master-bin.000001 # Query 3 # COMMIT
+master-bin.000001 # Query 3 # use `test`; DROP TABLE bug45756_master_logged_3
+
+
+
+connection srv_slave;
+show variables like 'server_id';
+Variable_name Value
+server_id 4
+show variables like 'log_bin';
+Variable_name Value
+log_bin OFF
+show variables like 'log_slave_updates';
+Variable_name Value
+log_slave_updates OFF
+show binlog events from <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+
+
+
+connection srv_slave1;
+show variables like 'server_id';
+Variable_name Value
+server_id 5
+show variables like 'log_bin';
+Variable_name Value
+log_bin ON
+show variables like 'log_slave_updates';
+Variable_name Value
+log_slave_updates OFF
+show binlog events from <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+slave-master-bin.000001 # Query 5 # use `test`; CREATE TABLE bug_45756_slave_logged_1 (a int) engine = NDB
+slave-master-bin.000001 # Query 5 # BEGIN
+slave-master-bin.000001 # Table_map 5 # table_id: # (test.bug_45756_slave_logged_1)
+slave-master-bin.000001 # Table_map 5 # table_id: # (mysql.ndb_apply_status)
+slave-master-bin.000001 # Write_rows 5 # table_id: #
+slave-master-bin.000001 # Write_rows 5 # table_id: # flags: STMT_END_F
+slave-master-bin.000001 # Query 5 # COMMIT
+slave-master-bin.000001 # Query 5 # use `test`; drop table `test`.`bug_45756_slave_logged_1`
+slave-master-bin.000001 # Query 5 # use `test`; CREATE TABLE bug_45756_slave_logged_2 (a int) engine = NDB
+slave-master-bin.000001 # Query 5 # BEGIN
+slave-master-bin.000001 # Table_map 5 # table_id: # (test.bug_45756_slave_logged_2)
+slave-master-bin.000001 # Table_map 5 # table_id: # (mysql.ndb_apply_status)
+slave-master-bin.000001 # Write_rows 5 # table_id: #
+slave-master-bin.000001 # Write_rows 5 # table_id: # flags: STMT_END_F
+slave-master-bin.000001 # Query 5 # COMMIT
+slave-master-bin.000001 # Query 5 # use `test`; DROP TABLE bug_45756_slave_logged_2
+slave-master-bin.000001 # Query 5 # use `test`; CREATE TABLE bug_45756_slave_logged_3 (a int) engine = NDB
+slave-master-bin.000001 # Query 5 # BEGIN
+slave-master-bin.000001 # Table_map 5 # table_id: # (test.bug_45756_slave_logged_3)
+slave-master-bin.000001 # Table_map 5 # table_id: # (mysql.ndb_apply_status)
+slave-master-bin.000001 # Write_rows 5 # table_id: #
+slave-master-bin.000001 # Write_rows 5 # table_id: # flags: STMT_END_F
+slave-master-bin.000001 # Query 5 # COMMIT
+slave-master-bin.000001 # Query 5 # use `test`; drop table `test`.`bug_45756_slave_logged_3`
+
+
+
+connection srv_slave2;
+show variables like 'server_id';
+Variable_name Value
+server_id 6
+show variables like 'log_bin';
+Variable_name Value
+log_bin ON
+show variables like 'log_slave_updates';
+Variable_name Value
+log_slave_updates ON
+show binlog events from <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+slave-master-bin.000001 # Query 6 # use `test`; CREATE TABLE bug_45756_slave_logged_1 (a int) engine = NDB
+slave-master-bin.000001 # Query 6 # BEGIN
+slave-master-bin.000001 # Table_map 6 # table_id: # (test.bug_45756_slave_logged_1)
+slave-master-bin.000001 # Table_map 6 # table_id: # (mysql.ndb_apply_status)
+slave-master-bin.000001 # Write_rows 6 # table_id: #
+slave-master-bin.000001 # Write_rows 6 # table_id: # flags: STMT_END_F
+slave-master-bin.000001 # Query 6 # COMMIT
+slave-master-bin.000001 # Query 6 # use `test`; drop table `test`.`bug_45756_slave_logged_1`
+slave-master-bin.000001 # Query 6 # use `test`; CREATE TABLE bug_45756_slave_logged_2 (a int) engine = NDB
+slave-master-bin.000001 # Query 6 # BEGIN
+slave-master-bin.000001 # Table_map 6 # table_id: # (test.bug_45756_slave_logged_2)
+slave-master-bin.000001 # Table_map 6 # table_id: # (mysql.ndb_apply_status)
+slave-master-bin.000001 # Write_rows 6 # table_id: #
+slave-master-bin.000001 # Write_rows 6 # table_id: # flags: STMT_END_F
+slave-master-bin.000001 # Query 6 # COMMIT
+slave-master-bin.000001 # Query 6 # use `test`; drop table `test`.`bug_45756_slave_logged_2`
+slave-master-bin.000001 # Query 6 # use `test`; CREATE TABLE bug_45756_slave_logged_3 (a int) engine = NDB
+slave-master-bin.000001 # Query 6 # BEGIN
+slave-master-bin.000001 # Table_map 6 # table_id: # (test.bug_45756_slave_logged_3)
+slave-master-bin.000001 # Table_map 6 # table_id: # (mysql.ndb_apply_status)
+slave-master-bin.000001 # Write_rows 6 # table_id: #
+slave-master-bin.000001 # Write_rows 6 # table_id: # flags: STMT_END_F
+slave-master-bin.000001 # Query 6 # COMMIT
+slave-master-bin.000001 # Query 6 # use `test`; DROP TABLE bug_45756_slave_logged_3
+slave-master-bin.000001 # Query 1 # use `test`; CREATE TABLE bug45756_master_logged_1 (a int) engine = NDB
+slave-master-bin.000001 # Query 6 # BEGIN
+slave-master-bin.000001 # Table_map 6 # table_id: # (test.bug45756_master_logged_1)
+slave-master-bin.000001 # Table_map 6 # table_id: # (mysql.ndb_apply_status)
+slave-master-bin.000001 # Write_rows 6 # table_id: #
+slave-master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
+slave-master-bin.000001 # Query 6 # COMMIT
+slave-master-bin.000001 # Query 1 # use `test`; drop table `test`.`bug45756_master_logged_1`
+slave-master-bin.000001 # Query 1 # use `test`; CREATE TABLE bug45756_master_logged_2 (a int) engine = NDB
+slave-master-bin.000001 # Query 6 # BEGIN
+slave-master-bin.000001 # Table_map 6 # table_id: # (test.bug45756_master_logged_2)
+slave-master-bin.000001 # Table_map 6 # table_id: # (mysql.ndb_apply_status)
+slave-master-bin.000001 # Write_rows 6 # table_id: #
+slave-master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
+slave-master-bin.000001 # Query 6 # COMMIT
+slave-master-bin.000001 # Query 1 # use `test`; drop table `test`.`bug45756_master_logged_2`
+slave-master-bin.000001 # Query 1 # use `test`; CREATE TABLE bug45756_master_logged_3 (a int) engine = NDB
+slave-master-bin.000001 # Query 6 # BEGIN
+slave-master-bin.000001 # Table_map 6 # table_id: # (test.bug45756_master_logged_3)
+slave-master-bin.000001 # Table_map 6 # table_id: # (mysql.ndb_apply_status)
+slave-master-bin.000001 # Write_rows 6 # table_id: #
+slave-master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
+slave-master-bin.000001 # Query 6 # COMMIT
+slave-master-bin.000001 # Query 1 # use `test`; drop table `test`.`bug45756_master_logged_3`
+*** Configuring replication via Slave1 ***
+STOP SLAVE;
+STOP SLAVE;
+RESET MASTER;
+RESET MASTER;
+RESET MASTER;
+RESET MASTER;
+RESET SLAVE;
+CHANGE MASTER TO MASTER_HOST="127.0.0.1",MASTER_PORT=MASTER_PORT,MASTER_USER="root";
+START SLAVE;
+*** Generating slave cluster originated binloggable changes ***
+CREATE TABLE bug_45756_slave_logged_1 (a int) engine = NDB;
+INSERT INTO bug_45756_slave_logged_1 VALUES (1);
+DROP TABLE bug_45756_slave_logged_1;
+CREATE TABLE bug_45756_slave_logged_2 (a int) engine = NDB;
+INSERT INTO bug_45756_slave_logged_2 VALUES (1);
+DROP TABLE bug_45756_slave_logged_2;
+CREATE TABLE bug_45756_slave_logged_3 (a int) engine = NDB;
+INSERT INTO bug_45756_slave_logged_3 VALUES (1);
+DROP TABLE bug_45756_slave_logged_3;
+***Generating slave cluster non-binloggable changes***
+SET SQL_LOG_BIN= 0;
+CREATE TABLE bug_45756_slave_not_logged_1 (a int) engine = NDB;
+INSERT INTO bug_45756_slave_not_logged_1 VALUES (1);
+DROP TABLE bug_45756_slave_not_logged_1;
+SET SQL_LOG_BIN= 1;
+SET SQL_LOG_BIN= 0;
+CREATE TABLE bug_45756_slave_not_logged_2 (a int) engine = NDB;
+INSERT INTO bug_45756_slave_not_logged_2 VALUES (1);
+DROP TABLE bug_45756_slave_not_logged_2;
+SET SQL_LOG_BIN= 1;
+SET SQL_LOG_BIN= 0;
+CREATE TABLE bug_45756_slave_not_logged_3 (a int) engine = NDB;
+INSERT INTO bug_45756_slave_not_logged_3 VALUES (1);
+DROP TABLE bug_45756_slave_not_logged_3;
+SET SQL_LOG_BIN= 1;
+*** Generating data to be replicated ***
+CREATE TABLE bug45756_master_logged_1 (a int) engine = NDB;
+INSERT INTO bug45756_master_logged_1 VALUES (1);
+DROP TABLE bug45756_master_logged_1;
+CREATE TABLE bug45756_master_logged_2 (a int) engine = NDB;
+INSERT INTO bug45756_master_logged_2 VALUES (1);
+DROP TABLE bug45756_master_logged_2;
+CREATE TABLE bug45756_master_logged_3 (a int) engine = NDB;
+INSERT INTO bug45756_master_logged_3 VALUES (1);
+DROP TABLE bug45756_master_logged_3;
+*** Generating changes not to be replicated ***
+SET SQL_LOG_BIN= 0;
+CREATE TABLE bug45756_master_not_logged_1 (a int) engine = NDB;
+INSERT INTO bug45756_master_not_logged_1 VALUES (1);
+DROP TABLE bug45756_master_not_logged_1;
+SET SQL_LOG_BIN= 1;
+SET SQL_LOG_BIN= 0;
+CREATE TABLE bug45756_master_not_logged_2 (a int) engine = NDB;
+INSERT INTO bug45756_master_not_logged_2 VALUES (1);
+DROP TABLE bug45756_master_not_logged_2;
+SET SQL_LOG_BIN= 1;
+SET SQL_LOG_BIN= 0;
+CREATE TABLE bug45756_master_not_logged_3 (a int) engine = NDB;
+INSERT INTO bug45756_master_not_logged_3 VALUES (1);
+DROP TABLE bug45756_master_not_logged_3;
+SET SQL_LOG_BIN= 1;
+*** Checking binlog contents on every server in both clusters ***
+
+
+
+connection srv_master;
+show variables like 'server_id';
+Variable_name Value
+server_id 1
+show variables like 'log_bin';
+Variable_name Value
+log_bin ON
+show variables like 'log_slave_updates';
+Variable_name Value
+log_slave_updates OFF
+show binlog events from <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Query 1 # use `test`; CREATE TABLE bug45756_master_logged_1 (a int) engine = NDB
+master-bin.000001 # Query 1 # BEGIN
+master-bin.000001 # Table_map 1 # table_id: # (test.bug45756_master_logged_1)
+master-bin.000001 # Table_map 1 # table_id: # (mysql.ndb_apply_status)
+master-bin.000001 # Write_rows 1 # table_id: #
+master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
+master-bin.000001 # Query 1 # COMMIT
+master-bin.000001 # Query 1 # use `test`; DROP TABLE bug45756_master_logged_1
+master-bin.000001 # Query 1 # use `test`; CREATE TABLE bug45756_master_logged_2 (a int) engine = NDB
+master-bin.000001 # Query 1 # BEGIN
+master-bin.000001 # Table_map 1 # table_id: # (test.bug45756_master_logged_2)
+master-bin.000001 # Table_map 1 # table_id: # (mysql.ndb_apply_status)
+master-bin.000001 # Write_rows 1 # table_id: #
+master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
+master-bin.000001 # Query 1 # COMMIT
+master-bin.000001 # Query 1 # use `test`; drop table `test`.`bug45756_master_logged_2`
+master-bin.000001 # Query 1 # use `test`; CREATE TABLE bug45756_master_logged_3 (a int) engine = NDB
+master-bin.000001 # Query 1 # BEGIN
+master-bin.000001 # Table_map 1 # table_id: # (test.bug45756_master_logged_3)
+master-bin.000001 # Table_map 1 # table_id: # (mysql.ndb_apply_status)
+master-bin.000001 # Write_rows 1 # table_id: #
+master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
+master-bin.000001 # Query 1 # COMMIT
+master-bin.000001 # Query 1 # use `test`; drop table `test`.`bug45756_master_logged_3`
+
+
+
+connection srv_master1;
+show variables like 'server_id';
+Variable_name Value
+server_id 2
+show variables like 'log_bin';
+Variable_name Value
+log_bin OFF
+show variables like 'log_slave_updates';
+Variable_name Value
+log_slave_updates OFF
+show binlog events from <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+
+
+
+connection srv_master2;
+show variables like 'server_id';
+Variable_name Value
+server_id 3
+show variables like 'log_bin';
+Variable_name Value
+log_bin ON
+show variables like 'log_slave_updates';
+Variable_name Value
+log_slave_updates OFF
+show binlog events from <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Query 3 # use `test`; CREATE TABLE bug45756_master_logged_1 (a int) engine = NDB
+master-bin.000001 # Query 3 # BEGIN
+master-bin.000001 # Table_map 3 # table_id: # (test.bug45756_master_logged_1)
+master-bin.000001 # Table_map 3 # table_id: # (mysql.ndb_apply_status)
+master-bin.000001 # Write_rows 3 # table_id: #
+master-bin.000001 # Write_rows 3 # table_id: # flags: STMT_END_F
+master-bin.000001 # Query 3 # COMMIT
+master-bin.000001 # Query 3 # use `test`; drop table `test`.`bug45756_master_logged_1`
+master-bin.000001 # Query 3 # use `test`; CREATE TABLE bug45756_master_logged_2 (a int) engine = NDB
+master-bin.000001 # Query 3 # BEGIN
+master-bin.000001 # Table_map 3 # table_id: # (test.bug45756_master_logged_2)
+master-bin.000001 # Table_map 3 # table_id: # (mysql.ndb_apply_status)
+master-bin.000001 # Write_rows 3 # table_id: #
+master-bin.000001 # Write_rows 3 # table_id: # flags: STMT_END_F
+master-bin.000001 # Query 3 # COMMIT
+master-bin.000001 # Query 3 # use `test`; drop table `test`.`bug45756_master_logged_2`
+master-bin.000001 # Query 3 # use `test`; CREATE TABLE bug45756_master_logged_3 (a int) engine = NDB
+master-bin.000001 # Query 3 # BEGIN
+master-bin.000001 # Table_map 3 # table_id: # (test.bug45756_master_logged_3)
+master-bin.000001 # Table_map 3 # table_id: # (mysql.ndb_apply_status)
+master-bin.000001 # Write_rows 3 # table_id: #
+master-bin.000001 # Write_rows 3 # table_id: # flags: STMT_END_F
+master-bin.000001 # Query 3 # COMMIT
+master-bin.000001 # Query 3 # use `test`; DROP TABLE bug45756_master_logged_3
+
+
+
+connection srv_slave;
+show variables like 'server_id';
+Variable_name Value
+server_id 4
+show variables like 'log_bin';
+Variable_name Value
+log_bin OFF
+show variables like 'log_slave_updates';
+Variable_name Value
+log_slave_updates OFF
+show binlog events from <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+
+
+
+connection srv_slave1;
+show variables like 'server_id';
+Variable_name Value
+server_id 5
+show variables like 'log_bin';
+Variable_name Value
+log_bin ON
+show variables like 'log_slave_updates';
+Variable_name Value
+log_slave_updates OFF
+show binlog events from <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+slave-master-bin.000001 # Query 5 # use `test`; CREATE TABLE bug_45756_slave_logged_1 (a int) engine = NDB
+slave-master-bin.000001 # Query 5 # BEGIN
+slave-master-bin.000001 # Table_map 5 # table_id: # (test.bug_45756_slave_logged_1)
+slave-master-bin.000001 # Table_map 5 # table_id: # (mysql.ndb_apply_status)
+slave-master-bin.000001 # Write_rows 5 # table_id: #
+slave-master-bin.000001 # Write_rows 5 # table_id: # flags: STMT_END_F
+slave-master-bin.000001 # Query 5 # COMMIT
+slave-master-bin.000001 # Query 5 # use `test`; drop table `test`.`bug_45756_slave_logged_1`
+slave-master-bin.000001 # Query 5 # use `test`; CREATE TABLE bug_45756_slave_logged_2 (a int) engine = NDB
+slave-master-bin.000001 # Query 5 # BEGIN
+slave-master-bin.000001 # Table_map 5 # table_id: # (test.bug_45756_slave_logged_2)
+slave-master-bin.000001 # Table_map 5 # table_id: # (mysql.ndb_apply_status)
+slave-master-bin.000001 # Write_rows 5 # table_id: #
+slave-master-bin.000001 # Write_rows 5 # table_id: # flags: STMT_END_F
+slave-master-bin.000001 # Query 5 # COMMIT
+slave-master-bin.000001 # Query 5 # use `test`; DROP TABLE bug_45756_slave_logged_2
+slave-master-bin.000001 # Query 5 # use `test`; CREATE TABLE bug_45756_slave_logged_3 (a int) engine = NDB
+slave-master-bin.000001 # Query 5 # BEGIN
+slave-master-bin.000001 # Table_map 5 # table_id: # (test.bug_45756_slave_logged_3)
+slave-master-bin.000001 # Table_map 5 # table_id: # (mysql.ndb_apply_status)
+slave-master-bin.000001 # Write_rows 5 # table_id: #
+slave-master-bin.000001 # Write_rows 5 # table_id: # flags: STMT_END_F
+slave-master-bin.000001 # Query 5 # COMMIT
+slave-master-bin.000001 # Query 5 # use `test`; drop table `test`.`bug_45756_slave_logged_3`
+
+
+
+connection srv_slave2;
+show variables like 'server_id';
+Variable_name Value
+server_id 6
+show variables like 'log_bin';
+Variable_name Value
+log_bin ON
+show variables like 'log_slave_updates';
+Variable_name Value
+log_slave_updates ON
+show binlog events from <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+slave-master-bin.000001 # Query 6 # use `test`; CREATE TABLE bug_45756_slave_logged_1 (a int) engine = NDB
+slave-master-bin.000001 # Query 6 # BEGIN
+slave-master-bin.000001 # Table_map 6 # table_id: # (test.bug_45756_slave_logged_1)
+slave-master-bin.000001 # Table_map 6 # table_id: # (mysql.ndb_apply_status)
+slave-master-bin.000001 # Write_rows 6 # table_id: #
+slave-master-bin.000001 # Write_rows 6 # table_id: # flags: STMT_END_F
+slave-master-bin.000001 # Query 6 # COMMIT
+slave-master-bin.000001 # Query 6 # use `test`; drop table `test`.`bug_45756_slave_logged_1`
+slave-master-bin.000001 # Query 6 # use `test`; CREATE TABLE bug_45756_slave_logged_2 (a int) engine = NDB
+slave-master-bin.000001 # Query 6 # BEGIN
+slave-master-bin.000001 # Table_map 6 # table_id: # (test.bug_45756_slave_logged_2)
+slave-master-bin.000001 # Table_map 6 # table_id: # (mysql.ndb_apply_status)
+slave-master-bin.000001 # Write_rows 6 # table_id: #
+slave-master-bin.000001 # Write_rows 6 # table_id: # flags: STMT_END_F
+slave-master-bin.000001 # Query 6 # COMMIT
+slave-master-bin.000001 # Query 6 # use `test`; drop table `test`.`bug_45756_slave_logged_2`
+slave-master-bin.000001 # Query 6 # use `test`; CREATE TABLE bug_45756_slave_logged_3 (a int) engine = NDB
+slave-master-bin.000001 # Query 6 # BEGIN
+slave-master-bin.000001 # Table_map 6 # table_id: # (test.bug_45756_slave_logged_3)
+slave-master-bin.000001 # Table_map 6 # table_id: # (mysql.ndb_apply_status)
+slave-master-bin.000001 # Write_rows 6 # table_id: #
+slave-master-bin.000001 # Write_rows 6 # table_id: # flags: STMT_END_F
+slave-master-bin.000001 # Query 6 # COMMIT
+slave-master-bin.000001 # Query 6 # use `test`; DROP TABLE bug_45756_slave_logged_3
+slave-master-bin.000001 # Query 1 # use `test`; CREATE TABLE bug45756_master_logged_1 (a int) engine = NDB
+slave-master-bin.000001 # Query 6 # BEGIN
+slave-master-bin.000001 # Table_map 6 # table_id: # (test.bug45756_master_logged_1)
+slave-master-bin.000001 # Table_map 6 # table_id: # (mysql.ndb_apply_status)
+slave-master-bin.000001 # Write_rows 6 # table_id: #
+slave-master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
+slave-master-bin.000001 # Query 6 # COMMIT
+slave-master-bin.000001 # Query 1 # use `test`; drop table `test`.`bug45756_master_logged_1`
+slave-master-bin.000001 # Query 1 # use `test`; CREATE TABLE bug45756_master_logged_2 (a int) engine = NDB
+slave-master-bin.000001 # Query 6 # BEGIN
+slave-master-bin.000001 # Table_map 6 # table_id: # (test.bug45756_master_logged_2)
+slave-master-bin.000001 # Table_map 6 # table_id: # (mysql.ndb_apply_status)
+slave-master-bin.000001 # Write_rows 6 # table_id: #
+slave-master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
+slave-master-bin.000001 # Query 6 # COMMIT
+slave-master-bin.000001 # Query 1 # use `test`; drop table `test`.`bug45756_master_logged_2`
+slave-master-bin.000001 # Query 1 # use `test`; CREATE TABLE bug45756_master_logged_3 (a int) engine = NDB
+slave-master-bin.000001 # Query 6 # BEGIN
+slave-master-bin.000001 # Table_map 6 # table_id: # (test.bug45756_master_logged_3)
+slave-master-bin.000001 # Table_map 6 # table_id: # (mysql.ndb_apply_status)
+slave-master-bin.000001 # Write_rows 6 # table_id: #
+slave-master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
+slave-master-bin.000001 # Query 6 # COMMIT
+slave-master-bin.000001 # Query 1 # use `test`; drop table `test`.`bug45756_master_logged_3`
+*** Configuring replication via Slave2 ***
+STOP SLAVE;
+STOP SLAVE;
+RESET MASTER;
+RESET MASTER;
+RESET MASTER;
+RESET MASTER;
+RESET SLAVE;
+CHANGE MASTER TO MASTER_HOST="127.0.0.1",MASTER_PORT=MASTER_PORT,MASTER_USER="root";;
+START SLAVE;
+*** Generating slave cluster originated binloggable changes ***
+CREATE TABLE bug_45756_slave_logged_1 (a int) engine = NDB;
+INSERT INTO bug_45756_slave_logged_1 VALUES (1);
+DROP TABLE bug_45756_slave_logged_1;
+CREATE TABLE bug_45756_slave_logged_2 (a int) engine = NDB;
+INSERT INTO bug_45756_slave_logged_2 VALUES (1);
+DROP TABLE bug_45756_slave_logged_2;
+CREATE TABLE bug_45756_slave_logged_3 (a int) engine = NDB;
+INSERT INTO bug_45756_slave_logged_3 VALUES (1);
+DROP TABLE bug_45756_slave_logged_3;
+***Generating slave cluster non-binloggable changes***
+SET SQL_LOG_BIN= 0;
+CREATE TABLE bug_45756_slave_not_logged_1 (a int) engine = NDB;
+INSERT INTO bug_45756_slave_not_logged_1 VALUES (1);
+DROP TABLE bug_45756_slave_not_logged_1;
+SET SQL_LOG_BIN= 1;
+SET SQL_LOG_BIN= 0;
+CREATE TABLE bug_45756_slave_not_logged_2 (a int) engine = NDB;
+INSERT INTO bug_45756_slave_not_logged_2 VALUES (1);
+DROP TABLE bug_45756_slave_not_logged_2;
+SET SQL_LOG_BIN= 1;
+SET SQL_LOG_BIN= 0;
+CREATE TABLE bug_45756_slave_not_logged_3 (a int) engine = NDB;
+INSERT INTO bug_45756_slave_not_logged_3 VALUES (1);
+DROP TABLE bug_45756_slave_not_logged_3;
+SET SQL_LOG_BIN= 1;
+*** Generating data to be replicated ***
+CREATE TABLE bug45756_master_logged_1 (a int) engine = NDB;
+INSERT INTO bug45756_master_logged_1 VALUES (1);
+DROP TABLE bug45756_master_logged_1;
+CREATE TABLE bug45756_master_logged_2 (a int) engine = NDB;
+INSERT INTO bug45756_master_logged_2 VALUES (1);
+DROP TABLE bug45756_master_logged_2;
+CREATE TABLE bug45756_master_logged_3 (a int) engine = NDB;
+INSERT INTO bug45756_master_logged_3 VALUES (1);
+DROP TABLE bug45756_master_logged_3;
+*** Generating changes not to be replicated ***
+SET SQL_LOG_BIN= 0;
+CREATE TABLE bug45756_master_not_logged_1 (a int) engine = NDB;
+INSERT INTO bug45756_master_not_logged_1 VALUES (1);
+DROP TABLE bug45756_master_not_logged_1;
+SET SQL_LOG_BIN= 1;
+SET SQL_LOG_BIN= 0;
+CREATE TABLE bug45756_master_not_logged_2 (a int) engine = NDB;
+INSERT INTO bug45756_master_not_logged_2 VALUES (1);
+DROP TABLE bug45756_master_not_logged_2;
+SET SQL_LOG_BIN= 1;
+SET SQL_LOG_BIN= 0;
+CREATE TABLE bug45756_master_not_logged_3 (a int) engine = NDB;
+INSERT INTO bug45756_master_not_logged_3 VALUES (1);
+DROP TABLE bug45756_master_not_logged_3;
+SET SQL_LOG_BIN= 1;
+*** Checking binlog contents on every server in both clusters ***
+
+
+
+connection srv_master;
+show variables like 'server_id';
+Variable_name Value
+server_id 1
+show variables like 'log_bin';
+Variable_name Value
+log_bin ON
+show variables like 'log_slave_updates';
+Variable_name Value
+log_slave_updates OFF
+show binlog events from <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Query 1 # use `test`; CREATE TABLE bug45756_master_logged_1 (a int) engine = NDB
+master-bin.000001 # Query 1 # BEGIN
+master-bin.000001 # Table_map 1 # table_id: # (test.bug45756_master_logged_1)
+master-bin.000001 # Table_map 1 # table_id: # (mysql.ndb_apply_status)
+master-bin.000001 # Write_rows 1 # table_id: #
+master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
+master-bin.000001 # Query 1 # COMMIT
+master-bin.000001 # Query 1 # use `test`; DROP TABLE bug45756_master_logged_1
+master-bin.000001 # Query 1 # use `test`; CREATE TABLE bug45756_master_logged_2 (a int) engine = NDB
+master-bin.000001 # Query 1 # BEGIN
+master-bin.000001 # Table_map 1 # table_id: # (test.bug45756_master_logged_2)
+master-bin.000001 # Table_map 1 # table_id: # (mysql.ndb_apply_status)
+master-bin.000001 # Write_rows 1 # table_id: #
+master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
+master-bin.000001 # Query 1 # COMMIT
+master-bin.000001 # Query 1 # use `test`; drop table `test`.`bug45756_master_logged_2`
+master-bin.000001 # Query 1 # use `test`; CREATE TABLE bug45756_master_logged_3 (a int) engine = NDB
+master-bin.000001 # Query 1 # BEGIN
+master-bin.000001 # Table_map 1 # table_id: # (test.bug45756_master_logged_3)
+master-bin.000001 # Table_map 1 # table_id: # (mysql.ndb_apply_status)
+master-bin.000001 # Write_rows 1 # table_id: #
+master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
+master-bin.000001 # Query 1 # COMMIT
+master-bin.000001 # Query 1 # use `test`; drop table `test`.`bug45756_master_logged_3`
+
+
+
+connection srv_master1;
+show variables like 'server_id';
+Variable_name Value
+server_id 2
+show variables like 'log_bin';
+Variable_name Value
+log_bin OFF
+show variables like 'log_slave_updates';
+Variable_name Value
+log_slave_updates OFF
+show binlog events from <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+
+
+
+connection srv_master2;
+show variables like 'server_id';
+Variable_name Value
+server_id 3
+show variables like 'log_bin';
+Variable_name Value
+log_bin ON
+show variables like 'log_slave_updates';
+Variable_name Value
+log_slave_updates OFF
+show binlog events from <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Query 3 # use `test`; CREATE TABLE bug45756_master_logged_1 (a int) engine = NDB
+master-bin.000001 # Query 3 # BEGIN
+master-bin.000001 # Table_map 3 # table_id: # (test.bug45756_master_logged_1)
+master-bin.000001 # Table_map 3 # table_id: # (mysql.ndb_apply_status)
+master-bin.000001 # Write_rows 3 # table_id: #
+master-bin.000001 # Write_rows 3 # table_id: # flags: STMT_END_F
+master-bin.000001 # Query 3 # COMMIT
+master-bin.000001 # Query 3 # use `test`; drop table `test`.`bug45756_master_logged_1`
+master-bin.000001 # Query 3 # use `test`; CREATE TABLE bug45756_master_logged_2 (a int) engine = NDB
+master-bin.000001 # Query 3 # BEGIN
+master-bin.000001 # Table_map 3 # table_id: # (test.bug45756_master_logged_2)
+master-bin.000001 # Table_map 3 # table_id: # (mysql.ndb_apply_status)
+master-bin.000001 # Write_rows 3 # table_id: #
+master-bin.000001 # Write_rows 3 # table_id: # flags: STMT_END_F
+master-bin.000001 # Query 3 # COMMIT
+master-bin.000001 # Query 3 # use `test`; drop table `test`.`bug45756_master_logged_2`
+master-bin.000001 # Query 3 # use `test`; CREATE TABLE bug45756_master_logged_3 (a int) engine = NDB
+master-bin.000001 # Query 3 # BEGIN
+master-bin.000001 # Table_map 3 # table_id: # (test.bug45756_master_logged_3)
+master-bin.000001 # Table_map 3 # table_id: # (mysql.ndb_apply_status)
+master-bin.000001 # Write_rows 3 # table_id: #
+master-bin.000001 # Write_rows 3 # table_id: # flags: STMT_END_F
+master-bin.000001 # Query 3 # COMMIT
+master-bin.000001 # Query 3 # use `test`; DROP TABLE bug45756_master_logged_3
+
+
+
+connection srv_slave;
+show variables like 'server_id';
+Variable_name Value
+server_id 4
+show variables like 'log_bin';
+Variable_name Value
+log_bin OFF
+show variables like 'log_slave_updates';
+Variable_name Value
+log_slave_updates OFF
+show binlog events from <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+
+
+
+connection srv_slave1;
+show variables like 'server_id';
+Variable_name Value
+server_id 5
+show variables like 'log_bin';
+Variable_name Value
+log_bin ON
+show variables like 'log_slave_updates';
+Variable_name Value
+log_slave_updates OFF
+show binlog events from <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+slave-master-bin.000001 # Query 5 # use `test`; CREATE TABLE bug_45756_slave_logged_1 (a int) engine = NDB
+slave-master-bin.000001 # Query 5 # BEGIN
+slave-master-bin.000001 # Table_map 5 # table_id: # (test.bug_45756_slave_logged_1)
+slave-master-bin.000001 # Table_map 5 # table_id: # (mysql.ndb_apply_status)
+slave-master-bin.000001 # Write_rows 5 # table_id: #
+slave-master-bin.000001 # Write_rows 5 # table_id: # flags: STMT_END_F
+slave-master-bin.000001 # Query 5 # COMMIT
+slave-master-bin.000001 # Query 5 # use `test`; drop table `test`.`bug_45756_slave_logged_1`
+slave-master-bin.000001 # Query 5 # use `test`; CREATE TABLE bug_45756_slave_logged_2 (a int) engine = NDB
+slave-master-bin.000001 # Query 5 # BEGIN
+slave-master-bin.000001 # Table_map 5 # table_id: # (test.bug_45756_slave_logged_2)
+slave-master-bin.000001 # Table_map 5 # table_id: # (mysql.ndb_apply_status)
+slave-master-bin.000001 # Write_rows 5 # table_id: #
+slave-master-bin.000001 # Write_rows 5 # table_id: # flags: STMT_END_F
+slave-master-bin.000001 # Query 5 # COMMIT
+slave-master-bin.000001 # Query 5 # use `test`; DROP TABLE bug_45756_slave_logged_2
+slave-master-bin.000001 # Query 5 # use `test`; CREATE TABLE bug_45756_slave_logged_3 (a int) engine = NDB
+slave-master-bin.000001 # Query 5 # BEGIN
+slave-master-bin.000001 # Table_map 5 # table_id: # (test.bug_45756_slave_logged_3)
+slave-master-bin.000001 # Table_map 5 # table_id: # (mysql.ndb_apply_status)
+slave-master-bin.000001 # Write_rows 5 # table_id: #
+slave-master-bin.000001 # Write_rows 5 # table_id: # flags: STMT_END_F
+slave-master-bin.000001 # Query 5 # COMMIT
+slave-master-bin.000001 # Query 5 # use `test`; drop table `test`.`bug_45756_slave_logged_3`
+
+
+
+connection srv_slave2;
+show variables like 'server_id';
+Variable_name Value
+server_id 6
+show variables like 'log_bin';
+Variable_name Value
+log_bin ON
+show variables like 'log_slave_updates';
+Variable_name Value
+log_slave_updates ON
+show binlog events from <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+slave-master-bin.000001 # Query 6 # use `test`; CREATE TABLE bug_45756_slave_logged_1 (a int) engine = NDB
+slave-master-bin.000001 # Query 6 # BEGIN
+slave-master-bin.000001 # Table_map 6 # table_id: # (test.bug_45756_slave_logged_1)
+slave-master-bin.000001 # Table_map 6 # table_id: # (mysql.ndb_apply_status)
+slave-master-bin.000001 # Write_rows 6 # table_id: #
+slave-master-bin.000001 # Write_rows 6 # table_id: # flags: STMT_END_F
+slave-master-bin.000001 # Query 6 # COMMIT
+slave-master-bin.000001 # Query 6 # use `test`; drop table `test`.`bug_45756_slave_logged_1`
+slave-master-bin.000001 # Query 6 # use `test`; CREATE TABLE bug_45756_slave_logged_2 (a int) engine = NDB
+slave-master-bin.000001 # Query 6 # BEGIN
+slave-master-bin.000001 # Table_map 6 # table_id: # (test.bug_45756_slave_logged_2)
+slave-master-bin.000001 # Table_map 6 # table_id: # (mysql.ndb_apply_status)
+slave-master-bin.000001 # Write_rows 6 # table_id: #
+slave-master-bin.000001 # Write_rows 6 # table_id: # flags: STMT_END_F
+slave-master-bin.000001 # Query 6 # COMMIT
+slave-master-bin.000001 # Query 6 # use `test`; drop table `test`.`bug_45756_slave_logged_2`
+slave-master-bin.000001 # Query 6 # use `test`; CREATE TABLE bug_45756_slave_logged_3 (a int) engine = NDB
+slave-master-bin.000001 # Query 6 # BEGIN
+slave-master-bin.000001 # Table_map 6 # table_id: # (test.bug_45756_slave_logged_3)
+slave-master-bin.000001 # Table_map 6 # table_id: # (mysql.ndb_apply_status)
+slave-master-bin.000001 # Write_rows 6 # table_id: #
+slave-master-bin.000001 # Write_rows 6 # table_id: # flags: STMT_END_F
+slave-master-bin.000001 # Query 6 # COMMIT
+slave-master-bin.000001 # Query 6 # use `test`; DROP TABLE bug_45756_slave_logged_3
+slave-master-bin.000001 # Query 1 # use `test`; CREATE TABLE bug45756_master_logged_1 (a int) engine = NDB
+slave-master-bin.000001 # Query 6 # BEGIN
+slave-master-bin.000001 # Table_map 6 # table_id: # (test.bug45756_master_logged_1)
+slave-master-bin.000001 # Table_map 6 # table_id: # (mysql.ndb_apply_status)
+slave-master-bin.000001 # Write_rows 6 # table_id: #
+slave-master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
+slave-master-bin.000001 # Query 6 # COMMIT
+slave-master-bin.000001 # Query 1 # use `test`; DROP TABLE bug45756_master_logged_1
+slave-master-bin.000001 # Query 1 # use `test`; CREATE TABLE bug45756_master_logged_2 (a int) engine = NDB
+slave-master-bin.000001 # Query 6 # BEGIN
+slave-master-bin.000001 # Table_map 6 # table_id: # (test.bug45756_master_logged_2)
+slave-master-bin.000001 # Table_map 6 # table_id: # (mysql.ndb_apply_status)
+slave-master-bin.000001 # Write_rows 6 # table_id: #
+slave-master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
+slave-master-bin.000001 # Query 6 # COMMIT
+slave-master-bin.000001 # Query 1 # use `test`; drop table `test`.`bug45756_master_logged_2`
+slave-master-bin.000001 # Query 1 # use `test`; CREATE TABLE bug45756_master_logged_3 (a int) engine = NDB
+slave-master-bin.000001 # Query 6 # BEGIN
+slave-master-bin.000001 # Table_map 6 # table_id: # (test.bug45756_master_logged_3)
+slave-master-bin.000001 # Table_map 6 # table_id: # (mysql.ndb_apply_status)
+slave-master-bin.000001 # Write_rows 6 # table_id: #
+slave-master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
+slave-master-bin.000001 # Query 6 # COMMIT
+slave-master-bin.000001 # Query 1 # use `test`; drop table `test`.`bug45756_master_logged_3`
=== modified file 'mysql-test/suite/rpl_ndb/t/rpl_ndb_circular.test'
--- a/mysql-test/suite/rpl_ndb/t/rpl_ndb_circular.test 2008-03-14 14:42:27 +0000
+++ b/mysql-test/suite/rpl_ndb/t/rpl_ndb_circular.test 2009-09-11 15:39:22 +0000
@@ -25,6 +25,8 @@
# insert some values on the slave and master
--connection master
INSERT INTO t1 VALUES (1,2);
+# Give time to propagate + close epoch, to ensure deterministic Binlog contents
+--sleep 1
--connection slave
INSERT INTO t1 VALUES (2,3);
@@ -42,6 +44,13 @@
# BUG#34654 Last_IO_Errno is not reset - Mask columns 35 and 36
--replace_column 1 # 4 # 7 # 8 # 9 # 22 # 23 # 33 # 35 # 36 #
--query_vertical show slave status;
+
+--echo Slave Binlog contains all ops as log_slave_updates is on
+show variables like 'server_id';
+show variables like 'log_bin';
+show variables like 'log_slave_updates';
+--source include/show_binlog_events2.inc
+
# connect to master and ensure data it there.
--connection master
SELECT * FROM t1 ORDER BY a;
@@ -50,6 +59,12 @@
--replace_column 1 # 4 # 7 # 8 # 9 # 22 # 23 # 33 # 35 # 36 #
--query_vertical show slave status;
+--echo Master Binlog contains only Master ops as log_slave_updates is off
+show variables like 'server_id';
+show variables like 'log_bin';
+show variables like 'log_slave_updates';
+--source include/show_binlog_events2.inc
+
# stop replication on "master" as not to replicate
# shutdown circularly, eg drop table
--connection master
=== modified file 'mysql-test/suite/rpl_ndb/t/rpl_ndb_circular_2ch.cnf'
--- a/mysql-test/suite/rpl_ndb/t/rpl_ndb_circular_2ch.cnf 2008-10-31 14:11:44 +0000
+++ b/mysql-test/suite/rpl_ndb/t/rpl_ndb_circular_2ch.cnf 2009-09-11 10:34:36 +0000
@@ -1,16 +1,27 @@
!include ../my.cnf
+# 2 clusters, each with 2 MySQLDs
+# All MySQLDs log-slave-updates
+# Potential infinite loops are broken by both servers
+# on each cluster having the same server-id
+# To support > 2 clusters and/or different server-ids per
+# MySQLD server, we need some other loop breaking
+# mechanism
+
[mysqld.1.1]
server-id= 1
log-bin
+log-slave-updates
[mysqld.2.1]
server-id= 1
log-bin
+log-slave-updates
[mysqld.1.slave]
server-id= 2
log-bin
+log-slave-updates
skip-slave-start
[mysqld.2.slave]
@@ -22,6 +33,7 @@
master-connect-retry= 1
init-rpl-role= slave
log-bin
+log-slave-updates
skip-slave-start
ndb_connectstring= @mysql_cluster.slave.ndb_connectstring
=== added file 'mysql-test/suite/rpl_ndb/t/rpl_ndb_slave_lsu.cnf'
--- a/mysql-test/suite/rpl_ndb/t/rpl_ndb_slave_lsu.cnf 1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/rpl_ndb/t/rpl_ndb_slave_lsu.cnf 2009-09-11 10:34:36 +0000
@@ -0,0 +1,1 @@
+!include extra/rpl_tests/rpl_ndb_multi_binlog_update.cnf
=== added file 'mysql-test/suite/rpl_ndb/t/rpl_ndb_slave_lsu.test'
--- a/mysql-test/suite/rpl_ndb/t/rpl_ndb_slave_lsu.test 1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/rpl_ndb/t/rpl_ndb_slave_lsu.test 2009-09-14 12:45:19 +0000
@@ -0,0 +1,177 @@
+###############################################################################
+# Description: Checks if DDL and DML statements are correctly logged by
+# servers and slave servers according to log-slave-updates,
+# and independent of their settings on the particular MySQLD
+# acting in the slave role
+#
+# Testing scenario: Cluster 1 replicates to Cluster 2
+# Key : BL = log-bin, LSU = log-slave-updates
+#
+# BL BL
+# cluster 1 [ srv_master srv_master1 srv_master2 ]
+# |----------+------------
+# v v v
+# cluster 2 [ srv_slave srv_slave1 srv_slave2 ]
+# BL BL LSU
+#
+# - First replicate via srv_slave and check all nodes' Binlog contents
+# - Second replicate via srv_slave1 and check all nodes' Binlog contents
+# - Third replicate via srv_slave2 and check all nodes' Binlog contents
+#
+# Makes use of extra/rpl_tests/rpl_ndb_multi_binlog_update.test
+# Originally motivated by bug#45756
+###############################################################################
+
+--source include/have_ndb.inc
+--source include/have_log_bin.inc
+
+###############################################################################
+# Configuring Environment
+###############################################################################
+--echo *** Configuring connections ***
+
+connect (master,127.0.0.1,root,,test,$MASTER_MYPORT,);
+connect (slave,127.0.0.1,root,,test,$SLAVE_MYPORT,);
+
+connect (srv_master,127.0.0.1,root,,test,$MASTER_MYPORT,);
+connect (srv_master1,127.0.0.1,root,,test,$MASTER_MYPORT1,);
+connect (srv_master2,127.0.0.1,root,,test,$MASTER_MYPORT2,);
+connect (srv_slave,127.0.0.1,root,,test,$SLAVE_MYPORT,);
+connect (srv_slave1,127.0.0.1,root,,test,$SLAVE_MYPORT1,);
+connect (srv_slave2,127.0.0.1,root,,test,$SLAVE_MYPORT2,);
+
+--echo *** Configuring replication via Slave ***
+connection slave;
+--disable_warnings
+STOP SLAVE;
+source include/wait_for_slave_to_stop.inc;
+--enable_warnings
+
+# Reset state of all Binlogging nodes
+connection master;
+--disable_warnings
+RESET MASTER;
+--enable_warnings
+
+connection srv_master2;
+--disable_warnings
+RESET MASTER;
+--enable_warnings
+
+connection srv_slave1;
+--disable_warnings
+RESET MASTER;
+--enable_warnings
+
+connection srv_slave2;
+--disable_warnings
+RESET MASTER;
+--enable_warnings
+
+connection slave;
+--disable_warnings
+RESET SLAVE;
+--replace_result $MASTER_MYPORT MASTER_PORT
+--eval CHANGE MASTER TO MASTER_HOST="127.0.0.1",MASTER_PORT=$MASTER_MYPORT,MASTER_USER="root";
+START SLAVE;
+source include/wait_for_slave_to_start.inc;
+--enable_warnings
+
+--let $which_slave=srv_slave
+--source extra/rpl_tests/rpl_ndb_multi_binlog_update.test
+
+
+
+--echo *** Configuring replication via Slave1 ***
+connection slave;
+--disable_warnings
+STOP SLAVE;
+source include/wait_for_slave_to_stop.inc;
+--enable_warnings
+
+connection srv_slave1;
+--disable_warnings
+STOP SLAVE;
+source include/wait_for_slave_to_stop.inc;
+--enable_warnings
+
+# Reset state of all Binlogging nodes
+connection master;
+--disable_warnings
+RESET MASTER;
+--enable_warnings
+
+connection srv_master2;
+--disable_warnings
+RESET MASTER;
+--enable_warnings
+
+connection srv_slave1;
+--disable_warnings
+RESET MASTER;
+--enable_warnings
+
+connection srv_slave2;
+--disable_warnings
+RESET MASTER;
+--enable_warnings
+
+connection srv_slave1;
+--disable_warnings
+RESET SLAVE;
+--replace_result $MASTER_MYPORT MASTER_PORT
+--eval CHANGE MASTER TO MASTER_HOST="127.0.0.1",MASTER_PORT=$MASTER_MYPORT,MASTER_USER="root"
+START SLAVE;
+source include/wait_for_slave_to_start.inc;
+--enable_warnings
+
+--let $which_slave=srv_slave1
+--source extra/rpl_tests/rpl_ndb_multi_binlog_update.test
+
+
+
+--echo *** Configuring replication via Slave2 ***
+connection srv_slave1;
+--disable_warnings
+STOP SLAVE;
+source include/wait_for_slave_to_stop.inc;
+--enable_warnings
+
+connection srv_slave2;
+--disable_warnings
+STOP SLAVE;
+source include/wait_for_slave_to_stop.inc;
+--enable_warnings
+
+# Reset state of all Binlogging nodes
+connection master;
+--disable_warnings
+RESET MASTER;
+--enable_warnings
+
+connection srv_master2;
+--disable_warnings
+RESET MASTER;
+--enable_warnings
+
+connection srv_slave1;
+--disable_warnings
+RESET MASTER;
+--enable_warnings
+
+connection srv_slave2;
+--disable_warnings
+RESET MASTER;
+--enable_warnings
+
+connection srv_slave2;
+--disable_warnings
+RESET SLAVE;
+--replace_result $MASTER_MYPORT MASTER_PORT
+--eval CHANGE MASTER TO MASTER_HOST="127.0.0.1",MASTER_PORT=$MASTER_MYPORT,MASTER_USER="root";
+START SLAVE;
+source include/wait_for_slave_to_start.inc;
+--enable_warnings
+
+--let $which_slave=srv_slave2
+--source extra/rpl_tests/rpl_ndb_multi_binlog_update.test
=== modified file 'sql/ha_ndbcluster.cc'
--- a/sql/ha_ndbcluster.cc 2009-09-03 09:54:52 +0000
+++ b/sql/ha_ndbcluster.cc 2009-09-15 14:10:32 +0000
@@ -1357,6 +1357,19 @@
return FALSE;
}
+void ha_ndbcluster::release_blobs_buffer()
+{
+ DBUG_ENTER("releaseBlobsBuffer");
+ if (m_blob_total_size > 0)
+ {
+ DBUG_PRINT("info", ("Deleting blobs buffer, size %llu", m_blob_total_size));
+ my_free(m_blobs_buffer, MYF(MY_ALLOW_ZERO_PTR));
+ m_blobs_buffer= 0;
+ m_blob_total_size= 0;
+ m_blobs_buffer_size= 0;
+ }
+ DBUG_VOID_RETURN;
+}
/**
Get metadata for this table from NDB.
@@ -5662,6 +5675,7 @@
// Start of transaction
m_rows_changed= 0;
m_blobs_pending= FALSE;
+ release_blobs_buffer();
m_slow_path= m_thd_ndb->m_slow_path;
#ifdef HAVE_NDB_BINLOG
if (unlikely(m_slow_path))
@@ -7905,7 +7919,9 @@
Ndb_tuple_id_range_guard g(m_share);
if (m_skip_auto_increment &&
ndb->readAutoIncrementValue(m_table, g.range, auto_value) ||
- ndb->getAutoIncrementValue(m_table, g.range, auto_value, m_autoincrement_prefetch, increment, offset))
+ ndb->getAutoIncrementValue(m_table, g.range, auto_value,
+ Uint32(m_autoincrement_prefetch),
+ increment, offset))
{
if (--retries && !thd->killed &&
ndb->getNdbError().status == NdbError::TemporaryError)
@@ -7984,6 +8000,7 @@
m_update_cannot_batch(FALSE),
m_skip_auto_increment(TRUE),
m_blobs_pending(0),
+ m_blob_total_size(0),
m_blobs_buffer(0),
m_blobs_buffer_size(0),
m_dupkey((uint) -1),
@@ -8036,8 +8053,7 @@
free_share(&m_share);
}
release_metadata(thd, ndb);
- my_free(m_blobs_buffer, MYF(MY_ALLOW_ZERO_PTR));
- m_blobs_buffer= 0;
+ release_blobs_buffer();
// Check for open cursor/transaction
DBUG_ASSERT(m_active_cursor == NULL);
@@ -12593,6 +12609,7 @@
my_free((char*)data, MYF(MY_ALLOW_ZERO_PTR));
my_free((char*)pack_data, MYF(MY_ALLOW_ZERO_PTR));
error= 1;
+ my_error(ER_FILE_NOT_FOUND, MYF(0), file);
}
else
{
@@ -12606,6 +12623,7 @@
{
DBUG_PRINT("info", ("On-line alter of table %s failed", m_tabname));
error= ndb_to_mysql_error(&dict->getNdbError());
+ my_error(error, MYF(0));
}
my_free((char*)data, MYF(MY_ALLOW_ZERO_PTR));
my_free((char*)pack_data, MYF(MY_ALLOW_ZERO_PTR));
=== modified file 'sql/ha_ndbcluster.h'
--- a/sql/ha_ndbcluster.h 2009-05-27 15:21:45 +0000
+++ b/sql/ha_ndbcluster.h 2009-09-08 12:10:53 +0000
@@ -704,6 +704,7 @@
int set_blob_values(const NdbOperation *ndb_op, my_ptrdiff_t row_offset,
const MY_BITMAP *bitmap, uint *set_count, bool batch);
friend int g_get_ndb_blobs_value(NdbBlob *ndb_blob, void *arg);
+ void release_blobs_buffer();
Uint32 setup_get_hidden_fields(NdbOperation::GetValueSpec gets[2]);
void get_hidden_fields_keyop(NdbOperation::OperationOptions *options,
NdbOperation::GetValueSpec gets[2]);
=== modified file 'sql/ha_ndbcluster_binlog.cc'
--- a/sql/ha_ndbcluster_binlog.cc 2009-08-26 13:25:41 +0000
+++ b/sql/ha_ndbcluster_binlog.cc 2009-09-11 11:36:53 +0000
@@ -2000,10 +2000,34 @@
r|= op->setValue(SCHEMA_TYPE_I, log_type);
DBUG_ASSERT(r == 0);
/* any value */
- if (!(thd->options & OPTION_BIN_LOG))
- r|= op->setAnyValue(NDB_ANYVALUE_FOR_NOLOGGING);
+ Uint32 anyValue;
+ if (! thd->slave_thread)
+ {
+ /* Schema change originating from this MySQLD, check SQL_LOG_BIN
+ * variable and pass 'setting' to all logging MySQLDs via AnyValue
+ */
+ if (thd->options & OPTION_BIN_LOG) /* e.g. SQL_LOG_BIN == on */
+ {
+ DBUG_PRINT("info", ("Schema event for binlogging"));
+ anyValue = 0;
+ }
+ else
+ {
+ DBUG_PRINT("info", ("Schema event not for binlogging"));
+ anyValue = NDB_ANYVALUE_FOR_NOLOGGING;
+ }
+ }
else
- r|= op->setAnyValue(thd->server_id);
+ {
+ /* Slave applying replicated schema event
+ * Pass original applier's serverId in AnyValue
+ */
+ DBUG_PRINT("info", ("Replicated schema event with original server id %d",
+ thd->server_id));
+ anyValue = thd->server_id;
+ }
+
+ r|= op->setAnyValue(anyValue);
DBUG_ASSERT(r == 0);
#if 0
if (log_db != new_db && new_db && new_table_name)
@@ -2249,14 +2273,34 @@
static void ndb_binlog_query(THD *thd, Cluster_schema *schema)
{
- if (schema->any_value & NDB_ANYVALUE_RESERVED)
+ /* any_value == 0 means local cluster sourced change that
+ * should be logged
+ */
+ if (schema->any_value != 0)
{
- if (schema->any_value != NDB_ANYVALUE_FOR_NOLOGGING)
- sql_print_warning("NDB: unknown value for binlog signalling 0x%X, "
- "query not logged",
- schema->any_value);
- return;
+ if (schema->any_value & NDB_ANYVALUE_RESERVED)
+ {
+ /* Originating SQL node did not want this query logged */
+ if (schema->any_value != NDB_ANYVALUE_FOR_NOLOGGING)
+ sql_print_warning("NDB: unknown value for binlog signalling 0x%X, "
+ "query not logged",
+ schema->any_value);
+ return;
+ }
+ else
+ {
+ /* AnyValue is set to non-zero serverId, must be a query applied
+ * by a slave mysqld.
+ * TODO : Assert that we are running in the Binlog injector thread?
+ */
+ if (! g_ndb_log_slave_updates)
+ {
+ /* This MySQLD does not log slave updates */
+ return;
+ }
+ }
}
+
uint32 thd_server_id_save= thd->server_id;
DBUG_ASSERT(sizeof(thd_server_id_save) == sizeof(thd->server_id));
char *thd_db_save= thd->db;
@@ -5791,6 +5835,7 @@
if (unlikely(schema_res > 0))
{
thd->proc_info= "Processing events from schema table";
+ g_ndb_log_slave_updates= opt_log_slave_updates;
s_ndb->
setReportThreshEventGCISlip(ndb_report_thresh_binlog_epoch_slip);
s_ndb->
=== modified file 'storage/ndb/include/kernel/AttributeHeader.hpp'
--- a/storage/ndb/include/kernel/AttributeHeader.hpp 2009-05-27 12:11:46 +0000
+++ b/storage/ndb/include/kernel/AttributeHeader.hpp 2009-09-04 11:01:23 +0000
@@ -53,7 +53,13 @@
STATIC_CONST( COPY_ROWID = 0xFFF1 );
STATIC_CONST( READ_ALL = 0xFFF0 );
STATIC_CONST( READ_LCP = 0xFFEF );
+
+ // Extents * sizeof(Extent) allocated to fragment
+ STATIC_CONST( FRAGMENT_EXTENT_SPACE = 0xFFEC );
+ // Free but allocated DD extent space
+ STATIC_CONST( FRAGMENT_FREE_EXTENT_SPACE = 0xFFEB );
+
/**
* Optimize pseudo column and optimization options
*/
=== modified file 'storage/ndb/include/kernel/kernel_config_parameters.h'
--- a/storage/ndb/include/kernel/kernel_config_parameters.h 2009-05-27 15:21:45 +0000
+++ b/storage/ndb/include/kernel/kernel_config_parameters.h 2009-09-09 10:58:10 +0000
@@ -56,9 +56,9 @@
#define CFG_TUP_FRAG (PRIVATE_BASE + 33)
#define CFG_TUP_OP_RECS (PRIVATE_BASE + 34)
#define CFG_TUP_PAGE (PRIVATE_BASE + 35)
-#define CFG_TUP_PAGE_RANGE (PRIVATE_BASE + 36)
+#define _CFG_TUP_PAGE_RANGE (PRIVATE_BASE + 36)
#define CFG_TUP_TABLE (PRIVATE_BASE + 37)
-#define CFG_TUP_TABLE_DESC (PRIVATE_BASE + 38)
+#define _CFG_TUP_TABLE_DESC (PRIVATE_BASE + 38)
#define CFG_TUP_STORED_PROC (PRIVATE_BASE + 39)
#define CFG_TUX_INDEX (PRIVATE_BASE + 40)
=== modified file 'storage/ndb/include/kernel/signaldata/FsOpenReq.hpp'
--- a/storage/ndb/include/kernel/signaldata/FsOpenReq.hpp 2009-08-21 10:39:15 +0000
+++ b/storage/ndb/include/kernel/signaldata/FsOpenReq.hpp 2009-09-14 12:43:17 +0000
@@ -231,7 +231,7 @@
inline
void FsOpenReq::setVersion(Uint32 fileNumber[], Uint8 val){
const Uint32 t = fileNumber[3];
- fileNumber[3] = t & 0x00FFFFFF | (((Uint32)val) << 24);
+ fileNumber[3] = (t & 0x00FFFFFF) | (((Uint32)val) << 24);
}
inline
@@ -242,7 +242,7 @@
inline
void FsOpenReq::setSuffix(Uint32 fileNumber[], Uint8 val){
const Uint32 t = fileNumber[3];
- fileNumber[3] = t & 0xFF00FFFF | (((Uint32)val) << 16);
+ fileNumber[3] = (t & 0xFF00FFFF) | (((Uint32)val) << 16);
}
inline
@@ -253,7 +253,7 @@
inline
void FsOpenReq::v1_setDisk(Uint32 fileNumber[], Uint8 val){
const Uint32 t = fileNumber[3];
- fileNumber[3] = t & 0xFFFF00FF | (((Uint32)val) << 8);
+ fileNumber[3] = (t & 0xFFFF00FF) | (((Uint32)val) << 8);
}
inline
@@ -294,7 +294,7 @@
inline
void FsOpenReq::v1_setP(Uint32 fileNumber[], Uint8 val){
const Uint32 t = fileNumber[3];
- fileNumber[3] = t & 0xFFFFFF00 | val;
+ fileNumber[3] = (t & 0xFFFFFF00) | val;
}
/****************/
=== modified file 'storage/ndb/include/ndbapi/NdbBlob.hpp'
--- a/storage/ndb/include/ndbapi/NdbBlob.hpp 2009-06-15 07:42:02 +0000
+++ b/storage/ndb/include/ndbapi/NdbBlob.hpp 2009-09-08 11:24:40 +0000
@@ -369,6 +369,7 @@
Buf();
~Buf();
void alloc(unsigned n);
+ void release();
void zerorest();
void copyfrom(const Buf& src);
};
=== modified file 'storage/ndb/include/ndbapi/NdbDictionary.hpp'
--- a/storage/ndb/include/ndbapi/NdbDictionary.hpp 2009-06-13 19:09:35 +0000
+++ b/storage/ndb/include/ndbapi/NdbDictionary.hpp 2009-09-04 11:33:38 +0000
@@ -584,7 +584,9 @@
static const Column * ANY_VALUE;
static const Column * COPY_ROWID;
static const Column * OPTIMIZE;
-
+ static const Column * FRAGMENT_EXTENT_SPACE;
+ static const Column * FRAGMENT_FREE_EXTENT_SPACE;
+
int getSizeInBytes() const;
int getBlobVersion() const; // NDB_BLOB_V1 or NDB_BLOB_V2
=== renamed file 'storage/ndb/src/mgmsrv/DirIterator.hpp' => 'storage/ndb/include/portlib/NdbDir.hpp'
--- a/storage/ndb/src/mgmsrv/DirIterator.hpp 2008-10-24 12:41:10 +0000
+++ b/storage/ndb/include/portlib/NdbDir.hpp 2009-09-11 08:02:07 +0000
@@ -1,4 +1,4 @@
-/* Copyright (C) 2008 Sun Microsystems, Inc.
+/* Copyright (C) 2008-2009 Sun Microsystems, Inc.
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
@@ -13,17 +13,53 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
-#ifndef DirIterator_HPP
-#define DirIterator_HPP
+#ifndef NdbDir_HPP
+#define NdbDir_HPP
-class DirIterator {
- class DirIteratorImpl& m_impl;
+class NdbDir {
public:
- DirIterator();
- ~DirIterator();
-
- int open(const char* path);
- const char* next_file(void);
+ class Iterator {
+ class DirIteratorImpl& m_impl;
+ Iterator(const Iterator&); // not impl
+ Iterator& operator=(const Iterator&); // not impl
+ public:
+ Iterator();
+ ~Iterator();
+
+ int open(const char* path);
+ void close(void);
+ const char* next_file(void);
+ const char* next_entry(void);
+ };
+
+ class Temp {
+ const char* m_path;
+ Temp(const Temp&); // not impl
+ Temp& operator=(const Temp&); // not impl
+ public:
+ Temp();
+ ~Temp();
+ const char* path(void) const;
+ };
+
+ /*
+ Create directory
+ */
+ static bool create(const char *path);
+
+ /*
+ Remove directory recursively
+ dir - path to directory that should be removed
+ only_contents - only remove the contents of the directory
+
+ */
+ static bool remove_recursive(const char* path, bool only_contents = false);
+
+ /*
+ Remove empty directory
+ */
+ static bool remove(const char* path);
+
};
#endif
=== modified file 'storage/ndb/include/portlib/NdbThread.h'
--- a/storage/ndb/include/portlib/NdbThread.h 2009-05-27 15:21:45 +0000
+++ b/storage/ndb/include/portlib/NdbThread.h 2009-09-08 15:12:34 +0000
@@ -59,7 +59,7 @@
*
* * p_thread_func: pointer of the function to run in the thread
* * p_thread_arg: pointer to argument to be passed to the thread
- * * thread_stack_size: stack size for this thread
+ * * thread_stack_size: stack size for this thread, 0 => default size
* * p_thread_name: pointer to name of this thread
* * returnvalue: pointer to the created thread
*/
=== modified file 'storage/ndb/include/util/NdbOut.hpp'
--- a/storage/ndb/include/util/NdbOut.hpp 2009-05-27 15:21:45 +0000
+++ b/storage/ndb/include/util/NdbOut.hpp 2009-09-08 13:48:12 +0000
@@ -77,6 +77,7 @@
NdbOut& flushline(void);
NdbOut& setHexFormat(int _format);
+ NdbOut();
NdbOut(OutputStream &, bool autoflush = true);
virtual ~NdbOut();
=== modified file 'storage/ndb/src/common/portlib/CMakeLists.txt'
--- a/storage/ndb/src/common/portlib/CMakeLists.txt 2009-01-23 12:50:40 +0000
+++ b/storage/ndb/src/common/portlib/CMakeLists.txt 2009-09-08 20:08:24 +0000
@@ -28,12 +28,19 @@
ADD_LIBRARY(ndbportlib STATIC
NdbCondition.c NdbMutex.c
NdbEnv.c NdbThread.c NdbHost.c NdbTCP.cpp
- NdbMem.c NdbConfig.c NdbTick.c
+ NdbMem.c NdbConfig.c NdbTick.c NdbDir.cpp
my_daemon.cc ${CMAKE_SOURCE_DIR}/sql/nt_servc.cc
${EXTRA_SRC}
)
TARGET_LINK_LIBRARIES(ndbportlib mysys ${EXTRA_LIB})
+ADD_EXECUTABLE(NdbDir-t
+ NdbDir.cpp
+ ${CMAKE_SOURCE_DIR}/storage/ndb/src/common/util/basestring_vsnprintf.c)
+SET_TARGET_PROPERTIES(NdbDir-t
+ PROPERTIES COMPILE_FLAGS "-DTEST_NDBDIR")
+TARGET_LINK_LIBRARIES(NdbDir-t ndbportlib)
+
#ADD_EXECUTABLE(memtest memtest.c)
#TARGET_LINK_LIBRARIES(memtest ndbportlib wsock32)
=== modified file 'storage/ndb/src/common/portlib/Makefile.am'
--- a/storage/ndb/src/common/portlib/Makefile.am 2009-05-27 15:21:45 +0000
+++ b/storage/ndb/src/common/portlib/Makefile.am 2009-09-08 20:08:24 +0000
@@ -22,7 +22,7 @@
NdbCondition.c NdbMutex.c NdbTick.c \
NdbEnv.c NdbThread.c NdbHost.c NdbTCP.cpp \
NdbDaemon.c my_daemon.cc NdbMem.c \
- NdbConfig.c
+ NdbConfig.c NdbDir.cpp
include $(top_srcdir)/storage/ndb/config/common.mk.am
include $(top_srcdir)/storage/ndb/config/type_util.mk.am
@@ -34,4 +34,14 @@
PortLibTest_SOURCES = NdbPortLibTest.cpp
munmaptest_SOURCES = munmaptest.cpp
+noinst_PROGRAMS = NdbDir-t
+
+NdbDir_t_SOURCES = NdbDir.cpp \
+ $(top_srcdir)/storage/ndb/src/common/util/basestring_vsnprintf.c
+NdbDir_t_CXXFLAGS = -DTEST_NDBDIR
+NdbDir_t_LDADD = \
+ libportlib.la \
+ $(top_builddir)/mysys/libmysyslt.la
+
+
%::SCCS/s.%
=== renamed file 'storage/ndb/src/mgmsrv/DirIterator.cpp' => 'storage/ndb/src/common/portlib/NdbDir.cpp'
--- a/storage/ndb/src/mgmsrv/DirIterator.cpp 2008-11-06 17:17:12 +0000
+++ b/storage/ndb/src/common/portlib/NdbDir.cpp 2009-09-15 17:35:16 +0000
@@ -1,4 +1,4 @@
-/* Copyright (C) 2008 Sun Microsystems, Inc.
+/* Copyright (C) 2008-2009 Sun Microsystems, Inc.
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
@@ -13,20 +13,20 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
-#include "DirIterator.hpp"
-#include <stdio.h>
+#include <ndb_global.h>
+#include <NdbDir.hpp>
+
+#include <util/basestring_vsnprintf.h>
#ifndef __WIN__
#include <dirent.h>
-
#include <sys/stat.h>
-#include <util/BaseString.hpp>
-
class DirIteratorImpl {
DIR* m_dirp;
const char *m_path;
+ char* m_buf;
bool is_regular_file(struct dirent* dp) const {
#ifdef _DIRENT_HAVE_D_TYPE
@@ -38,11 +38,11 @@
return (dp->d_type == DT_REG);
#endif
/* Using stat to read more info about the file */
- BaseString fullpath;
- fullpath.assfmt("%s/%s", m_path, dp->d_name);
+ basestring_snprintf(m_buf, PATH_MAX,
+ "%s/%s", m_path, dp->d_name);
struct stat buf;
- if (stat(fullpath.c_str(), &buf))
+ if (stat(m_buf, &buf))
return false; // 'stat' failed
return S_ISREG(buf.st_mode);
@@ -51,10 +51,13 @@
public:
DirIteratorImpl():
- m_dirp(NULL) {};
+ m_dirp(NULL) {
+ m_buf = new char[PATH_MAX];
+ };
~DirIteratorImpl() {
- closedir(m_dirp);
+ close();
+ delete [] m_buf;
}
int open(const char* path){
@@ -65,19 +68,27 @@
return 0;
}
- const char* next_file(void){
- struct dirent* dp;
- while ((dp = readdir(m_dirp)) != NULL &&
- !is_regular_file(dp))
- ;
- return dp ? dp->d_name : NULL;
+ void close(void)
+ {
+ if (m_dirp)
+ closedir(m_dirp);
+ m_dirp = NULL;
+ }
+
+ const char* next_entry(bool& is_directory)
+ {
+ struct dirent* dp = readdir(m_dirp);
+
+ if (dp == NULL)
+ return NULL;
+
+ is_directory = !is_regular_file(dp);
+ return dp->d_name;
}
};
#else
-#include <BaseString.hpp>
-
class DirIteratorImpl {
bool m_first;
WIN32_FIND_DATA m_find_data;
@@ -93,13 +104,14 @@
m_find_handle(INVALID_HANDLE_VALUE) {};
~DirIteratorImpl() {
- FindClose(m_find_handle);
+ close();
}
int open(const char* path){
- BaseString path_buf;
- path_buf.assfmt("%s\\*", path);
- m_find_handle = FindFirstFile(path_buf.c_str(), &m_find_data);
+ char path_buf[PATH_MAX+2];
+ m_first = true;
+ basestring_snprintf(path_buf, sizeof(path_buf), "%s\\*", path);
+ m_find_handle = FindFirstFile(path_buf, &m_find_data);
if(m_find_handle == INVALID_HANDLE_VALUE)
{
if (GetLastError() == ERROR_FILE_NOT_FOUND)
@@ -110,40 +122,314 @@
return 0;
}
- const char* next_file(void){
- while(m_first || FindNextFile(m_find_handle, &m_find_data))
+ void close(void)
+ {
+ if (m_find_handle)
+ FindClose(m_find_handle);
+ m_find_handle = NULL;
+ }
+
+ const char* next_entry(bool& is_directory)
+ {
+ if (m_first || FindNextFile(m_find_handle, &m_find_data))
{
- m_first= false;
-
- if (!is_dir(m_find_data))
- return m_find_data.cFileName;
+ m_first = false;
+ is_directory = is_dir(m_find_data);
+ return m_find_data.cFileName;
}
- return NULL;
+ return NULL;
}
-
};
#endif
-DirIterator::DirIterator() :
+NdbDir::Iterator::Iterator() :
m_impl(*new DirIteratorImpl())
{
}
-DirIterator::~DirIterator()
+NdbDir::Iterator::~Iterator()
{
delete &m_impl;
}
-int DirIterator::open(const char* path)
+int NdbDir::Iterator::open(const char* path)
{
return m_impl.open(path);
}
-const char* DirIterator::next_file(void)
-{
- return m_impl.next_file();
-}
-
+void NdbDir::Iterator::close(void)
+{
+ m_impl.close();
+}
+
+const char* NdbDir::Iterator::next_file(void)
+{
+ bool is_dir;
+ const char* name;
+ while((name = m_impl.next_entry(is_dir)) != NULL){
+ if (!is_dir)
+ return name; // Found some sort of file
+ }
+ return NULL;
+}
+
+const char* NdbDir::Iterator::next_entry(void)
+{
+ bool is_dir;
+ return m_impl.next_entry(is_dir);
+}
+
+
+bool
+NdbDir::create(const char *dir)
+{
+#ifdef _WIN32
+ if (CreateDirectory(dir, NULL) == 0)
+ {
+ fprintf(stderr,
+ "Failed to create directory '%s', error: %d",
+ dir, GetLastError());
+ return false;
+ }
+#else
+ if (mkdir(dir, S_IRUSR | S_IWUSR | S_IXUSR) != 0)
+ {
+ fprintf(stderr,
+ "Failed to create directory '%s', error: %d",
+ dir, errno);
+ return false;
+ }
+#endif
+ return true;
+}
+
+
+NdbDir::Temp::Temp()
+{
+#ifdef _WIN32
+ DWORD len = GetTempPath(0, NULL);
+ m_path = new char[len];
+ if (GetTempPath(len, (char*)m_path) == 0)
+ abort();
+#else
+ char* tmp = getenv("TMPDIR");
+ if (tmp)
+ m_path = tmp;
+ else
+ m_path = "/tmp/";
+#endif
+}
+
+NdbDir::Temp::~Temp()
+{
+#ifdef _WIN32
+ delete [] m_path;
+#endif
+}
+
+
+const char*
+NdbDir::Temp::path(void) const {
+ return m_path;
+}
+
+
+bool
+NdbDir::remove(const char* path)
+{
+#ifdef _WIN32
+ if (RemoveDirectory(path) != 0)
+ return true; // Gone
+#else
+ if (rmdir(path) == 0)
+ return true; // Gone
+#endif
+ return false;
+}
+
+bool
+NdbDir::remove_recursive(const char* dir, bool only_contents)
+{
+ char path[PATH_MAX];
+ if (basestring_snprintf(path, sizeof(path),
+ "%s%s", dir, DIR_SEPARATOR) < 0) {
+ fprintf(stderr, "Too long path to remove: '%s'\n", dir);
+ return false;
+ }
+ int start_len = strlen(path);
+
+ const char* name;
+ NdbDir::Iterator iter;
+loop:
+ {
+ if (iter.open(path) != 0)
+ {
+ fprintf(stderr, "Failed to open iterator for '%s'\n",
+ path);
+ return false;
+ }
+
+ while ((name = iter.next_entry()) != NULL)
+ {
+ if ((strcmp(".", name) == 0) || (strcmp("..", name) == 0))
+ continue;
+
+ int end_len, len = strlen(path);
+ if ((end_len = basestring_snprintf(path + len, sizeof(path) - len,
+ "%s", name)) < 0)
+ {
+ fprintf(stderr, "Too long path detected: '%s'+'%s'\n",
+ path, name);
+ return false;
+ }
+
+ if (unlink(path) == 0 || NdbDir::remove(path) == true)
+ {
+ path[len] = 0;
+ continue;
+ }
+
+ iter.close();
+
+ // Append ending slash to the string
+ int pos = len + end_len;
+ if (basestring_snprintf(path + pos, sizeof(path) - pos,
+ "%s", DIR_SEPARATOR) < 0)
+ {
+ fprintf(stderr, "Too long path detected: '%s'+'%s'\n",
+ path, DIR_SEPARATOR);
+ return false;
+ }
+
+ goto loop;
+ }
+ iter.close();
+
+ int len = strlen(path);
+ path[len - 1] = 0; // remove ending slash
+
+ char * prev_slash = strrchr(path, IF_WIN('\\', '/'));
+ if (len > start_len && prev_slash)
+ {
+ // Not done yet, step up one dir level
+ assert(prev_slash > path && prev_slash < path + sizeof(path));
+ prev_slash[1] = 0;
+ goto loop;
+ }
+ }
+
+ if (only_contents == false && NdbDir::remove(dir) == false)
+ {
+ fprintf(stderr,
+ "Failed to remove directory '%s', error: %d\n",
+ dir, errno);
+ return false;
+ }
+
+ return true;
+}
+
+
+#ifdef TEST_NDBDIR
+#include <NdbTap.hpp>
+
+#define CHECK(x) \
+ if (!(x)) { \
+ fprintf(stderr, "failed at line %d\n", __LINE__ ); \
+ abort(); }
+
+static void
+build_tree(const char* path)
+{
+ char tmp[PATH_MAX];
+ CHECK(NdbDir::create(path));
+
+ // Create files in path/
+ for (int i = 8; i < 14; i++){
+ basestring_snprintf(tmp, sizeof(tmp), "%s%sfile%d", path, DIR_SEPARATOR, i);
+ fclose(fopen(tmp, "w"));
+ }
+
+ // Create directories
+ for (int i = 8; i < 14; i++){
+ basestring_snprintf(tmp, sizeof(tmp), "%s%sdir%d", path, DIR_SEPARATOR, i);
+ CHECK(NdbDir::create(tmp));
+
+ // Create files in dir
+ for (int j = 0; j < 6; j++){
+ basestring_snprintf(tmp, sizeof(tmp), "%s%sdir%d%sfile%d",
+ path, DIR_SEPARATOR, i, DIR_SEPARATOR, j);
+ fclose(fopen(tmp, "w"));
+ }
+ }
+
+#ifndef _WIN32
+ // Symlink the last file created to path/symlink
+ char tmp2[PATH_MAX];
+ basestring_snprintf(tmp2, sizeof(tmp2), "%s%ssymlink", path, DIR_SEPARATOR);
+ CHECK(symlink(tmp, tmp2) == 0);
+#endif
+}
+
+static bool
+gone(const char *dir) {
+ return (access(dir, F_OK) == -1 && errno == ENOENT);
+}
+
+TAPTEST(DirIterator)
+{
+ NdbDir::Temp tempdir;
+ char path[PATH_MAX];
+ basestring_snprintf(path, sizeof(path),"%s%s%s",
+ tempdir.path(), DIR_SEPARATOR, "ndbdir_test");
+
+ printf("Using directory '%s'\n", path);
+
+ // Remove dir if it exists
+ if (access(path, F_OK) == 0)
+ CHECK(NdbDir::remove_recursive(path));
+
+ // Build dir tree
+ build_tree(path);
+ // Test to iterate over filesa
+ {
+ NdbDir::Iterator iter;
+ CHECK(iter.open(path) == 0);
+ const char* name;
+ int num_files = 0;
+ while((name = iter.next_file()) != NULL)
+ {
+ //printf("%s\n", name);
+ num_files++;
+ }
+ printf("Found %d files\n", num_files);
+ CHECK(num_files == 6);
+ }
+
+ // Remove all of tree
+ CHECK(NdbDir::remove_recursive(path));
+ CHECK(gone(path));
+
+ // Remove non exisiting directory
+ CHECK(!NdbDir::remove_recursive(path));
+ CHECK(gone(path));
+
+ // Build dir tree and remove everything inside it
+ build_tree(path);
+ CHECK(NdbDir::remove_recursive(path, true));
+ CHECK(!gone(path));
+
+ // Remoe also the empty dir
+ CHECK(NdbDir::remove_recursive(path));
+ CHECK(gone(path));
+
+ // Remove non exisiting directory(again)
+ CHECK(!NdbDir::remove_recursive(path));
+ CHECK(gone(path));
+
+ return 1; // OK
+}
+#endif
=== modified file 'storage/ndb/src/common/portlib/NdbThread.c'
--- a/storage/ndb/src/common/portlib/NdbThread.c 2009-05-27 15:21:45 +0000
+++ b/storage/ndb/src/common/portlib/NdbThread.c 2009-09-08 15:12:34 +0000
@@ -195,10 +195,16 @@
struct NdbThread* tmpThread;
int result;
pthread_attr_t thread_attr;
- NDB_THREAD_STACKSIZE thread_stack_size= _stack_size * SIZEOF_CHARP/4;
+ NDB_THREAD_STACKSIZE thread_stack_size;
DBUG_ENTER("NdbThread_Create");
+ /* Use default stack size if 0 specified */
+ if (_stack_size == 0)
+ thread_stack_size = 64 * 1024 * SIZEOF_CHARP/4;
+ else
+ thread_stack_size = _stack_size * SIZEOF_CHARP/4;
+
(void)thread_prio; /* remove warning for unused parameter */
if (p_thread_func == NULL)
@@ -217,6 +223,7 @@
if (thread_stack_size < PTHREAD_STACK_MIN)
thread_stack_size = PTHREAD_STACK_MIN;
#endif
+ DBUG_PRINT("info", ("stack_size: %llu", (ulong)thread_stack_size));
pthread_attr_setstacksize(&thread_attr, thread_stack_size);
#ifdef USE_PTHREAD_EXTRAS
/* Guard stack overflow with a 2k databuffer */
=== modified file 'storage/ndb/src/common/transporter/TransporterRegistry.cpp'
--- a/storage/ndb/src/common/transporter/TransporterRegistry.cpp 2009-08-12 18:10:54 +0000
+++ b/storage/ndb/src/common/transporter/TransporterRegistry.cpp 2009-09-08 15:12:34 +0000
@@ -1635,7 +1635,7 @@
m_run_start_clients_thread= true;
m_start_clients_thread= NdbThread_Create(run_start_clients_C,
(void**)this,
- 32768,
+ 0, // default stack size
"ndb_start_clients",
NDB_THREAD_PRIO_LOW);
if (m_start_clients_thread == 0)
=== modified file 'storage/ndb/src/common/util/NdbOut.cpp'
--- a/storage/ndb/src/common/util/NdbOut.cpp 2009-05-27 15:21:45 +0000
+++ b/storage/ndb/src/common/util/NdbOut.cpp 2009-09-09 12:34:25 +0000
@@ -21,10 +21,9 @@
#include <NdbOut.hpp>
#include <OutputStream.hpp>
-static FileOutputStream ndbouts_fileoutputstream(stdout);
-NdbOut ndbout(ndbouts_fileoutputstream);
-static FileOutputStream ndberrs_fileoutputstream(stderr);
-NdbOut ndberr(ndberrs_fileoutputstream);
+/* Initialized in ndb_init() */
+NdbOut ndbout;
+NdbOut ndberr;
static const char * fms[] = {
"%d", "0x%02x", // Int8
@@ -95,8 +94,20 @@
{
}
+NdbOut::NdbOut()
+ : m_out(NULL), isHex(0)
+{
+ /**
+ * m_out set to NULL!
+ */
+}
+
NdbOut::~NdbOut()
{
+ /**
+ * don't delete m_out, as it's a reference given to us.
+ * i.e we don't "own" it
+ */
}
void
@@ -175,3 +186,15 @@
return m_threshold;
}
+static FileOutputStream ndbouts_fileoutputstream(0);
+static FileOutputStream ndberrs_fileoutputstream(0);
+
+void
+NdbOut_Init()
+{
+ new (&ndbouts_fileoutputstream) FileOutputStream(stdout);
+ new (&ndbout) NdbOut(ndbouts_fileoutputstream);
+
+ new (&ndberrs_fileoutputstream) FileOutputStream(stderr);
+ new (&ndberr) NdbOut(ndberrs_fileoutputstream);
+}
=== modified file 'storage/ndb/src/common/util/SocketServer.cpp'
--- a/storage/ndb/src/common/util/SocketServer.cpp 2009-05-27 15:21:45 +0000
+++ b/storage/ndb/src/common/util/SocketServer.cpp 2009-09-08 15:12:34 +0000
@@ -236,7 +236,7 @@
{
m_thread = NdbThread_Create(socketServerThread_C,
(void**)this,
- 32768,
+ 0, // default stack size
"NdbSockServ",
NDB_THREAD_PRIO_LOW);
}
@@ -278,7 +278,7 @@
SocketServer::startSession(SessionInstance & si){
si.m_thread = NdbThread_Create(sessionThread_C,
(void**)si.m_session,
- 32768,
+ 0, // default stack size
"NdbSock_Session",
NDB_THREAD_PRIO_LOW);
}
=== modified file 'storage/ndb/src/common/util/ndb_init.cpp'
--- a/storage/ndb/src/common/util/ndb_init.cpp 2009-08-03 15:38:54 +0000
+++ b/storage/ndb/src/common/util/ndb_init.cpp 2009-09-09 12:34:25 +0000
@@ -37,6 +37,7 @@
extern "C" void NdbTick_Init(int need_monotonic);
extern "C" int NdbThread_Init();
extern "C" void NdbThread_End();
+extern void NdbOut_Init();
extern "C"
{
@@ -44,6 +45,7 @@
void
ndb_init_internal()
{
+ NdbOut_Init();
if (!g_ndb_connection_mutex)
g_ndb_connection_mutex = NdbMutex_Create();
if (!g_eventLogger)
=== modified file 'storage/ndb/src/cw/cpcd/Monitor.cpp'
--- a/storage/ndb/src/cw/cpcd/Monitor.cpp 2009-06-11 12:28:55 +0000
+++ b/storage/ndb/src/cw/cpcd/Monitor.cpp 2009-09-08 15:12:34 +0000
@@ -40,7 +40,7 @@
m_changeMutex = NdbMutex_Create();
m_monitorThread = NdbThread_Create(monitor_thread_create_wrapper,
(NDB_THREAD_ARG*) this,
- 32768,
+ 0, // default stack size
"ndb_cpcd_monitor",
NDB_THREAD_PRIO_MEAN);
m_monitorThreadQuitFlag = false;
=== modified file 'storage/ndb/src/kernel/blocks/ERROR_codes.txt'
--- a/storage/ndb/src/kernel/blocks/ERROR_codes.txt 2009-09-01 11:42:04 +0000
+++ b/storage/ndb/src/kernel/blocks/ERROR_codes.txt 2009-09-15 16:59:09 +0000
@@ -5,8 +5,8 @@
Next DBTUP 4029
Next DBLQH 5054
Next DBDICT 6013
-Next DBDIH 7220
-Next DBTC 8080
+Next DBDIH 7221
+Next DBTC 8081
Next CMVMI 9000
Next BACKUP 10042
Next DBUTIL 11002
@@ -282,7 +282,7 @@
8045: (ABORTCONF only as part of take-over)
Delay execution of ABORTCONF signal 2 seconds to generate time-out.
-8050: Send ZABORT_TIMEOUT_BREAK delayed
+8080: Send ZABORT_TIMEOUT_BREAK delayed
8053: Crash in timeOutFoundLab, state CS_WAIT_COMMIT_CONF
=== modified file 'storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp'
--- a/storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp 2009-08-21 13:01:34 +0000
+++ b/storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp 2009-09-09 10:58:10 +0000
@@ -2527,17 +2527,20 @@
if (sm == 0)
sm = 25;
- Uint32 sb = 0;
+ Uint64 sb = 0;
if (sm <= 100)
{
- sb = (rps * sm) / 100;
+ sb = (Uint64(rps) * Uint64(sm)) / 100;
}
else
{
sb = sm;
}
- c_rope_pool.setSize(sb/28 + 100);
+ sb /= (Rope::getSegmentSize() * sizeof(Uint32));
+ sb += 100; // more safty
+ ndbrequire(sb < (Uint64(1) << 32));
+ c_rope_pool.setSize(Uint32(sb));
// Initialize BAT for interface to file system
NewVARIABLE* bat = allocateBat(2);
@@ -5644,8 +5647,17 @@
void
Dbdict::execCREATE_TAB_REF(Signal* signal)
{
- // no longer received
- ndbrequire(false);
+ jamEntry();
+
+ CreateTabRef * const ref = (CreateTabRef*)signal->getDataPtr();
+
+ SchemaOpPtr op_ptr;
+ CreateTableRecPtr createTabPtr;
+ findSchemaOp(op_ptr, createTabPtr, ref->senderData);
+ ndbrequire(!op_ptr.isNull());
+
+ setError(op_ptr, ref->errorCode, __LINE__);
+ execute(signal, createTabPtr.p->m_callback, 0);
}
void
=== modified file 'storage/ndb/src/kernel/blocks/dbdih/DbdihInit.cpp'
--- a/storage/ndb/src/kernel/blocks/dbdih/DbdihInit.cpp 2009-05-27 15:21:45 +0000
+++ b/storage/ndb/src/kernel/blocks/dbdih/DbdihInit.cpp 2009-09-09 08:49:45 +0000
@@ -48,7 +48,7 @@
Ptr<TakeOverRecord> ptr;
while (c_activeTakeOverList.seize(ptr))
{
- new (ptr.p) TakeOverRecord();
+ new (ptr.p) TakeOverRecord;
}
while (c_activeTakeOverList.first(ptr))
{
=== modified file 'storage/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp'
--- a/storage/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp 2009-08-24 08:18:43 +0000
+++ b/storage/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp 2009-09-15 16:59:09 +0000
@@ -15762,7 +15762,7 @@
}//for
#ifdef ERROR_INSERT
- if (!tmp.isclear())
+ if (ERROR_INSERTED(7220) && !tmp.isclear())
{
jam();
=== modified file 'storage/ndb/src/kernel/blocks/dblqh/Dblqh.hpp'
--- a/storage/ndb/src/kernel/blocks/dblqh/Dblqh.hpp 2009-05-27 15:21:45 +0000
+++ b/storage/ndb/src/kernel/blocks/dblqh/Dblqh.hpp 2009-09-11 07:53:48 +0000
@@ -1402,8 +1402,10 @@
CLOSING_EXEC_LOG = 18,
OPEN_INIT = 19,
OPEN = 20, ///< Log file open
- OPEN_SR_INVALIDATE_PAGES = 21,
- CLOSE_SR_INVALIDATE_PAGES = 22
+ OPEN_SR_READ_INVALIDATE_PAGES = 21,
+ CLOSE_SR_READ_INVALIDATE_PAGES = 22,
+ OPEN_SR_WRITE_INVALIDATE_PAGES = 23,
+ CLOSE_SR_WRITE_INVALIDATE_PAGES = 24
};
/**
@@ -2384,7 +2386,9 @@
void errorReport(Signal* signal, int place);
void warningReport(Signal* signal, int place);
void invalidateLogAfterLastGCI(Signal *signal);
- void readFileInInvalidate(Signal *signal, bool stepNext);
+ Uint32 nextLogFilePtr(Uint32 logFilePtrI);
+ void readFileInInvalidate(Signal *signal, int stepNext);
+ void writeFileInInvalidate(Signal *signal, int stepPrev);
void exitFromInvalidate(Signal* signal);
Uint32 calcPageCheckSum(LogPageRecordPtr logP);
Uint32 handleLongTupKey(Signal* signal, Uint32* dataPtr, Uint32 len);
=== modified file 'storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp'
--- a/storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp 2009-08-24 13:29:00 +0000
+++ b/storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp 2009-09-11 07:53:48 +0000
@@ -13362,6 +13362,7 @@
jamEntry();
logFilePtr.i = signal->theData[0];
ptrCheckGuard(logFilePtr, clogFileFileSize, logFileRecord);
+ logFilePtr.p->fileRef = RNIL;
if (DEBUG_REDO)
{
@@ -13373,14 +13374,24 @@
}
switch (logFilePtr.p->logFileStatus) {
- case LogFileRecord::CLOSE_SR_INVALIDATE_PAGES:
- jam();
- logFilePtr.p->logFileStatus = LogFileRecord::CLOSED;
-
- logPartPtr.i = logFilePtr.p->logPartRec;
- ptrCheckGuard(logPartPtr, clogPartFileSize, logPartRecord);
-
- exitFromInvalidate(signal);
+ case LogFileRecord::CLOSE_SR_READ_INVALIDATE_PAGES:
+ jam();
+ logFilePtr.p->logFileStatus = LogFileRecord::CLOSED;
+
+ logPartPtr.i = logFilePtr.p->logPartRec;
+ ptrCheckGuard(logPartPtr, clogPartFileSize, logPartRecord);
+
+ readFileInInvalidate(signal, 2);
+ return;
+
+ case LogFileRecord::CLOSE_SR_WRITE_INVALIDATE_PAGES:
+ jam();
+ logFilePtr.p->logFileStatus = LogFileRecord::CLOSED;
+
+ logPartPtr.i = logFilePtr.p->logPartRec;
+ ptrCheckGuard(logPartPtr, clogPartFileSize, logPartRecord);
+
+ writeFileInInvalidate(signal, 1);
return;
case LogFileRecord::CLOSING_INIT:
jam();
@@ -13423,10 +13434,15 @@
jamEntry();
initFsopenconf(signal);
switch (logFilePtr.p->logFileStatus) {
- case LogFileRecord::OPEN_SR_INVALIDATE_PAGES:
- jam();
- logFilePtr.p->logFileStatus = LogFileRecord::OPEN;
- readFileInInvalidate(signal, false);
+ case LogFileRecord::OPEN_SR_READ_INVALIDATE_PAGES:
+ jam();
+ logFilePtr.p->logFileStatus = LogFileRecord::OPEN;
+ readFileInInvalidate(signal, 0);
+ return;
+ case LogFileRecord::OPEN_SR_WRITE_INVALIDATE_PAGES:
+ jam();
+ logFilePtr.p->logFileStatus = LogFileRecord::OPEN;
+ writeFileInInvalidate(signal, 0);
return;
case LogFileRecord::OPENING_INIT:
jam();
@@ -14871,11 +14887,15 @@
signal->theData[7] = pageNo;
sendSignal(NDBFS_REF, GSN_FSWRITEREQ, signal, 8, JBA);
+ ndbrequire(logFilePtr.p->fileRef != RNIL);
+
if (DEBUG_REDO)
+ {
ndbout_c("writeSingle 1 page at part: %u file: %u pos: %u",
- logPartPtr.p->logPartNo,
- logFilePtr.p->fileNo,
- pageNo);
+ logPartPtr.i,
+ logFilePtr.p->fileNo,
+ pageNo);
+ }
}//Dblqh::writeSinglePage()
/* ##########################################################################
@@ -14942,11 +14962,13 @@
{
logPartPtr.p->logLap = logPagePtr.p->logPageWord[ZPOS_LOG_LAP];
if (DEBUG_REDO)
+ {
ndbout_c("readSrLastFileLab part: %u logExecState: %u logPartState: %u logLap: %u",
- logPartPtr.p->logPartNo,
- logPartPtr.p->logExecState,
- logPartPtr.p->logPartState,
- logPartPtr.p->logLap);
+ logPartPtr.i,
+ logPartPtr.p->logExecState,
+ logPartPtr.p->logPartState,
+ logPartPtr.p->logLap);
+ }
if (logPartPtr.p->noLogFiles > cmaxLogFilesInPageZero) {
jam();
initGciInLogFileRec(signal, cmaxLogFilesInPageZero);
@@ -16486,11 +16508,13 @@
jam();
logWord = readLogword(signal);
if (DEBUG_REDO)
- ndbout_c("found gci: %u part: %u file: %u page: %u",
- logWord,
- logPartPtr.p->logPartNo,
- logFilePtr.p->fileNo,
- logFilePtr.p->currentFilepage);
+ {
+ ndbout_c("found gci: %u part: %u file: %u page: %u",
+ logWord,
+ logPartPtr.i,
+ logFilePtr.p->fileNo,
+ logFilePtr.p->currentFilepage);
+ }
if (logWord == logPartPtr.p->logLastGci) {
jam();
/*---------------------------------------------------------------------------*/
@@ -16508,9 +16532,11 @@
logPartPtr.p->headPageIndex =
logPagePtr.p->logPageWord[ZCURR_PAGE_INDEX];
logPartPtr.p->logLap = logPagePtr.p->logPageWord[ZPOS_LOG_LAP];
- if (DEBUG_REDO)
- ndbout_c("execSr part: %u logLap: %u",
- logPartPtr.p->logPartNo, logPartPtr.p->logLap);
+ if (DEBUG_REDO)
+ {
+ ndbout_c("execSr part: %u logLap: %u",
+ logPartPtr.i, logPartPtr.p->logLap);
+ }
}//if
/*---------------------------------------------------------------------------*/
/* THERE IS NO NEED OF EXECUTING PAST THIS LINE SINCE THERE WILL ONLY BE LOG */
@@ -16661,8 +16687,17 @@
// consistent. This function is executed last in start phase 3.
// RT 450. EDTJAMO.
//----------------------------------------------------------------------------
-void Dblqh::invalidateLogAfterLastGCI(Signal* signal) {
-
+Uint32
+Dblqh::nextLogFilePtr(Uint32 logFilePtrI)
+{
+ LogFileRecordPtr tmp;
+ tmp.i = logFilePtrI;
+ ptrCheckGuard(tmp, clogFileFileSize, logFileRecord);
+ return tmp.p->nextLogFile;
+}
+
+void Dblqh::invalidateLogAfterLastGCI(Signal* signal)
+{
jam();
if (logPartPtr.p->logExecState != LogPartRecord::LES_EXEC_LOG_INVALIDATE) {
jam();
@@ -16684,13 +16719,13 @@
// restart.
if (logPagePtr.p->logPageWord[ZPOS_LOG_LAP] == logPartPtr.p->logLap)
{
+ jam();
// This page must be invalidated.
// We search for end
// read next
releaseLfo(signal);
releaseLogpage(signal);
- readFileInInvalidate(signal, true);
- lfoPtr.p->lfoState = LogFileOperationRecord::READ_SR_INVALIDATE_PAGES;
+ readFileInInvalidate(signal, 1);
return;
}
@@ -16715,145 +16750,226 @@
if (logFilePtr.p->fileNo == 0)
{
- /**
- * We're wrapping in the log...
- * update logLap
- */
- logPartPtr.p->logLap--;
+ jam();
+ /**
+ * We're wrapping in the log...
+ * update logLap
+ */
+ logPartPtr.p->logLap--;
ndbrequire(logPartPtr.p->logLap); // Should always be > 0
- if (DEBUG_REDO)
- ndbout_c("invalidateLogAfterLastGCI part: %u wrap from file 0 -> logLap: %u",
- logPartPtr.p->logPartNo, logPartPtr.p->logLap);
- }
-
- /**
- * Move to prev file
- */
- logFilePtr.i = logFilePtr.p->prevLogFile;
- ptrCheckGuard(logFilePtr, clogFileFileSize, logFileRecord);
- logPartPtr.p->invalidateFileNo = logFilePtr.p->fileNo;
- logPartPtr.p->invalidatePageNo = clogFileSize * ZPAGES_IN_MBYTE - 1;
- }
-
- if (logPartPtr.p->invalidateFileNo == logPartPtr.p->headFileNo &&
- logPartPtr.p->invalidatePageNo == logPartPtr.p->headPageNo)
- {
- /**
- * Done...
- */
- logFilePtr.i = logPartPtr.p->currentLogfile;
- ptrCheckGuard(logFilePtr, clogFileFileSize, logFileRecord);
-
- logFilePtr.i = logFilePtr.p->nextLogFile;
- ptrCheckGuard(logFilePtr, clogFileFileSize, logFileRecord);
-
- // Close files if necessary. Current file and the next file should be
- // left open.
- exitFromInvalidate(signal);
+ if (DEBUG_REDO)
+ {
+ ndbout_c("invalidateLogAfterLastGCI part: %u wrap from file 0 -> logLap: %u",
+ logPartPtr.i, logPartPtr.p->logLap);
+ }
+ }
+
+ if (logFilePtr.p->fileNo != 0 &&
+ logFilePtr.i != logPartPtr.p->currentLogfile &&
+ logFilePtr.i != nextLogFilePtr(logPartPtr.p->currentLogfile))
+ {
+ jam();
+ if (DEBUG_REDO)
+ {
+ ndbout_c("invalidate part: %u close %u(%u) (write) (%u)",
+ logPartPtr.i,
+ logFilePtr.p->fileNo,
+ logFilePtr.i,
+ logPartPtr.p->currentLogfile);
+ }
+ logFilePtr.p->logFileStatus =
+ LogFileRecord::CLOSE_SR_WRITE_INVALIDATE_PAGES;
+ closeFile(signal, logFilePtr, __LINE__);
+ return;
+ }
+ writeFileInInvalidate(signal, 1); // step prev
return;
}
-
- seizeLogpage(signal);
-
+ writeFileInInvalidate(signal, 0);
+ return;
+ default:
+ jamLine(lfoPtr.p->lfoState);
+ ndbrequire(false);
+ }
+}
+
+void
+Dblqh::writeFileInInvalidate(Signal* signal, int stepPrev)
+{
+ /**
+ * Move to prev file
+ */
+ if (stepPrev == 1)
+ {
+ jam();
+ logFilePtr.i = logFilePtr.p->prevLogFile;
+ ptrCheckGuard(logFilePtr, clogFileFileSize, logFileRecord);
+ logPartPtr.p->invalidateFileNo = logFilePtr.p->fileNo;
+ logPartPtr.p->invalidatePageNo = clogFileSize * ZPAGES_IN_MBYTE - 1;
+ }
+
+ if (logPartPtr.p->invalidateFileNo == logPartPtr.p->headFileNo &&
+ logPartPtr.p->invalidatePageNo == logPartPtr.p->headPageNo)
+ {
+ jam();
/**
- * Make page really empty
+ * Done...
*/
- bzero(logPagePtr.p, sizeof(LogPageRecord));
- writeSinglePage(signal, logPartPtr.p->invalidatePageNo,
- ZPAGE_SIZE - 1, __LINE__);
-
- lfoPtr.p->lfoState = LogFileOperationRecord::WRITE_SR_INVALIDATE_PAGES;
+ logFilePtr.i = logPartPtr.p->currentLogfile;
+ ptrCheckGuard(logFilePtr, clogFileFileSize, logFileRecord);
+
+ logFilePtr.i = logFilePtr.p->nextLogFile;
+ ptrCheckGuard(logFilePtr, clogFileFileSize, logFileRecord);
+
+ exitFromInvalidate(signal);
return;
- default:
+ }
+
+ if (stepPrev == 1 && logFilePtr.p->logFileStatus != LogFileRecord::OPEN)
+ {
jam();
- systemError(signal, __LINE__);
+ if (DEBUG_REDO)
+ {
+ ndbout_c("invalidate part: %u open for write %u",
+ logPartPtr.i, logFilePtr.p->fileNo);
+ }
+ logFilePtr.p->logFileStatus =LogFileRecord::OPEN_SR_WRITE_INVALIDATE_PAGES;
+ openFileRw(signal, logFilePtr);
return;
- break;
}
+
+ seizeLogpage(signal);
+
+ /**
+ * Make page really empty
+ */
+ bzero(logPagePtr.p, sizeof(LogPageRecord));
+ writeSinglePage(signal, logPartPtr.p->invalidatePageNo,
+ ZPAGE_SIZE - 1, __LINE__);
+
+ lfoPtr.p->lfoState = LogFileOperationRecord::WRITE_SR_INVALIDATE_PAGES;
+ return;
}//Dblqh::invalidateLogAfterLastGCI
-void Dblqh::readFileInInvalidate(Signal* signal, bool stepNext)
+void Dblqh::readFileInInvalidate(Signal* signal, int stepNext)
{
jam();
- if (stepNext)
+ if (stepNext == 1)
{
logPartPtr.p->invalidatePageNo++;
- if (logPartPtr.p->invalidatePageNo == (clogFileSize * ZPAGES_IN_MBYTE))
+ if (logPartPtr.p->invalidatePageNo == (clogFileSize * ZPAGES_IN_MBYTE))
{
- // We continue in the next file.
- logFilePtr.i = logFilePtr.p->nextLogFile;
- ptrCheckGuard(logFilePtr, clogFileFileSize, logFileRecord);
- logPartPtr.p->invalidateFileNo = logFilePtr.p->fileNo;
- // Page 0 is used for file descriptors.
- logPartPtr.p->invalidatePageNo = 1;
-
- if (logFilePtr.p->fileNo == 0)
+ if (logFilePtr.p->fileNo != 0 &&
+ logFilePtr.i != logPartPtr.p->currentLogfile &&
+ logFilePtr.i != nextLogFilePtr(logPartPtr.p->currentLogfile))
{
- /**
- * We're wrapping in the log...
- * update logLap
- */
- logPartPtr.p->logLap++;
- if (DEBUG_REDO)
- ndbout_c("readFileInInvalidate part: %u wrap to file 0 -> logLap: %u",
- logPartPtr.p->logPartNo, logPartPtr.p->logLap);
+ jam();
+ if (DEBUG_REDO)
+ {
+ ndbout_c("invalidate part: %u close %u(%u) (read) (%u)",
+ logPartPtr.i,
+ logFilePtr.p->fileNo,
+ logFilePtr.i,
+ logPartPtr.p->currentLogfile);
+ }
+ logFilePtr.p->logFileStatus =
+ LogFileRecord::CLOSE_SR_READ_INVALIDATE_PAGES;
+ closeFile(signal, logFilePtr, __LINE__);
+ return;
}
- if (logFilePtr.p->logFileStatus != LogFileRecord::OPEN)
+ else
{
- jam();
- logFilePtr.p->logFileStatus = LogFileRecord::OPEN_SR_INVALIDATE_PAGES;
- openFileRw(signal, logFilePtr);
- return;
+ jam();
+ stepNext = 2; // After close
}
}
}
+ if (stepNext == 2)
+ {
+ jam();
+ // We continue in the next file.
+ logFilePtr.i = logFilePtr.p->nextLogFile;
+ ptrCheckGuard(logFilePtr, clogFileFileSize, logFileRecord);
+ logPartPtr.p->invalidateFileNo = logFilePtr.p->fileNo;
+ // Page 0 is used for file descriptors.
+ logPartPtr.p->invalidatePageNo = 1;
+
+ if (logFilePtr.p->fileNo == 0)
+ {
+ /**
+ * We're wrapping in the log...
+ * update logLap
+ */
+ logPartPtr.p->logLap++;
+ if (DEBUG_REDO)
+ {
+ ndbout_c("readFileInInvalidate part: %u wrap to file 0 -> logLap: %u",
+ logPartPtr.i, logPartPtr.p->logLap);
+ }
+ }
+
+ if (logFilePtr.p->logFileStatus != LogFileRecord::OPEN)
+ {
+ jam();
+ if (DEBUG_REDO)
+ {
+ ndbout_c("invalidate part: %u open for read %u",
+ logPartPtr.i, logFilePtr.p->fileNo);
+ }
+ logFilePtr.p->logFileStatus =LogFileRecord::OPEN_SR_READ_INVALIDATE_PAGES;
+ openFileRw(signal, logFilePtr);
+ return;
+ }
+ }
+
// Contact NDBFS. Real time break.
readSinglePage(signal, logPartPtr.p->invalidatePageNo);
lfoPtr.p->lfoState = LogFileOperationRecord::READ_SR_INVALIDATE_PAGES;
}
-void Dblqh::exitFromInvalidate(Signal* signal) {
- jam();
-
-loop:
- logFilePtr.i = logFilePtr.p->nextLogFile;
- ptrCheckGuard(logFilePtr, clogFileFileSize, logFileRecord);
-
- if (logFilePtr.i == logPartPtr.p->currentLogfile)
- {
- jam();
- goto done;
- }
-
- if (logFilePtr.p->fileNo == 0)
- {
- jam();
- /**
- * Logfile 0 shoult *not* be closed
- */
- goto loop;
- }
-
- if (logFilePtr.p->logFileStatus == LogFileRecord::CLOSED)
- {
- jam();
- goto done;
- }
-
- jam();
- ndbrequire(logFilePtr.p->logFileStatus == LogFileRecord::OPEN);
- logFilePtr.p->logFileStatus = LogFileRecord::CLOSE_SR_INVALIDATE_PAGES;
- closeFile(signal, logFilePtr, __LINE__);
- return;
-
-done:
+void Dblqh::exitFromInvalidate(Signal* signal)
+{
+ jam();
+
if (DEBUG_REDO)
- ndbout_c("exitFromInvalidate part: %u head file: %u page: %u",
- logPartPtr.p->logPartNo,
- logPartPtr.p->headFileNo,
- logPartPtr.p->headPageNo);
+ {
+ jam();
+ printf("exitFromInvalidate part: %u head file: %u page: %u open: ",
+ logPartPtr.i,
+ logPartPtr.p->headFileNo,
+ logPartPtr.p->headPageNo);
+
+ LogFileRecordPtr tmp;
+ tmp.i = logPartPtr.p->currentLogfile;
+ do
+ {
+ jam();
+ ptrCheckGuard(tmp, clogFileFileSize, logFileRecord);
+ if (tmp.p->logFileStatus != LogFileRecord::LFS_IDLE &&
+ tmp.p->logFileStatus != LogFileRecord::CLOSED)
+ {
+ jam();
+ printf("%u ", tmp.p->fileNo);
+ }
+ tmp.i = tmp.p->nextLogFile;
+ } while (tmp.i != logPartPtr.p->currentLogfile && tmp.i != RNIL);
+ printf("\n");
+
+ tmp.i = logPartPtr.p->currentLogfile;
+ ptrCheckGuard(tmp, clogFileFileSize, logFileRecord);
+
+ LogPosition head = { tmp.p->fileNo, tmp.p->currentMbyte };
+ LogPosition tail = { logPartPtr.p->logTailFileNo,
+ logPartPtr.p->logTailMbyte};
+ Uint64 mb = free_log(head, tail, logPartPtr.p->noLogFiles, clogFileSize);
+ Uint64 total = logPartPtr.p->noLogFiles * Uint64(clogFileSize);
+ ndbout_c("head: [ %u %u ] tail: [ %u %u ] free: %llu total: %llu",
+ head.m_file_no, head.m_mbyte,
+ tail.m_file_no, tail.m_mbyte,
+ mb, total);
+ }
logFilePtr.i = logPartPtr.p->firstLogfile;
ptrCheckGuard(logFilePtr, clogFileFileSize, logFileRecord);
@@ -17253,8 +17369,7 @@
logPartPtr.p->invalidatePageNo = logPartPtr.p->headPageNo;
logPartPtr.p->logExecState = LogPartRecord::LES_EXEC_LOG_INVALIDATE;
- readFileInInvalidate(signal, true);
- lfoPtr.p->lfoState = LogFileOperationRecord::READ_SR_INVALIDATE_PAGES;
+ readFileInInvalidate(signal, 1);
return;
}//Dblqh::readSrFourthZeroLab()
@@ -17759,12 +17874,16 @@
signal->theData[5] = twlpNoPages;
sendSignal(NDBFS_REF, GSN_FSWRITEREQ, signal, 15, JBA);
+ ndbrequire(logFilePtr.p->fileRef != RNIL);
+
if (DEBUG_REDO)
+ {
ndbout_c("writing %d pages at part: %u file: %u pos: %u",
- twlpNoPages,
- logPartPtr.p->logPartNo,
- logFilePtr.p->fileNo,
- logFilePtr.p->filePosition);
+ twlpNoPages,
+ logPartPtr.i,
+ logFilePtr.p->fileNo,
+ logFilePtr.p->filePosition);
+ }
if (twlpType == ZNORMAL) {
jam();
@@ -18870,12 +18989,13 @@
sendSignal(NDBFS_REF, GSN_FSREADREQ, signal, 16, JBA);
if (DEBUG_REDO)
+ {
ndbout_c("readExecLog %u page at part: %u file: %u pos: %u",
- lfoPtr.p->noPagesRw,
- logPartPtr.p->logPartNo,
- logFilePtr.p->fileNo,
- logPartPtr.p->execSrStartPageNo);
-
+ lfoPtr.p->noPagesRw,
+ logPartPtr.i,
+ logFilePtr.p->fileNo,
+ logPartPtr.p->execSrStartPageNo);
+ }
}//Dblqh::readExecLog()
/* ------------------------------------------------------------------------- */
@@ -18940,12 +19060,13 @@
sendSignal(NDBFS_REF, GSN_FSREADREQ, signal, 15, JBA);
if (DEBUG_REDO)
+ {
ndbout_c("readExecSr %u page at part: %u file: %u pos: %u",
- 8,
- logPartPtr.p->logPartNo,
- logFilePtr.p->fileNo,
- tresPageid);
-
+ 8,
+ logPartPtr.i,
+ logFilePtr.p->fileNo,
+ tresPageid);
+ }
}//Dblqh::readExecSr()
/* ------------------------------------------------------------------------- */
@@ -19101,11 +19222,12 @@
sendSignal(NDBFS_REF, GSN_FSREADREQ, signal, 8, JBA);
if (DEBUG_REDO)
+ {
ndbout_c("readSinglePage 1 page at part: %u file: %u pos: %u",
- logPartPtr.p->logPartNo,
- logFilePtr.p->fileNo,
- pageNo);
-
+ logPartPtr.i,
+ logFilePtr.p->fileNo,
+ pageNo);
+ }
}//Dblqh::readSinglePage()
/* --------------------------------------------------------------------------
@@ -19627,11 +19749,13 @@
logFilePtr.p->remainingWordsInMbyte - ZCOMPLETED_GCI_LOG_SIZE;
if (DEBUG_REDO)
+ {
ndbout_c("writeCompletedGciLog gci: %u part: %u file: %u page: %u",
- cnewestCompletedGci,
- logPartPtr.p->logPartNo,
- logFilePtr.p->fileNo,
- logFilePtr.p->currentFilepage);
+ cnewestCompletedGci,
+ logPartPtr.i,
+ logFilePtr.p->fileNo,
+ logFilePtr.p->currentFilepage);
+ }
writeLogWord(signal, ZCOMPLETED_GCI_TYPE);
writeLogWord(signal, cnewestCompletedGci);
@@ -19670,12 +19794,15 @@
signal->theData[7] = logPartPtr.p->prevFilepage;
sendSignal(NDBFS_REF, GSN_FSWRITEREQ, signal, 8, JBA);
+ ndbrequire(logFilePtr.p->fileRef != RNIL);
+
if (DEBUG_REDO)
+ {
ndbout_c("writeDirty 1 page at part: %u file: %u pos: %u",
- logPartPtr.p->logPartNo,
- logFilePtr.p->fileNo,
- logPartPtr.p->prevFilepage);
-
+ logPartPtr.i,
+ logFilePtr.p->fileNo,
+ logPartPtr.p->prevFilepage);
+ }
}//Dblqh::writeDirty()
/* --------------------------------------------------------------------------
=== modified file 'storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp'
--- a/storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp 2009-09-01 12:32:10 +0000
+++ b/storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp 2009-09-14 12:53:44 +0000
@@ -7177,7 +7177,7 @@
signal->theData[0] = TcContinueB::ZABORT_TIMEOUT_BREAK;
signal->theData[1] = tcConnectptr.i;
signal->theData[2] = apiConnectptr.i;
- if (ERROR_INSERTED(8050))
+ if (ERROR_INSERTED(8080))
{
ndbout_c("sending ZABORT_TIMEOUT_BREAK delayed (%d %d)",
Tcheck, apiConnectptr.p->counter);
=== modified file 'storage/ndb/src/kernel/blocks/dbtup/Dbtup.hpp'
--- a/storage/ndb/src/kernel/blocks/dbtup/Dbtup.hpp 2009-08-04 10:02:49 +0000
+++ b/storage/ndb/src/kernel/blocks/dbtup/Dbtup.hpp 2009-09-04 11:33:38 +0000
@@ -575,9 +575,9 @@
Local_key m_key;
Uint32 m_frag_ptr_i;
Uint32 m_extent_info_ptr;
- Uint16 m_estimated_free_space; // in bytes/records
- Uint16 m_list_index; // in Disk_alloc_info.m_page_requests
- Uint16 m_ref_count; // Waiters for page
+ Uint16 m_original_estimated_free_space; // in bytes/records
+ Uint16 m_list_index; // in Disk_alloc_info.m_page_requests
+ Uint16 m_ref_count; // Waiters for page
Uint16 m_uncommitted_used_space;
Uint32 nextList;
Uint32 prevList;
@@ -3163,9 +3163,21 @@
void drop_table_logsync_callback(Signal*, Uint32, Uint32);
void disk_page_set_dirty(Ptr<Page>);
- void restart_setup_page(Disk_alloc_info&, Ptr<Page>);
- void update_extent_pos(Disk_alloc_info&, Ptr<Extent_info>);
-
+ void restart_setup_page(Disk_alloc_info&, Ptr<Page>, Int32 estimate);
+ void update_extent_pos(Disk_alloc_info&, Ptr<Extent_info>, Int32 delta);
+
+ void disk_page_move_page_request(Disk_alloc_info& alloc,
+ Ptr<Extent_info>,
+ Ptr<Page_request> req,
+ Uint32 old_idx, Uint32 new_idx);
+
+ void disk_page_move_dirty_page(Disk_alloc_info& alloc,
+ Ptr<Extent_info> extentPtr,
+ Ptr<Page> pagePtr,
+ Uint32 old_idx, Uint32 new_idx);
+
+ void disk_page_get_allocated(const Tablerec*, const Fragrecord*,
+ Uint64 res[2]);
/**
* Disk restart code
*/
=== modified file 'storage/ndb/src/kernel/blocks/dbtup/DbtupDiskAlloc.cpp'
--- a/storage/ndb/src/kernel/blocks/dbtup/DbtupDiskAlloc.cpp 2009-05-28 13:12:22 +0000
+++ b/storage/ndb/src/kernel/blocks/dbtup/DbtupDiskAlloc.cpp 2009-09-04 15:24:11 +0000
@@ -40,7 +40,7 @@
{
out << "[ Page_request: ptr.i: " << ptr.i
<< " " << ptr.p->m_key
- << " m_estimated_free_space: " << ptr.p->m_estimated_free_space
+ << " m_original_estimated_free_space: " << ptr.p->m_original_estimated_free_space
<< " m_list_index: " << ptr.p->m_list_index
<< " m_frag_ptr_i: " << ptr.p->m_frag_ptr_i
<< " m_extent_info_ptr: " << ptr.p->m_extent_info_ptr
@@ -248,16 +248,41 @@
void
Dbtup::update_extent_pos(Disk_alloc_info& alloc,
- Ptr<Extent_info> extentPtr)
+ Ptr<Extent_info> extentPtr,
+ Int32 delta)
{
+ if (delta < 0)
+ {
+ jam();
+ Uint32 sub = Uint32(- delta);
+ ddassert(extentPtr.p->m_free_space >= sub);
+ extentPtr.p->m_free_space -= sub;
+ }
+ else
+ {
+ jam();
+ extentPtr.p->m_free_space += delta;
+ ndbassert(Uint32(delta) <= alloc.calc_page_free_space(0));
+ }
+
#ifdef VM_TRACE
- Uint32 min_free = 0;
+ Uint32 cnt = 0;
+ Uint32 sum = 0;
for(Uint32 i = 0; i<MAX_FREE_LIST; i++)
{
- Uint32 sum = alloc.calc_page_free_space(i);
- min_free += sum * extentPtr.p->m_free_page_count[i];
- }
- ddassert(extentPtr.p->m_free_space >= min_free);
+ cnt += extentPtr.p->m_free_page_count[i];
+ sum += extentPtr.p->m_free_page_count[i] * alloc.calc_page_free_space(i);
+ }
+ if (extentPtr.p->m_free_page_count[0] == cnt)
+ {
+ ddassert(extentPtr.p->m_free_space == cnt*alloc.m_page_free_bits_map[0]);
+ }
+ else
+ {
+ ddassert(extentPtr.p->m_free_space < cnt*alloc.m_page_free_bits_map[0]);
+ }
+ ddassert(extentPtr.p->m_free_space >= sum);
+ ddassert(extentPtr.p->m_free_space <= cnt*alloc.m_page_free_bits_map[0]);
#endif
Uint32 old = extentPtr.p->m_free_matrix_pos;
@@ -281,7 +306,8 @@
}
void
-Dbtup::restart_setup_page(Disk_alloc_info& alloc, PagePtr pagePtr)
+Dbtup::restart_setup_page(Disk_alloc_info& alloc, PagePtr pagePtr,
+ Int32 estimate)
{
jam();
/**
@@ -297,16 +323,24 @@
ndbrequire(c_extent_hash.find(extentPtr, key));
pagePtr.p->m_extent_info_ptr = extentPtr.i;
- Uint32 idx = pagePtr.p->list_index & ~0x8000;
- Uint32 estimated = alloc.calc_page_free_space(idx);
Uint32 real_free = pagePtr.p->free_space;
-
- ddassert(real_free >= estimated);
- if (real_free != estimated)
- {
- jam();
- extentPtr.p->m_free_space += (real_free - estimated);
- update_extent_pos(alloc, extentPtr);
+ const bool prealloc = estimate >= 0;
+ Uint32 estimated;
+ if (prealloc)
+ {
+ jam();
+ /**
+ * If this is during prealloc, use estimate from there
+ */
+ estimated = (Uint32)estimate;
+ }
+ else
+ {
+ jam();
+ /**
+ * else use the estimate based on the actual free space
+ */
+ estimated =alloc.calc_page_free_space(alloc.calc_page_free_bits(real_free));
}
#ifdef VM_TRACE
@@ -323,10 +357,30 @@
(void) tsman.get_page_free_bits(&page, &uncommitted, &committed);
jamEntry();
- idx = alloc.calc_page_free_bits(real_free);
- ddassert(idx == committed);
+ ddassert(alloc.calc_page_free_bits(real_free) == committed);
+ if (prealloc)
+ {
+ /**
+ * tsman.alloc_page sets the uncommitted-bits to MAX_FREE_LIST -1
+ * to avoid page being preallocated several times
+ */
+ ddassert(uncommitted == MAX_FREE_LIST - 1);
+ }
+ else
+ {
+ ddassert(committed == uncommitted);
+ }
}
#endif
+
+ ddassert(real_free >= estimated);
+
+ if (real_free != estimated)
+ {
+ jam();
+ Uint32 delta = (real_free-estimated);
+ update_extent_pos(alloc, extentPtr, delta);
+ }
}
/**
@@ -524,6 +578,7 @@
Logfile_client lgman(this, c_lgman, logfile_group_id);
int res= lgman.get_log_buffer(signal, sz, &cb);
+ jamEntry();
switch(res){
case 0:
break;
@@ -575,9 +630,9 @@
Uint32 size= alloc.calc_page_free_space((Uint32)pageBits);
ddassert(size >= sz);
+ req.p->m_original_estimated_free_space = size;
+
Uint32 new_size = size - sz; // Subtract alloc rec
- req.p->m_estimated_free_space= new_size; // Store on page request
-
Uint32 newPageBits= alloc.calc_page_free_bits(new_size);
if (newPageBits != (Uint32)pageBits)
{
@@ -586,9 +641,8 @@
ext.p->m_free_page_count[pageBits]--;
ext.p->m_free_page_count[newPageBits]++;
}
- ddassert(ext.p->m_free_space >= sz);
- ext.p->m_free_space -= sz;
-
+ update_extent_pos(alloc, ext, -Int32(sz));
+
// And put page request in correct free list
idx= alloc.calc_page_free_bits(new_size);
{
@@ -653,26 +707,15 @@
c_extent_pool.getPtr(extentPtr, ext);
Uint32 new_idx= alloc.calc_page_free_bits(free - used);
- ArrayPool<Page> *pool= (ArrayPool<Page>*)&m_global_page_pool;
if (old_idx != new_idx)
{
jam();
- LocalDLList<Page> old_list(*pool, alloc.m_dirty_pages[old_idx]);
- LocalDLList<Page> new_list(*pool, alloc.m_dirty_pages[new_idx]);
- old_list.remove(pagePtr);
- new_list.add(pagePtr);
-
- ddassert(extentPtr.p->m_free_page_count[old_idx]);
- extentPtr.p->m_free_page_count[old_idx]--;
- extentPtr.p->m_free_page_count[new_idx]++;
- pagePtr.p->list_index= new_idx;
+ disk_page_move_dirty_page(alloc, extentPtr, pagePtr, old_idx, new_idx);
}
pagePtr.p->uncommitted_used_space = used;
- ddassert(extentPtr.p->m_free_space >= sz);
- extentPtr.p->m_free_space -= sz;
- update_extent_pos(alloc, extentPtr);
+ update_extent_pos(alloc, extentPtr, -Int32(sz));
}
@@ -684,39 +727,26 @@
jam();
ddassert(req.p->m_list_index == old_idx);
- Uint32 free= req.p->m_estimated_free_space;
+ Uint32 free= req.p->m_original_estimated_free_space;
Uint32 used= req.p->m_uncommitted_used_space + sz;
Uint32 ext= req.p->m_extent_info_ptr;
Ptr<Extent_info> extentPtr;
c_extent_pool.getPtr(extentPtr, ext);
- ddassert(free >= sz);
- Uint32 new_idx= alloc.calc_page_free_bits(free - sz);
+ ddassert(free >= used);
+ Uint32 new_idx= alloc.calc_page_free_bits(free - used);
if (old_idx != new_idx)
{
jam();
- Page_request_list::Head *lists = alloc.m_page_requests;
- Local_page_request_list old_list(c_page_request_pool, lists[old_idx]);
- Local_page_request_list new_list(c_page_request_pool, lists[new_idx]);
- old_list.remove(req);
- new_list.add(req);
-
- ddassert(extentPtr.p->m_free_page_count[old_idx]);
- extentPtr.p->m_free_page_count[old_idx]--;
- extentPtr.p->m_free_page_count[new_idx]++;
- req.p->m_list_index= new_idx;
+ disk_page_move_page_request(alloc, extentPtr, req, old_idx, new_idx);
}
req.p->m_uncommitted_used_space = used;
- req.p->m_estimated_free_space = free - sz;
- ddassert(extentPtr.p->m_free_space >= sz);
- extentPtr.p->m_free_space -= sz;
- update_extent_pos(alloc, extentPtr);
+ update_extent_pos(alloc, extentPtr, -Int32(sz));
}
-
void
Dbtup::disk_page_prealloc_callback(Signal* signal,
Uint32 page_request, Uint32 page_id)
@@ -738,13 +768,88 @@
pagePtr.i = gpage.i;
pagePtr.p = reinterpret_cast<Page*>(gpage.p);
+ Disk_alloc_info& alloc= fragPtr.p->m_disk_alloc_info;
if (unlikely(pagePtr.p->m_restart_seq != globalData.m_restart_seq))
{
+ jam();
D(V(pagePtr.p->m_restart_seq) << V(globalData.m_restart_seq));
- restart_setup_page(fragPtr.p->m_disk_alloc_info, pagePtr);
- }
-
- disk_page_prealloc_callback_common(signal, req, fragPtr, pagePtr);
+ restart_setup_page(alloc, pagePtr, req.p->m_original_estimated_free_space);
+ }
+
+ Ptr<Extent_info> extentPtr;
+ c_extent_pool.getPtr(extentPtr, req.p->m_extent_info_ptr);
+
+ pagePtr.p->uncommitted_used_space += req.p->m_uncommitted_used_space;
+ ddassert(pagePtr.p->free_space >= pagePtr.p->uncommitted_used_space);
+
+ Uint32 free = pagePtr.p->free_space - pagePtr.p->uncommitted_used_space;
+ Uint32 idx = req.p->m_list_index;
+ Uint32 real_idx = alloc.calc_page_free_bits(free);
+
+ if (idx != real_idx)
+ {
+ jam();
+ ddassert(extentPtr.p->m_free_page_count[idx]);
+ extentPtr.p->m_free_page_count[idx]--;
+ extentPtr.p->m_free_page_count[real_idx]++;
+ update_extent_pos(alloc, extentPtr, 0);
+ }
+
+ {
+ /**
+ * add to dirty list
+ */
+ pagePtr.p->list_index = real_idx;
+ ArrayPool<Page> *cheat_pool= (ArrayPool<Page>*)&m_global_page_pool;
+ LocalDLList<Page> list(* cheat_pool, alloc.m_dirty_pages[real_idx]);
+ list.add(pagePtr);
+ }
+
+ {
+ /**
+ * release page request
+ */
+ Local_page_request_list list(c_page_request_pool,
+ alloc.m_page_requests[idx]);
+ list.release(req);
+ }
+}
+
+void
+Dbtup::disk_page_move_dirty_page(Disk_alloc_info& alloc,
+ Ptr<Extent_info> extentPtr,
+ Ptr<Page> pagePtr,
+ Uint32 old_idx,
+ Uint32 new_idx)
+{
+ ddassert(extentPtr.p->m_free_page_count[old_idx]);
+ extentPtr.p->m_free_page_count[old_idx]--;
+ extentPtr.p->m_free_page_count[new_idx]++;
+
+ ArrayPool<Page> *pool= (ArrayPool<Page>*)&m_global_page_pool;
+ LocalDLList<Page> new_list(*pool, alloc.m_dirty_pages[new_idx]);
+ LocalDLList<Page> old_list(*pool, alloc.m_dirty_pages[old_idx]);
+ old_list.remove(pagePtr);
+ new_list.add(pagePtr);
+ pagePtr.p->list_index = new_idx;
+}
+
+void
+Dbtup::disk_page_move_page_request(Disk_alloc_info& alloc,
+ Ptr<Extent_info> extentPtr,
+ Ptr<Page_request> req,
+ Uint32 old_idx, Uint32 new_idx)
+{
+ Page_request_list::Head *lists = alloc.m_page_requests;
+ Local_page_request_list old_list(c_page_request_pool, lists[old_idx]);
+ Local_page_request_list new_list(c_page_request_pool, lists[new_idx]);
+ old_list.remove(req);
+ new_list.add(req);
+
+ ddassert(extentPtr.p->m_free_page_count[old_idx]);
+ extentPtr.p->m_free_page_count[old_idx]--;
+ extentPtr.p->m_free_page_count[new_idx]++;
+ req.p->m_list_index= new_idx;
}
void
@@ -781,6 +886,15 @@
Ptr<Extent_info> extentPtr;
c_extent_pool.getPtr(extentPtr, req.p->m_extent_info_ptr);
+ if (tabPtr.p->m_attributes[DD].m_no_of_varsize == 0)
+ {
+ convertThPage((Fix_page*)pagePtr.p, tabPtr.p, DD);
+ }
+ else
+ {
+ abort();
+ }
+
pagePtr.p->m_page_no= req.p->m_key.m_page_no;
pagePtr.p->m_file_no= req.p->m_key.m_file_no;
pagePtr.p->m_table_id= fragPtr.p->fragTableId;
@@ -788,82 +902,34 @@
pagePtr.p->m_extent_no = extentPtr.p->m_key.m_page_idx; // logical extent no
pagePtr.p->m_extent_info_ptr= req.p->m_extent_info_ptr;
pagePtr.p->m_restart_seq = globalData.m_restart_seq;
- pagePtr.p->list_index = 0x8000;
- pagePtr.p->uncommitted_used_space = 0;
pagePtr.p->nextList = pagePtr.p->prevList = RNIL;
-
- if (tabPtr.p->m_attributes[DD].m_no_of_varsize == 0)
- {
- convertThPage((Fix_page*)pagePtr.p, tabPtr.p, DD);
- }
- else
- {
- abort();
- }
- disk_page_prealloc_callback_common(signal, req, fragPtr, pagePtr);
-}
+ pagePtr.p->list_index = req.p->m_list_index;
+ pagePtr.p->uncommitted_used_space = req.p->m_uncommitted_used_space;
-void
-Dbtup::disk_page_prealloc_callback_common(Signal* signal,
- Ptr<Page_request> req,
- Ptr<Fragrecord> fragPtr,
- PagePtr pagePtr)
-{
- /**
- * 1) remove page request from Disk_alloc_info.m_page_requests
- * 2) Add page to Disk_alloc_info.m_dirty_pages
- * 3) register callback in pgman (unmap callback)
- * 4) inform pgman about current users
- */
Disk_alloc_info& alloc= fragPtr.p->m_disk_alloc_info;
- ddassert((pagePtr.p->list_index & 0x8000) == 0x8000);
- ddassert(pagePtr.p->m_extent_info_ptr == req.p->m_extent_info_ptr);
- ddassert(pagePtr.p->m_page_no == req.p->m_key.m_page_no);
- ddassert(pagePtr.p->m_file_no == req.p->m_key.m_file_no);
-
- Uint32 old_idx = req.p->m_list_index;
- Uint32 free= req.p->m_estimated_free_space;
- Uint32 ext = req.p->m_extent_info_ptr;
- Uint32 used= req.p->m_uncommitted_used_space;
- Uint32 real_free = pagePtr.p->free_space;
- Uint32 real_used = used + pagePtr.p->uncommitted_used_space;
-
- ddassert(real_free >= free);
- ddassert(real_free >= real_used);
- ddassert(alloc.calc_page_free_bits(free) == old_idx);
- Uint32 new_idx= alloc.calc_page_free_bits(real_free - real_used);
-
- /**
- * Add to dirty pages
- */
- ArrayPool<Page> *cheat_pool= (ArrayPool<Page>*)&m_global_page_pool;
- LocalDLList<Page> list(* cheat_pool, alloc.m_dirty_pages[new_idx]);
- list.add(pagePtr);
- pagePtr.p->uncommitted_used_space = real_used;
- pagePtr.p->list_index = new_idx;
-
- if (old_idx != new_idx || free != real_free)
- {
- jam();
- Ptr<Extent_info> extentPtr;
- c_extent_pool.getPtr(extentPtr, ext);
-
- extentPtr.p->m_free_space += (real_free - free);
-
- if (old_idx != new_idx)
- {
- jam();
- ddassert(extentPtr.p->m_free_page_count[old_idx]);
- extentPtr.p->m_free_page_count[old_idx]--;
- extentPtr.p->m_free_page_count[new_idx]++;
- }
-
- update_extent_pos(alloc, extentPtr);
- }
-
- {
+ Uint32 idx = req.p->m_list_index;
+
+ {
+ Uint32 free = pagePtr.p->free_space - pagePtr.p->uncommitted_used_space;
+ ddassert(idx == alloc.calc_page_free_bits(free));
+ ddassert(pagePtr.p->free_space == req.p->m_original_estimated_free_space);
+ }
+
+ {
+ /**
+ * add to dirty list
+ */
+ ArrayPool<Page> *cheat_pool= (ArrayPool<Page>*)&m_global_page_pool;
+ LocalDLList<Page> list(* cheat_pool, alloc.m_dirty_pages[idx]);
+ list.add(pagePtr);
+ }
+
+ {
+ /**
+ * release page request
+ */
Local_page_request_list list(c_page_request_pool,
- alloc.m_page_requests[old_idx]);
+ alloc.m_page_requests[idx]);
list.release(req);
}
}
@@ -873,7 +939,8 @@
{
jam();
Uint32 idx = pagePtr.p->list_index;
- if ((idx & 0x8000) == 0)
+ if ((pagePtr.p->m_restart_seq == globalData.m_restart_seq) &&
+ ((idx & 0x8000) == 0))
{
jam();
/**
@@ -904,13 +971,16 @@
Uint32 used = pagePtr.p->uncommitted_used_space;
if (unlikely(pagePtr.p->m_restart_seq != globalData.m_restart_seq))
{
+ jam();
D(V(pagePtr.p->m_restart_seq) << V(globalData.m_restart_seq));
- restart_setup_page(alloc, pagePtr);
+ restart_setup_page(alloc, pagePtr, -1);
+ ndbassert(free == pagePtr.p->free_space);
idx = alloc.calc_page_free_bits(free);
used = 0;
}
else
{
+ jam();
idx &= ~0x8000;
ddassert(idx == alloc.calc_page_free_bits(free - used));
}
@@ -1139,20 +1209,10 @@
if (old_idx != new_idx)
{
jam();
- ddassert(extentPtr.p->m_free_page_count[old_idx]);
- extentPtr.p->m_free_page_count[old_idx]--;
- extentPtr.p->m_free_page_count[new_idx]++;
-
- ArrayPool<Page> *pool= (ArrayPool<Page>*)&m_global_page_pool;
- LocalDLList<Page> new_list(*pool, alloc.m_dirty_pages[new_idx]);
- LocalDLList<Page> old_list(*pool, alloc.m_dirty_pages[old_idx]);
- old_list.remove(pagePtr);
- new_list.add(pagePtr);
- pagePtr.p->list_index = new_idx;
+ disk_page_move_dirty_page(alloc, extentPtr, pagePtr, old_idx, new_idx);
}
- extentPtr.p->m_free_space += sz;
- update_extent_pos(alloc, extentPtr);
+ update_extent_pos(alloc, extentPtr, sz);
#if NOT_YET_FREE_EXTENT
if (check_free(extentPtr.p) == 0)
{
@@ -1166,6 +1226,7 @@
Local_key* key, Uint32 sz)
{
jam();
+
Page_cache_client::Request req;
req.m_callback.m_callbackData= sz;
req.m_callback.m_callbackFunction =
@@ -1231,47 +1292,29 @@
disk_page_set_dirty(pagePtr);
Disk_alloc_info& alloc= fragPtrP->m_disk_alloc_info;
- Uint32 page_idx = pagePtr.p->list_index;
+
+ Ptr<Extent_info> extentPtr;
+ c_extent_pool.getPtr(extentPtr, pagePtr.p->m_extent_info_ptr);
+
+ Uint32 idx = pagePtr.p->list_index & 0x7FFF;
Uint32 used = pagePtr.p->uncommitted_used_space;
Uint32 free = pagePtr.p->free_space;
- Uint32 ext = pagePtr.p->m_extent_info_ptr;
- Uint32 old_idx = page_idx & 0x7FFF;
ddassert(free >= used);
ddassert(used >= sz);
- ddassert(alloc.calc_page_free_bits(free - used) == old_idx);
+ ddassert(alloc.calc_page_free_bits(free - used) == idx);
+
+ pagePtr.p->uncommitted_used_space = used - sz;
+
Uint32 new_idx = alloc.calc_page_free_bits(free - used + sz);
- Ptr<Extent_info> extentPtr;
- c_extent_pool.getPtr(extentPtr, ext);
- if (old_idx != new_idx)
+ if (idx != new_idx)
{
jam();
- ddassert(extentPtr.p->m_free_page_count[old_idx]);
- extentPtr.p->m_free_page_count[old_idx]--;
- extentPtr.p->m_free_page_count[new_idx]++;
-
- if (old_idx == page_idx)
- {
- jam();
- ArrayPool<Page> *pool= (ArrayPool<Page>*)&m_global_page_pool;
- LocalDLList<Page> old_list(*pool, alloc.m_dirty_pages[old_idx]);
- LocalDLList<Page> new_list(*pool, alloc.m_dirty_pages[new_idx]);
- old_list.remove(pagePtr);
- new_list.add(pagePtr);
- pagePtr.p->list_index = new_idx;
- }
- else
- {
- jam();
- pagePtr.p->list_index = new_idx | 0x8000;
- }
+ disk_page_move_dirty_page(alloc, extentPtr, pagePtr, idx, new_idx);
}
- pagePtr.p->uncommitted_used_space = used - sz;
-
- extentPtr.p->m_free_space += sz;
- update_extent_pos(alloc, extentPtr);
+ update_extent_pos(alloc, extentPtr, sz);
#if NOT_YET_FREE_EXTENT
if (check_free(extentPtr.p) == 0)
{
@@ -1333,6 +1376,7 @@
Logfile_client::Change c[1] = {{ &alloc, sizeof(alloc) >> 2 } };
Uint64 lsn= lgman.add_entry(c, 1);
+ jamEntry();
Page_cache_client pgman(this, c_pgman);
pgman.update_lsn(* key, lsn);
jamEntry();
@@ -1366,6 +1410,7 @@
ndbassert(4*(3 + sz + 1) == (sizeof(update) + 4*sz - 4));
Uint64 lsn= lgman.add_entry(c, 3);
+ jamEntry();
Page_cache_client pgman(this, c_pgman);
pgman.update_lsn(* key, lsn);
jamEntry();
@@ -1399,6 +1444,7 @@
ndbassert(4*(3 + sz + 1) == (sizeof(free) + 4*sz - 4));
Uint64 lsn= lgman.add_entry(c, 3);
+ jamEntry();
Page_cache_client pgman(this, c_pgman);
pgman.update_lsn(* key, lsn);
jamEntry();
@@ -1903,7 +1949,7 @@
void
Dbtup::disk_restart_page_bits(Uint32 tableId, Uint32 fragId,
- const Local_key*, Uint32 bits)
+ const Local_key* key, Uint32 bits)
{
jam();
TablerecPtr tabPtr;
@@ -1918,7 +1964,35 @@
Uint32 size= alloc.calc_page_free_space(bits);
- ext.p->m_free_space += size;
ext.p->m_free_page_count[bits]++;
+ update_extent_pos(alloc, ext, size); // actually only to update free_space
ndbassert(ext.p->m_free_matrix_pos == RNIL);
}
+
+void
+Dbtup::disk_page_get_allocated(const Tablerec* tabPtrP,
+ const Fragrecord * fragPtrP,
+ Uint64 res[2])
+{
+ res[0] = res[1] = 0;
+ if (tabPtrP->m_no_of_disk_attributes)
+ {
+ jam();
+ const Disk_alloc_info& alloc= fragPtrP->m_disk_alloc_info;
+ Uint64 cnt = 0;
+ Uint64 free = 0;
+
+ {
+ Disk_alloc_info& tmp = const_cast<Disk_alloc_info&>(alloc);
+ Local_fragment_extent_list list(c_extent_pool, tmp.m_extent_list);
+ Ptr<Extent_info> extentPtr;
+ for (list.first(extentPtr); !extentPtr.isNull(); list.next(extentPtr))
+ {
+ cnt++;
+ free += extentPtr.p->m_free_space;
+ }
+ }
+ res[0] = cnt * alloc.m_extent_size * File_formats::NDB_PAGE_SIZE;
+ res[1] = free * 4 * tabPtrP->m_offsets[DD].m_fix_header_size;
+ }
+}
=== modified file 'storage/ndb/src/kernel/blocks/dbtup/DbtupGen.cpp'
--- a/storage/ndb/src/kernel/blocks/dbtup/DbtupGen.cpp 2009-05-27 15:21:45 +0000
+++ b/storage/ndb/src/kernel/blocks/dbtup/DbtupGen.cpp 2009-09-09 10:58:10 +0000
@@ -383,17 +383,43 @@
ndbrequire(!ndb_mgm_get_int_parameter(p, CFG_TUP_FRAG, &cnoOfFragrec));
Uint32 noOfTriggers= 0;
+ Uint32 noOfAttribs = 0;
ndbrequire(!ndb_mgm_get_int_parameter(p, CFG_TUP_TABLE, &cnoOfTablerec));
- ndbrequire(!ndb_mgm_get_int_parameter(p, CFG_TUP_TABLE_DESC,
- &cnoOfTabDescrRec));
+ ndbrequire(!ndb_mgm_get_int_parameter(p, CFG_DB_NO_ATTRIBUTES, &noOfAttribs));
+
Uint32 noOfStoredProc;
ndbrequire(!ndb_mgm_get_int_parameter(p, CFG_TUP_STORED_PROC,
&noOfStoredProc));
ndbrequire(!ndb_mgm_get_int_parameter(p, CFG_DB_NO_TRIGGERS,
&noOfTriggers));
- cnoOfTabDescrRec = (cnoOfTabDescrRec & 0xFFFFFFF0) + 16;
+
+ {
+ Uint32 keyDesc = noOfAttribs;
+ Uint32 maxKeyDesc = cnoOfTablerec * MAX_ATTRIBUTES_IN_INDEX;
+ if (keyDesc > maxKeyDesc)
+ {
+ /**
+ * There can be no-more key's
+ * than "cnoOfTablerec * MAX_ATTRIBUTES_IN_INDEX"
+ */
+ jam();
+ keyDesc = maxKeyDesc;
+ }
+
+ cnoOfTabDescrRec =
+ cnoOfTablerec * 2 * (ZTD_SIZE + ZTD_TRAILER_SIZE) +
+ noOfAttribs * (sizeOfReadFunction() + // READ
+ sizeOfReadFunction() + // UPDATE
+ (sizeof(char*) >> 2) + // Charset
+ ZAD_SIZE + // Descriptor
+ 1 + // real order
+ InternalMaxDynFix) + // Worst case dynamic
+ keyDesc; // key-descr
+
+ cnoOfTabDescrRec = (cnoOfTabDescrRec & 0xFFFFFFF0) + 16;
+ }
initRecords();
=== modified file 'storage/ndb/src/kernel/blocks/dbtup/DbtupMeta.cpp'
--- a/storage/ndb/src/kernel/blocks/dbtup/DbtupMeta.cpp 2009-05-27 15:21:45 +0000
+++ b/storage/ndb/src/kernel/blocks/dbtup/DbtupMeta.cpp 2009-09-04 11:33:38 +0000
@@ -354,11 +354,14 @@
Logfile_client lgman(this, c_lgman, regFragPtr.p->m_logfile_group_id);
if((terrorCode = lgman.alloc_log_space(sz)))
{
+ jamEntry();
addattrrefuseLab(signal, regFragPtr, fragOperPtr, regTabPtr.p, fragId);
return;
}
+ jamEntry();
int res= lgman.get_log_buffer(signal, sz, &cb);
+ jamEntry();
switch(res){
case 0:
jam();
@@ -1323,12 +1326,14 @@
Logfile_client::Change c[1] = {{ &create, sizeof(create) >> 2 } };
Uint64 lsn= lgman.add_entry(c, 1);
+ jamEntry();
Logfile_client::Request req;
req.m_callback.m_callbackData= fragOperPtr.i;
req.m_callback.m_callbackIndex = UNDO_CREATETABLE_LOGSYNC_CALLBACK;
int ret = lgman.sync_lsn(signal, lsn, &req, 0);
+ jamEntry();
switch(ret){
case 0:
return;
@@ -1625,6 +1630,7 @@
D("Logfile_client - releaseFragment");
Logfile_client lgman(this, c_lgman, logfile_group_id);
int r0 = lgman.alloc_log_space(sz);
+ jamEntry();
if (r0)
{
jam();
@@ -1634,6 +1640,7 @@
}
int res= lgman.get_log_buffer(signal, sz, &cb);
+ jamEntry();
switch(res){
case 0:
jam();
@@ -1642,6 +1649,7 @@
warningEvent("Failed to get log buffer for drop table: %u",
tabPtr.i);
lgman.free_log_space(sz);
+ jamEntry();
goto done;
break;
default:
@@ -1668,7 +1676,6 @@
if (!alloc_info.m_unmap_pages.isEmpty())
{
jam();
- ndbout_c("waiting for unmape pages");
signal->theData[0] = ZUNMAP_PAGES;
signal->theData[1] = tabPtr.i;
signal->theData[2] = fragPtr.i;
@@ -1714,6 +1721,7 @@
int flags= Page_cache_client::COMMIT_REQ;
Page_cache_client pgman(this, c_pgman);
int res= pgman.get_page(signal, req, flags);
+ jamEntry();
m_pgman_ptr = pgman.m_ptr;
switch(res)
{
@@ -1744,6 +1752,7 @@
Uint32 tableId = ((Page*)page.p)->m_table_id;
Page_cache_client pgman(this, c_pgman);
pgman.drop_page(key, page_id);
+ jamEntry();
TablerecPtr tabPtr;
tabPtr.i= tableId;
@@ -1779,10 +1788,12 @@
#if NOT_YET_UNDO_FREE_EXTENT
Uint32 sz= sizeof(Disk_undo::FreeExtent) >> 2;
(void) c_lgman->alloc_log_space(fragPtr.p->m_logfile_group_id, sz);
+ jamEntry();
Logfile_client lgman(this, c_lgman, fragPtr.p->m_logfile_group_id);
int res= lgman.get_log_buffer(signal, sz, &cb);
+ jamEntry();
switch(res){
case 0:
jam();
@@ -1835,12 +1846,14 @@
Logfile_client::Change c[1] = {{ &drop, sizeof(drop) >> 2 } };
Uint64 lsn = lgman.add_entry(c, 1);
+ jamEntry();
Logfile_client::Request req;
req.m_callback.m_callbackData= tablePtrI;
req.m_callback.m_callbackIndex = DROP_TABLE_LOGSYNC_CALLBACK;
int ret = lgman.sync_lsn(signal, lsn, &req, 0);
+ jamEntry();
switch(ret){
case 0:
return;
@@ -1911,6 +1924,7 @@
Logfile_client::Change c[1] = {{ &free, sizeof(free) >> 2 } };
Uint64 lsn = lgman.add_entry(c, 1);
+ jamEntry();
#else
Uint64 lsn = 0;
#endif
@@ -1921,6 +1935,7 @@
fragPtr.p->m_tablespace_id);
tsman.free_extent(&ext_ptr.p->m_key, lsn);
+ jamEntry();
c_extent_hash.remove(ext_ptr);
list.release(ext_ptr);
=== modified file 'storage/ndb/src/kernel/blocks/dbtup/DbtupRoutines.cpp'
--- a/storage/ndb/src/kernel/blocks/dbtup/DbtupRoutines.cpp 2009-08-17 07:36:12 +0000
+++ b/storage/ndb/src/kernel/blocks/dbtup/DbtupRoutines.cpp 2009-09-04 11:33:38 +0000
@@ -2423,6 +2423,22 @@
outBuffer[1] = operPtr.p->m_copy_tuple_location.m_page_no;
outBuffer[2] = operPtr.p->m_copy_tuple_location.m_page_idx;
break;
+ case AttributeHeader::FRAGMENT_EXTENT_SPACE:
+ {
+ Uint64 res[2];
+ disk_page_get_allocated(tabptr.p, fragptr.p, res);
+ memcpy(outBuffer + 1, res + 0, 8);
+ sz = 2;
+ break;
+ }
+ case AttributeHeader::FRAGMENT_FREE_EXTENT_SPACE:
+ {
+ Uint64 res[2];
+ disk_page_get_allocated(tabptr.p, fragptr.p, res);
+ memcpy(outBuffer + 1, res + 1, 8);
+ sz = 2;
+ break;
+ }
default:
return -ZATTRIBUTE_ID_ERROR;
}
=== modified file 'storage/ndb/src/kernel/blocks/ndbfs/PosixAsyncFile.cpp'
--- a/storage/ndb/src/kernel/blocks/ndbfs/PosixAsyncFile.cpp 2009-05-27 15:21:45 +0000
+++ b/storage/ndb/src/kernel/blocks/ndbfs/PosixAsyncFile.cpp 2009-09-14 12:43:30 +0000
@@ -85,7 +85,7 @@
int ret;
char * bufptr = (char*)((UintPtr(g_odirect_readbuf)+(GLOBAL_PAGE_SIZE - 1)) & ~(GLOBAL_PAGE_SIZE - 1));
while (((ret = ::write(theFd, bufptr, GLOBAL_PAGE_SIZE)) == -1) &&
- (errno == EINTR));
+ (errno == EINTR)) {};
if (ret == -1)
{
new_flags &= ~O_DIRECT;
@@ -111,7 +111,7 @@
int ret;
char * bufptr = (char*)((UintPtr(g_odirect_readbuf)+(GLOBAL_PAGE_SIZE - 1)) & ~(GLOBAL_PAGE_SIZE - 1));
while (((ret = ::read(theFd, bufptr, GLOBAL_PAGE_SIZE)) == -1) &&
- (errno == EINTR));
+ (errno == EINTR)) {};
if (ret == -1)
{
ndbout_c("%s Failed to read using O_DIRECT, disabling",
@@ -501,7 +501,7 @@
if(!use_gz)
{
while((seek_val= lseek(theFd, offset, SEEK_SET)) == (off_t)-1
- && errno == EINTR);
+ && errno == EINTR) {};
if(seek_val == (off_t)-1)
{
return errno;
@@ -511,7 +511,7 @@
if(use_gz)
{
while((seek_val= azseek(&azf, offset, SEEK_SET)) == (off_t)-1
- && errno == EINTR);
+ && errno == EINTR) {};
if(seek_val == (off_t)-1)
{
return errno;
@@ -614,7 +614,7 @@
FileGuard guard(this);
off_t seek_val;
while((seek_val= lseek(theFd, offset, SEEK_SET)) == (off_t)-1
- && errno == EINTR);
+ && errno == EINTR) {};
if(seek_val == (off_t)-1)
{
return errno;
=== modified file 'storage/ndb/src/kernel/blocks/ndbfs/Win32AsyncFile.cpp'
--- a/storage/ndb/src/kernel/blocks/ndbfs/Win32AsyncFile.cpp 2009-05-28 18:54:28 +0000
+++ b/storage/ndb/src/kernel/blocks/ndbfs/Win32AsyncFile.cpp 2009-09-14 12:41:02 +0000
@@ -402,7 +402,7 @@
{
int len = strlen(path);
strcat(path, ffd.cFileName);
- if(DeleteFile(path))
+ if(DeleteFile(path) || RemoveDirectory(path))
{
path[len] = 0;
continue;
=== modified file 'storage/ndb/src/kernel/vm/Configuration.cpp'
--- a/storage/ndb/src/kernel/vm/Configuration.cpp 2009-05-29 06:23:51 +0000
+++ b/storage/ndb/src/kernel/vm/Configuration.cpp 2009-09-09 10:58:10 +0000
@@ -808,7 +808,7 @@
cfg.put(CFG_DIH_REPLICAS,
NO_OF_FRAG_PER_NODE * noOfMetaTables *
- noOfDBNodes * noOfReplicas);
+ noOfDBNodes * noOfReplicas * lqhInstances);
cfg.put(CFG_DIH_TABLE,
noOfMetaTables);
@@ -864,16 +864,9 @@
cfg.put(CFG_TUP_PAGE,
noOfDataPages);
- cfg.put(CFG_TUP_PAGE_RANGE,
- 2 * NO_OF_FRAG_PER_NODE * noOfMetaTables* noOfReplicas);
-
cfg.put(CFG_TUP_TABLE,
noOfMetaTables);
- cfg.put(CFG_TUP_TABLE_DESC,
- 6 * NO_OF_FRAG_PER_NODE * noOfAttributes * noOfReplicas +
- 10 * NO_OF_FRAG_PER_NODE * noOfMetaTables * noOfReplicas );
-
cfg.put(CFG_TUP_STORED_PROC,
noOfLocalScanRecords);
}
=== modified file 'storage/ndb/src/kernel/vm/Rope.hpp'
--- a/storage/ndb/src/kernel/vm/Rope.hpp 2009-05-27 15:21:45 +0000
+++ b/storage/ndb/src/kernel/vm/Rope.hpp 2009-09-09 09:17:51 +0000
@@ -86,6 +86,7 @@
static Uint32 hash(const char * str, Uint32 len);
+ static Uint32 getSegmentSize() { return RopeBase::getSegmentSize();}
private:
Uint32 m_hash;
RopeHandle & src;
=== modified file 'storage/ndb/src/kernel/vm/WatchDog.cpp'
--- a/storage/ndb/src/kernel/vm/WatchDog.cpp 2009-05-27 15:21:45 +0000
+++ b/storage/ndb/src/kernel/vm/WatchDog.cpp 2009-09-08 15:12:34 +0000
@@ -110,7 +110,7 @@
theStop = false;
theThreadPtr = NdbThread_Create(runWatchDog,
(void**)this,
- 32768,
+ 0, // default stack size
"ndb_watchdog",
NDB_THREAD_PRIO_HIGH);
=== modified file 'storage/ndb/src/mgmclient/CommandInterpreter.cpp'
--- a/storage/ndb/src/mgmclient/CommandInterpreter.cpp 2009-05-27 15:21:45 +0000
+++ b/storage/ndb/src/mgmclient/CommandInterpreter.cpp 2009-09-08 15:12:34 +0000
@@ -1009,7 +1009,7 @@
p.p= &m_print_mutex;
m_event_thread = NdbThread_Create(event_thread_run,
(void**)&p,
- 32768,
+ 0, // default stack size
"CommandInterpreted_event_thread",
NDB_THREAD_PRIO_LOW);
if (m_event_thread)
=== modified file 'storage/ndb/src/mgmsrv/CMakeLists.txt'
--- a/storage/ndb/src/mgmsrv/CMakeLists.txt 2008-10-24 12:41:10 +0000
+++ b/storage/ndb/src/mgmsrv/CMakeLists.txt 2009-09-08 20:08:24 +0000
@@ -41,6 +41,5 @@
MgmtSrvr.cpp
main.cpp
Services.cpp
- ConfigManager.cpp
- DirIterator.cpp)
+ ConfigManager.cpp)
TARGET_LINK_LIBRARIES(ndb_mgmd ndbconf)
=== modified file 'storage/ndb/src/mgmsrv/ConfigInfo.cpp'
--- a/storage/ndb/src/mgmsrv/ConfigInfo.cpp 2009-08-24 12:55:54 +0000
+++ b/storage/ndb/src/mgmsrv/ConfigInfo.cpp 2009-09-09 11:01:50 +0000
@@ -1506,11 +1506,11 @@
CFG_DB_STRING_MEMORY,
"StringMemory",
DB_TOKEN,
- "Default size of string memory (0 -> 5% of max 1-100 -> %of max, >100 -> actual bytes)",
+ "Default size of string memory (1-100 -> %of max, >100 -> actual bytes)",
ConfigInfo::CI_USED,
false,
ConfigInfo::CI_INT,
- "0",
+ "25",
"0",
STR_VALUE(MAX_INT_RNIL) },
@@ -3746,6 +3746,8 @@
}
BaseString::snprintf(ctx.pname, sizeof(ctx.pname), "SYSTEM_%s", name);
+
+ ctx.m_currentSection->put("Type", ctx.fname);
return true;
}
=== modified file 'storage/ndb/src/mgmsrv/ConfigManager.cpp'
--- a/storage/ndb/src/mgmsrv/ConfigManager.cpp 2009-06-10 10:16:30 +0000
+++ b/storage/ndb/src/mgmsrv/ConfigManager.cpp 2009-09-08 20:08:24 +0000
@@ -16,7 +16,7 @@
#include "ConfigManager.hpp"
#include "MgmtSrvr.hpp"
-#include "DirIterator.hpp"
+#include <NdbDir.hpp>
#include <NdbConfig.h>
#include <NdbSleep.h>
@@ -130,7 +130,7 @@
ConfigManager::find_nodeid_from_configdir(void)
{
BaseString config_name;
- DirIterator iter;
+ NdbDir::Iterator iter;
if (iter.open(m_configdir) != 0)
return 0;
@@ -1815,7 +1815,7 @@
bool
ConfigManager::delete_saved_configs(void) const
{
- DirIterator iter;
+ NdbDir::Iterator iter;
if (iter.open(m_configdir) != 0)
return false;
@@ -1857,7 +1857,7 @@
bool
ConfigManager::saved_config_exists(BaseString& config_name) const
{
- DirIterator iter;
+ NdbDir::Iterator iter;
if (iter.open(m_configdir) != 0)
return false;
@@ -1895,7 +1895,7 @@
bool
ConfigManager::failed_config_change_exists() const
{
- DirIterator iter;
+ NdbDir::Iterator iter;
if (iter.open(m_configdir) != 0)
return false;
=== modified file 'storage/ndb/src/mgmsrv/InitConfigFileParser.cpp'
--- a/storage/ndb/src/mgmsrv/InitConfigFileParser.cpp 2009-06-01 15:58:26 +0000
+++ b/storage/ndb/src/mgmsrv/InitConfigFileParser.cpp 2009-08-25 11:48:09 +0000
@@ -359,7 +359,6 @@
values.c_str());
return false;
}
- ndbout_c("storing enum value %d for %s", value_int, pname);
require(ctx.m_currentSection->put(pname, value_int));
break;
}
=== modified file 'storage/ndb/src/mgmsrv/Makefile.am'
--- a/storage/ndb/src/mgmsrv/Makefile.am 2009-05-27 15:21:45 +0000
+++ b/storage/ndb/src/mgmsrv/Makefile.am 2009-09-08 20:08:24 +0000
@@ -31,8 +31,7 @@
InitConfigFileParser.cpp \
Config.cpp \
mgm_ndbinfo.cpp \
- ConfigManager.cpp \
- DirIterator.cpp
+ ConfigManager.cpp
noinst_PROGRAMS = testConfig
=== modified file 'storage/ndb/src/mgmsrv/MgmtSrvr.cpp'
--- a/storage/ndb/src/mgmsrv/MgmtSrvr.cpp 2009-05-27 15:21:45 +0000
+++ b/storage/ndb/src/mgmsrv/MgmtSrvr.cpp 2009-09-15 19:21:25 +0000
@@ -616,7 +616,7 @@
assert(_isStopThread == false);
_logLevelThread = NdbThread_Create(logLevelThread_C,
(void**)this,
- 32768,
+ 0, // default stack size
"MgmtSrvr_Loglevel",
NDB_THREAD_PRIO_LOW);
@@ -757,15 +757,6 @@
MgmtSrvr::~MgmtSrvr()
{
-
- /* Stop config manager */
- if (m_config_manager != 0)
- {
- m_config_manager->stop();
- delete m_config_manager;
- m_config_manager= 0;
- }
-
/* Stop log level thread */
void* res = 0;
_isStopThread = true;
@@ -786,6 +777,14 @@
"continuing with shutdown anyway.");
}
+ /* Stop config manager */
+ if (m_config_manager != 0)
+ {
+ m_config_manager->stop();
+ delete m_config_manager;
+ m_config_manager= 0;
+ }
+
// Stop transporter
if(theFacade != 0){
theFacade->stop_instance();
=== modified file 'storage/ndb/src/mgmsrv/MgmtThread.hpp'
--- a/storage/ndb/src/mgmsrv/MgmtThread.hpp 2008-10-21 12:41:59 +0000
+++ b/storage/ndb/src/mgmsrv/MgmtThread.hpp 2009-09-08 15:12:34 +0000
@@ -35,7 +35,7 @@
MgmtThread(); // Not implemented
MgmtThread(const MgmtThread&); // Not implemented
MgmtThread(const char* name,
- size_t stack_size= 32768,
+ size_t stack_size= 0, // Use default stack size
NDB_THREAD_PRIO thread_prio= NDB_THREAD_PRIO_LOW) :
m_running(true),
m_name(name),
=== modified file 'storage/ndb/src/mgmsrv/main.cpp'
--- a/storage/ndb/src/mgmsrv/main.cpp 2009-05-27 15:21:45 +0000
+++ b/storage/ndb/src/mgmsrv/main.cpp 2009-09-11 07:43:35 +0000
@@ -96,7 +96,7 @@
GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0 },
{ "daemon", 'd', "Run ndb_mgmd in daemon mode (default)",
(uchar**) &opts.daemon, (uchar**) &opts.daemon, 0,
- GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0 },
+ GET_BOOL, NO_ARG, IF_WIN(0,1), 0, 0, 0, 0, 0 },
{ "interactive", 256,
"Run interactive. Not supported but provided for testing purposes",
(uchar**) &opts.interactive, (uchar**) &opts.interactive, 0,
@@ -108,7 +108,7 @@
{ "nodaemon", 256,
"Don't run as daemon, but don't read from stdin",
(uchar**) &opts.non_interactive, (uchar**) &opts.non_interactive, 0,
- GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0 },
+ GET_BOOL, NO_ARG, IF_WIN(1,0), 0, 0, 0, 0, 0 },
{ "mycnf", 256,
"Read cluster config from my.cnf",
(uchar**) &opts.mycnf, (uchar**) &opts.mycnf, 0,
@@ -118,6 +118,10 @@
(uchar**) &opts.bind_address, (uchar**) &opts.bind_address, 0,
GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 },
{ "configdir", 256,
+ "Directory for the binary configuration files (alias for --config-dir)",
+ (uchar**) &opts.configdir, (uchar**) &opts.configdir, 0,
+ GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 },
+ { "config-dir", 256,
"Directory for the binary configuration files",
(uchar**) &opts.configdir, (uchar**) &opts.configdir, 0,
GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 },
@@ -148,12 +152,6 @@
static char **defaults_argv;
-/*
- mgmd_exit()
- do_exit=true:
- if in a windows service, don't want process to exit()
- until cleanup of other threads is done
-*/
static void mgmd_exit(int result)
{
g_eventLogger->close();
=== modified file 'storage/ndb/src/ndbapi/ClusterMgr.cpp'
--- a/storage/ndb/src/ndbapi/ClusterMgr.cpp 2009-07-03 06:34:01 +0000
+++ b/storage/ndb/src/ndbapi/ClusterMgr.cpp 2009-09-08 15:12:34 +0000
@@ -142,7 +142,7 @@
theStop = 0;
theClusterMgrThread = NdbThread_Create(runClusterMgr_C,
(void**)this,
- 32768,
+ 0, // default stack size
"ndb_clustermgr",
NDB_THREAD_PRIO_LOW);
}
@@ -698,7 +698,9 @@
aSignal.init(GSN_ARBIT_STARTREQ, theData);
sendSignalToThread(aSignal);
theThread = NdbThread_Create(
- runArbitMgr_C, (void**)this, 32768, "ndb_arbitmgr",
+ runArbitMgr_C, (void**)this,
+ 0, // default stack size
+ "ndb_arbitmgr",
NDB_THREAD_PRIO_HIGH);
NdbMutex_Unlock(theThreadMutex);
}
=== modified file 'storage/ndb/src/ndbapi/Ndb.cpp'
--- a/storage/ndb/src/ndbapi/Ndb.cpp 2009-06-22 09:07:41 +0000
+++ b/storage/ndb/src/ndbapi/Ndb.cpp 2009-09-15 16:59:09 +0000
@@ -964,11 +964,22 @@
DBUG_VOID_RETURN;
}
- if (aConnection->theReleaseOnClose == false) {
+ /**
+ * NOTE: It's ok to call getNodeSequence() here wo/ having mutex,
+ */
+ Uint32 nodeId = aConnection->getConnectedNodeId();
+ TransporterFacade* tp = theImpl->m_transporter_facade;
+ Uint32 seq = tp->getNodeSequence(nodeId);
+ if (aConnection->theNodeSequence != seq)
+ {
+ aConnection->theReleaseOnClose = true;
+ }
+
+ if (aConnection->theReleaseOnClose == false)
+ {
/**
* Put it back in idle list for that node
*/
- Uint32 nodeId = aConnection->getConnectedNodeId();
aConnection->theNext = theConnectionArray[nodeId];
theConnectionArray[nodeId] = aConnection;
DBUG_VOID_RETURN;
=== modified file 'storage/ndb/src/ndbapi/NdbBlob.cpp'
--- a/storage/ndb/src/ndbapi/NdbBlob.cpp 2009-05-29 06:23:51 +0000
+++ b/storage/ndb/src/ndbapi/NdbBlob.cpp 2009-09-08 12:10:53 +0000
@@ -357,6 +357,13 @@
void
NdbBlob::release()
{
+ theKeyBuf.release();
+ theAccessKeyBuf.release();
+ thePackKeyBuf.release();
+ theHeadInlineBuf.release();
+ theHeadInlineCopyBuf.release();
+ thePartBuf.release();
+ theBlobEventDataBuf.release();
setState(Idle);
}
@@ -392,6 +399,16 @@
}
void
+NdbBlob::Buf::release()
+{
+ if (data)
+ delete [] data;
+ data = NULL;
+ size = 0;
+ maxsize = 0;
+}
+
+void
NdbBlob::Buf::zerorest()
{
assert(size <= maxsize);
=== modified file 'storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp'
--- a/storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp 2009-08-05 10:48:56 +0000
+++ b/storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp 2009-09-04 11:33:38 +0000
@@ -339,6 +339,83 @@
DBUG_RETURN(true);
}
+void
+NdbColumnImpl::create_pseudo_columns()
+{
+ NdbDictionary::Column::FRAGMENT=
+ NdbColumnImpl::create_pseudo("NDB$FRAGMENT");
+ NdbDictionary::Column::FRAGMENT_FIXED_MEMORY=
+ NdbColumnImpl::create_pseudo("NDB$FRAGMENT_FIXED_MEMORY");
+ NdbDictionary::Column::FRAGMENT_VARSIZED_MEMORY=
+ NdbColumnImpl::create_pseudo("NDB$FRAGMENT_VARSIZED_MEMORY");
+ NdbDictionary::Column::ROW_COUNT=
+ NdbColumnImpl::create_pseudo("NDB$ROW_COUNT");
+ NdbDictionary::Column::COMMIT_COUNT=
+ NdbColumnImpl::create_pseudo("NDB$COMMIT_COUNT");
+ NdbDictionary::Column::ROW_SIZE=
+ NdbColumnImpl::create_pseudo("NDB$ROW_SIZE");
+ NdbDictionary::Column::RANGE_NO=
+ NdbColumnImpl::create_pseudo("NDB$RANGE_NO");
+ NdbDictionary::Column::DISK_REF=
+ NdbColumnImpl::create_pseudo("NDB$DISK_REF");
+ NdbDictionary::Column::RECORDS_IN_RANGE=
+ NdbColumnImpl::create_pseudo("NDB$RECORDS_IN_RANGE");
+ NdbDictionary::Column::ROWID=
+ NdbColumnImpl::create_pseudo("NDB$ROWID");
+ NdbDictionary::Column::ROW_GCI=
+ NdbColumnImpl::create_pseudo("NDB$ROW_GCI");
+ NdbDictionary::Column::ANY_VALUE=
+ NdbColumnImpl::create_pseudo("NDB$ANY_VALUE");
+ NdbDictionary::Column::COPY_ROWID=
+ NdbColumnImpl::create_pseudo("NDB$COPY_ROWID");
+ NdbDictionary::Column::OPTIMIZE=
+ NdbColumnImpl::create_pseudo("NDB$OPTIMIZE");
+ NdbDictionary::Column::FRAGMENT_EXTENT_SPACE =
+ NdbColumnImpl::create_pseudo("NDB$FRAGMENT_EXTENT_SPACE");
+ NdbDictionary::Column::FRAGMENT_FREE_EXTENT_SPACE =
+ NdbColumnImpl::create_pseudo("NDB$FRAGMENT_FREE_EXTENT_SPACE");
+}
+
+void
+NdbColumnImpl::destory_pseudo_columns()
+{
+ delete NdbDictionary::Column::FRAGMENT;
+ delete NdbDictionary::Column::FRAGMENT_FIXED_MEMORY;
+ delete NdbDictionary::Column::FRAGMENT_VARSIZED_MEMORY;
+ delete NdbDictionary::Column::ROW_COUNT;
+ delete NdbDictionary::Column::COMMIT_COUNT;
+ delete NdbDictionary::Column::ROW_SIZE;
+ delete NdbDictionary::Column::RANGE_NO;
+ delete NdbDictionary::Column::DISK_REF;
+ delete NdbDictionary::Column::RECORDS_IN_RANGE;
+ delete NdbDictionary::Column::ROWID;
+ delete NdbDictionary::Column::ROW_GCI;
+ delete NdbDictionary::Column::ANY_VALUE;
+ delete NdbDictionary::Column::OPTIMIZE;
+ NdbDictionary::Column::FRAGMENT= 0;
+ NdbDictionary::Column::FRAGMENT_FIXED_MEMORY= 0;
+ NdbDictionary::Column::FRAGMENT_VARSIZED_MEMORY= 0;
+ NdbDictionary::Column::ROW_COUNT= 0;
+ NdbDictionary::Column::COMMIT_COUNT= 0;
+ NdbDictionary::Column::ROW_SIZE= 0;
+ NdbDictionary::Column::RANGE_NO= 0;
+ NdbDictionary::Column::DISK_REF= 0;
+ NdbDictionary::Column::RECORDS_IN_RANGE= 0;
+ NdbDictionary::Column::ROWID= 0;
+ NdbDictionary::Column::ROW_GCI= 0;
+ NdbDictionary::Column::ANY_VALUE= 0;
+ NdbDictionary::Column::OPTIMIZE= 0;
+
+ delete NdbDictionary::Column::COPY_ROWID;
+ NdbDictionary::Column::COPY_ROWID = 0;
+
+ delete NdbDictionary::Column::FRAGMENT_EXTENT_SPACE;
+ NdbDictionary::Column::FRAGMENT_EXTENT_SPACE = 0;
+
+ delete NdbDictionary::Column::FRAGMENT_FREE_EXTENT_SPACE;
+ NdbDictionary::Column::FRAGMENT_FREE_EXTENT_SPACE = 0;
+}
+
NdbDictionary::Column *
NdbColumnImpl::create_pseudo(const char * name){
NdbDictionary::Column * col = new NdbDictionary::Column();
@@ -414,6 +491,16 @@
col->m_impl.m_attrId = AttributeHeader::OPTIMIZE;
col->m_impl.m_attrSize = 4;
col->m_impl.m_arraySize = 1;
+ } else if(!strcmp(name, "NDB$FRAGMENT_EXTENT_SPACE")){
+ col->setType(NdbDictionary::Column::Bigunsigned);
+ col->m_impl.m_attrId = AttributeHeader::FRAGMENT_EXTENT_SPACE;
+ col->m_impl.m_attrSize = 4;
+ col->m_impl.m_arraySize = 2;
+ } else if(!strcmp(name, "NDB$FRAGMENT_FREE_EXTENT_SPACE")){
+ col->setType(NdbDictionary::Column::Bigunsigned);
+ col->m_impl.m_attrId = AttributeHeader::FRAGMENT_FREE_EXTENT_SPACE;
+ col->m_impl.m_attrSize = 4;
+ col->m_impl.m_arraySize = 2;
} else {
abort();
}
@@ -7896,5 +7983,7 @@
const NdbDictionary::Column * NdbDictionary::Column::ANY_VALUE = 0;
const NdbDictionary::Column * NdbDictionary::Column::COPY_ROWID = 0;
const NdbDictionary::Column * NdbDictionary::Column::OPTIMIZE = 0;
+const NdbDictionary::Column * NdbDictionary::Column::FRAGMENT_EXTENT_SPACE = 0;
+const NdbDictionary::Column * NdbDictionary::Column::FRAGMENT_FREE_EXTENT_SPACE = 0;
template class Vector<NdbDictInterface::Tx::Op>;
=== modified file 'storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp'
--- a/storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp 2009-08-05 10:48:56 +0000
+++ b/storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp 2009-09-04 11:33:38 +0000
@@ -143,6 +143,8 @@
static const NdbColumnImpl & getImpl(const NdbDictionary::Column & t);
NdbDictionary::Column * m_facade;
+ static void create_pseudo_columns();
+ static void destory_pseudo_columns();
static NdbDictionary::Column * create_pseudo(const char *);
// Get total length in bytes, used by NdbOperation
=== modified file 'storage/ndb/src/ndbapi/TransporterFacade.cpp'
--- a/storage/ndb/src/ndbapi/TransporterFacade.cpp 2009-07-03 06:34:01 +0000
+++ b/storage/ndb/src/ndbapi/TransporterFacade.cpp 2009-09-08 15:12:34 +0000
@@ -458,13 +458,13 @@
theReceiveThread = NdbThread_Create(runReceiveResponse_C,
(void**)this,
- 32768,
+ 0, // Use default stack size
"ndb_receive",
NDB_THREAD_PRIO_LOW);
theSendThread = NdbThread_Create(runSendRequest_C,
(void**)this,
- 32768,
+ 0, // Use default stack size
"ndb_send",
NDB_THREAD_PRIO_LOW);
@@ -886,7 +886,7 @@
timeout = tmp1;
}
m_waitfor_timeout = timeout;
-
+
#ifdef API_TRACE
signalLogger.logOn(true, 0, SignalLoggerManager::LogInOut);
#endif
=== modified file 'storage/ndb/src/ndbapi/ndb_cluster_connection.cpp'
--- a/storage/ndb/src/ndbapi/ndb_cluster_connection.cpp 2009-07-03 06:34:01 +0000
+++ b/storage/ndb/src/ndbapi/ndb_cluster_connection.cpp 2009-09-08 15:12:34 +0000
@@ -112,7 +112,9 @@
DBUG_PRINT("info",("starting thread"));
m_impl.m_connect_thread=
NdbThread_Create(run_ndb_cluster_connection_connect_thread,
- (void**)&m_impl, 32768, "ndb_cluster_connection",
+ (void**)&m_impl,
+ 0, // default stack size
+ "ndb_cluster_connection",
NDB_THREAD_PRIO_LOW);
}
else if (r < 0)
@@ -299,36 +301,9 @@
DBUG_PRINT("enter",("Ndb_cluster_connection this=0x%lx", (long) this));
NdbMutex_Lock(g_ndb_connection_mutex);
- if(g_ndb_connection_count++ == 0){
- NdbDictionary::Column::FRAGMENT=
- NdbColumnImpl::create_pseudo("NDB$FRAGMENT");
- NdbDictionary::Column::FRAGMENT_FIXED_MEMORY=
- NdbColumnImpl::create_pseudo("NDB$FRAGMENT_FIXED_MEMORY");
- NdbDictionary::Column::FRAGMENT_VARSIZED_MEMORY=
- NdbColumnImpl::create_pseudo("NDB$FRAGMENT_VARSIZED_MEMORY");
- NdbDictionary::Column::ROW_COUNT=
- NdbColumnImpl::create_pseudo("NDB$ROW_COUNT");
- NdbDictionary::Column::COMMIT_COUNT=
- NdbColumnImpl::create_pseudo("NDB$COMMIT_COUNT");
- NdbDictionary::Column::ROW_SIZE=
- NdbColumnImpl::create_pseudo("NDB$ROW_SIZE");
- NdbDictionary::Column::RANGE_NO=
- NdbColumnImpl::create_pseudo("NDB$RANGE_NO");
- NdbDictionary::Column::DISK_REF=
- NdbColumnImpl::create_pseudo("NDB$DISK_REF");
- NdbDictionary::Column::RECORDS_IN_RANGE=
- NdbColumnImpl::create_pseudo("NDB$RECORDS_IN_RANGE");
- NdbDictionary::Column::ROWID=
- NdbColumnImpl::create_pseudo("NDB$ROWID");
- NdbDictionary::Column::ROW_GCI=
- NdbColumnImpl::create_pseudo("NDB$ROW_GCI");
- NdbDictionary::Column::ANY_VALUE=
- NdbColumnImpl::create_pseudo("NDB$ANY_VALUE");
- NdbDictionary::Column::COPY_ROWID=
- NdbColumnImpl::create_pseudo("NDB$COPY_ROWID");
- NdbDictionary::Column::OPTIMIZE=
- NdbColumnImpl::create_pseudo("NDB$OPTIMIZE");
-
+ if(g_ndb_connection_count++ == 0)
+ {
+ NdbColumnImpl::create_pseudo_columns();
g_eventLogger->createConsoleHandler();
g_eventLogger->setCategory("NdbApi");
g_eventLogger->enable(Logger::LL_ON, Logger::LL_ERROR);
@@ -424,37 +399,9 @@
free(m_name);
NdbMutex_Lock(g_ndb_connection_mutex);
- if(--g_ndb_connection_count == 0){
- delete NdbDictionary::Column::FRAGMENT;
- delete NdbDictionary::Column::FRAGMENT_FIXED_MEMORY;
- delete NdbDictionary::Column::FRAGMENT_VARSIZED_MEMORY;
- delete NdbDictionary::Column::ROW_COUNT;
- delete NdbDictionary::Column::COMMIT_COUNT;
- delete NdbDictionary::Column::ROW_SIZE;
- delete NdbDictionary::Column::RANGE_NO;
- delete NdbDictionary::Column::DISK_REF;
- delete NdbDictionary::Column::RECORDS_IN_RANGE;
- delete NdbDictionary::Column::ROWID;
- delete NdbDictionary::Column::ROW_GCI;
- delete NdbDictionary::Column::ANY_VALUE;
- delete NdbDictionary::Column::OPTIMIZE;
- NdbDictionary::Column::FRAGMENT= 0;
- NdbDictionary::Column::FRAGMENT_FIXED_MEMORY= 0;
- NdbDictionary::Column::FRAGMENT_VARSIZED_MEMORY= 0;
- NdbDictionary::Column::ROW_COUNT= 0;
- NdbDictionary::Column::COMMIT_COUNT= 0;
- NdbDictionary::Column::ROW_SIZE= 0;
- NdbDictionary::Column::RANGE_NO= 0;
- NdbDictionary::Column::DISK_REF= 0;
- NdbDictionary::Column::RECORDS_IN_RANGE= 0;
- NdbDictionary::Column::ROWID= 0;
- NdbDictionary::Column::ROW_GCI= 0;
- NdbDictionary::Column::ANY_VALUE= 0;
- NdbDictionary::Column::OPTIMIZE= 0;
-
- delete NdbDictionary::Column::COPY_ROWID;
- NdbDictionary::Column::COPY_ROWID = 0;
-
+ if(--g_ndb_connection_count == 0)
+ {
+ NdbColumnImpl::destory_pseudo_columns();
}
NdbMutex_Unlock(g_ndb_connection_mutex);
=== modified file 'storage/ndb/src/ndbapi/ndberror.c'
--- a/storage/ndb/src/ndbapi/ndberror.c 2009-08-05 10:48:56 +0000
+++ b/storage/ndb/src/ndbapi/ndberror.c 2009-09-09 09:43:33 +0000
@@ -376,6 +376,7 @@
/**
* SchemaError
*/
+ { 306, DMEC, IE, "Out of fragment records in DIH" },
{ 311, DMEC, AE, "Undefined partition used in setPartitionId" },
{ 703, DMEC, SE, "Invalid table format" },
{ 704, DMEC, SE, "Attribute name too long" },
=== modified file 'storage/ndb/test/ndbapi/testNdbApi.cpp'
--- a/storage/ndb/test/ndbapi/testNdbApi.cpp 2009-09-01 11:42:04 +0000
+++ b/storage/ndb/test/ndbapi/testNdbApi.cpp 2009-09-07 11:04:28 +0000
@@ -3052,6 +3052,16 @@
{
if (hugoOps.startTransaction(otherNdb) != 0)
{
+ if (otherNdb->getNdbError().code == 4009)
+ {
+ /* Api disconnect sometimes manifests as Cluster failure
+ * from API's point of view as it cannot seize() a
+ * transaction from any Ndbd node
+ * We treat this the same way as the later error cases
+ */
+ break;
+ }
+
ndbout << "Failed to start transaction. Error : "
<< otherNdb->getNdbError().message << endl;
return NDBT_FAILED;
=== modified file 'storage/ndb/test/ndbapi/testNodeRestart.cpp'
--- a/storage/ndb/test/ndbapi/testNodeRestart.cpp 2009-05-28 07:08:44 +0000
+++ b/storage/ndb/test/ndbapi/testNodeRestart.cpp 2009-09-14 12:53:44 +0000
@@ -728,7 +728,7 @@
if (loop & 1)
{
- if (restarter.insertErrorInNode(node1, 8050))
+ if (restarter.insertErrorInNode(node1, 8080))
goto err;
}
=== modified file 'storage/ndb/test/ndbapi/testSystemRestart.cpp'
--- a/storage/ndb/test/ndbapi/testSystemRestart.cpp 2009-08-18 06:59:17 +0000
+++ b/storage/ndb/test/ndbapi/testSystemRestart.cpp 2009-09-15 16:59:09 +0000
@@ -1441,6 +1441,9 @@
int cnt = 0;
CHECK(hugoTrans.selectCount(pNdb, 0, &cnt) == 0);
ndbout << "Found " << cnt << " records..." << endl;
+ ndbout << "Updating..." << endl;
+ CHECK(hugoTrans.scanUpdateRecords(pNdb,
+ NdbScanOperation::SF_TupScan, cnt) == 0);
ndbout << "Clearing..." << endl;
CHECK(hugoTrans.clearTable(pNdb,
NdbScanOperation::SF_TupScan, cnt) == 0);
@@ -1541,6 +1544,9 @@
int cnt = 0;
CHECK(hugoTrans.selectCount(pNdb, 0, &cnt) == 0);
ndbout << "Found " << cnt << " records..." << endl;
+ ndbout << "Updating..." << endl;
+ CHECK(hugoTrans.scanUpdateRecords(pNdb,
+ NdbScanOperation::SF_TupScan, cnt) == 0);
ndbout << "Clearing..." << endl;
CHECK(hugoTrans.clearTable(pNdb,
NdbScanOperation::SF_TupScan, cnt) == 0);
@@ -1557,6 +1563,142 @@
return result;
}
+int runSR_DD_3(NDBT_Context* ctx, NDBT_Step* step)
+{
+ Ndb* pNdb = GETNDB(step);
+ int result = NDBT_OK;
+ Uint32 loops = ctx->getNumLoops();
+ Uint32 rows = ctx->getNumRecords();
+ NdbRestarter restarter;
+ NdbBackup backup(GETNDB(step)->getNodeId()+1);
+ bool lcploop = ctx->getProperty("LCP", (unsigned)0);
+ bool all = ctx->getProperty("ALL", (unsigned)0);
+ int error = (int)ctx->getProperty("ERROR", (unsigned)0);
+ rows = ctx->getProperty("ROWS", rows);
+
+ Uint32 i = 1;
+
+ int val[] = { DumpStateOrd::CmvmiSetRestartOnErrorInsert, 1 };
+ int lcp = DumpStateOrd::DihMinTimeBetweenLCP;
+
+ if (error)
+ {
+ restarter.insertErrorInAllNodes(error);
+ }
+
+ HugoTransactions hugoTrans(*ctx->getTab());
+ while(i<=loops && result != NDBT_FAILED)
+ {
+
+ if (lcploop)
+ {
+ CHECK(restarter.dumpStateAllNodes(&lcp, 1) == 0);
+ }
+
+ int nodeId = restarter.getDbNodeId(rand() % restarter.getNumDbNodes());
+
+ if (hugoTrans.loadTable(pNdb, rows) != 0)
+ {
+ return NDBT_FAILED;
+ }
+
+ if (!all)
+ {
+ ndbout << "Making " << nodeId << " crash" << endl;
+ int kill[] = { 9999, 3000, 10000 };
+ CHECK(restarter.dumpStateOneNode(nodeId, val, 2) == 0);
+ CHECK(restarter.dumpStateOneNode(nodeId, kill, 3) == 0);
+ }
+ else
+ {
+ ndbout << "Crashing cluster" << endl;
+ ctx->setProperty("StopAbort", 3000 + rand() % (10000 - 3000));
+ }
+
+ int deletedrows[100];
+ Uint64 end = NdbTick_CurrentMillisecond() + 13000;
+ do {
+ Uint32 cnt = 0;
+ for (; cnt<NDB_ARRAY_SIZE(deletedrows); cnt++)
+ {
+ deletedrows[cnt] = rand() % rows;
+ if (hugoTrans.startTransaction(pNdb))
+ break;
+ if (hugoTrans.pkDeleteRecord(pNdb, deletedrows[cnt]))
+ break;
+ if (hugoTrans.execute_Commit(pNdb))
+ break;
+ hugoTrans.closeTransaction(pNdb);
+ }
+ if (hugoTrans.getTransaction() != 0)
+ hugoTrans.closeTransaction(pNdb);
+
+ if (hugoTrans.scanUpdateRecords(pNdb, NdbScanOperation::SF_TupScan,0)!=0)
+ break;
+
+ for (Uint32 n = 0; n<cnt; n++)
+ {
+ if (hugoTrans.startTransaction(pNdb))
+ break;
+ if (hugoTrans.pkInsertRecord(pNdb, deletedrows[n], 1, rand()))
+ break;
+ if (hugoTrans.execute_Commit(pNdb))
+ break;
+ hugoTrans.closeTransaction(pNdb);
+ }
+ if (hugoTrans.getTransaction() != 0)
+ hugoTrans.closeTransaction(pNdb);
+
+ if (hugoTrans.scanUpdateRecords(pNdb, NdbScanOperation::SF_TupScan,0)!=0)
+ break;
+ } while (NdbTick_CurrentMillisecond() < end);
+
+ if (!all)
+ {
+ ndbout << "Waiting for " << nodeId << " to restart" << endl;
+ CHECK(restarter.waitNodesNoStart(&nodeId, 1) == 0);
+ ndbout << "Restarting cluster" << endl;
+ CHECK(restarter.restartAll(false, true, true) == 0);
+ }
+ else
+ {
+ ndbout << "Waiting for cluster to restart" << endl;
+ }
+
+ CHECK(restarter.waitClusterNoStart() == 0);
+ CHECK(restarter.startAll() == 0);
+ CHECK(restarter.waitClusterStarted() == 0);
+ if (error)
+ {
+ restarter.insertErrorInAllNodes(error);
+ }
+
+ ndbout << "Starting backup..." << flush;
+ CHECK(backup.start() == 0);
+ ndbout << "done" << endl;
+
+ int cnt = 0;
+ CHECK(hugoTrans.selectCount(pNdb, 0, &cnt) == 0);
+ ndbout << "Found " << cnt << " records..." << endl;
+ ndbout << "Updating..." << endl;
+ CHECK(hugoTrans.scanUpdateRecords(pNdb,
+ NdbScanOperation::SF_TupScan, cnt) == 0);
+ ndbout << "Clearing..." << endl;
+ CHECK(hugoTrans.clearTable(pNdb,
+ NdbScanOperation::SF_TupScan, cnt) == 0);
+ i++;
+ }
+
+ if (error)
+ {
+ restarter.insertErrorInAllNodes(0);
+ }
+
+ ndbout << "runSR_DD_3 finished" << endl;
+ ctx->stopTest();
+ return result;
+}
+
int runBug22696(NDBT_Context* ctx, NDBT_Step* step)
{
Ndb* pNdb = GETNDB(step);
@@ -1732,10 +1874,20 @@
CHECK(res.waitClusterNoStart() == 0);
CHECK(res.startAll() == 0);
NDB_TICKS now = NdbTick_CurrentMillisecond();
+ /**
+ * running transaction while cluster is down...
+ * causes *lots* of printouts...redirect to /dev/null
+ * so that log files doe't get megabytes
+ */
+ NullOutputStream null;
+ OutputStream * save[1];
+ save[0] = g_err.m_out;
+ g_err.m_out = &null;
do
{
hugoTrans.scanUpdateRecords(pNdb, 0);
} while (NdbTick_CurrentMillisecond() < (now + 30000));
+ g_err.m_out = save[0];
CHECK(res.waitClusterStarted() == 0);
hugoTrans.clearTable(pNdb);
@@ -1999,9 +2151,20 @@
int val2[] = { DumpStateOrd::CmvmiSetRestartOnErrorInsert, 1 };
res.dumpStateAllNodes(val2, 2);
+ Bitmask<256/32> mask;
for (Uint32 i = 0; i<(nodeCount / 2); i++)
{
- res.insertErrorInNode(nodes[(nodeCount / 2) - (i + 1)], 7218);
+ int node = nodes[(nodeCount / 2) - (i + 1)];
+ mask.set(node);
+ res.insertErrorInNode(node, 7218);
+ }
+
+ for (Uint32 i = 0; i<nodeCount; i++)
+ {
+ int node = nodes[i];
+ if (mask.get(node))
+ continue;
+ res.insertErrorInNode(node, 7220);
}
int lcp = 7099;
@@ -2263,6 +2426,36 @@
STEP(runSR_DD_2);
FINALIZER(runClearTable);
}
+TESTCASE("SR_DD_3", "")
+{
+ TC_PROPERTY("ALL", 1);
+ INITIALIZER(runWaitStarted);
+ STEP(runStopper);
+ STEP(runSR_DD_3);
+ FINALIZER(runClearTable);
+}
+TESTCASE("SR_DD_3b", "")
+{
+ INITIALIZER(runWaitStarted);
+ STEP(runSR_DD_3);
+ FINALIZER(runClearTable);
+}
+TESTCASE("SR_DD_3_LCP", "")
+{
+ TC_PROPERTY("ALL", 1);
+ TC_PROPERTY("LCP", 1);
+ INITIALIZER(runWaitStarted);
+ STEP(runStopper);
+ STEP(runSR_DD_3);
+ FINALIZER(runClearTable);
+}
+TESTCASE("SR_DD_3b_LCP", "")
+{
+ TC_PROPERTY("LCP", 1);
+ INITIALIZER(runWaitStarted);
+ STEP(runSR_DD_3);
+ FINALIZER(runClearTable);
+}
TESTCASE("Bug29167", "")
{
INITIALIZER(runWaitStarted);
=== modified file 'storage/ndb/test/run-test/Makefile.am'
--- a/storage/ndb/test/run-test/Makefile.am 2009-05-27 15:21:45 +0000
+++ b/storage/ndb/test/run-test/Makefile.am 2009-09-15 20:02:22 +0000
@@ -25,7 +25,8 @@
test_DATA=daily-basic-tests.txt daily-devel-tests.txt 16node-tests.txt \
conf-ndbmaster.cnf \
conf-fimafeng08.cnf conf-dl145a.cnf test-tests.txt conf-test.cnf \
- conf-upgrade.cnf upgrade-tests.txt
+ conf-upgrade.cnf upgrade-tests.txt \
+ conf-ndb07.cnf
test_SCRIPTS=atrt-analyze-result.sh atrt-gather-result.sh atrt-setup.sh \
autotest-run.sh atrt-backtrace.sh
=== added file 'storage/ndb/test/run-test/conf-ndb07.cnf'
--- a/storage/ndb/test/run-test/conf-ndb07.cnf 1970-01-01 00:00:00 +0000
+++ b/storage/ndb/test/run-test/conf-ndb07.cnf 2009-09-15 19:04:57 +0000
@@ -0,0 +1,41 @@
+[atrt]
+basedir = CHOOSE_dir
+baseport = 14000
+clusters = .4node
+fix-nodeid=1
+mt = 1
+
+[ndb_mgmd]
+
+[mysqld]
+skip-innodb
+loose-skip-bdb
+skip-grant-tables
+socket=mysql.sock
+
+[client]
+protocol=tcp
+
+[cluster_config.4node]
+ndb_mgmd = CHOOSE_host1
+ndbd = CHOOSE_host2,CHOOSE_host3,CHOOSE_host4,CHOOSE_host5
+ndbapi= CHOOSE_host1,CHOOSE_host1,CHOOSE_host1
+mysqld = CHOOSE_host1,CHOOSE_host6
+
+NoOfReplicas = 2
+IndexMemory = 100M
+DataMemory = 500M
+BackupMemory = 64M
+MaxNoOfConcurrentScans = 100
+MaxNoOfSavedMessages= 1000
+NoOfFragmentLogFiles = 8
+FragmentLogFileSize = 64M
+ODirect=1
+
+SharedGlobalMemory=256M
+DiskPageBufferMemory=256M
+FileSystemPath=/data0/autotest
+FileSystemPathDataFiles=/data1/autotest
+FileSystemPathUndoFiles=/data2/autotest
+InitialLogfileGroup=undo_buffer_size=64M;undofile01.dat:256M;undofile02.dat:256M
+InitialTablespace=datafile01.dat:256M;datafile02.dat:256M
=== modified file 'storage/ndb/test/run-test/daily-basic-tests.txt'
--- a/storage/ndb/test/run-test/daily-basic-tests.txt 2009-09-01 11:42:04 +0000
+++ b/storage/ndb/test/run-test/daily-basic-tests.txt 2009-09-15 10:13:15 +0000
@@ -597,6 +597,22 @@
cmd: testNodeRestart
args: -n Bug32160 T1
+max-time: 2500
+cmd: testNodeRestart
+args: -n MixedPkRead T6 T13
+
+max-time: 2500
+cmd: testIndex
+args: -n NFNR1 T6 T13
+
+max-time: 2500
+cmd: testIndex
+args: -n NFNR1_O T6 T13
+
+max-time: 2500
+cmd: testIndex
+args: -n NFNR2_O T6 T13
+
#
# DICT TESTS
max-time: 500
@@ -937,6 +953,31 @@
cmd: test_event_merge
args: --no-implicit-nulls --no-multiops
+#
+max-time: 3600
+cmd: test_event
+args: -n EventOperationApplier -l 2
+
+#
+max-time: 3600
+cmd: test_event
+args: -n EventOperationApplier_NR -l 2
+
+#
+max-time: 3600
+cmd: test_event
+args: -n MergeEventOperationApplier_NR -l 2
+
+#
+max-time: 2500
+cmd: test_event
+args: -n Multi
+
+#
+max-time: 3600
+cmd: test_event
+args: -n CreateDropNR -l 1
+
max-time: 600
cmd: testBasic
args: -n PkRead T1
@@ -1120,6 +1161,38 @@
max-time: 1500
cmd: testSystemRestart
+args: -n SR_DD_3 D1
+
+max-time: 1500
+cmd: testSystemRestart
+args: -n SR_DD_3b D1
+
+max-time: 1500
+cmd: testSystemRestart
+args: -n SR_DD_3 D2
+
+max-time: 1500
+cmd: testSystemRestart
+args: -n SR_DD_3b D2
+
+max-time: 1500
+cmd: testSystemRestart
+args: -n SR_DD_3_LCP D1
+
+max-time: 1500
+cmd: testSystemRestart
+args: -n SR_DD_3b_LCP D1
+
+max-time: 1500
+cmd: testSystemRestart
+args: -n SR_DD_3_LCP D2
+
+max-time: 1500
+cmd: testSystemRestart
+args: -n SR_DD_3b_LCP D2
+
+max-time: 1500
+cmd: testSystemRestart
args: -n Bug41915 D2
max-time: 300
=== modified file 'storage/ndb/test/run-test/daily-devel-tests.txt'
--- a/storage/ndb/test/run-test/daily-devel-tests.txt 2009-09-01 11:42:04 +0000
+++ b/storage/ndb/test/run-test/daily-devel-tests.txt 2009-09-15 10:13:15 +0000
@@ -59,10 +59,6 @@
#
max-time: 2500
cmd: testNodeRestart
-args: -n MixedPkRead T6 T13
-
-max-time: 2500
-cmd: testNodeRestart
args: -l 1 -n MixedPkReadPkUpdate
max-time: 2500
@@ -100,10 +96,6 @@
#
max-time: 2500
cmd: testIndex
-args: -n NFNR1 T6 T13
-
-max-time: 2500
-cmd: testIndex
args: -n NFNR2 T6 T13
max-time: 2500
@@ -116,14 +108,6 @@
max-time: 2500
cmd: testIndex
-args: -n NFNR1_O T6 T13
-
-max-time: 2500
-cmd: testIndex
-args: -n NFNR2_O T6 T13
-
-max-time: 2500
-cmd: testIndex
args: -n NFNR3_O T6 T13
max-time: 2500
@@ -134,35 +118,6 @@
cmd: testIndex
args: -l 2 -n SR1_O T6 T13
-#
-max-time: 3600
-cmd: test_event
-args: -n EventOperationApplier -l 2
-
-#
-max-time: 3600
-cmd: test_event
-args: -n EventOperationApplier_NR -l 2
-
-#
-max-time: 3600
-cmd: test_event
-args: -n MergeEventOperationApplier_NR -l 2
-
-#
-max-time: 2500
-cmd: test_event
-args: -n Multi
-
-max-time: 600
-cmd: test_event
-args: -l 1 -n SubscribeNR T1
-
-#
-max-time: 3600
-cmd: test_event
-args: -n CreateDropNR -l 1
-
# dict trans
max-time: 1800
cmd: testDict
=== modified file 'storage/ndb/test/src/NDBT_Test.cpp'
--- a/storage/ndb/test/src/NDBT_Test.cpp 2009-07-03 15:08:14 +0000
+++ b/storage/ndb/test/src/NDBT_Test.cpp 2009-09-08 15:12:34 +0000
@@ -545,7 +545,7 @@
BaseString::snprintf(buf, sizeof(buf), "step_%d", stepNo);
NdbThread* pThread = NdbThread_Create(runStep_C,
(void**)pStep,
- 65535,
+ 0, // default stack size
buf,
NDB_THREAD_PRIO_LOW);
threads.push_back(pThread);
=== modified file 'storage/ndb/test/src/UtilTransactions.cpp'
--- a/storage/ndb/test/src/UtilTransactions.cpp 2009-05-27 15:21:45 +0000
+++ b/storage/ndb/test/src/UtilTransactions.cpp 2009-09-15 16:59:09 +0000
@@ -780,6 +780,9 @@
if (pTrans1 == NULL) {
const NdbError err = pNdb->getNdbError();
+ if (err.code == 4006)
+ goto close_all;
+
if (err.status == NdbError::TemporaryError){
ERR(err);
NdbSleep_MilliSleep(50);
=== modified file 'storage/ndb/tools/desc.cpp'
--- a/storage/ndb/tools/desc.cpp 2009-05-27 15:21:45 +0000
+++ b/storage/ndb/tools/desc.cpp 2009-09-04 11:33:38 +0000
@@ -303,6 +303,9 @@
{ "Commit count", 0, NdbDictionary::Column::COMMIT_COUNT },
{ "Frag fixed memory", 0, NdbDictionary::Column::FRAGMENT_FIXED_MEMORY },
{ "Frag varsized memory", 0, NdbDictionary::Column::FRAGMENT_VARSIZED_MEMORY },
+ { "Extent_space", 0, NdbDictionary::Column::FRAGMENT_EXTENT_SPACE },
+ { "Free extent_space", 0, NdbDictionary::Column::FRAGMENT_FREE_EXTENT_SPACE },
+
{ 0, 0, 0 }
};
=== modified file 'storage/ndb/tools/restore/Restore.cpp'
--- a/storage/ndb/tools/restore/Restore.cpp 2009-08-18 13:21:50 +0000
+++ b/storage/ndb/tools/restore/Restore.cpp 2009-09-08 12:10:53 +0000
@@ -1956,7 +1956,9 @@
NdbRecAttr tmprec(0);
tmprec.setup(desc.m_column, 0);
- tmprec.receive_data((Uint32*)data.void_value, data.size);
+ Uint32 length = (desc.size)/8 * (desc.arraySize);
+ tmprec.receive_data((Uint32*)data.void_value, length);
+
ndbrecattr_print_formatted(ndbout, tmprec, g_ndbrecord_print_format);
return ndbout;
Attachment: [text/bzr-bundle] bzr/jonas@mysql.com-20090916092353-fc6y59anmw94e3ub.bundle
| Thread |
|---|
| • bzr push into mysql-5.1-telco-7.0 branch (msabaratnam:2983 to 3012) | Maitrayi Sabaratnam | 16 Sep |