From: Date: March 23 2007 1:52pm Subject: bk commit into 5.0 tree (tomas:1.2397) BUG#25275 List-Archive: http://lists.mysql.com/commits/22768 X-Bug: 25275 Message-Id: <20070323125214.2E91F3052F6@whalegate.ndb.mysql.com> Below is the list of changes that have just been committed into a local 5.0 repository of tomas. When tomas does a push these changes will be propagated to the main repository and, within 24 hours after the push, to the public repository. For information on how to access the public repository see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html ChangeSet@stripped, 2007-03-23 13:52:03+01:00, tomas@stripped +13 -0 Bug #25275 SINGLE USER MODE prevents ALTER on non-ndb tables for other mysqld nodes ndb/include/kernel/signaldata/DictTabInfo.hpp@stripped, 2007-03-23 13:51:54+01:00, tomas@stripped +4 -1 add single user mode field in table definition ndb/include/ndb_constants.h@stripped, 2007-03-23 13:51:54+01:00, tomas@stripped +7 -0 new constants for single usermode option of tables ndb/include/ndbapi/NdbDictionary.hpp@stripped, 2007-03-23 13:51:54+01:00, tomas@stripped +16 -0 add single user mode field in table definition ndb/src/common/debugger/signaldata/DictTabInfo.cpp@stripped, 2007-03-23 13:51:54+01:00, tomas@stripped +3 -0 add single user mode field in table definition ndb/src/kernel/blocks/dbdict/Dbdict.cpp@stripped, 2007-03-23 13:51:54+01:00, tomas@stripped +6 -3 add single user mode field in table definition send this infor to TC ndb/src/kernel/blocks/dbdict/Dbdict.hpp@stripped, 2007-03-23 13:51:55+01:00, tomas@stripped +5 -0 add single user mode field in table definition ndb/src/kernel/blocks/dbtc/Dbtc.hpp@stripped, 2007-03-23 13:51:55+01:00, tomas@stripped +18 -6 single user table mode on table object merge some flags from uint8 to bits get allow transaction to also check single user mode ndb/src/kernel/blocks/dbtc/DbtcMain.cpp@stripped, 2007-03-23 13:51:55+01:00, tomas@stripped +54 -33 single user table mode on table object merge some flags from uint8 to bits get allow transaction to also check single user mode ndb/src/kernel/blocks/ndbcntr/NdbcntrMain.cpp@stripped, 2007-03-23 13:51:55+01:00, tomas@stripped +1 -0 set single user mode flag on system tables to make them always updatable ndb/src/ndbapi/NdbDictionary.cpp@stripped, 2007-03-23 13:51:55+01:00, tomas@stripped +12 -0 get/set functions for single user mode on tables ndb/src/ndbapi/NdbDictionaryImpl.cpp@stripped, 2007-03-23 13:51:55+01:00, tomas@stripped +15 -2 get/set functions for single user mode on tables ndb/src/ndbapi/NdbDictionaryImpl.hpp@stripped, 2007-03-23 13:51:55+01:00, tomas@stripped +1 -0 get/set functions for single user mode on tables ndb/test/src/NDBT_Table.cpp@stripped, 2007-03-23 13:51:56+01:00, tomas@stripped +1 -1 print single user mode # This is a BitKeeper patch. What follows are the unified diffs for the # set of deltas contained in the patch. The rest of the patch, the part # that BitKeeper cares about, is below these diffs. # User: tomas # Host: whalegate.ndb.mysql.com # Root: /home/tomas/mysql-5.0-telco-gca-single-user --- 1.21/ndb/include/kernel/signaldata/DictTabInfo.hpp 2006-12-23 20:04:09 +01:00 +++ 1.22/ndb/include/kernel/signaldata/DictTabInfo.hpp 2007-03-23 13:51:54 +01:00 @@ -126,6 +126,8 @@ MinRowsLow = 143, MinRowsHigh = 144, + SingleUserMode = 152, + TableEnd = 999, AttributeName = 1000, // String, Mandatory @@ -273,7 +275,8 @@ Uint32 MaxRowsHigh; Uint32 MinRowsLow; Uint32 MinRowsHigh; - + Uint32 SingleUserMode; + void init(); }; --- 1.57/ndb/include/ndbapi/NdbDictionary.hpp 2006-12-23 20:04:10 +01:00 +++ 1.58/ndb/include/ndbapi/NdbDictionary.hpp 2007-03-23 13:51:54 +01:00 @@ -497,6 +497,15 @@ */ class Table : public Object { public: + /* + * Single user mode specifies access rights to table during single user mode + */ + enum SingleUserMode { + SingleUserModeLocked = NDB_SUM_LOCKED, + SingleUserModeReadOnly = NDB_SUM_READONLY, + SingleUserModeReadWrite = NDB_SUM_READ_WRITE + }; + /** * @name General * @{ @@ -734,6 +743,13 @@ */ void setMinRows(Uint64 minRows); Uint64 getMinRows() const; + + /** + * Set/Get SingleUserMode + */ + void setSingleUserMode(enum SingleUserMode); + enum SingleUserMode getSingleUserMode() const; + /** @} *******************************************************************/ --- 1.8/ndb/src/common/debugger/signaldata/DictTabInfo.cpp 2006-12-23 20:04:12 +01:00 +++ 1.9/ndb/src/common/debugger/signaldata/DictTabInfo.cpp 2007-03-23 13:51:54 +01:00 @@ -51,6 +51,7 @@ DTIMAP(Table, MaxRowsHigh, MaxRowsHigh), DTIMAP(Table, MinRowsLow, MinRowsLow), DTIMAP(Table, MinRowsHigh, MinRowsHigh), + DTIMAP(Table, SingleUserMode, SingleUserMode), DTIBREAK(AttributeName) }; @@ -131,6 +132,8 @@ MaxRowsHigh = 0; MinRowsLow = 0; MinRowsHigh = 0; + + SingleUserMode = 0; } void --- 1.73/ndb/src/kernel/blocks/dbdict/Dbdict.cpp 2007-03-02 03:05:59 +01:00 +++ 1.74/ndb/src/kernel/blocks/dbdict/Dbdict.cpp 2007-03-23 13:51:54 +01:00 @@ -289,7 +289,7 @@ w.add(DictTabInfo::MaxRowsHigh, tablePtr.p->maxRowsHigh); w.add(DictTabInfo::MinRowsLow, tablePtr.p->minRowsLow); w.add(DictTabInfo::MinRowsHigh, tablePtr.p->minRowsHigh); - + w.add(DictTabInfo::SingleUserMode, tablePtr.p->singleUserMode); if(!signal) { w.add(DictTabInfo::FragmentCount, tablePtr.p->fragmentCount); @@ -1500,6 +1500,7 @@ tablePtr.p->maxRowsHigh = 0; tablePtr.p->minRowsLow = 0; tablePtr.p->minRowsHigh = 0; + tablePtr.p->singleUserMode = 0; tablePtr.p->storedTable = true; tablePtr.p->tableType = DictTabInfo::UserTable; tablePtr.p->primaryTableId = RNIL; @@ -4718,8 +4719,9 @@ signal->theData[4] = (Uint32)tabPtr.p->tableType; signal->theData[5] = createTabPtr.p->key; signal->theData[6] = (Uint32)tabPtr.p->noOfPrimkey; - - sendSignal(DBTC_REF, GSN_TC_SCHVERREQ, signal, 7, JBB); + signal->theData[7] = (Uint32)tabPtr.p->singleUserMode; + + sendSignal(DBTC_REF, GSN_TC_SCHVERREQ, signal, 8, JBB); return; } @@ -5084,6 +5086,7 @@ tablePtr.p->maxRowsHigh = tableDesc.MaxRowsHigh; tablePtr.p->minRowsLow = tableDesc.MinRowsLow; tablePtr.p->minRowsHigh = tableDesc.MinRowsHigh; + tablePtr.p->singleUserMode = tableDesc.SingleUserMode; Uint64 maxRows = (((Uint64)tablePtr.p->maxRowsHigh) << 32) + tablePtr.p->maxRowsLow; --- 1.25/ndb/src/kernel/blocks/dbdict/Dbdict.hpp 2006-12-23 20:04:15 +01:00 +++ 1.26/ndb/src/kernel/blocks/dbdict/Dbdict.hpp 2007-03-23 13:51:55 +01:00 @@ -237,6 +237,11 @@ char frmData[MAX_FRM_DATA_SIZE]; Uint32 fragmentCount; + + /* + * Access rights to table during single user mode + */ + Uint8 singleUserMode; }; typedef Ptr TableRecordPtr; --- 1.39/ndb/src/kernel/blocks/dbtc/Dbtc.hpp 2007-03-07 04:46:37 +01:00 +++ 1.40/ndb/src/kernel/blocks/dbtc/Dbtc.hpp 2007-03-23 13:51:55 +01:00 @@ -702,6 +702,7 @@ Uint8 tckeyrec; // Ändrad från R Uint8 tcindxrec; Uint8 apiFailState; // Ändrad från R + Uint8 singleUserMode; ReturnSignal returnsignal; Uint8 timeOutCounter; @@ -957,17 +958,28 @@ /********************************************************/ struct TableRecord { Uint32 currentSchemaVersion; - Uint8 enabled; - Uint8 dropping; + Uint16 m_flags; Uint8 tableType; - Uint8 storedTable; + Uint8 singleUserMode; + + enum { + TR_ENABLED = 1 << 0, + TR_DROPPING = 1 << 1, + TR_STORED_TABLE = 1 << 2 + }; + Uint8 get_enabled() const { return (m_flags & TR_ENABLED) != 0; } + Uint8 get_dropping() const { return (m_flags & TR_DROPPING) != 0; } + Uint8 get_storedTable() const { return (m_flags & TR_STORED_TABLE) != 0; } + void set_enabled(Uint8 f) { f ? m_flags |= (Uint16)TR_ENABLED : m_flags &= ~(Uint16)TR_ENABLED; } + void set_dropping(Uint8 f) { f ? m_flags |= (Uint16)TR_DROPPING : m_flags &= ~(Uint16)TR_DROPPING; } + void set_storedTable(Uint8 f) { f ? m_flags |= (Uint16)TR_STORED_TABLE : m_flags &= ~(Uint16)TR_STORED_TABLE; } Uint8 noOfKeyAttr; Uint8 hasCharAttr; Uint8 noOfDistrKeys; bool checkTable(Uint32 schemaVersion) const { - return enabled && !dropping && + return get_enabled() && !get_dropping() && (table_version_major(schemaVersion) == table_version_major(currentSchemaVersion)); } @@ -1835,10 +1847,10 @@ Uint32 transid2); void removeMarkerForFailedAPI(Signal* signal, Uint32 nodeId, Uint32 bucket); - bool getAllowStartTransaction(Uint32 nodeId) const { + bool getAllowStartTransaction(Uint32 nodeId, Uint32 table_single_user_mode) const { if (unlikely(getNodeState().getSingleUserMode())) { - if (getNodeState().getSingleUserApi() == nodeId) + if (getNodeState().getSingleUserApi() == nodeId || table_single_user_mode) return true; else return false; --- 1.104/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp 2007-03-07 04:46:37 +01:00 +++ 1.105/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp 2007-03-23 13:51:55 +01:00 @@ -327,19 +327,21 @@ tabptr.i = signal->theData[0]; ptrCheckGuard(tabptr, ctabrecFilesize, tableRecord); tabptr.p->currentSchemaVersion = signal->theData[1]; - tabptr.p->storedTable = (bool)signal->theData[2]; + tabptr.p->m_flags = 0; + tabptr.p->set_storedTable((bool)signal->theData[2]); BlockReference retRef = signal->theData[3]; tabptr.p->tableType = (Uint8)signal->theData[4]; BlockReference retPtr = signal->theData[5]; Uint32 noOfKeyAttr = signal->theData[6]; + tabptr.p->singleUserMode = (Uint8)signal->theData[7]; ndbrequire(noOfKeyAttr <= MAX_ATTRIBUTES_IN_INDEX); const KeyDescriptor* desc = g_key_descriptor_pool.getPtr(tabptr.i); ndbrequire(noOfKeyAttr == desc->noOfKeyAttr); - ndbrequire(tabptr.p->enabled == false); - tabptr.p->enabled = true; - tabptr.p->dropping = false; + ndbrequire(tabptr.p->get_enabled() == false); + tabptr.p->set_enabled(true); + tabptr.p->set_dropping(false); tabptr.p->noOfKeyAttr = desc->noOfKeyAttr; tabptr.p->hasCharAttr = desc->hasCharAttr; tabptr.p->noOfDistrKeys = desc->noOfDistrKeys; @@ -363,7 +365,7 @@ Uint32 senderRef = req->senderRef; Uint32 senderData = req->senderData; - if(!tabPtr.p->enabled){ + if(!tabPtr.p->get_enabled()){ jam(); PrepDropTabRef* ref = (PrepDropTabRef*)signal->getDataPtrSend(); ref->senderRef = reference(); @@ -375,7 +377,7 @@ return; } - if(tabPtr.p->dropping){ + if(tabPtr.p->get_dropping()){ jam(); PrepDropTabRef* ref = (PrepDropTabRef*)signal->getDataPtrSend(); ref->senderRef = reference(); @@ -387,7 +389,7 @@ return; } - tabPtr.p->dropping = true; + tabPtr.p->set_dropping(true); tabPtr.p->dropTable.senderRef = senderRef; tabPtr.p->dropTable.senderData = senderData; @@ -423,7 +425,7 @@ tabPtr.i = conf->tableId; ptrCheckGuard(tabPtr, ctabrecFilesize, tableRecord); - ndbrequire(tabPtr.p->dropping == true); + ndbrequire(tabPtr.p->get_dropping() == true); Uint32 nodeId = refToNode(conf->senderRef); tabPtr.p->dropTable.waitDropTabCount.clearWaitingFor(nodeId); @@ -453,7 +455,7 @@ tabPtr.i = ref->tableId; ptrCheckGuard(tabPtr, ctabrecFilesize, tableRecord); - ndbrequire(tabPtr.p->dropping == true); + ndbrequire(tabPtr.p->get_dropping() == true); Uint32 nodeId = refToNode(ref->senderRef); tabPtr.p->dropTable.waitDropTabCount.clearWaitingFor(nodeId); @@ -490,7 +492,7 @@ for(Uint32 i = 0; ienabled && tabPtr.p->dropping){ + if(tabPtr.p->get_enabled() && tabPtr.p->get_dropping()){ if(tabPtr.p->dropTable.waitDropTabCount.isWaitingFor(nodeId)){ jam(); conf->senderRef = calcLqhBlockRef(nodeId); @@ -531,7 +533,7 @@ Uint32 senderData = req->senderData; DropTabReq::RequestType rt = (DropTabReq::RequestType)req->requestType; - if(!tabPtr.p->enabled && rt == DropTabReq::OnlineDropTab){ + if(!tabPtr.p->get_enabled() && rt == DropTabReq::OnlineDropTab){ jam(); DropTabRef* ref = (DropTabRef*)signal->getDataPtrSend(); ref->senderRef = reference(); @@ -543,7 +545,7 @@ return; } - if(!tabPtr.p->dropping && rt == DropTabReq::OnlineDropTab){ + if(!tabPtr.p->get_dropping() && rt == DropTabReq::OnlineDropTab){ jam(); DropTabRef* ref = (DropTabRef*)signal->getDataPtrSend(); ref->senderRef = reference(); @@ -555,8 +557,8 @@ return; } - tabPtr.p->enabled = false; - tabPtr.p->dropping = false; + tabPtr.p->set_enabled(false); + tabPtr.p->set_dropping(false); DropTabConf * conf = (DropTabConf*)signal->getDataPtrSend(); conf->tableId = tabPtr.i; @@ -1214,8 +1216,7 @@ break; case NodeState::SL_STOPPING_1: case NodeState::SL_STOPPING_2: - if (getNodeState().getSingleUserMode() && - getNodeState().getSingleUserApi() == senderNodeId) + if (getNodeState().getSingleUserMode()) break; case NodeState::SL_STOPPING_3: case NodeState::SL_STOPPING_4: @@ -1225,9 +1226,6 @@ errCode = ZNODE_SHUTDOWN_IN_PROGRESS; break; case NodeState::SL_SINGLEUSER: - if (getNodeState().getSingleUserApi() == senderNodeId) - break; - errCode = ZCLUSTER_IN_SINGLEUSER_MODE; break; default: errCode = ZWRONG_STATE; @@ -2397,6 +2395,7 @@ regApiPtr->buddyPtr = RNIL; regApiPtr->currSavePointId = 0; regApiPtr->m_transaction_nodes.clear(); + regApiPtr->singleUserMode = 0; // Trigger data releaseFiredTriggerData(®ApiPtr->theFiredTriggers), // Index data @@ -2550,9 +2549,12 @@ bool isIndexOpReturn = regApiPtr->indexOpReturn; regApiPtr->isIndexOp = false; // Reset marker regApiPtr->m_exec_flag |= TexecFlag; + TableRecordPtr localTabptr; + localTabptr.i = TtabIndex; + localTabptr.p = &tableRecord[TtabIndex]; switch (regApiPtr->apiConnectstate) { case CS_CONNECTED:{ - if (TstartFlag == 1 && getAllowStartTransaction(sendersNodeId) == true){ + if (TstartFlag == 1 && getAllowStartTransaction(sendersNodeId, localTabptr.p->singleUserMode) == true){ //--------------------------------------------------------------------- // Initialise API connect record if transaction is started. //--------------------------------------------------------------------- @@ -2560,7 +2562,7 @@ initApiConnectRec(signal, regApiPtr); regApiPtr->m_exec_flag = TexecFlag; } else { - if(getAllowStartTransaction(sendersNodeId) == true){ + if(getAllowStartTransaction(sendersNodeId, localTabptr.p->singleUserMode) == true){ /*------------------------------------------------------------------ * WE EXPECTED A START TRANSACTION. SINCE NO OPERATIONS HAVE BEEN * RECEIVED WE INDICATE THIS BY SETTING FIRST_TC_CONNECT TO RNIL TO @@ -2587,6 +2589,13 @@ * the state will be CS_STARTED */ jam(); + if (unlikely(getNodeState().getSingleUserMode()) && + getNodeState().getSingleUserApi() != sendersNodeId && + !localTabptr.p->singleUserMode) + { + TCKEY_abort(signal, TexecFlag ? 60 : 57); + return; + } initApiConnectRec(signal, regApiPtr); regApiPtr->m_exec_flag = TexecFlag; } else { @@ -2607,6 +2616,10 @@ case CS_ABORTING: if (regApiPtr->abortState == AS_IDLE) { if (TstartFlag == 1) { + if(getAllowStartTransaction(sendersNodeId, localTabptr.p->singleUserMode) == false){ + TCKEY_abort(signal, TexecFlag ? 60 : 57); + return; + } //-------------------------------------------------------------------- // Previous transaction had been aborted and the abort was completed. // It is then OK to start a new transaction again. @@ -2670,9 +2683,6 @@ return; }//switch - TableRecordPtr localTabptr; - localTabptr.i = TtabIndex; - localTabptr.p = &tableRecord[TtabIndex]; if (localTabptr.p->checkTable(tcKeyReq->tableSchemaVersion)) { ; } else { @@ -2731,6 +2741,8 @@ regTcPtr->savePointId = regApiPtr->currSavePointId; regApiPtr->executingIndexOp = RNIL; + regApiPtr->singleUserMode |= 1 << localTabptr.p->singleUserMode; + if (TcKeyReq::getExecutingTrigger(Treqinfo)) { // Save the TcOperationPtr for fireing operation regTcPtr->triggeringOperation = TsenderData; @@ -2862,7 +2874,7 @@ * THIS VARIABLE CONTROLS THE INTERVAL BETWEEN LCP'S AND * TEMP TABLES DON'T PARTICIPATE. * -------------------------------------------------------------------- */ - if (localTabptr.p->storedTable) { + if (localTabptr.p->get_storedTable()) { coperationsize = ((Toperationsize + TattrLen) + TkeyLength) + 17; } c_counters.cwriteCount = TwriteCount + 1; @@ -4721,6 +4733,7 @@ regApiPtr->lqhkeyconfrec = Tlqhkeyconfrec; regApiPtr->commitAckMarker = TcommitAckMarker; regApiPtr->m_transaction_nodes = Tnodes; + regApiPtr->singleUserMode = 0; gcpPtr.i = TgcpPointer; ptrCheckGuard(gcpPtr, TgcpFilesize, localGcpRecord); @@ -4732,6 +4745,7 @@ regTmpApiPtr->firstTcConnect = RNIL; regTmpApiPtr->lastTcConnect = RNIL; regTmpApiPtr->m_transaction_nodes.clear(); + regTmpApiPtr->singleUserMode = 0; releaseAllSeizedIndexOperations(regTmpApiPtr); }//Dbtc::copyApi() @@ -6237,8 +6251,9 @@ { apiConnectptr.i = api_con_ptr; ptrCheckGuard(apiConnectptr, capiConnectFilesize, apiConnectRecord); - if (getNodeState().getSingleUserApi() == - refToNode(apiConnectptr.p->ndbapiBlockref)) + if ((getNodeState().getSingleUserApi() == + refToNode(apiConnectptr.p->ndbapiBlockref)) || + !(apiConnectptr.p->singleUserMode & (1 << NDB_SUM_LOCKED))) { // api allowed during single user, use original timeout time_out_value= @@ -8181,6 +8196,7 @@ apiConnectptr.p->ndbapiConnect = 0; apiConnectptr.p->buddyPtr = RNIL; apiConnectptr.p->m_transaction_nodes.clear(); + apiConnectptr.p->singleUserMode = 0; setApiConTimer(apiConnectptr.i, 0, __LINE__); switch(ttransStatus){ case LqhTransConf::Committed: @@ -10076,6 +10092,7 @@ apiConnectptr.p->buddyPtr = RNIL; apiConnectptr.p->currSavePointId = 0; apiConnectptr.p->m_transaction_nodes.clear(); + apiConnectptr.p->singleUserMode = 0; }//for apiConnectptr.i = tiacTmp - 1; ptrCheckGuard(apiConnectptr, capiConnectFilesize, apiConnectRecord); @@ -10104,6 +10121,7 @@ apiConnectptr.p->buddyPtr = RNIL; apiConnectptr.p->currSavePointId = 0; apiConnectptr.p->m_transaction_nodes.clear(); + apiConnectptr.p->singleUserMode = 0; }//for apiConnectptr.i = (2 * tiacTmp) - 1; ptrCheckGuard(apiConnectptr, capiConnectFilesize, apiConnectRecord); @@ -10132,6 +10150,7 @@ apiConnectptr.p->buddyPtr = RNIL; apiConnectptr.p->currSavePointId = 0; apiConnectptr.p->m_transaction_nodes.clear(); + apiConnectptr.p->singleUserMode = 0; }//for apiConnectptr.i = (3 * tiacTmp) - 1; ptrCheckGuard(apiConnectptr, capiConnectFilesize, apiConnectRecord); @@ -10316,10 +10335,11 @@ refresh_watch_dog(); ptrAss(tabptr, tableRecord); tabptr.p->currentSchemaVersion = 0; - tabptr.p->storedTable = true; + tabptr.p->m_flags = 0; + tabptr.p->set_storedTable(true); tabptr.p->tableType = 0; - tabptr.p->enabled = false; - tabptr.p->dropping = false; + tabptr.p->set_enabled(false); + tabptr.p->set_dropping(false); tabptr.p->noOfKeyAttr = 0; tabptr.p->hasCharAttr = 0; tabptr.p->noOfDistrKeys = 0; @@ -10452,6 +10472,7 @@ apiConnectptr.p->firstTcConnect = RNIL; apiConnectptr.p->lastTcConnect = RNIL; apiConnectptr.p->m_transaction_nodes.clear(); + apiConnectptr.p->singleUserMode = 0; // MASV let state be CS_ABORTING until all // signals in the "air" have been received. Reset to CS_CONNECTED @@ -11130,7 +11151,7 @@ const Uint32 senderData = req->senderData; const BlockReference senderRef = req->senderRef; - if(getAllowStartTransaction(refToNode(senderRef)) == true && !getNodeState().getSingleUserMode()){ + if(getAllowStartTransaction(refToNode(senderRef), 0) == true && !getNodeState().getSingleUserMode()){ jam(); ref->senderData = senderData; @@ -13366,9 +13387,9 @@ Uint32 Dbtc::TableRecord::getErrorCode(Uint32 schemaVersion) const { - if(!enabled) + if(!get_enabled()) return ZNO_SUCH_TABLE; - if(dropping) + if(get_dropping()) return ZDROP_TABLE_IN_PROGRESS; if(table_version_major(schemaVersion) != table_version_major(currentSchemaVersion)) return ZWRONG_SCHEMA_VERSION_ERROR; --- 1.35/ndb/src/kernel/blocks/ndbcntr/NdbcntrMain.cpp 2006-12-23 20:04:16 +01:00 +++ 1.36/ndb/src/kernel/blocks/ndbcntr/NdbcntrMain.cpp 2007-03-23 13:51:55 +01:00 @@ -1645,6 +1645,7 @@ //w.add(DictTabInfo::NoOfVariable, (Uint32)0); //w.add(DictTabInfo::KeyLength, 1); w.add(DictTabInfo::TableTypeVal, (Uint32)table.tableType); + w.add(DictTabInfo::SingleUserMode, (Uint32)NDB_SUM_READ_WRITE); for (unsigned i = 0; i < table.columnCount; i++) { const SysColumn& column = table.columnList[i]; --- 1.40/ndb/src/ndbapi/NdbDictionary.cpp 2006-12-23 20:04:18 +01:00 +++ 1.41/ndb/src/ndbapi/NdbDictionary.cpp 2007-03-23 13:51:55 +01:00 @@ -430,6 +430,18 @@ return m_impl.m_frm.length(); } +enum NdbDictionary::Table::SingleUserMode +NdbDictionary::Table::getSingleUserMode() const +{ + return (enum SingleUserMode)m_impl.m_single_user_mode; +} + +void +NdbDictionary::Table::setSingleUserMode(enum NdbDictionary::Table::SingleUserMode mode) +{ + m_impl.m_single_user_mode = (Uint8)mode; +} + void NdbDictionary::Table::setFrm(const void* data, Uint32 len){ m_impl.m_frm.assign(data, len); --- 1.96/ndb/src/ndbapi/NdbDictionaryImpl.cpp 2006-12-23 20:04:18 +01:00 +++ 1.97/ndb/src/ndbapi/NdbDictionaryImpl.cpp 2007-03-23 13:51:55 +01:00 @@ -318,6 +318,7 @@ m_replicaCount= 0; m_min_rows = 0; m_max_rows = 0; + m_single_user_mode = 0; } bool @@ -378,6 +379,14 @@ DBUG_RETURN(false); } + if(m_single_user_mode != obj.m_single_user_mode) + { + DBUG_PRINT("info",("m_single_user_mode %d != %d", + (int32)m_single_user_mode, + (int32)obj.m_single_user_mode)); + DBUG_RETURN(false); + } + DBUG_RETURN(true); } @@ -403,7 +412,8 @@ m_kvalue = org.m_kvalue; m_minLoadFactor = org.m_minLoadFactor; m_maxLoadFactor = org.m_maxLoadFactor; - + m_single_user_mode = org.m_single_user_mode; + if (m_index != 0) delete m_index; m_index = org.m_index; @@ -1191,6 +1201,7 @@ impl->m_kvalue = tableDesc.TableKValue; impl->m_minLoadFactor = tableDesc.MinLoadFactor; impl->m_maxLoadFactor = tableDesc.MaxLoadFactor; + impl->m_single_user_mode = tableDesc.SingleUserMode; impl->m_indexType = (NdbDictionary::Index::Type) getApiConstant(tableDesc.TableType, @@ -1519,11 +1530,13 @@ tmpTab.MaxRowsLow = (Uint32)(impl.m_max_rows & 0xFFFFFFFF); tmpTab.MinRowsHigh = (Uint32)(impl.m_min_rows >> 32); tmpTab.MinRowsLow = (Uint32)(impl.m_min_rows & 0xFFFFFFFF); - + Uint64 maxRows = (((Uint64)tmpTab.MaxRowsHigh) << 32) + tmpTab.MaxRowsLow; Uint64 minRows = (((Uint64)tmpTab.MinRowsHigh) << 32) + tmpTab.MinRowsLow; + + tmpTab.SingleUserMode = impl.m_single_user_mode; tmpTab.FragmentType = getKernelConstant(impl.m_fragmentType, fragmentTypeMapping, --- 1.41/ndb/src/ndbapi/NdbDictionaryImpl.hpp 2006-12-23 20:04:18 +01:00 +++ 1.42/ndb/src/ndbapi/NdbDictionaryImpl.hpp 2007-03-23 13:51:55 +01:00 @@ -138,6 +138,7 @@ int m_maxLoadFactor; Uint16 m_keyLenInWords; Uint16 m_fragmentCount; + Uint8 m_single_user_mode; NdbDictionaryImpl * m_dictionary; NdbIndexImpl * m_index; --- 1.9/ndb/test/src/NDBT_Table.cpp 2006-12-23 20:04:22 +01:00 +++ 1.10/ndb/test/src/NDBT_Table.cpp 2007-03-23 13:51:56 +01:00 @@ -31,7 +31,7 @@ ndbout << "Number of attributes: " << tab.getNoOfColumns() << endl; ndbout << "Number of primary keys: " << tab.getNoOfPrimaryKeys() << endl; ndbout << "Length of frm data: " << tab.getFrmLength() << endl; - + ndbout << "SingleUserMode: " << tab.getSingleUserMode() << endl; //<< ((tab.getTupleKey() == TupleId) ? " tupleid" : "") <