mirror of
https://github.com/MariaDB/server.git
synced 2025-01-18 04:53:01 +01:00
bug#5702
more bug fixes. ndb/src/kernel/blocks/dbdict/Dbdict.cpp: DropIndex - 1) return Invalid version 2) Mark as IS_DROPPING so that 2 simulatainious threads can't drop it ndb/src/ndbapi/NdbDictionary.cpp: Changed listIndex from taking table name to taking table id (should be index version aswell) ndb/src/ndbapi/NdbDictionaryImpl.cpp: List indexes using id Fix log towards m_globalHash ndb/src/ndbapi/NdbDictionaryImpl.hpp: List indexes using tableid (indexid)
This commit is contained in:
parent
2d4abfcae5
commit
339d362dd7
4 changed files with 56 additions and 26 deletions
|
@ -4538,6 +4538,15 @@ void Dbdict::handleTabInfoInit(SimpleProperties::Reader & it,
|
|||
parseP->errorLine = __LINE__;
|
||||
return;
|
||||
}
|
||||
|
||||
if(parseP->requestType == DictTabInfo::AlterTableFromAPI)
|
||||
{
|
||||
ndbrequire(!checkExist);
|
||||
}
|
||||
if(!checkExist)
|
||||
{
|
||||
ndbrequire(parseP->requestType == DictTabInfo::AlterTableFromAPI);
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------- */
|
||||
// Verify that table name is an allowed table name.
|
||||
|
@ -4633,12 +4642,10 @@ void Dbdict::handleTabInfoInit(SimpleProperties::Reader & it,
|
|||
strcpy(tablePtr.p->tableName, keyRecord.tableName);
|
||||
if (parseP->requestType != DictTabInfo::AlterTableFromAPI) {
|
||||
jam();
|
||||
c_tableRecordHash.add(tablePtr);
|
||||
}
|
||||
|
||||
#ifdef VM_TRACE
|
||||
ndbout_c("Dbdict: name=%s,id=%u", tablePtr.p->tableName, tablePtr.i);
|
||||
ndbout_c("Dbdict: name=%s,id=%u", tablePtr.p->tableName, tablePtr.i);
|
||||
#endif
|
||||
}
|
||||
|
||||
//tablePtr.p->noOfPrimkey = tableDesc.NoOfKeyAttr;
|
||||
//tablePtr.p->noOfNullAttr = tableDesc.NoOfNullable;
|
||||
|
@ -4677,11 +4684,12 @@ void Dbdict::handleTabInfoInit(SimpleProperties::Reader & it,
|
|||
|
||||
handleTabInfo(it, parseP);
|
||||
|
||||
if(parseP->errorCode != 0){
|
||||
if(parseP->errorCode != 0)
|
||||
{
|
||||
/**
|
||||
* Release table
|
||||
*/
|
||||
releaseTableObject(tablePtr.i);
|
||||
releaseTableObject(tablePtr.i, !checkExist);
|
||||
}
|
||||
}//handleTabInfoInit()
|
||||
|
||||
|
@ -6563,14 +6571,28 @@ Dbdict::execDROP_INDX_REQ(Signal* signal)
|
|||
int res = getMetaTablePtr(tmp, indexId, indexVersion);
|
||||
switch(res){
|
||||
case MetaData::InvalidArgument:
|
||||
case MetaData::TableNotFound:
|
||||
err = DropTableRef::NoSuchTable;
|
||||
err = DropIndxRef::IndexNotFound;
|
||||
goto error;
|
||||
case MetaData::TableNotFound:
|
||||
case MetaData::InvalidTableVersion:
|
||||
err = DropIndxRef::InvalidIndexVersion;
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (! tmp.p->isIndex()) {
|
||||
jam();
|
||||
err = DropIndxRef::NotAnIndex;
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (tmp.p->indexState == TableRecord::IS_DROPPING){
|
||||
jam();
|
||||
err = DropIndxRef::IndexNotFound;
|
||||
goto error;
|
||||
}
|
||||
|
||||
tmp.p->indexState = TableRecord::IS_DROPPING;
|
||||
|
||||
req->setOpKey(++c_opRecordSequence);
|
||||
NodeReceiverGroup rg(DBDICT, c_aliveNodes);
|
||||
sendSignal(rg, GSN_DROP_INDX_REQ,
|
||||
|
|
|
@ -856,7 +856,12 @@ NdbDictionary::Dictionary::listObjects(List& list, Object::Type type)
|
|||
int
|
||||
NdbDictionary::Dictionary::listIndexes(List& list, const char * tableName)
|
||||
{
|
||||
return m_impl.listIndexes(list, tableName);
|
||||
const NdbDictionary::Table* tab= getTable(tableName);
|
||||
if(tab == 0)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
return m_impl.listIndexes(list, tab->getTableId());
|
||||
}
|
||||
|
||||
const struct NdbError &
|
||||
|
|
|
@ -1407,16 +1407,15 @@ int NdbDictionaryImpl::alterTable(NdbTableImpl &impl)
|
|||
// Remove cached information and let it be refreshed at next access
|
||||
if (m_localHash.get(originalInternalName) != NULL) {
|
||||
m_localHash.drop(originalInternalName);
|
||||
m_globalHash->lock();
|
||||
NdbTableImpl * cachedImpl = m_globalHash->get(originalInternalName);
|
||||
// If in local cache it must be in global
|
||||
if (!cachedImpl)
|
||||
abort();
|
||||
m_globalHash->lock();
|
||||
m_globalHash->drop(cachedImpl);
|
||||
m_globalHash->unlock();
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -1714,6 +1713,7 @@ NdbDictionaryImpl::dropTable(const char * name)
|
|||
int
|
||||
NdbDictionaryImpl::dropTable(NdbTableImpl & impl)
|
||||
{
|
||||
int res;
|
||||
const char * name = impl.getName();
|
||||
if(impl.m_status == NdbDictionary::Object::New){
|
||||
return dropTable(name);
|
||||
|
@ -1725,28 +1725,34 @@ NdbDictionaryImpl::dropTable(NdbTableImpl & impl)
|
|||
}
|
||||
|
||||
List list;
|
||||
if (listIndexes(list, name) == -1)
|
||||
if ((res = listIndexes(list, impl.m_tableId)) == -1){
|
||||
return -1;
|
||||
}
|
||||
for (unsigned i = 0; i < list.count; i++) {
|
||||
const List::Element& element = list.elements[i];
|
||||
if (dropIndex(element.name, name) == -1)
|
||||
if ((res = dropIndex(element.name, name)) == -1)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (impl.m_noOfBlobs != 0) {
|
||||
if (dropBlobTables(impl) != 0)
|
||||
if (dropBlobTables(impl) != 0){
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int ret = m_receiver.dropTable(impl);
|
||||
if(ret == 0){
|
||||
if(ret == 0 || m_error.code == 709){
|
||||
const char * internalTableName = impl.m_internalName.c_str();
|
||||
|
||||
|
||||
m_localHash.drop(internalTableName);
|
||||
|
||||
m_globalHash->lock();
|
||||
m_globalHash->drop(&impl);
|
||||
m_globalHash->unlock();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
@ -1762,8 +1768,9 @@ NdbDictionaryImpl::dropBlobTables(NdbTableImpl & t)
|
|||
char btname[NdbBlob::BlobTableNameSize];
|
||||
NdbBlob::getBlobTableName(btname, &t, &c);
|
||||
if (dropTable(btname) != 0) {
|
||||
if (m_error.code != 709)
|
||||
if (m_error.code != 709){
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
|
@ -2132,7 +2139,6 @@ NdbDictionaryImpl::dropIndex(NdbIndexImpl & impl, const char * tableName)
|
|||
m_globalHash->drop(impl.m_table);
|
||||
m_globalHash->unlock();
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -2816,14 +2822,11 @@ NdbDictionaryImpl::listObjects(List& list, NdbDictionary::Object::Type type)
|
|||
}
|
||||
|
||||
int
|
||||
NdbDictionaryImpl::listIndexes(List& list, const char * tableName)
|
||||
NdbDictionaryImpl::listIndexes(List& list, Uint32 indexId)
|
||||
{
|
||||
ListTablesReq req;
|
||||
NdbTableImpl* impl = getTable(tableName);
|
||||
if (impl == 0)
|
||||
return -1;
|
||||
req.requestData = 0;
|
||||
req.setTableId(impl->m_tableId);
|
||||
req.setTableId(indexId);
|
||||
req.setListNames(true);
|
||||
req.setListIndexes(true);
|
||||
return m_receiver.listObjects(list, req.requestData, m_ndb.usingFullyQualifiedNames());
|
||||
|
|
|
@ -390,7 +390,7 @@ public:
|
|||
int stopSubscribeEvent(NdbEventImpl &);
|
||||
|
||||
int listObjects(List& list, NdbDictionary::Object::Type type);
|
||||
int listIndexes(List& list, const char * tableName);
|
||||
int listIndexes(List& list, Uint32 indexId);
|
||||
|
||||
NdbTableImpl * getTable(const char * tableName, void **data= 0);
|
||||
Ndb_local_table_info * get_local_table_info(const char * internalName);
|
||||
|
|
Loading…
Reference in a new issue