List:Commits« Previous MessageNext Message »
From:Jonas Oreland Date:October 30 2009 8:20am
Subject:bzr push into mysql-5.1-telco-7.0 branch (jonas:3173 to 3175)
View as plain text  
 3175 Jonas Oreland	2009-10-30 [merge]
      merge 63 to 70

    modified:
      storage/ndb/test/ndbapi/testUpgrade.cpp
 3174 Jonas Oreland	2009-10-30
      ndb - bug#48416 - record the fake-unique-index-triggers created during upgrade as true schema object, to avoid id-collision

    modified:
      storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp
      storage/ndb/src/kernel/blocks/dbdict/Dbdict.hpp
      storage/ndb/test/ndbapi/testUpgrade.cpp
 3173 Magnus Blåudd	2009-10-27 [merge]
      Merge

    modified:
      mysql-test/suite/funcs_1/r/innodb_views.result
      mysql-test/suite/funcs_1/r/memory_views.result
      mysql-test/suite/funcs_1/r/myisam_views.result
      mysql-test/suite/funcs_1/r/ndb_views.result
      mysql-test/suite/funcs_1/views/views_master.inc
=== modified file 'storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp'
--- a/storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp	2009-10-27 10:13:15 +0000
+++ b/storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp	2009-10-30 08:12:30 +0000
@@ -4825,11 +4825,21 @@ void Dbdict::handleTabInfoInit(SimplePro
                  c_tableDesc.InsertTriggerId,
                  c_tableDesc.UpdateTriggerId,
                  c_tableDesc.DeleteTriggerId);
+        infoEvent("table: %u UPGRADE saving (%u/%u/%u)",
+                  tablePtr.i,
+                  c_tableDesc.InsertTriggerId,
+                  c_tableDesc.UpdateTriggerId,
+                  c_tableDesc.DeleteTriggerId);
         tablePtr.p->triggerId = c_tableDesc.InsertTriggerId;
         tablePtr.p->m_upgrade_trigger_handling.m_upgrade = true;
         tablePtr.p->m_upgrade_trigger_handling.insertTriggerId = c_tableDesc.InsertTriggerId;
         tablePtr.p->m_upgrade_trigger_handling.updateTriggerId = c_tableDesc.UpdateTriggerId;
         tablePtr.p->m_upgrade_trigger_handling.deleteTriggerId = c_tableDesc.DeleteTriggerId;
+
+        upgrade_seizeTrigger(tablePtr,
+                             c_tableDesc.InsertTriggerId,
+                             c_tableDesc.UpdateTriggerId,
+                             c_tableDesc.DeleteTriggerId);
       }
     }
   }
@@ -4865,6 +4875,98 @@ void Dbdict::handleTabInfoInit(SimplePro
   }
 }//handleTabInfoInit()
 
