From: Jonas Oreland Date: January 27 2011 1:23pm Subject: bzr commit into mysql-5.1-telco-7.0 branch (jonas:4144) Bug#59756 List-Archive: http://lists.mysql.com/commits/129762 X-Bug: 59756 Message-Id: <20110127132317.F03C2AB68D5@perch.localdomain> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============7780217013805072421==" --===============7780217013805072421== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///home/jonas/src/telco-7.0/ based on revid:jonas@stripped 4144 Jonas Oreland 2011-01-27 ndb - bug#59756 - Don't put table into global cache until schema trans has been successfully committed. Add interface to get ObjectId back from createTable() modified: mysql-test/suite/ndb/r/ndb_basic.result mysql-test/suite/ndb/t/ndb_basic.test sql/ha_ndbcluster.cc storage/ndb/include/ndbapi/NdbDictionary.hpp storage/ndb/src/ndbapi/NdbDictionary.cpp storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp === modified file 'mysql-test/suite/ndb/r/ndb_basic.result' --- a/mysql-test/suite/ndb/r/ndb_basic.result 2011-01-27 10:36:47 +0000 +++ b/mysql-test/suite/ndb/r/ndb_basic.result 2011-01-27 13:23:07 +0000 @@ -873,4 +873,16 @@ id parent_id 2 2 3 3 DROP TABLE child, parent; +CREATE TABLE t1 (a INT PRIMARY KEY, b TEXT) +ENGINE=ndb PARTITION BY KEY(a) PARTITIONS 24; +ERROR HY000: Can't create table 'test.t1' (errno: 140) +show warnings; +Level Code Message +Error 1296 Got error 1224 'Too many fragments' from NDB +Error 1005 Can't create table 'test.t1' (errno: 140) +CREATE TABLE t1 (a INT PRIMARY KEY, b TEXT) +ENGINE=ndb; +show warnings; +Level Code Message +drop table t1; End of 5.1 tests === modified file 'mysql-test/suite/ndb/t/ndb_basic.test' --- a/mysql-test/suite/ndb/t/ndb_basic.test 2011-01-27 10:36:47 +0000 +++ b/mysql-test/suite/ndb/t/ndb_basic.test 2011-01-27 13:23:07 +0000 @@ -785,4 +785,16 @@ SELECT * FROM child ORDER BY id; DROP TABLE child, parent; +# +# bug#59756 +# +--error 1005 +CREATE TABLE t1 (a INT PRIMARY KEY, b TEXT) +ENGINE=ndb PARTITION BY KEY(a) PARTITIONS 24; +show warnings; +CREATE TABLE t1 (a INT PRIMARY KEY, b TEXT) +ENGINE=ndb; +show warnings; +drop table t1; + --echo End of 5.1 tests === modified file 'sql/ha_ndbcluster.cc' --- a/sql/ha_ndbcluster.cc 2011-01-27 10:36:47 +0000 +++ b/sql/ha_ndbcluster.cc 2011-01-27 13:23:07 +0000 @@ -7674,6 +7674,7 @@ int ha_ndbcluster::create(const char *na bool ndb_sys_table= FALSE; partition_info *part_info; int result= 0; + NdbDictionary::ObjectId objId; DBUG_ENTER("ha_ndbcluster::create"); DBUG_PRINT("enter", ("name: %s", name)); @@ -7700,7 +7701,6 @@ int ha_ndbcluster::create(const char *na Ndb *ndb= get_ndb(thd); NDBDICT *dict= ndb->getDictionary(); - Ndb_table_guard ndbtab_g(dict); #ifndef NDB_WITHOUT_TABLESPACE_IN_FRM DBUG_PRINT("info", ("Tablespace %s,%s", form->s->tablespace, create_info->tablespace)); @@ -7754,6 +7754,7 @@ int ha_ndbcluster::create(const char *na if (is_truncate) { + Ndb_table_guard ndbtab_g(dict); ndbtab_g.init(m_tabname); if (!(m_table= ndbtab_g.get_table())) ERR_RETURN(dict->getNdbError()); @@ -8055,7 +8056,7 @@ int ha_ndbcluster::create(const char *na } // Create the table in NDB - if (dict->createTable(tab) != 0) + if (dict->createTable(tab, &objId) != 0) { const NdbError err= dict->getNdbError(); set_ndb_err(thd, err); @@ -8063,26 +8064,14 @@ int ha_ndbcluster::create(const char *na goto abort; } - ndbtab_g.init(m_tabname); - // temporary set m_table during create - // reset at return - m_table= ndbtab_g.get_table(); - // TODO check also that we have the same frm... - if (!m_table) - { - /* purecov: begin deadcode */ - const NdbError err= dict->getNdbError(); - set_ndb_err(thd, err); - my_errno= ndb_to_mysql_error(&err); - goto abort; - /* purecov: end */ - } - DBUG_PRINT("info", ("Table %s/%s created successfully", m_dbname, m_tabname)); // Create secondary indexes + tab.assignObjId(objId); + m_table= &tab; my_errno= create_indexes(thd, ndb, form); + m_table= 0; if (!my_errno) { @@ -8118,6 +8107,13 @@ err_return: m_table= 0; ERR_RETURN(dict->getNdbError()); } + + /** + * createTable/index schema transaction OK + */ + Ndb_table_guard ndbtab_g(dict, m_tabname); + m_table= ndbtab_g.get_table(); + if (my_errno) { /* === modified file 'storage/ndb/include/ndbapi/NdbDictionary.hpp' --- a/storage/ndb/include/ndbapi/NdbDictionary.hpp 2010-10-13 09:33:02 +0000 +++ b/storage/ndb/include/ndbapi/NdbDictionary.hpp 2011-01-27 13:23:07 +0000 @@ -1041,6 +1041,14 @@ public: * passing NULL pointer will equal to bitmap with all columns set */ int checkColumns(const Uint32* bitmap, unsigned len_in_bytes) const; + + /** + * Set tableId,tableVersion on a table... + * this is a "work-around" since createIndex can't (currently) + * accept an ObjectId instead of table-object in createIndex + * this as way way too much stuff is pushed into NdbDictInterface + */ + void assignObjId(const ObjectId &); #endif // these 2 are not de-doxygenated @@ -2211,6 +2219,14 @@ public: int createTable(const Table &table); /** + * Create defined table given defined Table instance + * return ObjectId + * @param table Table to create + * @return 0 if successful otherwise -1. + */ + int createTable(const Table &table, ObjectId * objid); + + /** * Start table optimization given defined table object * @param t Object of table to optimize * @param Pre-allocated OptimizeTableHandle === modified file 'storage/ndb/src/ndbapi/NdbDictionary.cpp' --- a/storage/ndb/src/ndbapi/NdbDictionary.cpp 2010-09-30 14:27:18 +0000 +++ b/storage/ndb/src/ndbapi/NdbDictionary.cpp 2011-01-27 13:23:07 +0000 @@ -532,6 +532,7 @@ NdbDictionary::Table::addColumn(const Co { return -1; } + col->m_column_no = m_impl.m_columns.size() - 1; return 0; } @@ -976,6 +977,14 @@ NdbDictionary::Table::getPartitionId(Uin } } +void +NdbDictionary::Table::assignObjId(const NdbDictionary::ObjectId& _objId) +{ + const NdbDictObjectImpl& objId = NdbDictObjectImpl::getImpl(_objId); + m_impl.m_id = objId.m_id; + m_impl.m_version = objId.m_version; +} + /***************************************************************** * Index facade */ @@ -2064,12 +2073,23 @@ NdbDictionary::Dictionary::~Dictionary() int NdbDictionary::Dictionary::createTable(const Table & t) { + return createTable(t, 0); +} + +int +NdbDictionary::Dictionary::createTable(const Table & t, ObjectId * objId) +{ int ret; + ObjectId tmp; + if (objId == 0) + objId = &tmp; + if (likely(! is_ndb_blob_table(t.getName()))) { DO_TRANS( ret, - m_impl.createTable(NdbTableImpl::getImpl(t)) + m_impl.createTable(NdbTableImpl::getImpl(t), + NdbDictObjectImpl::getImpl( *objId)) ); } else === modified file 'storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp' --- a/storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp 2011-01-12 08:04:39 +0000 +++ b/storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp 2011-01-27 13:23:07 +0000 @@ -2879,7 +2879,7 @@ NdbDictInterface::parseTableInfo(NdbTabl * Create table and alter table */ int -NdbDictionaryImpl::createTable(NdbTableImpl &t) +NdbDictionaryImpl::createTable(NdbTableImpl &t, NdbDictObjectImpl & objid) { DBUG_ENTER("NdbDictionaryImpl::createTable"); @@ -2910,6 +2910,8 @@ NdbDictionaryImpl::createTable(NdbTableI Uint32* data = (Uint32*)m_receiver.m_buffer.get_data(); t.m_id = data[0]; t.m_version = data[1]; + objid.m_id = data[0]; + objid.m_version = data[1]; // update table def from DICT - by-pass cache NdbTableImpl* t2 = @@ -3014,7 +3016,8 @@ NdbDictionaryImpl::createBlobTables(cons assert(bc != NULL); bc->setStorageType(d); } - if (createTable(bt) != 0) { + NdbDictionary::ObjectId objId; // ignore objid + if (createTable(bt, NdbDictObjectImpl::getImpl(objId)) != 0) { DBUG_RETURN(-1); } } === modified file 'storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp' --- a/storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp 2010-11-09 20:40:03 +0000 +++ b/storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp 2011-01-27 13:23:07 +0000 @@ -817,7 +817,7 @@ public: bool setTransporter(class Ndb * ndb, class TransporterFacade * tf); bool setTransporter(class TransporterFacade * tf); - int createTable(NdbTableImpl &t); + int createTable(NdbTableImpl &t, NdbDictObjectImpl &); int optimizeTable(const NdbTableImpl &t, NdbOptimizeTableHandleImpl &h); int optimizeIndex(const NdbIndexImpl &index, --===============7780217013805072421== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/jonas@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: jonas@stripped # target_branch: file:///home/jonas/src/telco-7.0/ # testament_sha1: c94c3703a3e1572488f60775e3c7e888a4a8f2ff # timestamp: 2011-01-27 14:23:17 +0100 # source_branch: file:///home/jonas/src/telco-6.3/ # base_revision_id: jonas@stripped # # Begin bundle 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 --===============7780217013805072421==--