#At file:///home/jonas/src/telco-6.2/ based on revid:jonas@stripped
2936 Jonas Oreland 2009-05-26
ndb - bug#41915 - fix spurious crash in recovery of DD tables
M storage/ndb/src/kernel/blocks/ERROR_codes.txt
M storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp
M storage/ndb/src/kernel/blocks/dbtup/Dbtup.hpp
M storage/ndb/src/kernel/blocks/dbtup/DbtupCommit.cpp
M storage/ndb/src/kernel/blocks/dbtup/DbtupScan.cpp
M storage/ndb/test/ndbapi/testSystemRestart.cpp
M storage/ndb/test/run-test/daily-basic-tests.txt
=== modified file 'storage/ndb/src/kernel/blocks/ERROR_codes.txt'
--- a/storage/ndb/src/kernel/blocks/ERROR_codes.txt 2009-01-29 10:56:52 +0000
+++ b/storage/ndb/src/kernel/blocks/ERROR_codes.txt 2009-05-26 04:14:03 +0000
@@ -3,7 +3,7 @@ Next NDBCNTR 1002
Next NDBFS 2000
Next DBACC 3002
Next DBTUP 4029
-Next DBLQH 5051
+Next DBLQH 5054
Next DBDICT 6008
Next DBDIH 7215
Next DBTC 8074
=== modified file 'storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp'
--- a/storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp 2009-05-24 18:29:37 +0000
+++ b/storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp 2009-05-26 04:14:03 +0000
@@ -11848,6 +11848,11 @@ void Dblqh::execLCP_PREPARE_CONF(Signal*
SET_ERROR_INSERT_VALUE(5027);
sendSignalWithDelay(reference(), GSN_START_RECREQ, signal, 10000, 1);
}
+ else if (ERROR_INSERTED(5053))
+ {
+ sendSignalWithDelay(BACKUP_REF, GSN_BACKUP_FRAGMENT_REQ, signal,
+ 150, BackupFragmentReq::SignalLength);
+ }
else
{
sendSignal(BACKUP_REF, GSN_BACKUP_FRAGMENT_REQ, signal,
=== modified file 'storage/ndb/src/kernel/blocks/dbtup/Dbtup.hpp'
--- a/storage/ndb/src/kernel/blocks/dbtup/Dbtup.hpp 2009-05-06 20:46:58 +0000
+++ b/storage/ndb/src/kernel/blocks/dbtup/Dbtup.hpp 2009-05-26 04:14:03 +0000
@@ -3206,6 +3206,8 @@ private:
/* For debugging, dump the contents of a tuple. */
void dump_tuple(const KeyReqStruct* req_struct, const Tablerec* tabPtrP);
+
+ void handle_lcp_keep(Signal*, Fragrecord*, ScanOp*, Uint32 rowid);
};
#if 0
=== modified file 'storage/ndb/src/kernel/blocks/dbtup/DbtupCommit.cpp'
--- a/storage/ndb/src/kernel/blocks/dbtup/DbtupCommit.cpp 2008-03-25 15:46:12 +0000
+++ b/storage/ndb/src/kernel/blocks/dbtup/DbtupCommit.cpp 2009-05-26 04:14:03 +0000
@@ -117,12 +117,33 @@ void Dbtup::initOpConnection(Operationre
}
static
-inline
bool
-operator>(const Local_key& key1, const Local_key& key2)
+operator>(const Local_key& key1, const Dbtup::ScanOp& op)
{
- return key1.m_page_no > key2.m_page_no ||
- (key1.m_page_no == key2.m_page_no && key1.m_page_idx > key2.m_page_idx);
+ Local_key key2 = op.m_scanPos.m_key;
+ int gth0 = int(key1.m_page_no) - int(key2.m_page_no);
+ int gth1 = int(key1.m_page_idx) - int(key2.m_page_idx);
+ if (gth0 > 0 || (gth0 == 0 && gth1 > 0))
+ {
+ return true;
+ }
+ if (gth0 < 0 || (gth0 == 0 && gth1 < 0))
+ {
+ return false;
+ }
+
+ /**
+ * key are equal...need to look at scan state
+ */
+ switch(op.m_state){
+ case Dbtup::ScanOp::Next:
+ /**
+ * This row-id has already been scanned
+ */
+ return false;
+ default:
+ return true;
+ }
}
void
@@ -158,9 +179,8 @@ Dbtup::dealloc_tuple(Signal* signal,
ScanOpPtr scanOp;
c_scanOpPool.getPtr(scanOp, lcpScan_ptr_i);
Local_key rowid = regOperPtr->m_tuple_location;
- Local_key scanpos = scanOp.p->m_scanPos.m_key;
rowid.m_page_no = page->frag_page_id;
- if (rowid > scanpos)
+ if (rowid > *scanOp.p)
{
jam();
extra_bits = Tuple_header::LCP_KEEP; // Note REMOVE FREE
@@ -344,9 +364,8 @@ Dbtup::commit_operation(Signal* signal,
ScanOpPtr scanOp;
c_scanOpPool.getPtr(scanOp, lcpScan_ptr_i);
Local_key rowid = regOperPtr->m_tuple_location;
- Local_key scanpos = scanOp.p->m_scanPos.m_key;
rowid.m_page_no = pagePtr.p->frag_page_id;
- if(rowid > scanpos)
+ if (rowid > *scanOp.p)
{
jam();
copy_bits |= Tuple_header::LCP_SKIP;
=== modified file 'storage/ndb/src/kernel/blocks/dbtup/DbtupScan.cpp'
--- a/storage/ndb/src/kernel/blocks/dbtup/DbtupScan.cpp 2008-03-25 15:46:12 +0000
+++ b/storage/ndb/src/kernel/blocks/dbtup/DbtupScan.cpp 2009-05-26 04:14:03 +0000
@@ -272,6 +272,22 @@ Dbtup::execACC_CHECK_SCAN(Signal* signal
signal, signalLength, JBB);
return; // stop
}
+
+ const bool lcp = (scan.m_bits & ScanOp::SCAN_LCP);
+ Uint32 lcp_list = fragPtr.p->m_lcp_keep_list;
+
+ if (lcp && lcp_list != RNIL)
+ {
+ jam();
+ /**
+ * Handle lcp keep list already here
+ * So that scan state is not alterer
+ * if lcp_keep rows are found in ScanOp::First
+ */
+ handle_lcp_keep(signal, fragPtr.p, scanPtr.p, lcp_list);
+ return;
+ }
+
if (scan.m_state == ScanOp::First) {
jam();
scanFirst(signal, scanPtr);
@@ -623,7 +639,14 @@ Dbtup::scanNext(Signal* signal, ScanOpPt
Uint32 size = table.m_offsets[mm].m_fix_header_size;
if (lcp && lcp_list != RNIL)
- goto found_lcp_keep;
+ {
+ jam();
+ /**
+ * Handle lcp keep list here to, due to scanCont
+ */
+ handle_lcp_keep(signal, fragPtr.p, scanPtr.p, lcp_list);
+ return false;
+ }
switch(pos.m_get){
case ScanPos::Get_next_tuple:
@@ -1024,11 +1047,21 @@ Dbtup::scanNext(Signal* signal, ScanOpPt
signal->theData[1] = scanPtr.i;
sendSignal(reference(), GSN_CONTINUEB, signal, 2, JBB);
return false;
+}
+
+void
+Dbtup::handle_lcp_keep(Signal* signal,
+ Fragrecord* fragPtrP,
+ ScanOp* scanPtrP,
+ Uint32 lcp_list)
+{
+ TablerecPtr tablePtr;
+ tablePtr.i = scanPtrP->m_tableId;
+ ptrCheckGuard(tablePtr, cnoOfTablerec, tablerec);
-found_lcp_keep:
Local_key tmp;
tmp.assref(lcp_list);
- tmp.m_page_no = getRealpid(fragPtr.p, tmp.m_page_no);
+ tmp.m_page_no = getRealpid(fragPtrP, tmp.m_page_no);
Ptr<Page> pagePtr;
c_page_pool.getPtr(pagePtr, tmp.m_page_no);
@@ -1045,19 +1078,19 @@ found_lcp_keep:
jam();
setChecksum(ptr, tablePtr.p);
}
-
+
NextScanConf* const conf = (NextScanConf*)signal->getDataPtrSend();
- conf->scanPtr = scan.m_userPtr;
+ conf->scanPtr = scanPtrP->m_userPtr;
conf->accOperationPtr = (Uint32)-1;
- conf->fragId = frag.fragmentId;
+ conf->fragId = fragPtrP->fragmentId;
conf->localKey[0] = lcp_list;
conf->localKey[1] = 0;
conf->localKeyLength = 1;
conf->gci = 0;
- Uint32 blockNo = refToBlock(scan.m_userRef);
+ Uint32 blockNo = refToBlock(scanPtrP->m_userRef);
EXECUTE_DIRECT(blockNo, GSN_NEXT_SCANCONF, signal, 7);
- fragPtr.p->m_lcp_keep_list = next;
+ fragPtrP->m_lcp_keep_list = next;
ptr->m_header_bits |= Tuple_header::FREED; // RESTORE free flag
if (headerbits & Tuple_header::FREED)
{
@@ -1065,13 +1098,12 @@ found_lcp_keep:
tablePtr.p->m_attributes[MM].m_no_of_dynamic)
{
jam();
- free_var_rec(fragPtr.p, tablePtr.p, &tmp, pagePtr);
+ free_var_rec(fragPtrP, tablePtr.p, &tmp, pagePtr);
} else {
jam();
- free_fix_rec(fragPtr.p, tablePtr.p, &tmp, (Fix_page*)pagePtr.p);
+ free_fix_rec(fragPtrP, tablePtr.p, &tmp, (Fix_page*)pagePtr.p);
}
}
- return false;
}
void
=== modified file 'storage/ndb/test/ndbapi/testSystemRestart.cpp'
--- a/storage/ndb/test/ndbapi/testSystemRestart.cpp 2008-08-22 22:07:53 +0000
+++ b/storage/ndb/test/ndbapi/testSystemRestart.cpp 2009-05-26 04:14:03 +0000
@@ -1466,11 +1466,12 @@ int runSR_DD_2(NDBT_Context* ctx, NDBT_S
int result = NDBT_OK;
Uint32 loops = ctx->getNumLoops();
Uint32 rows = ctx->getNumRecords();
- int count;
NdbRestarter restarter;
NdbBackup backup(GETNDB(step)->getNodeId()+1);
bool lcploop = ctx->getProperty("LCP", (unsigned)0);
bool all = ctx->getProperty("ALL", (unsigned)0);
+ int error = (int)ctx->getProperty("ERROR", (unsigned)0);
+ rows = ctx->getProperty("ROWS", rows);
Uint32 i = 1;
Uint32 backupId;
@@ -1478,7 +1479,10 @@ int runSR_DD_2(NDBT_Context* ctx, NDBT_S
int val[] = { DumpStateOrd::CmvmiSetRestartOnErrorInsert, 1 };
int lcp = DumpStateOrd::DihMinTimeBetweenLCP;
- int startFrom = 0;
+ if (error)
+ {
+ restarter.insertErrorInAllNodes(error);
+ }
HugoTransactions hugoTrans(*ctx->getTab());
while(i<=loops && result != NDBT_FAILED)
@@ -1501,11 +1505,10 @@ int runSR_DD_2(NDBT_Context* ctx, NDBT_S
else
{
ndbout << "Crashing cluster" << endl;
- ctx->setProperty("StopAbort", 1000 + rand() % (3000 - 1000));
+ ctx->setProperty("StopAbort", 3000 + rand() % (10000 - 3000));
}
Uint64 end = NdbTick_CurrentMillisecond() + 11000;
- Uint32 row = startFrom;
do {
if (hugoTrans.loadTable(pNdb, rows) != 0)
break;
@@ -1529,7 +1532,11 @@ int runSR_DD_2(NDBT_Context* ctx, NDBT_S
CHECK(restarter.waitClusterNoStart() == 0);
CHECK(restarter.startAll() == 0);
CHECK(restarter.waitClusterStarted() == 0);
-
+ if (error)
+ {
+ restarter.insertErrorInAllNodes(error);
+ }
+
ndbout << "Starting backup..." << flush;
CHECK(backup.start(backupId) == 0);
ndbout << "done" << endl;
@@ -1542,6 +1549,11 @@ int runSR_DD_2(NDBT_Context* ctx, NDBT_S
NdbScanOperation::SF_TupScan, cnt) == 0);
i++;
}
+
+ if (error)
+ {
+ restarter.insertErrorInAllNodes(0);
+ }
ndbout << "runSR_DD_2 finished" << endl;
ctx->stopTest();
@@ -1928,6 +1940,16 @@ TESTCASE("basic", "")
STEP(runBasic);
FINALIZER(runDropAllTables);
}
+TESTCASE("Bug41915", "")
+{
+ TC_PROPERTY("ALL", 1);
+ TC_PROPERTY("ERROR", 5053);
+ TC_PROPERTY("ROWS", 30);
+ INITIALIZER(runWaitStarted);
+ STEP(runStopper);
+ STEP(runSR_DD_2);
+ FINALIZER(runClearTable);
+}
NDBT_TESTSUITE_END(testSystemRestart);
int main(int argc, const char** argv){
=== modified file 'storage/ndb/test/run-test/daily-basic-tests.txt'
--- a/storage/ndb/test/run-test/daily-basic-tests.txt 2009-05-24 18:29:37 +0000
+++ b/storage/ndb/test/run-test/daily-basic-tests.txt 2009-05-26 04:14:03 +0000
@@ -1154,6 +1154,10 @@ max-time: 1500
cmd: testSystemRestart
args: -n SR_DD_2b_LCP D2
+max-time: 1500
+cmd: testSystemRestart
+args: -n Bug41915 D2
+
max-time: 600
cmd: testNodeRestart
args: -n Bug31525 T1
Attachment: [text/bzr-bundle] bzr/jonas@mysql.com-20090526041403-0qtjtehbumdqqdgc.bundle
| Thread |
|---|
| • bzr commit into mysql-5.1-telco-6.2 branch (jonas:2936) Bug#41915 | Jonas Oreland | 26 May |