From: Frazer Clement Date: February 17 2012 12:15pm Subject: bzr push into mysql-5.1-telco-7.1 branch (frazer.clement:4451 to 4452) List-Archive: http://lists.mysql.com/commits/142943 Message-Id: <201202171215.q1HCFLBg022867@acsmt356.oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit 4452 Frazer Clement 2012-02-17 Test commit for Blob reorg added: mysql-test/suite/ndb/include/ndb_desc_partition.inc modified: mysql-test/suite/ndb/r/ndb_add_partition.result mysql-test/suite/ndb/t/ndb_add_partition.test storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp 4451 Frazer Clement 2012-01-31 [merge] Merge 7.0->7.1 modified: sql/ndb_conflict.cc sql/ndb_conflict.h === added file 'mysql-test/suite/ndb/include/ndb_desc_partition.inc' --- a/mysql-test/suite/ndb/include/ndb_desc_partition.inc 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/ndb/include/ndb_desc_partition.inc 2012-02-17 12:14:18 +0000 @@ -0,0 +1,63 @@ +# +# ndb_desc_partition.inc +# +# Helper include to describe partitioning of table test.t3 and its +# two blob part tables for columns 1 + 2 +# Could be made generic for any table/database + blob columns +# +--disable_query_log +--disable_result_log +let $MYSQLD_DATADIR= `select @@datadir;`; +--exec $NDB_SHOW_TABLES > $MYSQLTEST_VARDIR/tmp/ndb_show_tables.txt + +create table outputrows (txt varchar(1000)); + +--eval load data local infile '$MYSQLTEST_VARDIR/tmp/ndb_show_tables.txt' into table outputrows columns terminated by '\n'; + +eval select @table_id:= trim(left(txt, INSTR(txt, ' '))) from outputrows where txt like '%UserTable%test%t3'; + +drop table outputrows; + + +--eval select @blob_1_table:= concat('NDB\\\\\$BLOB_', @table_id, '_1'); +--eval select @blob_2_table:= concat('NDB\\\\\$BLOB_', @table_id, '_2'); + +let $blob_1_table= query_get_value('select @blob_1_table as v',v,1); +let $blob_2_table= query_get_value('select @blob_2_table as v',v,1); + +#--echo $blob_1_table +#--echo $blob_2_table + +--exec $NDB_DESC -dtest t3 -p > $MYSQLTEST_VARDIR/tmp/ndb_desc.txt +create table outputrows (txt varchar(1000)); + +--eval load data local infile '$MYSQLTEST_VARDIR/tmp/ndb_desc.txt' into table outputrows columns terminated by '\n'; +--enable_result_log +select txt as T3_FragmentCount from outputrows where txt like 'FragmentCount%'; +--disable_result_log +drop table outputrows; + +--exec $NDB_DESC -dtest $blob_1_table -p > $MYSQLTEST_VARDIR/tmp/ndb_desc.txt +create table outputrows (txt varchar(1000)); + +--eval load data local infile '$MYSQLTEST_VARDIR/tmp/ndb_desc.txt' into table outputrows columns terminated by '\n'; +--enable_result_log +select txt as BLOB1_FragmentCount from outputrows where txt like 'FragmentCount%'; +--disable_result_log +drop table outputrows; + +--exec $NDB_DESC -dtest $blob_2_table -p > $MYSQLTEST_VARDIR/tmp/ndb_desc.txt +create table outputrows (txt varchar(1000)); + +--eval load data local infile '$MYSQLTEST_VARDIR/tmp/ndb_desc.txt' into table outputrows columns terminated by '\n'; +--enable_result_log +select txt as BLOB2_FragmentCount from outputrows where txt like 'FragmentCount%'; +--disable_result_log +drop table outputrows; + +#--exec $NDB_DESC -dtest t3 -p +#--exec $NDB_DESC -dtest $blob_1_table -p +#--exec $NDB_DESC -dtest $blob_2_table -p + +--enable_result_log +--enable_query_log \ No newline at end of file === modified file 'mysql-test/suite/ndb/r/ndb_add_partition.result' --- a/mysql-test/suite/ndb/r/ndb_add_partition.result 2011-05-12 11:31:21 +0000 +++ b/mysql-test/suite/ndb/r/ndb_add_partition.result 2012-02-17 12:14:18 +0000 @@ -24,6 +24,12 @@ ENGINE = NDB STORAGE DISK TABLESPACE ts1 partition by key(a); +CREATE TABLE t3 (a int unsigned not null, +b text not null, +c text not null, +primary key(a)) +ENGINE=NDB +partition by key(a); INSERT INTO t1 VALUES (1,1,1),(2,2,2),(3,3,3),(4,4,4),(5,5,5), (6,6,6),(7,7,7),(8,8,8),(9,9,9),(10,10,10), @@ -45,13 +51,23 @@ INSERT INTO t1 VALUES (86,86,86),(87,87,87),(88,88,88),(89,89,89),(90,90,90), (91,91,91),(92,92,92),(93,93,93),(94,94,94),(95,95,95), (96,96,96),(97,97,97),(98,98,98),(99,99,99),(100,100,100); +T3_FragmentCount +FragmentCount: 2 +BLOB1_FragmentCount +FragmentCount: 2 +BLOB2_FragmentCount +FragmentCount: 2 insert into t2 select * from t1; +insert into t3 select a, repeat(a, 20000), repeat(a, 20000) from t1; select count(*) from t1; count(*) 100 select count(*) from t2; count(*) 100 +select count(*) from t3; +count(*) +100 select * from t1 where a < 20; a b c 1 1 1 @@ -142,22 +158,75 @@ a b c select * from t2 where b = 50; a b c 50 50 50 +select a, length(b), length(c) from t3 where a < 20; +a length(b) length(c) +1 20000 20000 +10 40000 40000 +11 40000 40000 +12 40000 40000 +13 40000 40000 +14 40000 40000 +15 40000 40000 +16 40000 40000 +17 40000 40000 +18 40000 40000 +19 40000 40000 +2 20000 20000 +3 20000 20000 +4 20000 20000 +5 20000 20000 +6 20000 20000 +7 20000 20000 +8 20000 20000 +9 20000 20000 +select a, length(b), length(c) from t3 where a = 20; +a length(b) length(c) +20 40000 40000 +select a, length(b), length(c) from t3 where a = 30; +a length(b) length(c) +30 40000 40000 +select a, length(b), length(c) from t3 where a = 40; +a length(b) length(c) +40 40000 40000 +select a, length(b), length(c) from t3 where a = 50; +a length(b) length(c) +50 40000 40000 alter online table t1 reorganize partition; alter online table t2 reorganize partition; +alter online table t3 reorganize partition; +T3_FragmentCount +FragmentCount: 2 +BLOB1_FragmentCount +FragmentCount: 2 +BLOB2_FragmentCount +FragmentCount: 2 partitions added to t1 t1_added 0 partitions added to t2 t2_added 0 +partitions added to t3 +t3_added +0 alter online table t1 add partition partitions 1; alter online table t2 add partition partitions 4; +alter online table t3 add partition partitions 4; +T3_FragmentCount +FragmentCount: 6 +BLOB1_FragmentCount +FragmentCount: 6 +BLOB2_FragmentCount +FragmentCount: 6 partitions added to t1 t1_added 1 partitions added to t2 t2_added 4 +partitions added to t3 +t3_added +4 alter online table t1 reorganize partition; ERROR HY000: REORGANIZE PARTITION without parameters can only be used on auto-partitioned tables using HASH PARTITIONs select count(*) from t1; @@ -166,6 +235,9 @@ count(*) select count(*) from t2; count(*) 100 +select count(*) from t3; +count(*) +100 select * from t1 where a < 20; a b c 1 1 1 @@ -256,14 +328,57 @@ a b c select * from t2 where b = 50; a b c 50 50 50 +select a, length(b), length(c) from t3 where a < 20; +a length(b) length(c) +1 20000 20000 +10 40000 40000 +11 40000 40000 +12 40000 40000 +13 40000 40000 +14 40000 40000 +15 40000 40000 +16 40000 40000 +17 40000 40000 +18 40000 40000 +19 40000 40000 +2 20000 20000 +3 20000 20000 +4 20000 20000 +5 20000 20000 +6 20000 20000 +7 20000 20000 +8 20000 20000 +9 20000 20000 +select a, length(b), length(c) from t3 where a = 20; +a length(b) length(c) +20 40000 40000 +select a, length(b), length(c) from t3 where a = 30; +a length(b) length(c) +30 40000 40000 +select a, length(b), length(c) from t3 where a = 40; +a length(b) length(c) +40 40000 40000 +select a, length(b), length(c) from t3 where a = 50; +a length(b) length(c) +50 40000 40000 alter online table t1 add partition partitions 2; alter online table t2 add partition partitions 1; +alter online table t3 add partition partitions 1; +T3_FragmentCount +FragmentCount: 7 +BLOB1_FragmentCount +FragmentCount: 7 +BLOB2_FragmentCount +FragmentCount: 7 partitions added to t1 t1_added 3 partitions added to t2 t2_added 5 +partitions added to t3 +t3_added +5 select count(*) from t1; count(*) 100 @@ -360,7 +475,40 @@ a b c select * from t2 where b = 50; a b c 50 50 50 -drop table t1,t2; +select a, length(b), length(c) from t3 where a < 20; +a length(b) length(c) +1 20000 20000 +10 40000 40000 +11 40000 40000 +12 40000 40000 +13 40000 40000 +14 40000 40000 +15 40000 40000 +16 40000 40000 +17 40000 40000 +18 40000 40000 +19 40000 40000 +2 20000 20000 +3 20000 20000 +4 20000 20000 +5 20000 20000 +6 20000 20000 +7 20000 20000 +8 20000 20000 +9 20000 20000 +select a, length(b), length(c) from t3 where a = 20; +a length(b) length(c) +20 40000 40000 +select a, length(b), length(c) from t3 where a = 30; +a length(b) length(c) +30 40000 40000 +select a, length(b), length(c) from t3 where a = 40; +a length(b) length(c) +40 40000 40000 +select a, length(b), length(c) from t3 where a = 50; +a length(b) length(c) +50 40000 40000 +drop table t1,t2,t3; alter tablespace ts1 drop datafile 'datafile.dat' engine = ndb; drop tablespace ts1 engine = ndb; drop logfile group lg1 engine = ndb; === modified file 'mysql-test/suite/ndb/t/ndb_add_partition.test' --- a/mysql-test/suite/ndb/t/ndb_add_partition.test 2011-05-12 11:31:21 +0000 +++ b/mysql-test/suite/ndb/t/ndb_add_partition.test 2012-02-17 12:14:18 +0000 @@ -33,10 +33,19 @@ STORAGE DISK TABLESPACE ts1 partition by key(a); +CREATE TABLE t3 (a int unsigned not null, + b text not null, + c text not null, + primary key(a)) +ENGINE=NDB +partition by key(a); + let $t1_part_count_start = query_get_value(select count(*) as Value from information_schema.partitions where table_schema = 'test' and table_name = 't1', Value, 1); let $t2_part_count_start = query_get_value(select count(*) as Value from information_schema.partitions where table_schema = 'test' and table_name = 't2', Value, 1); +let $t3_part_count_start = query_get_value(select count(*) as Value from information_schema.partitions where table_schema = 'test' and table_name = 't3', Value, 1); + INSERT INTO t1 VALUES (1,1,1),(2,2,2),(3,3,3),(4,4,4),(5,5,5), (6,6,6),(7,7,7),(8,8,8),(9,9,9),(10,10,10), @@ -59,9 +68,15 @@ INSERT INTO t1 VALUES (91,91,91),(92,92,92),(93,93,93),(94,94,94),(95,95,95), (96,96,96),(97,97,97),(98,98,98),(99,99,99),(100,100,100); +--source suite/ndb/include/ndb_desc_partition.inc + + insert into t2 select * from t1; + +insert into t3 select a, repeat(a, 20000), repeat(a, 20000) from t1; select count(*) from t1; select count(*) from t2; +select count(*) from t3; --sorted_result select * from t1 where a < 20; --sorted_result @@ -92,32 +107,57 @@ select * from t2 where b = 30; select * from t2 where b = 40; select * from t2 where b = 50; +--sorted_result +select a, length(b), length(c) from t3 where a < 20; +--sorted_result +select a, length(b), length(c) from t3 where a = 20; +--sorted_result +select a, length(b), length(c) from t3 where a = 30; +--sorted_result +select a, length(b), length(c) from t3 where a = 40; +--sorted_result +select a, length(b), length(c) from t3 where a = 50; + alter online table t1 reorganize partition; alter online table t2 reorganize partition; +alter online table t3 reorganize partition; let $t1_part_count_now = query_get_value(select count(*) as Value from information_schema.partitions where table_schema = 'test' and table_name = 't1', Value, 1); let $t2_part_count_now = query_get_value(select count(*) as Value from information_schema.partitions where table_schema = 'test' and table_name = 't2', Value, 1); +let $t3_part_count_now = query_get_value(select count(*) as Value from information_schema.partitions where table_schema = 'test' and table_name = 't3', Value, 1); + +--source suite/ndb/include/ndb_desc_partition.inc + --disable_query_log --echo partitions added to t1 eval select $t1_part_count_now - $t1_part_count_start as t1_added; --echo partitions added to t2 eval select $t2_part_count_now - $t2_part_count_start as t2_added; +--echo partitions added to t3 +eval select $t3_part_count_now - $t2_part_count_start as t3_added; --enable_query_log alter online table t1 add partition partitions 1; alter online table t2 add partition partitions 4; +alter online table t3 add partition partitions 4; let $t1_part_count_now = query_get_value(select count(*) as Value from information_schema.partitions where table_schema = 'test' and table_name = 't1', Value, 1); let $t2_part_count_now = query_get_value(select count(*) as Value from information_schema.partitions where table_schema = 'test' and table_name = 't2', Value, 1); +let $t3_part_count_now = query_get_value(select count(*) as Value from information_schema.partitions where table_schema = 'test' and table_name = 't3', Value, 1); + +--source suite/ndb/include/ndb_desc_partition.inc + --disable_query_log --echo partitions added to t1 eval select $t1_part_count_now - $t1_part_count_start as t1_added; --echo partitions added to t2 eval select $t2_part_count_now - $t2_part_count_start as t2_added; +--echo partitions added to t3 +eval select $t3_part_count_now - $t3_part_count_start as t3_added; --enable_query_log # reorganize partition not support if not default partitioning @@ -127,6 +167,8 @@ alter online table t1 reorganize partiti select count(*) from t1; select count(*) from t2; +select count(*) from t3; + --sorted_result select * from t1 where a < 20; --sorted_result @@ -157,18 +199,36 @@ select * from t2 where b = 30; select * from t2 where b = 40; select * from t2 where b = 50; +--sorted_result +select a, length(b), length(c) from t3 where a < 20; +--sorted_result +select a, length(b), length(c) from t3 where a = 20; +--sorted_result +select a, length(b), length(c) from t3 where a = 30; +--sorted_result +select a, length(b), length(c) from t3 where a = 40; +--sorted_result +select a, length(b), length(c) from t3 where a = 50; + alter online table t1 add partition partitions 2; alter online table t2 add partition partitions 1; +alter online table t3 add partition partitions 1; let $t1_part_count_now = query_get_value(select count(*) as Value from information_schema.partitions where table_schema = 'test' and table_name = 't1', Value, 1); let $t2_part_count_now = query_get_value(select count(*) as Value from information_schema.partitions where table_schema = 'test' and table_name = 't2', Value, 1); +let $t3_part_count_now = query_get_value(select count(*) as Value from information_schema.partitions where table_schema = 'test' and table_name = 't3', Value, 1); + +--source suite/ndb/include/ndb_desc_partition.inc + --disable_query_log --echo partitions added to t1 eval select $t1_part_count_now - $t1_part_count_start as t1_added; --echo partitions added to t2 eval select $t2_part_count_now - $t2_part_count_start as t2_added; +--echo partitions added to t3 +eval select $t3_part_count_now - $t3_part_count_start as t3_added; --enable_query_log select count(*) from t1; @@ -203,7 +263,18 @@ select * from t2 where b = 30; select * from t2 where b = 40; select * from t2 where b = 50; -drop table t1,t2; +--sorted_result +select a, length(b), length(c) from t3 where a < 20; +--sorted_result +select a, length(b), length(c) from t3 where a = 20; +--sorted_result +select a, length(b), length(c) from t3 where a = 30; +--sorted_result +select a, length(b), length(c) from t3 where a = 40; +--sorted_result +select a, length(b), length(c) from t3 where a = 50; + +drop table t1,t2,t3; alter tablespace ts1 drop datafile 'datafile.dat' engine = ndb; drop tablespace ts1 engine = ndb; drop logfile group lg1 engine = ndb; === modified file 'storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp' --- a/storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp 2011-11-10 14:23:53 +0000 +++ b/storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp 2012-02-17 12:14:18 +0000 @@ -3224,7 +3224,9 @@ int NdbDictionaryImpl::alterTableGlobal( if (ret != 0) m_error.code = 723; - if (ret == 0 && AlterTableReq::getNameFlag(changeMask) != 0) + if (ret == 0 && + ((AlterTableReq::getNameFlag(changeMask) != 0) || + (AlterTableReq::getAddFragFlag(changeMask) != 0))) { char db0[MAX_TAB_NAME_SIZE]; char db1[MAX_TAB_NAME_SIZE]; @@ -3252,9 +3254,12 @@ int NdbDictionaryImpl::alterTableGlobal( } bool schema_change = strcmp(db0, db1) != 0; - if (db_change || schema_change) + + bool frag_change = (impl.m_fragmentCount != old_impl.m_fragmentCount); + + if (db_change || schema_change || frag_change) { - if (renameBlobTables(old_impl, impl) != 0) + if (alterBlobTables(old_impl, impl) != 0) { DBUG_RETURN(-1); } @@ -3266,8 +3271,8 @@ int NdbDictionaryImpl::alterTableGlobal( } int -NdbDictionaryImpl::renameBlobTables(const NdbTableImpl & old_tab, - const NdbTableImpl & new_tab) +NdbDictionaryImpl::alterBlobTables(const NdbTableImpl & old_tab, + const NdbTableImpl & new_tab) { if (old_tab.m_noOfBlobs == 0) return 0; @@ -3277,6 +3282,9 @@ NdbDictionaryImpl::renameBlobTables(cons new_tab.getDbName(db, sizeof(db)); new_tab.getSchemaName(schema, sizeof(schema)); + Uint32 oldFragCount= old_tab.m_fragmentCount; + Uint32 newFragCount= new_tab.m_fragmentCount; + for (unsigned i = 0; i < old_tab.m_columns.size(); i++) { NdbColumnImpl & c = *old_tab.m_columns[i]; @@ -3292,13 +3300,43 @@ NdbDictionaryImpl::renameBlobTables(cons NdbDictionary::Table new_bt(bt); new_bt.m_impl.setDbSchema(db, schema); + if (oldFragCount != newFragCount) + { + if (bt.getFragmentType() == NdbDictionary::Object::HashMapPartition) + { + if (_bt->m_fragmentCount != oldFragCount) + { +#ifdef VM_TRACE + ndbout_c("Blob parts table %s doesn't have same fragcount" + "as old main table %s (BT : %u), (OT : %u)", + bt.getName(), + old_tab.m_facade->getName(), + _bt->m_fragmentCount, + oldFragCount); +#endif + } + /* We can only repartition HashMap partitioned parts tables */ + new_bt.m_impl.m_fragmentCount = newFragCount; + new_bt.m_impl.m_hash_map_id = new_tab.m_hash_map_id; + new_bt.m_impl.m_hash_map_version = new_tab.m_hash_map_version; + } +#ifdef VM_TRACE + else + { + ndbout_c("Blob parts table %s (%s) is not hashmap partitioned, type (%d)", + bt.getName(), + old_tab.m_facade->getName(), + bt.getFragmentType()); + } +#endif + } + Uint32 changeMask = 0; int ret = m_receiver.alterTable(m_ndb, bt.m_impl, new_bt.m_impl,changeMask); if (ret != 0) { return ret; } - assert(AlterTableReq::getNameFlag(changeMask) != 0); } return 0; } === modified file 'storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp' --- a/storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp 2011-07-04 16:30:34 +0000 +++ b/storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp 2012-02-17 12:14:18 +0000 @@ -843,7 +843,7 @@ public: int dropTable(const char * name); int dropTable(NdbTableImpl &); int dropBlobTables(NdbTableImpl &); - int renameBlobTables(const NdbTableImpl &old_impl, const NdbTableImpl &impl); + int alterBlobTables(const NdbTableImpl &old_impl, const NdbTableImpl &impl); int invalidateObject(NdbTableImpl &); int removeCachedObject(NdbTableImpl &); No bundle (reason: useless for push emails).