List:Commits« Previous MessageNext Message »
From:Ole John Aske Date:October 5 2012 7:58am
Subject:bzr push into mysql-5.1-telco-7.0 branch (ole.john.aske:4995 to 4996)
View as plain text  
 4996 Ole John Aske	2012-10-04
      Refactor ERROR_INSERT code in SPJ block such that actions taken
      in composite ERROR_INSERT conditions can be recognized as unused
      code and removed by compiler when -DERROR_INSERT was not defined.
      
      Generally the ERROR_INSERT(nn) should be checked *first* in a
      '||' term in the if-conditions, else anything preceding the 
      ERROR_INSERT(n) has to be evaluated:
      
      in the condition:
      
            if (ERROR_INSERTED_CLEAR(17060) ||
                ((rand() % 7) == 0 && ERROR_INSERTED_CLEAR(17061)) ||
                ((treeNodePtr.p->isLeaf() && ERROR_INSERTED_CLEAR(17062))) ||
                ((treeNodePtr.p->m_parentPtrI != RNIL && ERROR_INSERTED_CLEAR(17063))))
      
      Both the function 'rand()' and 'isLeaf()' was called even when
      compiled wo/ -DERROR_INSERT!
      
      So the pattern in this fix is to rewrite such construct to:
      
            if (ERROR_INSERTED(17060) ||
               (ERROR_INSERTED(17061) && (treeNodePtr.p->isLeaf())) ||
               (ERROR_INSERTED(17062) && (treeNodePtr.p->m_parentPtrI != RNIL)) ||
               (ERROR_INSERTED(17063) && (rand() % 7) == 0))
            {
              jam();
              CLEAR_ERROR_INSERT_VALUE;
      
      Which could then be entirely removed when compiled wo / DERROR_INSERT.

    modified:
      storage/ndb/src/kernel/blocks/dbspj/DbspjMain.cpp
 4995 Ole John Aske	2012-10-04
      Fix for Bug#14648712 CALLING PROGERROR WITHOUT THE THIRD ARGUMENT RESULTS IN SIGSEGV
      
      The function ndb_basename() is called from ErrorReporter::handleError() with
      'problemData' as argument. As problemData is allowed to be NULL, that used to
      crash ndb_basename() when 'strlen()' was called.
      
      This fix will check for NULL argument to ndb_basename() and then
      return NULL. The returned NULL value is then later correctly 
      handled in ::WriteMessage() and EvenLogger::info() which ::handleErrro()
      may then later call with a NULL argument.

    modified:
      storage/ndb/src/kernel/error/ErrorReporter.cpp
=== modified file 'storage/ndb/src/kernel/blocks/dbspj/DbspjMain.cpp'
--- a/storage/ndb/src/kernel/blocks/dbspj/DbspjMain.cpp	2012-09-19 06:37:24 +0000
+++ b/storage/ndb/src/kernel/blocks/dbspj/DbspjMain.cpp	2012-10-04 11:27:10 +0000
@@ -721,9 +721,9 @@ void Dbspj::execLQHKEYREQ(Signal* signal
 
     if (ERROR_INSERTED_CLEAR(17001))
     {
+      jam();
       ndbout_c("Injecting OutOfQueryMem error 17001 at line %d file %s",
                 __LINE__,  __FILE__);
-      jam();
       break;
     }
     if (unlikely(!m_request_pool.seize(ah, requestPtr)))
@@ -2569,10 +2569,11 @@ Dbspj::execTRANSID_AI(Signal* signal)
   {
     jam();
     Uint32 err;
-    if (ERROR_INSERTED_CLEAR(17120) ||
-        (treeNodePtr.p->m_parentPtrI != RNIL && ERROR_INSERTED_CLEAR(17121)))
+    if (ERROR_INSERTED(17120) ||
+       (ERROR_INSERTED(17121) && treeNodePtr.p->m_parentPtrI != RNIL))
     {
       jam();
+      CLEAR_ERROR_INSERT_VALUE;
       abort(signal, requestPtr, DbspjErr::OutOfRowMemory);
     }
     else if ((err = storeRow(requestPtr, treeNodePtr, row)) != 0)
@@ -3073,9 +3074,9 @@ Dbspj::allocPage(Ptr<RowPage> & ptr)
     jam();
     if (ERROR_INSERTED_CLEAR(17003))
     {
+      jam();
       ndbout_c("Injecting failed '::allocPage', error 17003 at line %d file %s",
                __LINE__,  __FILE__);
-      jam();
       return false;
     }
     ptr.p = (RowPage*)m_ctx.m_mm.alloc_page(RT_SPJ_DATABUFFER,
@@ -3155,10 +3156,11 @@ Dbspj::checkTableError(Ptr<TreeNode> tre
               << ", tableOrIndexId: " << treeNodePtr.p->m_tableOrIndexId
               << ", error: " << err);
   }
-  if (ERROR_INSERTED_CLEAR(17520) ||
+  if (ERROR_INSERTED(17520) ||
       ERROR_INSERTED(17521) && (rand() % 7) == 0)
   {
     jam();
+    CLEAR_ERROR_INSERT_VALUE;
     ndbout_c("::checkTableError, injecting NoSuchTable error at line %d file %s",
               __LINE__,  __FILE__);
     return DbspjErr::NoSuchTable;
@@ -3505,11 +3507,12 @@ Dbspj::lookup_send(Signal* signal,
          * - 17072: Fail on lookup_send() if treeNode not root
          */
 
-        if (ERROR_INSERTED_CLEAR(17070) ||
-            (treeNodePtr.p->isLeaf() && ERROR_INSERTED_CLEAR(17071)) ||
-            (treeNodePtr.p->m_parentPtrI != RNIL && ERROR_INSERTED_CLEAR(17072)))
+        if (ERROR_INSERTED(17070) ||
+           (ERROR_INSERTED(17071) && treeNodePtr.p->isLeaf()) ||
+           (ERROR_INSERTED(17072) && treeNodePtr.p->m_parentPtrI != RNIL))
         {
           jam();
+          CLEAR_ERROR_INSERT_VALUE;
           ndbout_c("Injecting OutOfSectionMemory error at line %d file %s",
                    __LINE__,  __FILE__);
           releaseSection(keyInfoPtrI);
@@ -3548,11 +3551,12 @@ Dbspj::lookup_send(Signal* signal,
      * - 17031: Fail on lookup_send() if 'isLeaf'
      * - 17032: Fail on lookup_send() if treeNode not root 
      */
-    if (ERROR_INSERTED_CLEAR(17030) ||
-        (treeNodePtr.p->isLeaf() && ERROR_INSERTED_CLEAR(17031)) ||
-        (treeNodePtr.p->m_parentPtrI != RNIL && ERROR_INSERTED_CLEAR(17032)))
+    if (ERROR_INSERTED(17030) ||
+       (ERROR_INSERTED(17031) && treeNodePtr.p->isLeaf()) ||
+       (ERROR_INSERTED(17032) && treeNodePtr.p->m_parentPtrI != RNIL))
     {
       jam();
+      CLEAR_ERROR_INSERT_VALUE;
       req->tableSchemaVersion += (1 << 16); // Provoke 'Invalid schema version'
     }
 
@@ -3584,11 +3588,12 @@ Dbspj::lookup_send(Signal* signal,
      * - 17021: Fail on lookup_send() if 'isLeaf'
      * - 17022: Fail on lookup_send() if treeNode not root 
      */
-    if (ERROR_INSERTED_CLEAR(17020) ||
-        (treeNodePtr.p->isLeaf() && ERROR_INSERTED_CLEAR(17021)) ||
-        (treeNodePtr.p->m_parentPtrI != RNIL && ERROR_INSERTED_CLEAR(17022)))
+    if (ERROR_INSERTED(17020) ||
+       (ERROR_INSERTED(17021) && treeNodePtr.p->isLeaf()) ||
+       (ERROR_INSERTED(17022) && treeNodePtr.p->m_parentPtrI != RNIL))
     {
       jam();
+      CLEAR_ERROR_INSERT_VALUE;
       releaseSections(handle);
       err = DbspjErr::NodeFailure;
       break;
@@ -3893,11 +3898,12 @@ Dbspj::lookup_parent_row(Signal* signal,
      * - 17041: Fail on lookup_parent_row() if 'isLeaf'
      * - 17042: Fail on lookup_parent_row() if treeNode not root 
      */
-    if (ERROR_INSERTED_CLEAR(17040) ||
-        (treeNodePtr.p->isLeaf() && ERROR_INSERTED_CLEAR(17041)) ||
-        (treeNodePtr.p->m_parentPtrI != RNIL && ERROR_INSERTED_CLEAR(17042)))
+    if (ERROR_INSERTED(17040) ||
+       (ERROR_INSERTED(17041) && treeNodePtr.p->isLeaf()) ||
+       (ERROR_INSERTED(17042) && treeNodePtr.p->m_parentPtrI != RNIL))
     {
       jam();
+      CLEAR_ERROR_INSERT_VALUE;
       err = DbspjErr::OutOfQueryMemory;
       break;
     }
@@ -4013,11 +4019,12 @@ Dbspj::lookup_parent_row(Signal* signal,
        * - 17082: Fail on lookup_parent_row: if treeNode not root
        */
 
-      if (ERROR_INSERTED_CLEAR(17080) ||
-          (treeNodePtr.p->isLeaf() && ERROR_INSERTED_CLEAR(17081)) ||
-          (treeNodePtr.p->m_parentPtrI != RNIL && ERROR_INSERTED_CLEAR(17082)))
+      if (ERROR_INSERTED(17080) ||
+         (ERROR_INSERTED(17081) && treeNodePtr.p->isLeaf()) ||
+         (ERROR_INSERTED(17082) && treeNodePtr.p->m_parentPtrI != RNIL))
       {
         jam();
+        CLEAR_ERROR_INSERT_VALUE;
         ndbout_c("Injecting OutOfSectionMemory error at line %d file %s",
                  __LINE__,  __FILE__);
         err = DbspjErr::OutOfSectionMemory;
@@ -4464,9 +4471,9 @@ Dbspj::scanFrag_build(Build_context& ctx
     Ptr<ScanFragHandle> scanFragHandlePtr;
     if (ERROR_INSERTED_CLEAR(17004))
     {
+      jam();
       ndbout_c("Injecting OutOfQueryMemory error 17004 at line %d file %s",
                __LINE__,  __FILE__);
-      jam();
       err = DbspjErr::OutOfQueryMemory;
       break;
     }
@@ -5811,11 +5818,13 @@ Dbspj::scanIndex_parent_row(Signal* sign
        * - 17062: Fail on scanIndex_parent_row if treeNode not root
        * - 17063: Fail on scanIndex_parent_row at a random node of the query tree
        */
-      if (ERROR_INSERTED_CLEAR(17060) ||
-          ((rand() % 7) == 0 && ERROR_INSERTED_CLEAR(17061)) ||
-          ((treeNodePtr.p->isLeaf() && ERROR_INSERTED_CLEAR(17062))) ||
-          ((treeNodePtr.p->m_parentPtrI != RNIL && ERROR_INSERTED_CLEAR(17063))))
+      if (ERROR_INSERTED(17060) ||
+         (ERROR_INSERTED(17061) && (treeNodePtr.p->isLeaf())) ||
+         (ERROR_INSERTED(17062) && (treeNodePtr.p->m_parentPtrI != RNIL)) ||
+         (ERROR_INSERTED(17063) && (rand() % 7) == 0))
       {
+        jam();
+        CLEAR_ERROR_INSERT_VALUE;
         ndbout_c("Injecting OutOfSectionMemory error at line %d file %s",
                  __LINE__,  __FILE__);
         err = DbspjErr::OutOfSectionMemory;
@@ -6252,12 +6261,13 @@ Dbspj::scanIndex_send(Signal* signal,
            * - 17093: Fail on scanIndex_send() if treeNode not root
            */
 
-          if (ERROR_INSERTED_CLEAR(17090) ||
-              (requestsSent > 1 && ERROR_INSERTED_CLEAR(17091)) ||
-              (treeNodePtr.p->isLeaf() && ERROR_INSERTED_CLEAR(17092)) ||
-              (treeNodePtr.p->m_parentPtrI != RNIL && ERROR_INSERTED_CLEAR(17093)))
+          if (ERROR_INSERTED(17090) ||
+             (ERROR_INSERTED(17091) && requestsSent > 1) ||
+             (ERROR_INSERTED(17092) && treeNodePtr.p->isLeaf()) ||
+             (ERROR_INSERTED(17093) && treeNodePtr.p->m_parentPtrI != RNIL))
           {
             jam();
+            CLEAR_ERROR_INSERT_VALUE;
             ndbout_c("Injecting OutOfSectionMemory error at line %d file %s",
                      __LINE__,  __FILE__);
             err = DbspjErr::OutOfSectionMemory;
@@ -6310,11 +6320,12 @@ Dbspj::scanIndex_send(Signal* signal,
          */
         jam();
 
-        if (ERROR_INSERTED_CLEAR(17110) ||
-            (treeNodePtr.p->isLeaf() && ERROR_INSERTED_CLEAR(17111)) ||
-            (treeNodePtr.p->m_parentPtrI != RNIL && ERROR_INSERTED_CLEAR(17112)))
+        if (ERROR_INSERTED(17110) ||
+           (ERROR_INSERTED(17111) && treeNodePtr.p->isLeaf()) ||
+           (ERROR_INSERTED(17112) && treeNodePtr.p->m_parentPtrI != RNIL))
         {
           jam();
+          CLEAR_ERROR_INSERT_VALUE;
           ndbout_c("Injecting invalid schema version error at line %d file %s",
                    __LINE__,  __FILE__);
           // Provoke 'Invalid schema version' in order to receive SCAN_FRAGREF
@@ -7273,7 +7284,7 @@ bool
 Dbspj::appendToSection(Uint32& firstSegmentIVal,
                          const Uint32* src, Uint32 len)
 {
-  if (fi_cnt++ % 13 == 0 && ERROR_INSERTED(17510))
+  if (ERROR_INSERTED(17510) && fi_cnt++ % 13 == 0)
   {
     jam();
     ndbout_c("Injecting appendToSection error 17510 at line %d file %s",
@@ -7998,14 +8009,15 @@ Dbspj::parseDA(Build_context& ctx,
      * - 17052: Fail on parseDA if treeNode not root
      * - 17053: Fail on parseDA at a random node of the query tree
      */
-    if (ERROR_INSERTED_CLEAR(17050) ||
-        ((treeNodePtr.p->isLeaf() &&  ERROR_INSERTED_CLEAR(17051))) ||
-        ((treeNodePtr.p->m_parentPtrI != RNIL && ERROR_INSERTED_CLEAR(17052)))||
-        ((rand() % 7) == 0 && ERROR_INSERTED_CLEAR(17053)))
+    if (ERROR_INSERTED(17050) ||
+       (ERROR_INSERTED(17051) && (treeNodePtr.p->isLeaf())) ||
+       (ERROR_INSERTED(17052) && (treeNodePtr.p->m_parentPtrI != RNIL)) ||
+       (ERROR_INSERTED(17053) && (rand() % 7) == 0))
     {
+      jam();
+      CLEAR_ERROR_INSERT_VALUE;
       ndbout_c("Injecting OutOfSectionMemory error at line %d file %s",
                 __LINE__,  __FILE__);
-      jam();
       err = DbspjErr::OutOfSectionMemory;
       break;
     }

No bundle (reason: useless for push emails).
Thread
bzr push into mysql-5.1-telco-7.0 branch (ole.john.aske:4995 to 4996) Ole John Aske5 Oct