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<TableRecord> 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 tcindxrec;
+ 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; i<RT_BREAK && tabPtr.i < ctabrecFilesize; i++, tabPtr.i++){
jam();
ptrAss(tabPtr, tableRecord);
- if(tabPtr.p->enabled && 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" : "") <<endl;
ndbout << "TableStatus: ";
--- 1.11/ndb/include/ndb_constants.h 2006-12-23 20:04:08 +01:00
+++ 1.12/ndb/include/ndb_constants.h 2007-03-23 13:51:54 +01:00
@@ -68,4 +68,11 @@
#define NDB_TYPE_MAX 31
+/*
+ * Table single user mode
+ */
+#define NDB_SUM_LOCKED 0
+#define NDB_SUM_READONLY 1
+#define NDB_SUM_READ_WRITE 2
+
#endif
| Thread |
|---|
| • bk commit into 5.0 tree (tomas:1.2397) BUG#25275 | tomas | 23 Mar |