#At file:///home/jonas/src/telco-6.4/
3072 Jonas Oreland 2008-11-11
ndb - fix testDict -n DictRestart
1) fix random data being used in send_nf_complete_rep (spurious errors)
2) pack/unpack filegroup so that they are identical on all nodes
3) init SchemaEntry for tables not restored on restart
4) make sure that all transactions are ended before starting next pass
modified:
storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp
storage/ndb/src/kernel/blocks/dbdict/Dbdict.hpp
=== modified file 'storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp'
--- a/storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp 2008-11-07 14:50:21 +0000
+++ b/storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp 2008-11-11 07:36:01 +0000
@@ -3304,6 +3304,7 @@ Dbdict::restart_checkSchemaStatusComplet
return;
}
+ ndbrequire(c_restartRecord.m_op_cnt == 0);
ndbrequire(c_nodeRestart || c_initialNodeRestart);
activateIndexes(signal, 0);
return;
@@ -3478,8 +3479,10 @@ void Dbdict::checkSchemaStatus(Signal* s
continue;
if (masterState != SchemaFile::SF_IN_USE)
+ {
+ ownEntry->init();
continue;
-
+ }
/**
* handle table(index) special as DIH has already copied
* table (using COPY_TABREQ)
@@ -3511,6 +3514,9 @@ void Dbdict::checkSchemaStatus(Signal* s
else
{
jam();
+
+ c_restartRecord.m_op_cnt = 0;
+
TxHandlePtr tx_ptr;
c_txHandleHash.getPtr(tx_ptr, c_restartRecord.m_tx_ptr_i);
@@ -3640,6 +3646,7 @@ Dbdict::restart_fromEndTrans(Signal* sig
releaseTxHandle(tx_ptr);
+ ndbrequire(c_restartRecord.m_op_cnt == 0);
c_restartRecord.activeTable++;
seizeTxHandle(tx_ptr);
@@ -3705,10 +3712,35 @@ Dbdict::restartNextPass(Signal* signal)
return;
}
}
+ else if (c_restartRecord.m_tx_ptr_i != RNIL)
+ {
+ /**
+ * Complete last trans
+ */
+ jam();
+
+ c_restartRecord.m_pass--;
+ c_restartRecord.m_op_cnt = 0;
+
+ Ptr<TxHandle> tx_ptr;
+ c_txHandleHash.getPtr(tx_ptr, c_restartRecord.m_tx_ptr_i);
+
+ Callback c = {
+ safe_cast(&Dbdict::restartEndPass_fromEndTrans),
+ tx_ptr.p->tx_key
+ };
+ tx_ptr.p->m_callback = c;
+
+ Uint32 flags = 0;
+ endSchemaTrans(signal, tx_ptr, flags);
+ return;
+ }
else
{
jam();
+ ndbrequire(c_restartRecord.m_op_cnt == 0);
+
/**
* Write schema file at-end of checkSchemaStatus
*/
@@ -4084,11 +4116,12 @@ void Dbdict::execAPI_FAILREQ(Signal* sig
void Dbdict::execNODE_FAILREP(Signal* signal)
{
jamEntry();
- NodeFailRep * const nodeFail = (NodeFailRep *)&signal->theData[0];
+ NodeFailRep nodeFailRep = *(NodeFailRep *)&signal->theData[0];
+ NodeFailRep * nodeFail = &nodeFailRep;
NodeRecordPtr ownNodePtr;
c_nodes.getPtr(ownNodePtr, getOwnNodeId());
- c_failureNr = nodeFail->failNo;
+ c_failureNr = nodeFail->failNo;
const Uint32 numberOfFailedNodes = nodeFail->noOfNodes;
const bool masterFailed = (c_masterNodeId != nodeFail->masterNodeId);
c_masterNodeId = nodeFail->masterNodeId;
@@ -4110,20 +4143,19 @@ void Dbdict::execNODE_FAILREP(Signal* si
*/
jam();
ownNodePtr.p->nodeState = NodeRecord::NDB_MASTER_TAKEOVER;
- ownNodePtr.p->nodeFailRep = *nodeFail;
+ ownNodePtr.p->nodeFailRep = nodeFailRep;
infoEvent("Node %u taking over as DICT master", c_masterNodeId);
handle_master_takeover(signal);
return;
}
- send_nf_complete_rep(signal);
+ send_nf_complete_rep(signal, &nodeFailRep);
return;
}//execNODE_FAILREP()
-void Dbdict::send_nf_complete_rep(Signal* signal)
+void Dbdict::send_nf_complete_rep(Signal* signal, const NodeFailRep* nodeFail)
{
jam();
- NodeFailRep * const nodeFail = (NodeFailRep *)&signal->theData[0];
Uint32 theFailedNodes[NdbNodeBitmask::Size];
memcpy(theFailedNodes, nodeFail->theNodes, sizeof(theFailedNodes));
NdbNodeBitmask tmp;
@@ -9093,8 +9125,8 @@ void Dbdict::execGET_TABINFOREQ(Signal*
jam();
// see own trans always
}
- else if (refToBlock(req->senderRef) != DBUTIL && /** XXX cheat */
- refToBlock(req->senderRef) != SUMA)
+ else if (refToBlock(req->senderRef) != DBUTIL && /** XXX cheat */
+ refToBlock(req->senderRef) != SUMA)
{
Uint32 err;
if ((err = check_read_obj(objEntry)))
@@ -17471,9 +17503,7 @@ void Dbdict::check_takeover_replies(Sign
No slave found any pending transactions, we are done
*/
jam();
- memcpy(signal->theData, &masterNodePtr.p->nodeFailRep,
- sizeof(masterNodePtr.p->nodeFailRep));
- send_nf_complete_rep(signal);
+ send_nf_complete_rep(signal, &masterNodePtr.p->nodeFailRep);
return;
}
/*
@@ -19213,6 +19243,17 @@ Dbdict::createFilegroup_parse(Signal* si
obj_ptr.p->m_type = fg.FilegroupType;
obj_ptr.p->m_ref_count = 0;
+ if (master)
+ {
+ jam();
+ releaseSections(handle);
+ SimplePropertiesSectionWriter w(*this);
+ packFilegroupIntoPages(w, fg_ptr, 0, 0);
+ w.getPtr(objInfoPtr);
+ handle.m_ptr[0] = objInfoPtr;
+ handle.m_cnt = 1;
+ }
+
{
SchemaFile::TableEntry te; te.init();
te.m_tableState = SchemaFile::SF_CREATE;
@@ -25141,9 +25182,7 @@ send_node_fail_rep:
/*
Continue with NODE_FAILREP
*/
- NodeFailRep * const nodeFailRep = (NodeFailRep *)&signal->theData[0];
- *nodeFailRep = ownNodePtr.p->nodeFailRep;
- send_nf_complete_rep(signal);
+ send_nf_complete_rep(signal, &ownNodePtr.p->nodeFailRep);
}
}
=== modified file 'storage/ndb/src/kernel/blocks/dbdict/Dbdict.hpp'
--- a/storage/ndb/src/kernel/blocks/dbdict/Dbdict.hpp 2008-10-29 14:25:59 +0000
+++ b/storage/ndb/src/kernel/blocks/dbdict/Dbdict.hpp 2008-11-11 07:36:01 +0000
@@ -729,7 +729,7 @@ private:
void execTC_SCHVERCONF(Signal* signal);
void execNODE_FAILREP(Signal* signal);
- void send_nf_complete_rep(Signal* signal);
+ void send_nf_complete_rep(Signal* signal, const NodeFailRep*);
void execINCL_NODEREQ(Signal* signal);
void execAPI_FAILREQ(Signal* signal);
| Thread |
|---|
| • bzr commit into mysql-5.1 branch (jonas:3072) | Jonas Oreland | 11 Nov |