Commit 339d362d authored by unknown's avatar unknown

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)
parent 2d4abfca
...@@ -4539,6 +4539,15 @@ void Dbdict::handleTabInfoInit(SimpleProperties::Reader & it, ...@@ -4539,6 +4539,15 @@ void Dbdict::handleTabInfoInit(SimpleProperties::Reader & it,
return; return;
} }
if(parseP->requestType == DictTabInfo::AlterTableFromAPI)
{
ndbrequire(!checkExist);
}
if(!checkExist)
{
ndbrequire(parseP->requestType == DictTabInfo::AlterTableFromAPI);
}
/* ---------------------------------------------------------------- */ /* ---------------------------------------------------------------- */
// Verify that table name is an allowed table name. // Verify that table name is an allowed table name.
// TODO // TODO
...@@ -4633,12 +4642,10 @@ void Dbdict::handleTabInfoInit(SimpleProperties::Reader & it, ...@@ -4633,12 +4642,10 @@ void Dbdict::handleTabInfoInit(SimpleProperties::Reader & it,
strcpy(tablePtr.p->tableName, keyRecord.tableName); strcpy(tablePtr.p->tableName, keyRecord.tableName);
if (parseP->requestType != DictTabInfo::AlterTableFromAPI) { if (parseP->requestType != DictTabInfo::AlterTableFromAPI) {
jam(); jam();
c_tableRecordHash.add(tablePtr);
}
#ifdef VM_TRACE #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 #endif
}
//tablePtr.p->noOfPrimkey = tableDesc.NoOfKeyAttr; //tablePtr.p->noOfPrimkey = tableDesc.NoOfKeyAttr;
//tablePtr.p->noOfNullAttr = tableDesc.NoOfNullable; //tablePtr.p->noOfNullAttr = tableDesc.NoOfNullable;
...@@ -4677,11 +4684,12 @@ void Dbdict::handleTabInfoInit(SimpleProperties::Reader & it, ...@@ -4677,11 +4684,12 @@ void Dbdict::handleTabInfoInit(SimpleProperties::Reader & it,
handleTabInfo(it, parseP); handleTabInfo(it, parseP);
if(parseP->errorCode != 0){ if(parseP->errorCode != 0)
{
/** /**
* Release table * Release table
*/ */
releaseTableObject(tablePtr.i); releaseTableObject(tablePtr.i, !checkExist);
} }
}//handleTabInfoInit() }//handleTabInfoInit()
...@@ -6563,14 +6571,28 @@ Dbdict::execDROP_INDX_REQ(Signal* signal) ...@@ -6563,14 +6571,28 @@ Dbdict::execDROP_INDX_REQ(Signal* signal)
int res = getMetaTablePtr(tmp, indexId, indexVersion); int res = getMetaTablePtr(tmp, indexId, indexVersion);
switch(res){ switch(res){
case MetaData::InvalidArgument: case MetaData::InvalidArgument:
case MetaData::TableNotFound: err = DropIndxRef::IndexNotFound;
err = DropTableRef::NoSuchTable;
goto error; goto error;
case MetaData::TableNotFound:
case MetaData::InvalidTableVersion: case MetaData::InvalidTableVersion:
err = DropIndxRef::InvalidIndexVersion; err = DropIndxRef::InvalidIndexVersion;
goto error; 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); req->setOpKey(++c_opRecordSequence);
NodeReceiverGroup rg(DBDICT, c_aliveNodes); NodeReceiverGroup rg(DBDICT, c_aliveNodes);
sendSignal(rg, GSN_DROP_INDX_REQ, sendSignal(rg, GSN_DROP_INDX_REQ,
......
...@@ -856,7 +856,12 @@ NdbDictionary::Dictionary::listObjects(List& list, Object::Type type) ...@@ -856,7 +856,12 @@ NdbDictionary::Dictionary::listObjects(List& list, Object::Type type)
int int
NdbDictionary::Dictionary::listIndexes(List& list, const char * tableName) 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 & const struct NdbError &
......
...@@ -1407,16 +1407,15 @@ int NdbDictionaryImpl::alterTable(NdbTableImpl &impl) ...@@ -1407,16 +1407,15 @@ int NdbDictionaryImpl::alterTable(NdbTableImpl &impl)
// Remove cached information and let it be refreshed at next access // Remove cached information and let it be refreshed at next access
if (m_localHash.get(originalInternalName) != NULL) { if (m_localHash.get(originalInternalName) != NULL) {
m_localHash.drop(originalInternalName); m_localHash.drop(originalInternalName);
m_globalHash->lock();
NdbTableImpl * cachedImpl = m_globalHash->get(originalInternalName); NdbTableImpl * cachedImpl = m_globalHash->get(originalInternalName);
// If in local cache it must be in global // If in local cache it must be in global
if (!cachedImpl) if (!cachedImpl)
abort(); abort();
m_globalHash->lock();
m_globalHash->drop(cachedImpl); m_globalHash->drop(cachedImpl);
m_globalHash->unlock(); m_globalHash->unlock();
} }
} }
return ret; return ret;
} }
...@@ -1714,6 +1713,7 @@ NdbDictionaryImpl::dropTable(const char * name) ...@@ -1714,6 +1713,7 @@ NdbDictionaryImpl::dropTable(const char * name)
int int
NdbDictionaryImpl::dropTable(NdbTableImpl & impl) NdbDictionaryImpl::dropTable(NdbTableImpl & impl)
{ {
int res;
const char * name = impl.getName(); const char * name = impl.getName();
if(impl.m_status == NdbDictionary::Object::New){ if(impl.m_status == NdbDictionary::Object::New){
return dropTable(name); return dropTable(name);
...@@ -1725,21 +1725,25 @@ NdbDictionaryImpl::dropTable(NdbTableImpl & impl) ...@@ -1725,21 +1725,25 @@ NdbDictionaryImpl::dropTable(NdbTableImpl & impl)
} }
List list; List list;
if (listIndexes(list, name) == -1) if ((res = listIndexes(list, impl.m_tableId)) == -1){
return -1; return -1;
}
for (unsigned i = 0; i < list.count; i++) { for (unsigned i = 0; i < list.count; i++) {
const List::Element& element = list.elements[i]; const List::Element& element = list.elements[i];
if (dropIndex(element.name, name) == -1) if ((res = dropIndex(element.name, name)) == -1)
{
return -1; return -1;
} }
}
if (impl.m_noOfBlobs != 0) { if (impl.m_noOfBlobs != 0) {
if (dropBlobTables(impl) != 0) if (dropBlobTables(impl) != 0){
return -1; return -1;
} }
}
int ret = m_receiver.dropTable(impl); int ret = m_receiver.dropTable(impl);
if(ret == 0){ if(ret == 0 || m_error.code == 709){
const char * internalTableName = impl.m_internalName.c_str(); const char * internalTableName = impl.m_internalName.c_str();
m_localHash.drop(internalTableName); m_localHash.drop(internalTableName);
...@@ -1747,6 +1751,8 @@ NdbDictionaryImpl::dropTable(NdbTableImpl & impl) ...@@ -1747,6 +1751,8 @@ NdbDictionaryImpl::dropTable(NdbTableImpl & impl)
m_globalHash->lock(); m_globalHash->lock();
m_globalHash->drop(&impl); m_globalHash->drop(&impl);
m_globalHash->unlock(); m_globalHash->unlock();
return 0;
} }
return ret; return ret;
...@@ -1762,10 +1768,11 @@ NdbDictionaryImpl::dropBlobTables(NdbTableImpl & t) ...@@ -1762,10 +1768,11 @@ NdbDictionaryImpl::dropBlobTables(NdbTableImpl & t)
char btname[NdbBlob::BlobTableNameSize]; char btname[NdbBlob::BlobTableNameSize];
NdbBlob::getBlobTableName(btname, &t, &c); NdbBlob::getBlobTableName(btname, &t, &c);
if (dropTable(btname) != 0) { if (dropTable(btname) != 0) {
if (m_error.code != 709) if (m_error.code != 709){
return -1; return -1;
} }
} }
}
return 0; return 0;
} }
...@@ -2132,7 +2139,6 @@ NdbDictionaryImpl::dropIndex(NdbIndexImpl & impl, const char * tableName) ...@@ -2132,7 +2139,6 @@ NdbDictionaryImpl::dropIndex(NdbIndexImpl & impl, const char * tableName)
m_globalHash->drop(impl.m_table); m_globalHash->drop(impl.m_table);
m_globalHash->unlock(); m_globalHash->unlock();
} }
return ret; return ret;
} }
...@@ -2816,14 +2822,11 @@ NdbDictionaryImpl::listObjects(List& list, NdbDictionary::Object::Type type) ...@@ -2816,14 +2822,11 @@ NdbDictionaryImpl::listObjects(List& list, NdbDictionary::Object::Type type)
} }
int int
NdbDictionaryImpl::listIndexes(List& list, const char * tableName) NdbDictionaryImpl::listIndexes(List& list, Uint32 indexId)
{ {
ListTablesReq req; ListTablesReq req;
NdbTableImpl* impl = getTable(tableName);
if (impl == 0)
return -1;
req.requestData = 0; req.requestData = 0;
req.setTableId(impl->m_tableId); req.setTableId(indexId);
req.setListNames(true); req.setListNames(true);
req.setListIndexes(true); req.setListIndexes(true);
return m_receiver.listObjects(list, req.requestData, m_ndb.usingFullyQualifiedNames()); return m_receiver.listObjects(list, req.requestData, m_ndb.usingFullyQualifiedNames());
......
...@@ -390,7 +390,7 @@ public: ...@@ -390,7 +390,7 @@ public:
int stopSubscribeEvent(NdbEventImpl &); int stopSubscribeEvent(NdbEventImpl &);
int listObjects(List& list, NdbDictionary::Object::Type type); 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); NdbTableImpl * getTable(const char * tableName, void **data= 0);
Ndb_local_table_info * get_local_table_info(const char * internalName); Ndb_local_table_info * get_local_table_info(const char * internalName);
......
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