+void
+Dbdict::upgrade_seizeTrigger(Ptr<TableRecord> tabPtr,
+                             Uint32 insertTriggerId,
+                             Uint32 updateTriggerId,
+                             Uint32 deleteTriggerId)
+{
+  /**
+   * The insert trigger will be "main" trigger so
+   *   it does not need any special treatment
+   */
+  const Uint32 size = c_triggerRecordPool.getSize();
+  ndbrequire(updateTriggerId == RNIL || updateTriggerId < size);
+  ndbrequire(deleteTriggerId == RNIL || deleteTriggerId < size);
+
+  TriggerRecordPtr triggerPtr;
+  if (updateTriggerId != RNIL)
+  {
+    jam();
+    c_triggerRecordPool.getPtr(triggerPtr, updateTriggerId);
+    if (triggerPtr.p->triggerState == TriggerRecord::TS_NOT_DEFINED)
+    {
+      jam();
+      initialiseTriggerRecord(triggerPtr);
+      triggerPtr.p->triggerState = TriggerRecord::TS_FAKE_UPGRADE;
+      triggerPtr.p->triggerId = triggerPtr.i;
+      triggerPtr.p->tableId = tabPtr.p->primaryTableId;
+      triggerPtr.p->indexId = tabPtr.i;
+      TriggerInfo::packTriggerInfo(triggerPtr.p->triggerInfo,
+                                   g_hashIndexTriggerTmpl[0].triggerInfo);
+
+      char buf[256];
+      BaseString::snprintf(buf, sizeof(buf),
+                           "UPG_UPD_NDB$INDEX_%u_UI", tabPtr.i);
+      {
+        Rope name(c_rope_pool, triggerPtr.p->triggerName);
+        name.assign(buf);
+      }
+
+      Ptr<DictObject> obj_ptr;
+      bool ok = c_obj_hash.seize(obj_ptr);
+      ndbrequire(ok);
+      new (obj_ptr.p) DictObject();
+
+      obj_ptr.p->m_name = triggerPtr.p->triggerName;
+      c_obj_hash.add(obj_ptr);
+      obj_ptr.p->m_ref_count = 0;
+
+      triggerPtr.p->m_obj_ptr_i = obj_ptr.i;
+      obj_ptr.p->m_id = triggerPtr.p->triggerId;
+      obj_ptr.p->m_type =TriggerInfo::getTriggerType(triggerPtr.p->triggerInfo);
+    }
+  }
+
+  if (deleteTriggerId != RNIL);
+  {
+    jam();
+    c_triggerRecordPool.getPtr(triggerPtr, deleteTriggerId);
+    if (triggerPtr.p->triggerState == TriggerRecord::TS_NOT_DEFINED)
+    {
+      jam();
+      initialiseTriggerRecord(triggerPtr);
+      triggerPtr.p->triggerState = TriggerRecord::TS_FAKE_UPGRADE;
+      triggerPtr.p->triggerId = triggerPtr.i;
+      triggerPtr.p->tableId = tabPtr.p->primaryTableId;
+      triggerPtr.p->indexId = tabPtr.i;
+      TriggerInfo::packTriggerInfo(triggerPtr.p->triggerInfo,
+                                   g_hashIndexTriggerTmpl[0].triggerInfo);
+      char buf[256];
+      BaseString::snprintf(buf, sizeof(buf),
+                           "UPG_DEL_NDB$INDEX_%u_UI", tabPtr.i);
+
+      {
+        Rope name(c_rope_pool, triggerPtr.p->triggerName);
+        name.assign(buf);
+      }
+
+      Ptr<DictObject> obj_ptr;
+      bool ok = c_obj_hash.seize(obj_ptr);
+      ndbrequire(ok);
+      new (obj_ptr.p) DictObject();
+
+      obj_ptr.p->m_name = triggerPtr.p->triggerName;
+      c_obj_hash.add(obj_ptr);
+      obj_ptr.p->m_ref_count = 0;
+
+      triggerPtr.p->m_obj_ptr_i = obj_ptr.i;
+      obj_ptr.p->m_id = triggerPtr.p->triggerId;
+      obj_ptr.p->m_type =TriggerInfo::getTriggerType(triggerPtr.p->triggerInfo);
+    }
+  }
+}
+
 void Dbdict::handleTabInfo(SimpleProperties::Reader & it,
 			   ParseDictTabInfoRecord * parseP,
 			   DictTabInfo::Table &tableDesc)
@@ -6735,6 +6837,35 @@ void Dbdict::releaseTableObject(Uint32 t
     def.erase();
   }
   list.release();
+
+  {
+    if (tablePtr.p->m_upgrade_trigger_handling.m_upgrade)
+    {
+      jam();
+      Uint32 triggerId;
+
+      triggerId = tablePtr.p->m_upgrade_trigger_handling.updateTriggerId;
+      if (triggerId != RNIL)
+      {
+        jam();
+        TriggerRecordPtr triggerPtr;
+        c_triggerRecordPool.getPtr(triggerPtr, triggerId);
+        triggerPtr.p->triggerState = TriggerRecord::TS_NOT_DEFINED;
+        release_object(triggerPtr.p->m_obj_ptr_i);
+      }
+
+      triggerId = tablePtr.p->m_upgrade_trigger_handling.deleteTriggerId;
+      if (triggerId != RNIL)
+      {
+        jam();
+        TriggerRecordPtr triggerPtr;
+        c_triggerRecordPool.getPtr(triggerPtr, triggerId);
+        triggerPtr.p->triggerState = TriggerRecord::TS_NOT_DEFINED;
+        release_object(triggerPtr.p->m_obj_ptr_i);
+      }
+    }
+  }
+
 }//releaseTableObject()
 
 // CreateTable: END
