Merge whalegate.ndb.mysql.com:/home/tomas/mysql-5.0-telco-gca-single-user

into  whalegate.ndb.mysql.com:/home/tomas/mysql-5.1-telco-gca-single-user
This commit is contained in:
tomas@whalegate.ndb.mysql.com 2007-03-23 14:06:00 +01:00
commit 9899df36bd
13 changed files with 141 additions and 41 deletions

View file

@ -140,6 +140,8 @@ public:
RowGCIFlag = 150,
RowChecksumFlag = 151,
SingleUserMode = 152,
TableEnd = 999,
AttributeName = 1000, // String, Mandatory
@ -344,6 +346,7 @@ public:
Uint32 RowGCIFlag;
Uint32 RowChecksumFlag;
Uint32 SingleUserMode;
Table() {}
void init();

View file

@ -89,5 +89,12 @@
*/
#define NDB_TEMP_TAB_PERMANENT 0
#define NDB_TEMP_TAB_TEMPORARY 1
/*
* Table single user mode
*/
#define NDB_SUM_LOCKED 0
#define NDB_SUM_READONLY 1
#define NDB_SUM_READ_WRITE 2
#endif

View file

@ -576,6 +576,15 @@ public:
*/
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
* @{
@ -895,6 +904,13 @@ public:
void setMinRows(Uint64 minRows);
Uint64 getMinRows() const;
/**
* Set/Get SingleUserMode
*/
void setSingleUserMode(enum SingleUserMode);
enum SingleUserMode getSingleUserMode() const;
/** @} *******************************************************************/
/**

View file

@ -66,6 +66,7 @@ DictTabInfo::TableMapping[] = {
DTIMAP(Table, MaxRowsHigh, MaxRowsHigh),
DTIMAP(Table, MinRowsLow, MinRowsLow),
DTIMAP(Table, MinRowsHigh, MinRowsHigh),
DTIMAP(Table, SingleUserMode, SingleUserMode),
DTIBREAK(AttributeName)
};
@ -164,6 +165,8 @@ DictTabInfo::Table::init(){
MaxRowsHigh = 0;
MinRowsLow = 0;
MinRowsHigh = 0;
SingleUserMode = 0;
}
void

View file

@ -462,6 +462,7 @@ Dbdict::packTableIntoPages(SimpleProperties::Writer & w,
w.add(DictTabInfo::FragmentCount, tablePtr.p->fragmentCount);
w.add(DictTabInfo::MinRowsLow, tablePtr.p->minRowsLow);
w.add(DictTabInfo::MinRowsHigh, tablePtr.p->minRowsHigh);
w.add(DictTabInfo::SingleUserMode, tablePtr.p->singleUserMode);
if(signal)
{
@ -1873,6 +1874,7 @@ void Dbdict::initialiseTableRecord(TableRecordPtr tablePtr)
tablePtr.p->m_bits = 0;
tablePtr.p->minRowsLow = 0;
tablePtr.p->minRowsHigh = 0;
tablePtr.p->singleUserMode = 0;
tablePtr.p->tableType = DictTabInfo::UserTable;
tablePtr.p->primaryTableId = RNIL;
// volatile elements
@ -5706,7 +5708,9 @@ Dbdict::execTAB_COMMITCONF(Signal* signal){
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;
}
@ -6136,6 +6140,7 @@ void Dbdict::handleTabInfoInit(SimpleProperties::Reader & it,
tablePtr.p->minRowsHigh = c_tableDesc.MinRowsHigh;
tablePtr.p->defaultNoPartFlag = c_tableDesc.DefaultNoPartFlag;
tablePtr.p->linearHashFlag = c_tableDesc.LinearHashFlag;
tablePtr.p->singleUserMode = tableDesc.SingleUserMode;
Uint64 maxRows =
(((Uint64)tablePtr.p->maxRowsHigh) << 32) + tablePtr.p->maxRowsLow;

View file

@ -375,6 +375,11 @@ public:
Uint32 fragmentCount;
Uint32 m_tablespace_id;
/*
* Access rights to table during single user mode
*/
Uint8 singleUserMode;
};
typedef Ptr<TableRecord> TableRecordPtr;

View file

