From: Frazer Clement Date: June 16 2011 12:44pm Subject: bzr commit into mysql-5.1-telco-7.1 branch (frazer.clement:4244) List-Archive: http://lists.mysql.com/commits/139327 Message-Id: <201106161244.p5GCiHV8024217@acsmt358.oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit #At file:///home/frazer/bzr/mysql-5.1-telco-7.1/ based on revid:magnus.blaudd@stripped 4244 Frazer Clement 2011-06-16 [merge] Merge 7.0->7.1 added: mysql-test/suite/ndb_rpl/ndb_master-slave_2ch_end.inc modified: mysql-test/suite/ndb_rpl/ndb_master-slave_2ch.inc mysql-test/suite/ndb_rpl/r/ndb_rpl_circular_2ch.result mysql-test/suite/ndb_rpl/t/ndb_rpl_circular_2ch.cnf mysql-test/suite/ndb_rpl/t/ndb_rpl_circular_2ch.test storage/ndb/src/kernel/blocks/dbspj/DbspjMain.cpp storage/ndb/src/ndbapi/NdbQueryBuilder.cpp storage/ndb/src/ndbapi/NdbQueryBuilder.hpp storage/ndb/src/ndbapi/NdbQueryBuilderImpl.hpp storage/ndb/src/ndbapi/NdbQueryOperation.cpp storage/ndb/test/include/HugoQueryBuilder.hpp storage/ndb/test/src/HugoQueryBuilder.cpp === modified file 'mysql-test/suite/ndb_rpl/ndb_master-slave_2ch.inc' --- a/mysql-test/suite/ndb_rpl/ndb_master-slave_2ch.inc 2011-05-13 07:40:50 +0000 +++ b/mysql-test/suite/ndb_rpl/ndb_master-slave_2ch.inc 2011-06-16 12:36:28 +0000 @@ -3,10 +3,11 @@ # Set up circular cluster replication where each # cluster has two mysqlds and replication directions are # following: +# 1 2 # master ---> slave # / \ # cluster A cluster B -# \ / +# \ 3 4 / # master1 <--- slave1 # # ==== Usage ==== @@ -26,8 +27,9 @@ # $rpl_skip_start_slave, $rpl_debug, $slave_timeout # See include/master-slave.inc +#--let $rpl_debug= 1 --let $rpl_topology= 1->2,4->3 ---let $rpl_skip_check_server_ids= 1 +--let $rpl_skip_start_slave= 1 --source include/rpl_init.inc # Make connections to mysqlds @@ -37,7 +39,7 @@ --source include/rpl_connect.inc --let $rpl_connection_name= master1 ---let $rpl_server_number= 1 +--let $rpl_server_number= 3 --source include/rpl_connect.inc --let $rpl_connection_name= slave @@ -45,9 +47,23 @@ --source include/rpl_connect.inc --let $rpl_connection_name= slave1 ---let $rpl_server_number= 2 +--let $rpl_server_number= 4 --source include/rpl_connect.inc +# Now add IGNORE_SERVER_IDS +--disable_query_log +connection master; +CHANGE MASTER TO IGNORE_SERVER_IDS= (1,3); +connection master1; +CHANGE MASTER TO IGNORE_SERVER_IDS= (1,3); +connection slave; +CHANGE MASTER TO IGNORE_SERVER_IDS= (2,4); +connection slave1; +CHANGE MASTER TO IGNORE_SERVER_IDS= (2,4); + +# Now start replication +--source include/rpl_start_slaves.inc +--enable_query_log # Check that all mysqld are compiled with ndb support --let $_rpl_server= 4 === added file 'mysql-test/suite/ndb_rpl/ndb_master-slave_2ch_end.inc' --- a/mysql-test/suite/ndb_rpl/ndb_master-slave_2ch_end.inc 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/ndb_rpl/ndb_master-slave_2ch_end.inc 2011-06-16 12:36:28 +0000 @@ -0,0 +1,28 @@ +# ==== Purpose ==== +# +# Clean up replication configuration after using a 2ch +# setup. +# We need to explicitly reset the IGNORE_SERVER_IDS parameters +# on all Servers to avoid testcase check errors. +# +# ==== Usage ==== +# +# [--let $rpl_debug= 1] +# --source suite/ndb_rpl/ndb_master-slave_2ch_end.inc +# +# Parameters: +# $rpl_debug +# See include/master-slave.inc + +--source include/rpl_stop_slaves.inc +--connection master +CHANGE MASTER TO IGNORE_SERVER_IDS= (); +--connection master1 +CHANGE MASTER TO IGNORE_SERVER_IDS= (); +--connection slave +CHANGE MASTER TO IGNORE_SERVER_IDS= (); +--connection slave1 +CHANGE MASTER TO IGNORE_SERVER_IDS= (); +--source include/rpl_start_slaves.inc + +--source include/rpl_end.inc \ No newline at end of file === modified file 'mysql-test/suite/ndb_rpl/r/ndb_rpl_circular_2ch.result' --- a/mysql-test/suite/ndb_rpl/r/ndb_rpl_circular_2ch.result 2011-05-13 07:40:50 +0000 +++ b/mysql-test/suite/ndb_rpl/r/ndb_rpl_circular_2ch.result 2011-06-16 12:36:28 +0000 @@ -3,6 +3,7 @@ include/rpl_connect.inc [creating master include/rpl_connect.inc [creating master1] include/rpl_connect.inc [creating slave] include/rpl_connect.inc [creating slave1] +include/rpl_start_slaves.inc *** Check server_id of mysqld servers *** SHOW VARIABLES LIKE "server_id"; @@ -12,7 +13,7 @@ SET auto_increment_offset = 1; SET auto_increment_increment = 2; SHOW VARIABLES LIKE "server_id"; Variable_name Value -server_id 1 +server_id 3 SET auto_increment_offset = 1; SET auto_increment_increment = 2; SHOW VARIABLES LIKE "server_id"; @@ -22,7 +23,7 @@ SET auto_increment_offset = 2; SET auto_increment_increment = 2; SHOW VARIABLES LIKE "server_id"; Variable_name Value -server_id 2 +server_id 4 SET auto_increment_offset = 2; SET auto_increment_increment = 2; @@ -48,4 +49,10 @@ Check data on both clusters include/diff_tables.inc [master:t1, slave:t1] DROP TABLE IF EXISTS t1; +include/rpl_stop_slaves.inc +CHANGE MASTER TO IGNORE_SERVER_IDS= (); +CHANGE MASTER TO IGNORE_SERVER_IDS= (); +CHANGE MASTER TO IGNORE_SERVER_IDS= (); +CHANGE MASTER TO IGNORE_SERVER_IDS= (); +include/rpl_start_slaves.inc include/rpl_end.inc === modified file 'mysql-test/suite/ndb_rpl/t/ndb_rpl_circular_2ch.cnf' --- a/mysql-test/suite/ndb_rpl/t/ndb_rpl_circular_2ch.cnf 2011-05-13 07:40:50 +0000 +++ b/mysql-test/suite/ndb_rpl/t/ndb_rpl_circular_2ch.cnf 2011-06-16 12:36:28 +0000 @@ -2,34 +2,39 @@ # 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 +# All MySQLDs log-apply-status +# Infinite loops broken in the test using Ignore_server_ids mechanism [mysqld.1.1] server-id= 1 log-bin +ndb_connectstring= @mysql_cluster.1.ndb_connectstring log-slave-updates +skip-slave-start [mysqld.2.1] -server-id= 1 +server-id= 3 log-bin +ndb_connectstring= @mysql_cluster.1.ndb_connectstring log-slave-updates +skip-slave-start [mysqld.1.slave] server-id= 2 log-bin +ndb_connectstring= @mysql_cluster.slave.ndb_connectstring log-slave-updates skip-slave-start [mysqld.2.slave] -server-id= 2 +server-id= 4 log-bin ndb_connectstring= @mysql_cluster.slave.ndb_connectstring +log-slave-updates +skip-slave-start [ENV] - -SLAVE_MYPORT1= @mysqld.2.slave.port -SLAVE_MYSOCK1= @mysqld.2.slave.socket +SERVER_MYPORT_1= @mysqld.1.1.port +SERVER_MYPORT_2= @mysqld.1.slave.port +SERVER_MYPORT_3= @mysqld.2.1.port +SERVER_MYPORT_4= @mysqld.2.slave.port === modified file 'mysql-test/suite/ndb_rpl/t/ndb_rpl_circular_2ch.test' --- a/mysql-test/suite/ndb_rpl/t/ndb_rpl_circular_2ch.test 2011-05-13 07:40:50 +0000 +++ b/mysql-test/suite/ndb_rpl/t/ndb_rpl_circular_2ch.test 2011-06-16 12:36:28 +0000 @@ -163,5 +163,8 @@ DROP TABLE IF EXISTS t1; --source include/wait_for_query_to_fail.inc --echo +--connection master + # End of test 5.1 ---source include/rpl_end.inc +--source suite/ndb_rpl/ndb_master-slave_2ch_end.inc + === modified file 'storage/ndb/src/kernel/blocks/dbspj/DbspjMain.cpp' --- a/storage/ndb/src/kernel/blocks/dbspj/DbspjMain.cpp 2011-06-07 12:08:29 +0000 +++ b/storage/ndb/src/kernel/blocks/dbspj/DbspjMain.cpp 2011-06-16 08:37:10 +0000 @@ -4418,7 +4418,7 @@ Dbspj::scanIndex_build(Build_context& ct if (requestPtr.p->m_bits & Request::RT_REPEAT_SCAN_RESULT && !treeNodePtr.p->m_ancestors.contains(ctx.m_scans)) { - nodePtr.p->m_bits |= TreeNode::T_SCAN_REPEATABLE; + treeNodePtr.p->m_bits |= TreeNode::T_SCAN_REPEATABLE; } ctx.m_scan_cnt++; @@ -5025,6 +5025,8 @@ Dbspj::scanIndex_parent_batch_repeat(Sig DEBUG("scanIndex_parent_batch_repeat(), m_node_no: " << treeNodePtr.p->m_node_no << ", m_batch_chunks: " << data.m_batch_chunks); + + ndbassert(treeNodePtr.p->m_bits & TreeNode::T_SCAN_REPEATABLE); /** * Register index-scans to be restarted if we didn't get all === modified file 'storage/ndb/src/ndbapi/NdbQueryBuilder.cpp' --- a/storage/ndb/src/ndbapi/NdbQueryBuilder.cpp 2011-05-17 12:47:21 +0000 +++ b/storage/ndb/src/ndbapi/NdbQueryBuilder.cpp 2011-06-16 09:32:43 +0000 @@ -23,7 +23,6 @@ #include #include "signaldata/QueryTree.hpp" -#include #include "NdbDictionaryImpl.hpp" #include #include "AttributeHeader.hpp" @@ -575,16 +574,15 @@ NdbQueryIndexScanOperationDef::~NdbQuery NdbQueryOperationDefImpl::~NdbQueryOperationDefImpl() { + // Unlink any parent and child refering this object if (m_parent != NULL) { m_parent->removeChild(this); } - // Delete children recursively also. for (Uint32 i = 0; im_parent == this); m_children[i]->m_parent = NULL; - delete m_children[i]; } } @@ -686,9 +684,9 @@ NdbQueryOperationDef::getIndex() const * Implementation of NdbQueryBuilder factory ******************************************/ // Static method. -NdbQueryBuilder* NdbQueryBuilder::create(Ndb& ndb) +NdbQueryBuilder* NdbQueryBuilder::create() { - NdbQueryBuilderImpl* const impl = new NdbQueryBuilderImpl(ndb); + NdbQueryBuilderImpl* const impl = new NdbQueryBuilderImpl(); if (likely (impl != NULL)) { if (likely(impl->getNdbError().code == 0)) @@ -1045,9 +1043,9 @@ NdbQueryBuilder::prepare() // The (hidden) Impl of NdbQueryBuilder //////////////////////////////////////// -NdbQueryBuilderImpl::NdbQueryBuilderImpl(Ndb& ndb) +NdbQueryBuilderImpl::NdbQueryBuilderImpl() : m_interface(*this), - m_ndb(ndb), m_error(), + m_error(), m_operations(), m_operands(), m_paramCnt(0), @@ -1063,12 +1061,13 @@ NdbQueryBuilderImpl::NdbQueryBuilderImpl NdbQueryBuilderImpl::~NdbQueryBuilderImpl() { // Delete all operand and operator in Vector's - if (m_operations.size() > 0) + for (Uint32 i=0; i 0) + for (Uint32 i=0; igetQueryBuilder(); + NdbQueryBuilder* qb = myBuilder; const NdbQueryOperand* managerKey[] = // Manager is indexed om {"dept_no", "emp_no"} { qb->constValue("d005"), // dept_no = "d005" === modified file 'storage/ndb/src/ndbapi/NdbQueryBuilder.hpp' --- a/storage/ndb/src/ndbapi/NdbQueryBuilder.hpp 2011-04-06 14:16:13 +0000 +++ b/storage/ndb/src/ndbapi/NdbQueryBuilder.hpp 2011-06-16 09:32:43 +0000 @@ -24,7 +24,6 @@ // skip includes...and require them to be included first // BUH! -class Ndb; class NdbQueryDef; class NdbQueryDefImpl; class NdbQueryBuilderImpl; @@ -358,9 +357,8 @@ private: * build phase. * * - The NdbQueryDef produced by the ::prepare() method has a lifetime - * determined by the Ndb object, or until it is explicit released by - * NdbQueryDef::release() - * + * until it is explicit released by NdbQueryDef::release() + * */ class NdbQueryBuilder { @@ -380,7 +378,7 @@ public: * Allocate an instance. * @return New instance, or NULL if allocation failed. */ - static NdbQueryBuilder* create(Ndb& ndb); + static NdbQueryBuilder* create(); /** * Release this object and any resources held by it. @@ -478,8 +476,7 @@ private: * NdbQueryDef represents a ::prepare()'d object from NdbQueryBuilder. * * The NdbQueryDef is reusable in the sense that it may be executed multiple - * times. Its lifetime is defined by the Ndb object which it was created with, - * or it may be explicitely released() when no longer required. + * times. It is valid until it is explicitely released(). * * The NdbQueryDef *must* be keept alive until the last thread * which executing a query based on this NdbQueryDef has completed execution === modified file 'storage/ndb/src/ndbapi/NdbQueryBuilderImpl.hpp' --- a/storage/ndb/src/ndbapi/NdbQueryBuilderImpl.hpp 2011-05-05 11:06:08 +0000 +++ b/storage/ndb/src/ndbapi/NdbQueryBuilderImpl.hpp 2011-06-16 09:32:43 +0000 @@ -631,7 +631,7 @@ class NdbQueryBuilderImpl public: ~NdbQueryBuilderImpl(); - explicit NdbQueryBuilderImpl(Ndb& ndb); + explicit NdbQueryBuilderImpl(); const NdbQueryDefImpl* prepare(); @@ -665,7 +665,6 @@ private: bool contains(const NdbQueryOperationDefImpl*); NdbQueryBuilder m_interface; - Ndb& m_ndb; NdbError m_error; Vector m_operations; === modified file 'storage/ndb/src/ndbapi/NdbQueryOperation.cpp' --- a/storage/ndb/src/ndbapi/NdbQueryOperation.cpp 2011-05-26 14:44:59 +0000 +++ b/storage/ndb/src/ndbapi/NdbQueryOperation.cpp 2011-06-16 09:32:43 +0000 @@ -2895,7 +2895,6 @@ NdbQueryImpl::closeTcCursor(bool forceSe assert (m_queryDef.isScanQuery()); NdbImpl* const ndb = m_transaction.getNdb()->theImpl; - NdbImpl* const impl = ndb; const Uint32 timeout = ndb->get_waitfor_timeout(); const Uint32 nodeId = m_transaction.getConnectedNodeId(); const Uint32 seq = m_transaction.theNodeSequence; @@ -2905,7 +2904,7 @@ NdbQueryImpl::closeTcCursor(bool forceSe */ PollGuard poll_guard(*ndb); - if (unlikely(impl->getNodeSequence(nodeId) != seq)) + if (unlikely(ndb->getNodeSequence(nodeId) != seq)) { setErrorCode(Err_NodeFailCausedAbort); return -1; // Transporter disconnected and reconnected, no need to close @@ -2917,7 +2916,7 @@ NdbQueryImpl::closeTcCursor(bool forceSe const FetchResult result = static_cast (poll_guard.wait_scan(3*timeout, nodeId, forceSend)); - if (unlikely(impl->getNodeSequence(nodeId) != seq)) + if (unlikely(ndb->getNodeSequence(nodeId) != seq)) setFetchTerminated(Err_NodeFailCausedAbort,false); else if (unlikely(result != FetchResult_ok)) { @@ -2952,7 +2951,7 @@ NdbQueryImpl::closeTcCursor(bool forceSe const FetchResult result = static_cast (poll_guard.wait_scan(3*timeout, nodeId, forceSend)); - if (unlikely(impl->getNodeSequence(nodeId) != seq)) + if (unlikely(ndb->getNodeSequence(nodeId) != seq)) setFetchTerminated(Err_NodeFailCausedAbort,false); else if (unlikely(result != FetchResult_ok)) { === modified file 'storage/ndb/test/include/HugoQueryBuilder.hpp' --- a/storage/ndb/test/include/HugoQueryBuilder.hpp 2011-04-06 14:16:13 +0000 +++ b/storage/ndb/test/include/HugoQueryBuilder.hpp 2011-06-16 09:32:43 +0000 @@ -1,6 +1,5 @@ /* - Copyright (C) 2003 MySQL AB - All rights reserved. Use is subject to license terms. + Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -105,7 +104,7 @@ public: OptionMask getOptionMask() const { return m_options;} void setOptionMask(OptionMask om) { m_options = om;} - const NdbQueryDef * createQuery(Ndb*, bool takeOwnership = false); + const NdbQueryDef * createQuery(bool takeOwnership = false); private: struct TableDef === modified file 'storage/ndb/test/src/HugoQueryBuilder.cpp' --- a/storage/ndb/test/src/HugoQueryBuilder.cpp 2011-04-06 14:16:13 +0000 +++ b/storage/ndb/test/src/HugoQueryBuilder.cpp 2011-06-16 09:32:43 +0000 @@ -1,6 +1,5 @@ /* - Copyright (C) 2003 MySQL AB - All rights reserved. Use is subject to license terms. + Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -563,9 +562,9 @@ loop: } const NdbQueryDef * -HugoQueryBuilder::createQuery(Ndb* pNdb, bool takeOwnership) +HugoQueryBuilder::createQuery(bool takeOwnership) { - NdbQueryBuilder* const builder = NdbQueryBuilder::create(*pNdb); + NdbQueryBuilder* const builder = NdbQueryBuilder::create(); if (builder == NULL) { ndbout << "Failed to create NdbQueryBuilder." << endl; No bundle (reason: revision is a merge (you can force generation of a bundle with env var BZR_FORCE_BUNDLE=1)).