@@ -27156,7 +27287,8 @@ Dbdict::check_consistency_index(TableRec
 void
 Dbdict::check_consistency_trigger(TriggerRecordPtr triggerPtr)
 {
-  ndbrequire(triggerPtr.p->triggerState == TriggerRecord::TS_ONLINE);
+  if (! (triggerPtr.p->triggerState == TriggerRecord::TS_FAKE_UPGRADE))
+    ndbrequire(triggerPtr.p->triggerState == TriggerRecord::TS_ONLINE);
   ndbrequire(triggerPtr.p->triggerId == triggerPtr.i);
 
   TableRecordPtr tablePtr;
@@ -27177,7 +27309,8 @@ Dbdict::check_consistency_trigger(Trigge
     TriggerInfo::unpackTriggerInfo(triggerPtr.p->triggerInfo, ti);
     switch (ti.triggerEvent) {
     case TriggerEvent::TE_CUSTOM:
-      ndbrequire(triggerPtr.i == indexPtr.p->triggerId);
+      if (! (triggerPtr.p->triggerState == TriggerRecord::TS_FAKE_UPGRADE))
+        ndbrequire(triggerPtr.i == indexPtr.p->triggerId);
       break;
     default:
       ndbrequire(false);

=== modified file 'storage/ndb/src/kernel/blocks/dbdict/Dbdict.hpp'
--- a/storage/ndb/src/kernel/blocks/dbdict/Dbdict.hpp	2009-10-21 16:49:01 +0000
+++ b/storage/ndb/src/kernel/blocks/dbdict/Dbdict.hpp	2009-10-30 08:12:30 +0000
@@ -425,7 +425,8 @@ public:
       TS_OFFLINE  = 2,   // created globally in DICT
       //TS_BUILDING = 3,
       //TS_DROPPING = 4,
-      TS_ONLINE = 5      // created in other blocks
+      TS_ONLINE = 5,      // created in other blocks
+      TS_FAKE_UPGRADE = 6
     };
     TriggerState triggerState;
 
@@ -3789,6 +3790,8 @@ public:
   void unblock_substartstop();
   void wait_substartstop(Signal* signal, Uint32 opPtrI);
 
+  void upgrade_seizeTrigger(Ptr<TableRecord> tabPtr, Uint32, Uint32, Uint32);
+
 protected:
   virtual bool getParam(const char * param, Uint32 * retVal);
 };

=== modified file 'storage/ndb/test/ndbapi/testUpgrade.cpp'
--- a/storage/ndb/test/ndbapi/testUpgrade.cpp	2009-10-22 11:33:08 +0000
+++ b/storage/ndb/test/ndbapi/testUpgrade.cpp	2009-10-30 08:17:03 +0000
@@ -236,6 +236,15 @@ int runUpgrade_NR1(NDBT_Context* ctx, ND
 
 static
 int
+runBug48416(NDBT_Context* ctx, NDBT_Step* step)
+{
+  Ndb* pNdb = GETNDB(step);
+
+  return NDBT_Tables::createTable(pNdb, "I1");
+}
+
+static
+int
 runUpgrade_Half(NDBT_Context* ctx, NDBT_Step* step)
 {
   // Assuming 2 replicas
@@ -649,23 +658,35 @@ runPostUpgradeChecks(NDBT_Context* ctx, 
   }
   ndbout << "done" << endl;
 
+
   /**
    * Bug48227
    *   
    */
   Ndb* pNdb = GETNDB(step);
   NdbDictionary::Dictionary *pDict = pNdb->getDictionary();
-  NdbDictionary::Table tab = * NDBT_Tables::getTable(0);
-  tab.setName("TRUP2");
-  pDict->dropTable(tab.getName());
-  if (pDict->createTable(tab) != 0)
+  {
+    NdbDictionary::Dictionary::List l;
+    pDict->listObjects(l);
+    for (Uint32 i = 0; i<l.count; i++)
+      ndbout_c("found %u : %s", l.elements[i].id, l.elements[i].name);
+  }
+
+  pDict->dropTable("I3");
+  if (NDBT_Tables::createTable(pNdb, "I3"))
   {
     ndbout_c("Failed to create table!");
     ndbout << pDict->getNdbError() << endl;
-    NDBT_Tables::print(NDBT_Tables::getTable(0)->getName());
     return NDBT_FAILED;
   }
 
+  {
+    NdbDictionary::Dictionary::List l;
+    pDict->listObjects(l);
+    for (Uint32 i = 0; i<l.count; i++)
+      ndbout_c("found %u : %s", l.elements[i].id, l.elements[i].name);
+  }
+
   NdbRestarter res;
   if (res.restartAll() != 0)
   {
@@ -679,7 +700,7 @@ runPostUpgradeChecks(NDBT_Context* ctx, 
     return NDBT_FAILED;
   }
 
-  if (pDict->getTable(tab.getName()) == 0)
+  if (pDict->getTable("I3") == 0)
   {
     ndbout_c("Table disappered");
     return NDBT_FAILED;
@@ -692,6 +713,7 @@ NDBT_TESTSUITE(testUpgrade);
 TESTCASE("Upgrade_NR1",
 	 "Test that one node at a time can be upgraded"){
   INITIALIZER(runCheckStarted);
+  INITIALIZER(runBug48416);
   STEP(runUpgrade_NR1);
   VERIFIER(startPostUpgradeChecks);
 }

Attachment: [text/bzr-bundle] bzr/jonas@mysql.com-20091030081703-2toioetod5opm6pq.bundle
Thread
bzr push into mysql-5.1-telco-7.0 branch (jonas:3173 to 3175)Jonas Oreland30 Oct