mirror of
https://github.com/MariaDB/server.git
synced 2025-01-30 02:30:06 +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__;
|
parseP->errorLine = __LINE__;
|
||||||
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.
|
||||||
|
@ -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,
|
||||||
|
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
// 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)
|
||||||
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,28 +1725,34 @@ 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);
|
||||||
|
|
||||||
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,8 +1768,9 @@ 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)
|
||||||
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)
|
||||||
}
|
}
|
||||||
|
|
||||||
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:
|
||||||
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);
|
||||||
|
|
Loading…
Add table
Reference in a new issue