List:Commits« Previous MessageNext Message »
From:Jonas Oreland Date:May 26 2009 4:14am
Subject:bzr commit into mysql-5.1-telco-6.2 branch (jonas:2936) Bug#41915
View as plain text  
#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#41915Jonas Oreland26 May