Commit e7508ad3 authored by pekka@orca.ndb.mysql.com's avatar pekka@orca.ndb.mysql.com

Merge orca.ndb.mysql.com:/export/home/space/pekka/ndb/version/my50-bug21017

into  orca.ndb.mysql.com:/export/home/space/pekka/ndb/version/my51-bug21017
parents d170f1b1 1b6f2f1c
...@@ -192,6 +192,7 @@ public: ...@@ -192,6 +192,7 @@ public:
enum ErrorCode { enum ErrorCode {
NoError = 0, NoError = 0,
Busy = 701, Busy = 701,
BusyWithNR = 711,
NotMaster = 702, NotMaster = 702,
IndexOnDiskAttributeError = 756, IndexOnDiskAttributeError = 756,
TriggerNotFound = 4238, TriggerNotFound = 4238,
......
...@@ -168,6 +168,7 @@ public: ...@@ -168,6 +168,7 @@ public:
NoError = 0, NoError = 0,
InvalidIndexVersion = 241, InvalidIndexVersion = 241,
Busy = 701, Busy = 701,
BusyWithNR = 711,
NotMaster = 702, NotMaster = 702,
IndexNotFound = 4243, IndexNotFound = 4243,
BadRequestType = 4247, BadRequestType = 4247,
......
...@@ -7584,9 +7584,18 @@ Dbdict::execCREATE_INDX_REQ(Signal* signal) ...@@ -7584,9 +7584,18 @@ Dbdict::execCREATE_INDX_REQ(Signal* signal)
} }
if (signal->getLength() == CreateIndxReq::SignalLength) { if (signal->getLength() == CreateIndxReq::SignalLength) {
jam(); jam();
CreateIndxRef::ErrorCode tmperr = CreateIndxRef::NoError;
if (getOwnNodeId() != c_masterNodeId) { if (getOwnNodeId() != c_masterNodeId) {
jam(); jam();
tmperr = CreateIndxRef::NotMaster;
} else if (c_blockState == BS_NODE_RESTART) {
jam();
tmperr = CreateIndxRef::BusyWithNR;
} else if (c_blockState != BS_IDLE) {
jam();
tmperr = CreateIndxRef::Busy;
}
if (tmperr != CreateIndxRef::NoError) {
releaseSections(signal); releaseSections(signal);
OpCreateIndex opBusy; OpCreateIndex opBusy;
opPtr.p = &opBusy; opPtr.p = &opBusy;
...@@ -7594,13 +7603,12 @@ Dbdict::execCREATE_INDX_REQ(Signal* signal) ...@@ -7594,13 +7603,12 @@ Dbdict::execCREATE_INDX_REQ(Signal* signal)
opPtr.p->m_isMaster = (senderRef == reference()); opPtr.p->m_isMaster = (senderRef == reference());
opPtr.p->key = 0; opPtr.p->key = 0;
opPtr.p->m_requestType = CreateIndxReq::RT_DICT_PREPARE; opPtr.p->m_requestType = CreateIndxReq::RT_DICT_PREPARE;
opPtr.p->m_errorCode = CreateIndxRef::NotMaster; opPtr.p->m_errorCode = tmperr;
opPtr.p->m_errorLine = __LINE__; opPtr.p->m_errorLine = __LINE__;
opPtr.p->m_errorNode = c_masterNodeId; opPtr.p->m_errorNode = c_masterNodeId;
createIndex_sendReply(signal, opPtr, true); createIndex_sendReply(signal, opPtr, true);
return; return;
} }
// forward initial request plus operation key to all // forward initial request plus operation key to all
req->setOpKey(++c_opRecordSequence); req->setOpKey(++c_opRecordSequence);
NodeReceiverGroup rg(DBDICT, c_aliveNodes); NodeReceiverGroup rg(DBDICT, c_aliveNodes);
...@@ -8185,10 +8193,19 @@ Dbdict::execDROP_INDX_REQ(Signal* signal) ...@@ -8185,10 +8193,19 @@ Dbdict::execDROP_INDX_REQ(Signal* signal)
jam(); jam();
if (signal->getLength() == DropIndxReq::SignalLength) { if (signal->getLength() == DropIndxReq::SignalLength) {
jam(); jam();
DropIndxRef::ErrorCode tmperr = DropIndxRef::NoError;
if (getOwnNodeId() != c_masterNodeId) { if (getOwnNodeId() != c_masterNodeId) {
jam(); jam();
tmperr = DropIndxRef::NotMaster;
err = DropIndxRef::NotMaster; } else if (c_blockState == BS_NODE_RESTART) {
jam();
tmperr = DropIndxRef::BusyWithNR;
} else if (c_blockState != BS_IDLE) {
jam();
tmperr = DropIndxRef::Busy;
}
if (tmperr != DropIndxRef::NoError) {
err = tmperr;
goto error; goto error;
} }
// forward initial request plus operation key to all // forward initial request plus operation key to all
...@@ -13491,6 +13508,17 @@ Dbdict::execDICT_LOCK_REQ(Signal* signal) ...@@ -13491,6 +13508,17 @@ Dbdict::execDICT_LOCK_REQ(Signal* signal)
sendDictLockInfoEvent(lockPtr, "lock request by node"); sendDictLockInfoEvent(lockPtr, "lock request by node");
} }
// only table and index ops are checked
bool
Dbdict::hasDictLockSchemaOp()
{
return
! c_opCreateTable.isEmpty() ||
! c_opDropTable.isEmpty() ||
! c_opCreateIndex.isEmpty() ||
! c_opDropIndex.isEmpty();
}
void void
Dbdict::checkDictLockQueue(Signal* signal, bool poll) Dbdict::checkDictLockQueue(Signal* signal, bool poll)
{ {
...@@ -13511,7 +13539,7 @@ Dbdict::checkDictLockQueue(Signal* signal, bool poll) ...@@ -13511,7 +13539,7 @@ Dbdict::checkDictLockQueue(Signal* signal, bool poll)
break; break;
} }
if (c_opRecordPool.getNoOfFree() != c_opRecordPool.getSize()) { if (hasDictLockSchemaOp()) {
jam(); jam();
break; break;
} }
...@@ -13544,7 +13572,7 @@ Dbdict::execDICT_UNLOCK_ORD(Signal* signal) ...@@ -13544,7 +13572,7 @@ Dbdict::execDICT_UNLOCK_ORD(Signal* signal)
if (lockPtr.p->locked) { if (lockPtr.p->locked) {
jam(); jam();
ndbrequire(c_blockState == lockPtr.p->lt->blockState); ndbrequire(c_blockState == lockPtr.p->lt->blockState);
ndbrequire(c_opRecordPool.getNoOfFree() == c_opRecordPool.getSize()); ndbrequire(! hasDictLockSchemaOp());
ndbrequire(! c_dictLockQueue.hasPrev(lockPtr)); ndbrequire(! c_dictLockQueue.hasPrev(lockPtr));
c_blockState = BS_IDLE; c_blockState = BS_IDLE;
...@@ -13640,7 +13668,7 @@ Dbdict::removeStaleDictLocks(Signal* signal, const Uint32* theFailedNodes) ...@@ -13640,7 +13668,7 @@ Dbdict::removeStaleDictLocks(Signal* signal, const Uint32* theFailedNodes)
if (lockPtr.p->locked) { if (lockPtr.p->locked) {
jam(); jam();
ndbrequire(c_blockState == lockPtr.p->lt->blockState); ndbrequire(c_blockState == lockPtr.p->lt->blockState);
ndbrequire(c_opRecordPool.getNoOfFree() == c_opRecordPool.getSize()); ndbrequire(! hasDictLockSchemaOp());
ndbrequire(! c_dictLockQueue.hasPrev(lockPtr)); ndbrequire(! c_dictLockQueue.hasPrev(lockPtr));
c_blockState = BS_IDLE; c_blockState = BS_IDLE;
......
...@@ -2107,6 +2107,9 @@ private: ...@@ -2107,6 +2107,9 @@ private:
void sendDictLockInfoEvent(Uint32 pollCount); void sendDictLockInfoEvent(Uint32 pollCount);
void sendDictLockInfoEvent(DictLockPtr lockPtr, const char* text); void sendDictLockInfoEvent(DictLockPtr lockPtr, const char* text);
// check if any schema op exists (conflicting with dict lock)
bool hasDictLockSchemaOp();
void checkDictLockQueue(Signal* signal, bool poll); void checkDictLockQueue(Signal* signal, bool poll);
void sendDictLockConf(Signal* signal, DictLockPtr lockPtr); void sendDictLockConf(Signal* signal, DictLockPtr lockPtr);
void sendDictLockRef(Signal* signal, DictLockReq req, Uint32 errorCode); void sendDictLockRef(Signal* signal, DictLockReq req, Uint32 errorCode);
......
...@@ -147,6 +147,8 @@ public: ...@@ -147,6 +147,8 @@ public:
*/ */
bool next(Uint32 bucket, Iterator & iter) const; bool next(Uint32 bucket, Iterator & iter) const;
inline bool isEmpty() const { Iterator iter; return ! first(iter); }
private: private:
Uint32 mask; Uint32 mask;
Uint32 * hashValues; Uint32 * hashValues;
......
...@@ -44,6 +44,8 @@ public: ...@@ -44,6 +44,8 @@ public:
static const NdbDictionary::Table* getTable(int _num); static const NdbDictionary::Table* getTable(int _num);
static int getNumTables(); static int getNumTables();
static const char** getIndexes(const char* table);
static int create_default_tablespace(Ndb* pNdb); static int create_default_tablespace(Ndb* pNdb);
private: private:
......
...@@ -1022,8 +1022,8 @@ int verifyTablesAreEqual(const NdbDictionary::Table* pTab, const NdbDictionary:: ...@@ -1022,8 +1022,8 @@ int verifyTablesAreEqual(const NdbDictionary::Table* pTab, const NdbDictionary::
if (!pTab->equal(*pTab2)){ if (!pTab->equal(*pTab2)){
g_err << "equal failed" << endl; g_err << "equal failed" << endl;
g_info << *pTab; g_info << *(NDBT_Table*)pTab; // gcc-4.1.2
g_info << *pTab2; g_info << *(NDBT_Table*)pTab2;
return NDBT_FAILED; return NDBT_FAILED;
} }
return NDBT_OK; return NDBT_OK;
...@@ -1033,7 +1033,7 @@ int runGetPrimaryKey(NDBT_Context* ctx, NDBT_Step* step){ ...@@ -1033,7 +1033,7 @@ int runGetPrimaryKey(NDBT_Context* ctx, NDBT_Step* step){
Ndb* pNdb = GETNDB(step); Ndb* pNdb = GETNDB(step);
const NdbDictionary::Table* pTab = ctx->getTab(); const NdbDictionary::Table* pTab = ctx->getTab();
ndbout << "|- " << pTab->getName() << endl; ndbout << "|- " << pTab->getName() << endl;
g_info << *pTab; g_info << *(NDBT_Table*)pTab;
// Try to create table in db // Try to create table in db
if (pTab->createTableInDb(pNdb) != 0){ if (pTab->createTableInDb(pNdb) != 0){
return NDBT_FAILED; return NDBT_FAILED;
...@@ -1985,7 +1985,53 @@ runDictOps(NDBT_Context* ctx, NDBT_Step* step) ...@@ -1985,7 +1985,53 @@ runDictOps(NDBT_Context* ctx, NDBT_Step* step)
// replace by the Retrieved table // replace by the Retrieved table
pTab = pTab2; pTab = pTab2;
int records = ctx->getNumRecords(); // create indexes
const char** indlist = NDBT_Tables::getIndexes(tabName);
uint indnum = 0;
while (*indlist != 0) {
uint count = 0;
try_create_index:
count++;
if (count == 1)
g_info << "2: create index " << indnum << " " << *indlist << endl;
NdbDictionary::Index ind;
char indName[200];
sprintf(indName, "%s_X%u", tabName, indnum);
ind.setName(indName);
ind.setTable(tabName);
if (strcmp(*indlist, "UNIQUE") == 0) {
ind.setType(NdbDictionary::Index::UniqueHashIndex);
ind.setLogging(pTab->getLogging());
} else if (strcmp(*indlist, "ORDERED") == 0) {
ind.setType(NdbDictionary::Index::OrderedIndex);
ind.setLogging(false);
} else {
assert(false);
}
const char** indtemp = indlist;
while (*++indtemp != 0) {
ind.addColumn(*indtemp);
}
if (pDic->createIndex(ind) != 0) {
const NdbError err = pDic->getNdbError();
if (count == 1)
g_err << "2: " << indName << ": create failed: " << err << endl;
if (err.code != 711) {
result = NDBT_FAILED;
break;
}
NdbSleep_MilliSleep(myRandom48(maxsleep));
goto try_create_index;
}
indlist = ++indtemp;
indnum++;
}
if (result == NDBT_FAILED)
break;
uint indcount = indnum;
int records = myRandom48(ctx->getNumRecords());
g_info << "2: load " << records << " records" << endl; g_info << "2: load " << records << " records" << endl;
HugoTransactions hugoTrans(*pTab); HugoTransactions hugoTrans(*pTab);
if (hugoTrans.loadTable(pNdb, records) != 0) { if (hugoTrans.loadTable(pNdb, records) != 0) {
...@@ -1996,6 +2042,32 @@ runDictOps(NDBT_Context* ctx, NDBT_Step* step) ...@@ -1996,6 +2042,32 @@ runDictOps(NDBT_Context* ctx, NDBT_Step* step)
} }
NdbSleep_MilliSleep(myRandom48(maxsleep)); NdbSleep_MilliSleep(myRandom48(maxsleep));
// drop indexes
indnum = 0;
while (indnum < indcount) {
uint count = 0;
try_drop_index:
count++;
if (count == 1)
g_info << "2: drop index " << indnum << endl;
char indName[200];
sprintf(indName, "%s_X%u", tabName, indnum);
if (pDic->dropIndex(indName, tabName) != 0) {
const NdbError err = pDic->getNdbError();
if (count == 1)
g_err << "2: " << indName << ": drop failed: " << err << endl;
if (err.code != 711) {
result = NDBT_FAILED;
break;
}
NdbSleep_MilliSleep(myRandom48(maxsleep));
goto try_drop_index;
}
indnum++;
}
if (result == NDBT_FAILED)
break;
g_info << "2: drop" << endl; g_info << "2: drop" << endl;
{ {
uint count = 0; uint count = 0;
......
...@@ -829,6 +829,17 @@ NDBT_Tables::getNumTables(){ ...@@ -829,6 +829,17 @@ NDBT_Tables::getNumTables(){
return numTestTables; return numTestTables;
} }
const char**
NDBT_Tables::getIndexes(const char* table)
{
Uint32 i = 0;
for (i = 0; indexes[i].m_table != 0; i++) {
if (strcmp(indexes[i].m_table, table) == 0)
return indexes[i].m_indexes;
}
return 0;
}
int int
NDBT_Tables::createAllTables(Ndb* pNdb, bool _temp, bool existsOk){ NDBT_Tables::createAllTables(Ndb* pNdb, bool _temp, bool existsOk){
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment