List:Commits« Previous MessageNext Message »
From:Maitrayi Sabaratnam Date:September 16 2009 11:50am
Subject:bzr push into mysql-5.1-telco-7.0 branch (msabaratnam:2983 to 3012)
View as plain text  
 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 Sabaratnam16 Sep