@ -709,6 +709,7 @@ public:
Uint8 tckeyrec; // Ändrad från R
Uint8 tcindxrec;
Uint8 apiFailState; // Ändrad från R
Uint8 singleUserMode;
ReturnSignal returnsignal;
Uint8 timeOutCounter;
@ -959,10 +960,21 @@ public:
/********************************************************/
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;
@ -970,7 +982,7 @@ public:
Uint8 hasVarKeys;
bool checkTable(Uint32 schemaVersion) const {
return enabled && !dropping &&
return get_enabled() && !get_dropping() &&
(table_version_major(schemaVersion) == table_version_major(currentSchemaVersion));
}
@ -1837,10 +1849,10 @@ private:
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;

View file

@ -330,19 +330,21 @@ void Dbtc::execTC_SCHVERREQ(Signal* signal)
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;
@ -366,7 +368,7 @@ Dbtc::execPREP_DROP_TAB_REQ(Signal* signal)
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();
@ -378,7 +380,7 @@ Dbtc::execPREP_DROP_TAB_REQ(Signal* signal)
return;
}
if(tabPtr.p->dropping){
if(tabPtr.p->get_dropping()){
jam();
PrepDropTabRef* ref = (PrepDropTabRef*)signal->getDataPtrSend();
ref->senderRef = reference();
@ -390,7 +392,7 @@ Dbtc::execPREP_DROP_TAB_REQ(Signal* signal)
return;
}
tabPtr.p->dropping = true;
tabPtr.p->set_dropping(true);
tabPtr.p->dropTable.senderRef = senderRef;
tabPtr.p->dropTable.senderData = senderData;
@ -426,7 +428,7 @@ Dbtc::execWAIT_DROP_TAB_CONF(Signal* signal)
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);
@ -456,7 +458,7 @@ Dbtc::execWAIT_DROP_TAB_REF(Signal* signal)
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);
@ -493,7 +495,7 @@ Dbtc::checkWaitDropTabFailedLqh(Signal* signal, Uint32 nodeId, Uint32 tableId)
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);
@ -534,7 +536,7 @@ Dbtc::execDROP_TAB_REQ(Signal* signal)
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();
@ -546,7 +548,7 @@ Dbtc::execDROP_TAB_REQ(Signal* signal)
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();
@ -558,8 +560,8 @@ Dbtc::execDROP_TAB_REQ(Signal* signal)
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;
@ -1217,8 +1219,7 @@ void Dbtc::execTCSEIZEREQ(Signal* signal)
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:
@ -1228,9 +1229,6 @@ void Dbtc::execTCSEIZEREQ(Signal* signal)
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;
@ -2402,6 +2400,7 @@ void Dbtc::initApiConnectRec(Signal* signal,
regApiPtr->buddyPtr = RNIL;
regApiPtr->currSavePointId = 0;
regApiPtr->m_transaction_nodes.clear();
regApiPtr->singleUserMode = 0;
// Trigger data
releaseFiredTriggerData(&regApiPtr->theFiredTriggers),
// Index data
@ -2555,9 +2554,12 @@ void Dbtc::execTCKEYREQ(Signal* signal)
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.
//---------------------------------------------------------------------
@ -2565,7 +2567,7 @@ void Dbtc::execTCKEYREQ(Signal* signal)
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
@ -2592,6 +2594,13 @@ void Dbtc::execTCKEYREQ(Signal* signal)
* 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 {
@ -2612,6 +2621,10 @@ void Dbtc::execTCKEYREQ(Signal* signal)
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.
@ -2675,9 +2688,6 @@ void Dbtc::execTCKEYREQ(Signal* signal)
return;
}//switch
TableRecordPtr localTabptr;
localTabptr.i = TtabIndex;
localTabptr.p = &tableRecord[TtabIndex];
if (localTabptr.p->checkTable(tcKeyReq->tableSchemaVersion)) {
;
} else {
@ -2736,6 +2746,8 @@ void Dbtc::execTCKEYREQ(Signal* signal)
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;
@ -2861,7 +2873,7 @@ void Dbtc::execTCKEYREQ(Signal* signal)
* 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;
@ -4694,6 +4706,7 @@ void Dbtc::copyApi(Signal* signal)
regApiPtr->lqhkeyconfrec = Tlqhkeyconfrec;
regApiPtr->commitAckMarker = TcommitAckMarker;
regApiPtr->m_transaction_nodes = Tnodes;
regApiPtr->singleUserMode = 0;
gcpPtr.i = TgcpPointer;
ptrCheckGuard(gcpPtr, TgcpFilesize, localGcpRecord);
@ -4705,6 +4718,7 @@ void Dbtc::copyApi(Signal* signal)
regTmpApiPtr->firstTcConnect = RNIL;
regTmpApiPtr->lastTcConnect = RNIL;
regTmpApiPtr->m_transaction_nodes.clear();
regTmpApiPtr->singleUserMode = 0;
releaseAllSeizedIndexOperations(regTmpApiPtr);
}//Dbtc::copyApi()
@ -6224,8 +6238,9 @@ void Dbtc::timeOutLoopStartLab(Signal* signal, Uint32 api_con_ptr)
{
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=
@ -8160,6 +8175,7 @@ void Dbtc::initApiConnectFail(Signal* signal)
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:
@ -10061,6 +10077,7 @@ void Dbtc::initApiConnect(Signal* signal)
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);
@ -10089,6 +10106,7 @@ void Dbtc::initApiConnect(Signal* signal)
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);
@ -10117,6 +10135,7 @@ void Dbtc::initApiConnect(Signal* signal)
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);
@ -10301,10 +10320,11 @@ void Dbtc::initTable(Signal* signal)
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;
@ -10438,6 +10458,7 @@ void Dbtc::releaseAbortResources(Signal* signal)
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
@ -11116,7 +11137,7 @@ void Dbtc::execABORT_ALL_REQ(Signal* signal)
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;
@ -13395,9 +13416,9 @@ void Dbtc::deleteFromIndexTable(Signal* signal,
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;

View file

@ -1685,6 +1685,7 @@ void Ndbcntr::createSystableLab(Signal* signal, unsigned index)
//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];

View file

@ -495,6 +495,18 @@ NdbDictionary::Table::getFrmLength() const {
return m_impl.getFrmLength();
}
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::setTablespaceNames(const void *data, Uint32 len)
{

View file

@ -470,6 +470,7 @@ NdbTableImpl::init(){
m_tablespace_name.clear();
m_tablespace_id = ~0;
m_tablespace_version = ~0;
m_single_user_mode = 0;
}
bool
@ -663,6 +664,15 @@ NdbTableImpl::equal(const NdbTableImpl& obj) const
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);
}
@ -726,6 +736,8 @@ NdbTableImpl::assign(const NdbTableImpl& org)
m_keyLenInWords = org.m_keyLenInWords;
m_fragmentCount = org.m_fragmentCount;
m_single_user_mode = org.m_single_user_mode;
if (m_index != 0)
delete m_index;
m_index = org.m_index;
@ -2101,6 +2113,7 @@ NdbDictInterface::parseTableInfo(NdbTableImpl ** ret,
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::Object::Type)
getApiConstant(tableDesc->TableType,
@ -2562,6 +2575,7 @@ NdbDictInterface::createOrAlterTable(Ndb & ndb,
tmpTab->MinRowsLow = (Uint32)(impl.m_min_rows & 0xFFFFFFFF);
tmpTab->DefaultNoPartFlag = impl.m_default_no_part_flag;
tmpTab->LinearHashFlag = impl.m_linear_flag;
tmpTab->SingleUserMode = impl.m_single_user_mode;
if (impl.m_ts_name.length())
{

View file

@ -204,6 +204,7 @@ public:
int m_maxLoadFactor;
Uint16 m_keyLenInWords;
Uint16 m_fragmentCount;
Uint8 m_single_user_mode;
NdbIndexImpl * m_index;
NdbColumnImpl * getColumn(unsigned attrId);

View file

@ -33,7 +33,7 @@ operator <<(class NdbOut& ndbout, const NDBT_Table & tab)
ndbout << "Length of frm data: " << tab.getFrmLength() << endl;
ndbout << "Row Checksum: " << tab.getRowChecksumIndicator() << endl;
ndbout << "Row GCI: " << tab.getRowGCIIndicator() << endl;
ndbout << "SingleUserMode: " << tab.getSingleUserMode() << endl;
//<< ((tab.getTupleKey() == TupleId) ? " tupleid" : "") <<endl;
ndbout << "TableStatus: ";