From: Martin Zaun Date: February 18 2011 7:44pm Subject: bzr commit into mysql-5.1-telco-7.1 branch (martin.zaun:4092) List-Archive: http://lists.mysql.com/commits/131659 Message-Id: <201102181944.p1IBhXNc024652@rcsinet15.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============3483633243451628913==" --===============3483633243451628913== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///Users/mz/mysql/ndb-7.1/ based on revid:magnus.blaudd@stripped 4092 Martin Zaun 2011-02-18 [merge] merge Jonas's (?) commits from 7.0 to 7.1 modified: storage/ndb/include/kernel/signaldata/DictTabInfo.hpp storage/ndb/include/ndb_constants.h storage/ndb/include/ndbapi/NdbDictionary.hpp storage/ndb/src/common/debugger/signaldata/DictTabInfo.cpp storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp storage/ndb/src/kernel/blocks/dbdict/Dbdict.hpp storage/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp storage/ndb/src/kernel/blocks/lgman.cpp storage/ndb/src/ndbapi/NdbDictionary.cpp storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp === modified file 'storage/ndb/include/kernel/signaldata/DictTabInfo.hpp' --- a/storage/ndb/include/kernel/signaldata/DictTabInfo.hpp 2011-02-01 23:27:25 +0000 +++ b/storage/ndb/include/kernel/signaldata/DictTabInfo.hpp 2011-02-16 14:53:53 +0000 @@ -148,6 +148,8 @@ public: HashMapObjectId = 153, HashMapVersion = 154, + TableStorageType = 155, + TableEnd = 999, AttributeName = 1000, // String, Mandatory @@ -376,7 +378,9 @@ public: Uint32 HashMapObjectId; Uint32 HashMapVersion; - + + Uint32 TableStorageType; + Table() {} void init(); }; === modified file 'storage/ndb/include/ndb_constants.h' --- a/storage/ndb/include/ndb_constants.h 2011-02-01 23:27:25 +0000 +++ b/storage/ndb/include/ndb_constants.h 2011-02-16 14:53:53 +0000 @@ -87,6 +87,7 @@ #define NDB_STORAGETYPE_MEMORY 0 #define NDB_STORAGETYPE_DISK 1 +#define NDB_STORAGETYPE_DEFAULT 2 /* not set */ /* * Table temporary status. === modified file 'storage/ndb/include/ndbapi/NdbDictionary.hpp' --- a/storage/ndb/include/ndbapi/NdbDictionary.hpp 2011-02-10 18:47:43 +0000 +++ b/storage/ndb/include/ndbapi/NdbDictionary.hpp 2011-02-18 19:43:58 +0000 @@ -287,7 +287,8 @@ public: */ enum StorageType { StorageTypeMemory = NDB_STORAGETYPE_MEMORY, - StorageTypeDisk = NDB_STORAGETYPE_DISK + StorageTypeDisk = NDB_STORAGETYPE_DISK, + StorageTypeDefault = NDB_STORAGETYPE_DEFAULT }; /** @@ -1054,6 +1055,12 @@ public: * this as way way too much stuff is pushed into NdbDictInterface */ void assignObjId(const ObjectId &); + + /** + * set/get table-storage-method + */ + void setStorageType(Column::StorageType); + Column::StorageType getStorageType() const; #endif // these 2 are not de-doxygenated === modified file 'storage/ndb/src/common/debugger/signaldata/DictTabInfo.cpp' --- a/storage/ndb/src/common/debugger/signaldata/DictTabInfo.cpp 2011-02-01 23:27:25 +0000 +++ b/storage/ndb/src/common/debugger/signaldata/DictTabInfo.cpp 2011-02-16 14:53:53 +0000 @@ -72,6 +72,7 @@ DictTabInfo::TableMapping[] = { DTIMAP(Table, SingleUserMode, SingleUserMode), DTIMAP(Table, HashMapObjectId, HashMapObjectId), DTIMAP(Table, HashMapVersion, HashMapVersion), + DTIMAP(Table, TableStorageType, TableStorageType), DTIBREAK(AttributeName) }; @@ -181,6 +182,8 @@ DictTabInfo::Table::init(){ HashMapObjectId = RNIL; HashMapVersion = RNIL; + + TableStorageType = NDB_STORAGETYPE_DEFAULT; } void === modified file 'storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp' --- a/storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp 2011-02-15 10:52:32 +0000 +++ b/storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp 2011-02-16 14:53:53 +0000 @@ -744,6 +744,7 @@ Dbdict::packTableIntoPages(SimplePropert w.add(DictTabInfo::MinRowsHigh, tablePtr.p->minRowsHigh); w.add(DictTabInfo::SingleUserMode, tablePtr.p->singleUserMode); w.add(DictTabInfo::HashMapObjectId, tablePtr.p->hashMapObjectId); + w.add(DictTabInfo::TableStorageType, tablePtr.p->storageType); if (tablePtr.p->hashMapObjectId != RNIL) { @@ -2452,6 +2453,7 @@ void Dbdict::initialiseTableRecord(Table tablePtr.p->triggerId = RNIL; tablePtr.p->buildTriggerId = RNIL; tablePtr.p->m_read_locked= 0; + tablePtr.p->storageType = NDB_STORAGETYPE_DEFAULT; }//Dbdict::initialiseTableRecord() void Dbdict::initTriggerRecords() @@ -4941,6 +4943,7 @@ void Dbdict::handleTabInfoInit(Signal * tablePtr.p->singleUserMode = c_tableDesc.SingleUserMode; tablePtr.p->hashMapObjectId = c_tableDesc.HashMapObjectId; tablePtr.p->hashMapVersion = c_tableDesc.HashMapVersion; + tablePtr.p->storageType = c_tableDesc.TableStorageType; tabRequire(tablePtr.p->noOfAttributes <= MAX_ATTRIBUTES_IN_TABLE, CreateTableRef::NoMoreAttributeRecords); // bad error code! === modified file 'storage/ndb/src/kernel/blocks/dbdict/Dbdict.hpp' --- a/storage/ndb/src/kernel/blocks/dbdict/Dbdict.hpp 2011-02-01 23:27:25 +0000 +++ b/storage/ndb/src/kernel/blocks/dbdict/Dbdict.hpp 2011-02-16 14:53:53 +0000 @@ -330,6 +330,11 @@ public: */ Uint8 minLoadFactor; + /** + * Table default storage method + */ + Uint8 storageType; // NDB_STORAGETYPE_ + /* Convenience routines */ bool isTable() const; bool isIndex() const; === modified file 'storage/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp' --- a/storage/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp 2011-02-16 08:21:03 +0000 +++ b/storage/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp 2011-02-18 19:43:58 +0000 @@ -1989,6 +1989,7 @@ void Dbdih::execREAD_NODESCONF(Signal* s if (c_2pass_inr) { jam(); + Uint32 workers = getNodeInfo(getOwnNodeId()).m_lqh_workers; printf("Checking 2-pass initial node restart: "); for (i = 0; i disabled\n", nodeArray[i]); + printf("not ok (version node %u) => disabled\n", nodeArray[i]); + break; + } + + if (workers > 1 && + workers != getNodeInfo(nodeArray[i]).m_lqh_workers) + { + c_2pass_inr = false; + printf("not ok (different worker cnt node %u) => disabled\n", + nodeArray[i]); break; } } @@ -3778,7 +3788,7 @@ done: req->fragId = takeOverPtr.p->toCurrentFragid; req->noOfLogNodes = 0; - if (c_2pass_inr) + if (c_2pass_inr && cstarttype == NodeState::ST_INITIAL_NODE_RESTART) { /** * Check if we can make 2-phase copy @@ -3829,7 +3839,7 @@ done: takeOverPtr.p->toCurrentTabref, takeOverPtr.p->toCurrentFragid, req->lqhLogNode[0], - req->lcpId); + takeOverPtr.p->startGci); } BlockReference ref = numberToRef(DBLQH, takeOverPtr.p->toStartingNode); === modified file 'storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp' --- a/storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp 2011-02-16 08:21:03 +0000 +++ b/storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp 2011-02-18 19:43:58 +0000 @@ -73,6 +73,7 @@ #include #include #include +#include #include #include "../suma/Suma.hpp" @@ -7807,12 +7808,6 @@ void Dblqh::commitContinueAfterBlockedLa EXECUTE_DIRECT(tup, GSN_TUP_COMMITREQ, signal, TupCommitReq::SignalLength); - if(signal->theData[0] != 0) - { - regTcPtr.p->transactionState = TcConnectionrec::WAIT_TUP_COMMIT; - return; // TUP_COMMIT was timesliced - } - if (TRACENR_FLAG) { TRACENR("COMMIT: "); @@ -7833,9 +7828,18 @@ void Dblqh::commitContinueAfterBlockedLa if (LqhKeyReq::getRowidFlag(regTcPtr.p->reqinfo)) TRACENR(" rowid: " << regTcPtr.p->m_row_id); TRACENR(" key: " << getKeyInfoWordOrZero(regTcPtr.p, 0)); + + if (signal->theData[0] != 0) + TRACENR(" TIMESLICE"); TRACENR(endl); } + if(signal->theData[0] != 0) + { + regTcPtr.p->transactionState = TcConnectionrec::WAIT_TUP_COMMIT; + return; // TUP_COMMIT was timesliced + } + TRACE_OP(regTcPtr.p, "ACC_COMMITREQ"); Uint32 acc = refToMain(regTcPtr.p->tcAccBlockref); @@ -16495,7 +16499,6 @@ Dblqh::send_restore_lcp(Signal * signal) sendSignal(ref, GSN_COPY_FRAGREQ, signal, CopyFragReq::SignalLength, JBB); - } } @@ -16503,7 +16506,17 @@ void Dblqh::execCOPY_FRAGREF(Signal* signal) { jamEntry(); - ndbrequire(false); + + const CopyFragRef * ref = CAST_CONSTPTR(CopyFragRef, signal->getDataPtr()); + Uint32 errorCode = ref->errorCode; + + SystemError * sysErr = (SystemError*)&signal->theData[0]; + sysErr->errorCode = SystemError::CopyFragRefError; + sysErr->errorRef = reference(); + sysErr->data[0] = errorCode; + sysErr->data[1] = 0; + sendSignal(NDBCNTR_REF, GSN_SYSTEM_ERROR, signal, + SystemError::SignalLength, JBB); } void @@ -16600,7 +16613,18 @@ void Dblqh::execRESTORE_LCP_CONF(Signal* lcpPtr.i = 0; ptrAss(lcpPtr, lcpRecord); lcpPtr.p->m_outstanding = 1; - + + if (cstartType == NodeState::ST_INITIAL_NODE_RESTART) + { + jam(); + /** + * Skip lgman undo... + */ + signal->theData[0] = LGMAN_REF; + sendSignal(reference(), GSN_START_RECCONF, signal, 1, JBB); + return; + } + if (!isNdbMtLqh()) { jam(); === modified file 'storage/ndb/src/kernel/blocks/lgman.cpp' --- a/storage/ndb/src/kernel/blocks/lgman.cpp 2011-02-15 08:46:20 +0000 +++ b/storage/ndb/src/kernel/blocks/lgman.cpp 2011-02-17 15:51:08 +0000 @@ -595,7 +595,9 @@ Lgman::execCREATE_FILEGROUP_IMPL_REQ(Sig m_logfile_group_hash.add(ptr); m_logfile_group_list.add(ptr); - if (getNodeState().getNodeRestartInProgress() || + if ((getNodeState().getNodeRestartInProgress() && + getNodeState().starting.restartType != + NodeState::ST_INITIAL_NODE_RESTART)|| getNodeState().getSystemRestartInProgress()) { ptr.p->m_state = Logfile_group::LG_STARTING; === modified file 'storage/ndb/src/ndbapi/NdbDictionary.cpp' --- a/storage/ndb/src/ndbapi/NdbDictionary.cpp 2011-02-10 18:47:43 +0000 +++ b/storage/ndb/src/ndbapi/NdbDictionary.cpp 2011-02-18 19:43:58 +0000 @@ -1003,6 +1003,18 @@ NdbDictionary::Table::assignObjId(const m_impl.m_version = objId.m_version; } +void +NdbDictionary::Table::setStorageType(NdbDictionary::Column::StorageType type) +{ + m_impl.m_storageType = type; +} + +NdbDictionary::Column::StorageType +NdbDictionary::Table::getStorageType() const +{ + return (NdbDictionary::Column::StorageType)m_impl.m_storageType; +} + /***************************************************************** * Index facade */ === modified file 'storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp' --- a/storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp 2011-02-04 18:34:09 +0000 +++ b/storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp 2011-02-18 19:43:58 +0000 @@ -637,6 +637,7 @@ NdbTableImpl::init(){ m_single_user_mode = 0; m_hash_map_id = RNIL; m_hash_map_version = ~0; + m_storageType = NDB_STORAGETYPE_DEFAULT; } bool @@ -921,6 +922,8 @@ NdbTableImpl::assign(const NdbTableImpl& m_tablespace_name = org.m_tablespace_name; m_tablespace_id= org.m_tablespace_id; m_tablespace_version = org.m_tablespace_version; + m_storageType = org.m_storageType; + DBUG_RETURN(0); } @@ -2681,6 +2684,7 @@ NdbDictInterface::parseTableInfo(NdbTabl impl->m_minLoadFactor = tableDesc->MinLoadFactor; impl->m_maxLoadFactor = tableDesc->MaxLoadFactor; impl->m_single_user_mode = tableDesc->SingleUserMode; + impl->m_storageType = tableDesc->TableStorageType; impl->m_indexType = (NdbDictionary::Object::Type) getApiConstant(tableDesc->TableType, @@ -3393,6 +3397,7 @@ NdbDictInterface::serializeTableDesc(Ndb tmpTab->HashMapObjectId = impl.m_hash_map_id; tmpTab->HashMapVersion = impl.m_hash_map_version; + tmpTab->TableStorageType = impl.m_storageType; const char *tablespace_name= impl.m_tablespace_name.c_str(); loop: === modified file 'storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp' --- a/storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp 2011-02-03 14:45:49 +0000 +++ b/storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp 2011-02-18 19:43:58 +0000 @@ -233,6 +233,7 @@ public: Uint16 m_keyLenInWords; Uint16 m_fragmentCount; Uint8 m_single_user_mode; + Uint8 m_storageType; // NDB_STORAGETYPE_MEMORY or _DISK or DEFAULT NdbIndexImpl * m_index; NdbColumnImpl * getColumn(unsigned attrId); --===============3483633243451628913== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/martin.zaun@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: martin.zaun@stripped # target_branch: file:///Users/mz/mysql/ndb-7.1/ # testament_sha1: b5c765b4d7fe78bddda06ddf245e7bc0c14130de # timestamp: 2011-02-18 11:44:14 -0800 # source_branch: file:///Users/mz/mysql/ndb-7.1-opt1/ # base_revision_id: magnus.blaudd@stripped\ # w5nu7khevmk6qw6n # # Begin bundle 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 --===============3483633243451628913==--