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 Oreland | 30 Oct |