ndb - bug#25636

  Fix DD problem during NR after 3 missed LCP's
parent f8fdb7c9
...@@ -2916,6 +2916,17 @@ Dbdih::nr_start_fragment(Signal* signal, ...@@ -2916,6 +2916,17 @@ Dbdih::nr_start_fragment(Signal* signal,
takeOverPtr.p->toCurrentTabref, takeOverPtr.p->toCurrentTabref,
takeOverPtr.p->toCurrentFragid); takeOverPtr.p->toCurrentFragid);
replicaPtr.p->lcpIdStarted = 0; replicaPtr.p->lcpIdStarted = 0;
BlockReference ref = calcLqhBlockRef(takeOverPtr.p->toStartingNode);
StartFragReq *req = (StartFragReq *)signal->getDataPtrSend();
req->userPtr = 0;
req->userRef = reference();
req->lcpNo = ZNIL;
req->lcpId = 0;
req->tableId = takeOverPtr.p->toCurrentTabref;
req->fragId = takeOverPtr.p->toCurrentFragid;
req->noOfLogNodes = 0;
sendSignal(ref, GSN_START_FRAGREQ, signal,
StartFragReq::SignalLength, JBB);
} }
else else
{ {
......
...@@ -13836,6 +13836,7 @@ void Dblqh::execSTART_FRAGREQ(Signal* signal) ...@@ -13836,6 +13836,7 @@ void Dblqh::execSTART_FRAGREQ(Signal* signal)
Uint32 lcpNo = startFragReq->lcpNo; Uint32 lcpNo = startFragReq->lcpNo;
Uint32 noOfLogNodes = startFragReq->noOfLogNodes; Uint32 noOfLogNodes = startFragReq->noOfLogNodes;
Uint32 lcpId = startFragReq->lcpId; Uint32 lcpId = startFragReq->lcpId;
ndbrequire(noOfLogNodes <= 4); ndbrequire(noOfLogNodes <= 4);
fragptr.p->fragStatus = Fragrecord::CRASH_RECOVERING; fragptr.p->fragStatus = Fragrecord::CRASH_RECOVERING;
fragptr.p->srBlockref = startFragReq->userRef; fragptr.p->srBlockref = startFragReq->userRef;
...@@ -13890,7 +13891,16 @@ void Dblqh::execSTART_FRAGREQ(Signal* signal) ...@@ -13890,7 +13891,16 @@ void Dblqh::execSTART_FRAGREQ(Signal* signal)
signal->theData[1] = fragId; signal->theData[1] = fragId;
sendSignal(DBACC_REF, GSN_EXPANDCHECK2, signal, 2, JBB); sendSignal(DBACC_REF, GSN_EXPANDCHECK2, signal, 2, JBB);
} }
if (getNodeState().getNodeRestartInProgress())
{
jam();
fragptr.p->fragStatus = Fragrecord::ACTIVE_CREATION;
}
c_tup->disk_restart_mark_no_lcp(tabptr.i, fragId);
jamEntry();
return; return;
}//if }//if
...@@ -16713,8 +16723,8 @@ void Dblqh::initialiseRecordsLab(Signal* signal, Uint32 data, ...@@ -16713,8 +16723,8 @@ void Dblqh::initialiseRecordsLab(Signal* signal, Uint32 data,
ccurrentGcprec = RNIL; ccurrentGcprec = RNIL;
caddNodeState = ZFALSE; caddNodeState = ZFALSE;
cstartRecReq = ZFALSE; cstartRecReq = ZFALSE;
cnewestGci = ~0; cnewestGci = 0;
cnewestCompletedGci = ~0; cnewestCompletedGci = 0;
crestartOldestGci = 0; crestartOldestGci = 0;
crestartNewestGci = 0; crestartNewestGci = 0;
csrPhaseStarted = ZSR_NO_PHASE_STARTED; csrPhaseStarted = ZSR_NO_PHASE_STARTED;
......
...@@ -2711,6 +2711,8 @@ public: ...@@ -2711,6 +2711,8 @@ public:
Ptr<Extent_info> m_extent_ptr; Ptr<Extent_info> m_extent_ptr;
Local_key m_key; Local_key m_key;
}; };
void disk_restart_mark_no_lcp(Uint32 table, Uint32 frag);
private: private:
void disk_restart_undo_next(Signal*); void disk_restart_undo_next(Signal*);
......
...@@ -1422,6 +1422,13 @@ Dbtup::disk_restart_undo_next(Signal* signal) ...@@ -1422,6 +1422,13 @@ Dbtup::disk_restart_undo_next(Signal* signal)
sendSignal(LGMAN_REF, GSN_CONTINUEB, signal, 1, JBB); sendSignal(LGMAN_REF, GSN_CONTINUEB, signal, 1, JBB);
} }
void
Dbtup::disk_restart_mark_no_lcp(Uint32 tableId, Uint32 fragId)
{
jamEntry();
disk_restart_undo_lcp(tableId, fragId, Fragrecord::UC_CREATE);
}
void void
Dbtup::disk_restart_undo_lcp(Uint32 tableId, Uint32 fragId, Uint32 flag) Dbtup::disk_restart_undo_lcp(Uint32 tableId, Uint32 fragId, Uint32 flag)
{ {
......
...@@ -1258,6 +1258,8 @@ Pgman::process_lcp(Signal* signal) ...@@ -1258,6 +1258,8 @@ Pgman::process_lcp(Signal* signal)
void void
Pgman::process_lcp_locked(Signal* signal, Ptr<Page_entry> ptr) Pgman::process_lcp_locked(Signal* signal, Ptr<Page_entry> ptr)
{ {
CRASH_INSERTION(11006);
ptr.p->m_last_lcp = m_last_lcp; ptr.p->m_last_lcp = m_last_lcp;
if (ptr.p->m_state & Page_entry::DIRTY) if (ptr.p->m_state & Page_entry::DIRTY)
{ {
...@@ -2351,6 +2353,11 @@ Pgman::execDUMP_STATE_ORD(Signal* signal) ...@@ -2351,6 +2353,11 @@ Pgman::execDUMP_STATE_ORD(Signal* signal)
{ {
g_dbg_lcp = ~g_dbg_lcp; g_dbg_lcp = ~g_dbg_lcp;
} }
if (signal->theData[0] == 11006)
{
SET_ERROR_INSERT_VALUE(11006);
}
} }
// page cache client // page cache client
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment