#At file:///home/jonas/src/telco-6.4/ based on revid:jonas@stripped
2959 Jonas Oreland 2009-08-05
ndb - bug#46494
Problem was that after an upgrade from 6.3, no default hashmap existed
Patch fixes this by always (silently) adding a "create default hashmap if not exists" to each
create table operation (which works perfectly thx to schema transactions)
Test is committed to 6.3, which as a post-upgrade-test will drop/recreate the table
@ storage/ndb/include/kernel/signaldata/CreateTable.hpp
fix unique error code for invalud hashmap
@ storage/ndb/src/common/debugger/signaldata/SignalNames.cpp
add signal names
@ storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp
implement
- CreateHashMapReq::CreateDefault
- CreateHashMapReq::CreateIfNotExists
@ storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp
always add a "create default hashmap if not exists" to a create-table
if it is hashmap-partitioned and has not specified a hashmap
@ storage/ndb/src/ndbapi/ndberror.c
new error code
modified:
storage/ndb/include/kernel/signaldata/CreateHashMap.hpp
storage/ndb/include/kernel/signaldata/CreateTable.hpp
storage/ndb/src/common/debugger/signaldata/SignalNames.cpp
storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp
storage/ndb/src/ndbapi/NdbDictionary.cpp
storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp
storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp
storage/ndb/src/ndbapi/ndberror.c
=== modified file 'storage/ndb/include/kernel/signaldata/CreateHashMap.hpp'
--- a/storage/ndb/include/kernel/signaldata/CreateHashMap.hpp 2008-06-02 13:27:27 +0000
+++ b/storage/ndb/include/kernel/signaldata/CreateHashMap.hpp 2009-08-05 10:48:56 +0000
@@ -21,9 +21,13 @@
struct CreateHashMapReq
{
- STATIC_CONST( SignalLength = 5 );
+ STATIC_CONST( SignalLength = 7 );
- enum RequestType {
+ enum RequestType
+ {
+ CreateIfNotExists = 1,
+ CreateDefault = 2,
+ CreateForReorg = 4
};
Uint32 clientRef;
=== modified file 'storage/ndb/include/kernel/signaldata/CreateTable.hpp'
--- a/storage/ndb/include/kernel/signaldata/CreateTable.hpp 2009-05-27 15:21:45 +0000
+++ b/storage/ndb/include/kernel/signaldata/CreateTable.hpp 2009-08-05 10:48:56 +0000
@@ -74,7 +74,8 @@ struct CreateTableRef {
NotATablespace = 758,
InvalidTablespaceVersion = 759,
OutOfStringBuffer = 773,
- NoLoggingTemporaryTable = 778
+ NoLoggingTemporaryTable = 778,
+ InvalidHashMap = 790
};
Uint32 senderRef;
=== modified file 'storage/ndb/src/common/debugger/signaldata/SignalNames.cpp'
--- a/storage/ndb/src/common/debugger/signaldata/SignalNames.cpp 2009-05-27 15:21:45 +0000
+++ b/storage/ndb/src/common/debugger/signaldata/SignalNames.cpp 2009-08-05 10:48:56 +0000
@@ -741,6 +741,8 @@ const GsnName SignalNames [] = {
,{ GSN_RELEASE_PAGES_REQ, "RELEASE_PAGES_REQ" }
,{ GSN_RELEASE_PAGES_CONF, "RELEASE_PAGES_CONF" }
-
+ ,{ GSN_CREATE_HASH_MAP_REQ, "CREATE_HASH_MAP_REQ" }
+ ,{ GSN_CREATE_HASH_MAP_REF, "CREATE_HASH_MAP_REF" }
+ ,{ GSN_CREATE_HASH_MAP_CONF, "CREATE_HASH_MAP_CONF" }
};
const unsigned short NO_OF_SIGNAL_NAMES = sizeof(SignalNames)/sizeof(GsnName);
=== modified file 'storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp'
--- a/storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp 2009-06-16 12:19:58 +0000
+++ b/storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp 2009-08-05 10:48:56 +0000
@@ -4553,10 +4553,10 @@ void Dbdict::handleTabInfoInit(SimplePro
jam();
HashMapPtr hm_ptr;
tabRequire(c_hash_map_hash.find(hm_ptr, tablePtr.p->hashMapObjectId),
- CreateTableRef::InvalidTablespace);
+ CreateTableRef::InvalidHashMap);
tabRequire(hm_ptr.p->m_object_version == tablePtr.p->hashMapVersion,
- CreateTableRef::InvalidTablespace);
+ CreateTableRef::InvalidHashMap);
}
{
@@ -26134,6 +26134,13 @@ Dbdict::createHashMap_parse(Signal* sign
* No info, create "default"
*/
jam();
+ if (impl_req->requestType & CreateHashMapReq::CreateDefault)
+ {
+ jam();
+ impl_req->buckets = NDB_DEFAULT_HASHMAP_BUCKTETS;
+ impl_req->fragments = 0;
+ }
+
Uint32 buckets = impl_req->buckets;
Uint32 fragments = impl_req->fragments;
if (fragments == 0)
@@ -26142,6 +26149,7 @@ Dbdict::createHashMap_parse(Signal* sign
fragments = get_default_fragments();
}
+
BaseString::snprintf(hm.HashMapName, sizeof(hm.HashMapName),
"DEFAULT-HASHMAP-%u-%u",
buckets,
@@ -26173,6 +26181,9 @@ Dbdict::createHashMap_parse(Signal* sign
DictHashMapInfo::MappingSize, true);
ndbrequire(s == SimpleProperties::Eof);
w.getPtr(objInfoPtr);
+
+ handle.m_cnt = 1;
+ handle.m_ptr[CreateHashMapReq::INFO] = objInfoPtr;
}
Uint32 len = Uint32(strlen(hm.HashMapName) + 1);
@@ -26186,12 +26197,52 @@ Dbdict::createHashMap_parse(Signal* sign
return;
}
- if(get_object(hm.HashMapName, len, hash) != 0)
+ DictObject * objptr = get_object(hm.HashMapName, len, hash);
+ if(objptr != 0)
{
jam();
- setError(error, CreateTableRef::TableAlreadyExist, __LINE__);
+
+ if (! (impl_req->requestType & CreateHashMapReq::CreateIfNotExists))
+ {
+ jam();
+ setError(error, CreateTableRef::TableAlreadyExist, __LINE__);
+ return;
+ }
+
+ /**
+ * verify object found
+ */
+
+ if (objptr->m_type != DictTabInfo::HashMap)
+ {
+ jam();
+ setError(error, CreateTableRef::TableAlreadyExist, __LINE__);
+ return;
+ }
+
+ if (check_write_obj(objptr->m_id,
+ trans_ptr.p->m_transId,
+ SchemaFile::SF_CREATE, error))
+ {
+ jam();
+ return;
+ }
+
+ HashMapPtr hm_ptr;
+ ndbrequire(c_hash_map_hash.find(hm_ptr, objptr->m_id));
+
+ impl_req->objectId = objptr->m_id;
+ impl_req->objectVersion = hm_ptr.p->m_object_version;
return;
}
+ else
+ {
+ jam();
+ /**
+ * Clear the IfNotExistsFlag
+ */
+ impl_req->requestType &= ~Uint32(CreateHashMapReq::CreateIfNotExists);
+ }
if (ERROR_INSERTED(6206))
{
@@ -26402,13 +26453,19 @@ Dbdict::createHashMap_abortParse(Signal*
{
D("createHashMap_abortParse" << *op_ptr.p);
- if (op_ptr.p->m_orig_entry_id != RNIL)
+ CreateHashMapRecPtr createHashMapPtr;
+ getOpRec(op_ptr, createHashMapPtr);
+ CreateHashMapImplReq* impl_req = &createHashMapPtr.p->m_request;
+
+ if (impl_req->requestType & CreateHashMapReq::CreateIfNotExists)
{
jam();
+ ndbrequire(op_ptr.p->m_orig_entry_id == RNIL);
+ }
- CreateHashMapRecPtr createHashMapPtr;
- getOpRec(op_ptr, createHashMapPtr);
- CreateHashMapImplReq* impl_req = &createHashMapPtr.p->m_request;
+ if (op_ptr.p->m_orig_entry_id != RNIL)
+ {
+ jam();
Ptr<HashMapRecord> hm_ptr;
ndbrequire(c_hash_map_hash.find(hm_ptr, impl_req->objectId));
@@ -26479,6 +26536,13 @@ Dbdict::createHashMap_prepare(Signal* si
getOpRec(op_ptr, createHashMapPtr);
CreateHashMapImplReq* impl_req = &createHashMapPtr.p->m_request;
+ if (impl_req->requestType & CreateHashMapReq::CreateIfNotExists)
+ {
+ jam();
+ sendTransConf(signal, op_ptr);
+ return;
+ }
+
Callback cb;
cb.m_callbackData = op_ptr.p->op_key;
cb.m_callbackFunction = safe_cast(&Dbdict::createHashMap_writeObjConf);
=== modified file 'storage/ndb/src/ndbapi/NdbDictionary.cpp'
--- a/storage/ndb/src/ndbapi/NdbDictionary.cpp 2009-05-27 15:21:45 +0000
+++ b/storage/ndb/src/ndbapi/NdbDictionary.cpp 2009-08-05 10:48:56 +0000
@@ -2875,6 +2875,7 @@ NdbDictionary::Dictionary::createHashMap
int ret;
DO_TRANS(ret,
m_impl.m_receiver.create_hashmap(NdbHashMapImpl::getImpl(map),
- &NdbDictObjectImpl::getImpl(*dst)));
+ &NdbDictObjectImpl::getImpl(*dst),
+ 0));
return ret;
}
=== modified file 'storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp'
--- a/storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp 2009-05-29 06:23:51 +0000
+++ b/storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp 2009-08-05 10:48:56 +0000
@@ -2860,13 +2860,32 @@ NdbDictInterface::createTable(Ndb & ndb,
DBUG_ENTER("NdbDictInterface::createTable");
+ if (impl.m_fragmentType == NdbDictionary::Object::HashMapPartition)
+ {
+ if (impl.m_hash_map_id == RNIL && impl.m_hash_map_version == ~(Uint32)0)
+ {
+ /**
+ * Make sure that hashmap exists (i.e after upgrade or similar)
+ */
+ NdbHashMapImpl hashmap;
+ ret = create_hashmap(hashmap, 0,
+ CreateHashMapReq::CreateDefault |
+ CreateHashMapReq::CreateIfNotExists);
+ if (ret)
+ {
+ DBUG_RETURN(ret);
+ }
+ }
+ }
syncInternalName(ndb, impl);
UtilBufferWriter w(m_buffer);
ret= serializeTableDesc(ndb, impl, w);
if(ret != 0)
+ {
DBUG_RETURN(ret);
+ }
DBUG_RETURN(sendCreateTable(impl, w));
}
@@ -6903,6 +6922,7 @@ NdbDictInterface::drop_file(const NdbFil
req->senderData = 0;
req->file_id = file.m_id;
req->file_version = file.m_version;
+ req->requestInfo = 0;
req->requestInfo |= m_tx.requestFlags();
req->transId = m_tx.transId();
req->transKey = m_tx.transKey();
@@ -7000,6 +7020,7 @@ NdbDictInterface::create_filegroup(const
req->senderRef = m_reference;
req->senderData = 0;
req->objType = fg.FilegroupType;
+ req->requestInfo = 0;
req->requestInfo |= m_tx.requestFlags();
req->transId = m_tx.transId();
req->transKey = m_tx.transKey();
@@ -7063,6 +7084,7 @@ NdbDictInterface::drop_filegroup(const N
req->senderData = 0;
req->filegroup_id = group.m_id;
req->filegroup_version = group.m_version;
+ req->requestInfo = 0;
req->requestInfo |= m_tx.requestFlags();
req->transId = m_tx.transId();
req->transKey = m_tx.transKey();
@@ -7531,7 +7553,8 @@ NdbDictInterface::parseHashMapInfo(NdbHa
int
NdbDictInterface::create_hashmap(const NdbHashMapImpl& src,
- NdbDictObjectImpl* obj)
+ NdbDictObjectImpl* obj,
+ Uint32 flags)
{
DictHashMapInfo::HashMap hm; hm.init();
BaseString::snprintf(hm.HashMapName, sizeof(hm.HashMapName), src.getName());
@@ -7566,6 +7589,7 @@ NdbDictInterface::create_hashmap(const N
CreateHashMapReq* req = CAST_PTR(CreateHashMapReq, tSignal.getDataPtrSend());
req->clientRef = m_reference;
req->clientData = 0;
+ req->requestInfo = flags;
req->requestInfo |= m_tx.requestFlags();
req->transId = m_tx.transId();
req->transKey = m_tx.transKey();
@@ -7582,7 +7606,12 @@ NdbDictInterface::create_hashmap(const N
Send signal without time-out since creating files can take a very long
time if the file is very big.
*/
- int ret = dictSignal(&tSignal, ptr, 1,
+ Uint32 seccnt = 1;
+ if (flags & CreateHashMapReq::CreateDefault)
+ {
+ seccnt = 0;
+ }
+ int ret = dictSignal(&tSignal, ptr, seccnt,
0, // master
WAIT_CREATE_INDX_REQ,
-1, 100,
=== modified file 'storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp'
--- a/storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp 2009-05-27 15:21:45 +0000
+++ b/storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp 2009-08-05 10:48:56 +0000
@@ -679,7 +679,7 @@ public:
NdbTableImpl* index_table,
const NdbTableImpl* primary_table);
- int create_hashmap(const NdbHashMapImpl&, NdbDictObjectImpl*);
+ int create_hashmap(const NdbHashMapImpl&, NdbDictObjectImpl*, Uint32 flags);
int get_hashmap(NdbHashMapImpl&, Uint32 id);
int get_hashmap(NdbHashMapImpl&, const char * name);
=== modified file 'storage/ndb/src/ndbapi/ndberror.c'
--- a/storage/ndb/src/ndbapi/ndberror.c 2009-05-27 15:21:45 +0000
+++ b/storage/ndb/src/ndbapi/ndberror.c 2009-08-05 10:48:56 +0000
@@ -420,6 +420,7 @@ ErrorBundle ErrorCodes[] = {
{ 769, DMEC, SE, "Drop undofile not supported, drop logfile group instead" },
{ 770, DMEC, SE, "Cant drop file, file is used" },
{ 774, DMEC, SE, "Invalid schema object for drop" },
+ { 790, HA_WRONG_CREATE_OPTION, SE, "Invalid hashmap" },
{ 241, HA_ERR_TABLE_DEF_CHANGED, SE, "Invalid schema object version" },
{ 283, HA_ERR_NO_SUCH_TABLE, SE, "Table is being dropped" },
{ 284, HA_ERR_TABLE_DEF_CHANGED, SE, "Table not defined in transaction coordinator" },
Attachment: [text/bzr-bundle] bzr/jonas@mysql.com-20090805104856-1dn1t3l1r1gkcyom.bundle
| Thread |
|---|
| • bzr commit into mysql-5.1-telco-7.0 branch (jonas:2959) Bug#46494 | Jonas Oreland | 5 Aug |