From: Ole John Aske Date: October 15 2010 12:28pm Subject: bzr commit into mysql-5.1-telco-7.1 branch (ole.john.aske:3880) Bug#57481 List-Archive: http://lists.mysql.com/commits/120835 X-Bug: 57481 Message-Id: <20101015122831.BFF1F21D@fimafeng09.norway.sun.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============5800459343045402441==" --===============5800459343045402441== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///net/fimafeng09/export/home/tmp/oleja/mysql/mysql-5.1-telco-7.1/ based on revid:jonas@stripped 3880 Ole John Aske 2010-10-15 Proposed patch for bug#57481 ha_ndbcluster::read_multi_range_first() should close any previous completed scan operations. MTR result file *not* included due to its size..... modified: mysql-test/suite/ndb/t/ndb_read_multi_range.test sql/ha_ndbcluster.cc === modified file 'mysql-test/suite/ndb/t/ndb_read_multi_range.test' --- a/mysql-test/suite/ndb/t/ndb_read_multi_range.test 2010-09-22 11:36:01 +0000 +++ b/mysql-test/suite/ndb/t/ndb_read_multi_range.test 2010-10-15 12:28:26 +0000 @@ -428,3 +428,52 @@ select * from t1 or (a = 'v') order by a asc, b asc; drop table t1, t2; + +######################## +# Check propper reinit of a mrr executed multiple time as part of a join. +# The mrr access is driven by a scan and executed as for every tuple +# in the scaned table. +# +# In certain queries the optimizer don't read the entire mrr result set +# before it fetch the next tuple from the scanned table. +# The next mrr operation would then still have an open scan which wasn't +# cleaned up as expected. This may cause all available NdbOperation, +# NdbTransaction or lock objects to be consumed before the operation +# could finish. +##################### + +create table t1 (pk int primary key, a int) engine=ndb; +create table t2 (pk int primary key, a int) engine=ndb; + +insert into t2 values + (0,0), (1,1), (2,2), (3,3), (4,4), + (5,5), (6,6), (7,7), (8,8), (9,9); + +## +# 10^4 cross product on t2 creates 10.000 rows: +# Insert volume has been tunes to insert only 3.000 +# of these as this is sufficient to produce an 'out of connection objects' +## +insert into t1 + select + t1.a + t2.a*10 + t3.a*100 + t4.a*1000, + (t1.a + t2.a*10 + t3.a*100 + t4.a*1000) / 1000 +from + t2 as t1, t2 as t2, t2 as t3, t2 as t4 +where (t1.a + t2.a*10 + t3.a*100 + t4.a*1000) < 3000; + + +# Execute a 'scan(t1) join mrr(t2)' +# - 'DISTINCT t1.pk' will cause optimizer to stop fetching mrr(t2) +# when the first matching 't2.a = t1.a' is found. +# - 'LEFT JOIN' is to ensure that 'Using join buffer' is *not* used +# +explain +SELECT DISTINCT STRAIGHT_JOIN t1.pk FROM + t1 LEFT JOIN t2 ON t2.a = t1.a AND t2.pk != 6; + +--sorted_result +SELECT DISTINCT STRAIGHT_JOIN t1.pk FROM + t1 LEFT JOIN t2 ON t2.a = t1.a AND t2.pk != 6; + +drop table t1, t2; === modified file 'sql/ha_ndbcluster.cc' --- a/sql/ha_ndbcluster.cc 2010-10-11 06:48:37 +0000 +++ b/sql/ha_ndbcluster.cc 2010-10-15 12:28:26 +0000 @@ -11648,6 +11648,7 @@ ha_ndbcluster::read_multi_range_first(KE const NdbOperation* op; Thd_ndb *thd_ndb= m_thd_ndb; NdbTransaction *trans= m_thd_ndb->trans; + int error; DBUG_ENTER("ha_ndbcluster::read_multi_range_first"); DBUG_PRINT("info", ("blob fields=%d read_set=0x%x", table_share->blob_fields, table->read_set->bitmap[0])); @@ -11669,6 +11670,14 @@ ha_ndbcluster::read_multi_range_first(KE sorted, buffer)); } + + /** + * There may still be an open m_multi_cursor from the previous mrr access on this handler. + * Close it now to free up resources for this NdbScanOperation. + */ + if (unlikely(error= close_scan())) + DBUG_RETURN(error); + thd_ndb->query_state|= NDB_QUERY_MULTI_READ_RANGE; m_disable_multi_read= FALSE; @@ -11704,8 +11713,8 @@ ha_ndbcluster::read_multi_range_first(KE */ DBUG_ASSERT(cur_index_type != UNDEFINED_INDEX); + DBUG_ASSERT(m_multi_cursor==NULL); - m_multi_cursor= 0; const NdbOperation* lastOp= trans ? trans->getLastDefinedOperation() : 0; NdbOperation::LockMode lm= (NdbOperation::LockMode)get_ndb_lock_type(m_lock.type, table->read_set); @@ -11713,7 +11722,6 @@ ha_ndbcluster::read_multi_range_first(KE const uchar *end_of_buffer= buffer->buffer_end; uint num_scan_ranges= 0; uint i; - int error; bool any_real_read= FALSE; if (m_read_before_write_removal_possible) --===============5800459343045402441== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/ole.john.aske@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: ole.john.aske@stripped\ # x4hqwwdvq2itz4yr # target_branch: file:///net/fimafeng09/export/home/tmp/oleja/mysql\ # /mysql-5.1-telco-7.1/ # testament_sha1: 0f349454d8a87032afda92a3288f908abfee7abf # timestamp: 2010-10-15 14:28:31 +0200 # base_revision_id: jonas@stripped # # Begin bundle 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 --===============5800459343045402441==--