List:Commits« Previous MessageNext Message »
From:Jonas Oreland Date:August 5 2009 10:49am
Subject:bzr commit into mysql-5.1-telco-7.0 branch (jonas:2959) Bug#46494
View as plain text  
#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#46494Jonas Oreland5 Aug