List:Commits« Previous MessageNext Message »
From:Jonas Oreland Date:November 13 2008 1:37pm
Subject:bzr push into mysql-5.1 branch (jonas:2733 to 2734) Bug#40697
View as plain text  
 2734 Jonas Oreland	2008-11-13
      ndb - bug#40697 - transaction can wait longer needed during node-failure-handling
modified:
  storage/ndb/include/ndb_version.h.in
  storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp
  storage/ndb/src/kernel/blocks/qmgr/Qmgr.hpp
  storage/ndb/src/kernel/blocks/qmgr/QmgrInit.cpp
  storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp
  storage/ndb/src/mgmsrv/MgmtSrvr.cpp
  storage/ndb/src/ndbapi/Ndbif.cpp
  storage/ndb/src/ndbapi/TransporterFacade.cpp

 2733 Frazer Clement	2008-11-11
      Bug# 39645 Losing size info for VARCHAR/CHAR for disk-data could segfault API apps
      
      VAR* types are stored fixed-size on disk.  This var->fixed mapping occurs 
      at the NDBAPI level, and some evidence of it can leak out to NDBAPI applications.
      
      This patch modifies the implementation of a number of NDBAPI methods so that
      disk-based VAR* types display the same behaviour as memory based VAR* types.
      
      From mysql-5.1-telco-6.4, the handling of VAR* types on disk is changed by 
      WL4499, and this patch becomes unnecessary.
      
      HugoTest table D2 is augmented with some VARCHAR and LONGVARCHAR columns.
modified:
  storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp
  storage/ndb/src/ndbapi/NdbInterpretedCode.cpp
  storage/ndb/src/ndbapi/NdbOperationDefine.cpp
  storage/ndb/src/ndbapi/NdbOperationExec.cpp
  storage/ndb/src/ndbapi/NdbOperationInt.cpp
  storage/ndb/src/ndbapi/NdbRecAttr.cpp
  storage/ndb/test/src/NDBT_Tables.cpp

=== modified file 'storage/ndb/include/ndb_version.h.in'
--- a/storage/ndb/include/ndb_version.h.in	2008-05-16 13:08:36 +0000
+++ b/storage/ndb/include/ndb_version.h.in	2008-11-13 13:15:56 +0000
@@ -207,4 +207,28 @@ ndbd_LIST_TABLES_CONF_long_signal(Uint32
   return x >= NDBD_LONG_LIST_TABLES_CONF_63;
 }
 
+#define NDBD_API_TAKE_OVERTCCONF_60 NDB_MAKE_VERSION(5,2,4)
+#define NDBD_API_TAKE_OVERTCCONF_62 NDB_MAKE_VERSION(6,2,17)
+#define NDBD_API_TAKE_OVERTCCONF_63 NDB_MAKE_VERSION(6,3,19)
+
+static
+inline
+int
+ndb_takeovertc(Uint32 x)
+{
+  if (x >= NDB_VERSION_D)
+    return 1;
+
+  const Uint32 major = (x >> 16) & 0xFF;
+  const Uint32 minor = (x >>  8) & 0xFF;
+
+  if (major >= 6)
+  {
+    if (minor == 2)
+      return x >= NDBD_API_TAKE_OVERTCCONF_62;
+  }
+
+  return x >= NDBD_API_TAKE_OVERTCCONF_63;
+}
+
 #endif

=== modified file 'storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp'
--- a/storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp	2008-11-11 09:33:56 +0000
+++ b/storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp	2008-11-13 13:15:56 +0000
@@ -7354,6 +7354,9 @@ Dbtc::checkNodeFailComplete(Signal* sign
     nfRep->failedNodeId = hostptr.i;
     sendSignal(cdihblockref, GSN_NF_COMPLETEREP, signal, 
 	       NFCompleteRep::SignalLength, JBB);
+
+    sendSignal(QMGR_REF, GSN_NF_COMPLETEREP, signal, 
+	       NFCompleteRep::SignalLength, JBB);
   }
 
   CRASH_INSERTION(8058);

=== modified file 'storage/ndb/src/kernel/blocks/qmgr/Qmgr.hpp'
--- a/storage/ndb/src/kernel/blocks/qmgr/Qmgr.hpp	2008-08-11 10:41:11 +0000
+++ b/storage/ndb/src/kernel/blocks/qmgr/Qmgr.hpp	2008-11-13 13:15:56 +0000
@@ -243,6 +243,7 @@ private:
   void execDUMP_STATE_ORD(Signal* signal);
   void execCONNECT_REP(Signal* signal);
   void execNDB_FAILCONF(Signal* signal);
+  void execNF_COMPLETEREP(Signal*);
   void execREAD_CONFIG_REQ(Signal* signal);
   void execSTTOR(Signal* signal);
   void execCM_INFOCONF(Signal* signal);

=== modified file 'storage/ndb/src/kernel/blocks/qmgr/QmgrInit.cpp'
--- a/storage/ndb/src/kernel/blocks/qmgr/QmgrInit.cpp	2007-11-23 10:09:30 +0000
+++ b/storage/ndb/src/kernel/blocks/qmgr/QmgrInit.cpp	2008-11-13 13:15:56 +0000
@@ -100,6 +100,7 @@ Qmgr::Qmgr(Block_context& ctx)
   // Received signals
   addRecSignal(GSN_CONNECT_REP, &Qmgr::execCONNECT_REP);
   addRecSignal(GSN_NDB_FAILCONF, &Qmgr::execNDB_FAILCONF);
+  addRecSignal(GSN_NF_COMPLETEREP, &Qmgr::execNF_COMPLETEREP);
   addRecSignal(GSN_READ_CONFIG_REQ, &Qmgr::execREAD_CONFIG_REQ);
   addRecSignal(GSN_STTOR, &Qmgr::execSTTOR);
   addRecSignal(GSN_CLOSE_COMCONF, &Qmgr::execCLOSE_COMCONF);

=== modified file 'storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp'
--- a/storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp	2008-08-27 19:56:41 +0000
+++ b/storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp	2008-11-13 13:15:56 +0000
@@ -2714,12 +2714,47 @@ void Qmgr::execNDB_FAILCONF(Signal* sign
     if (nodePtr.p->phase == ZAPI_ACTIVE){
       jam();
       sendSignal(nodePtr.p->blockRef, GSN_NF_COMPLETEREP, signal, 
-                 NFCompleteRep::SignalLength, JBA);
+                 NFCompleteRep::SignalLength, JBB);
     }//if
   }//for
   return;
 }//Qmgr::execNDB_FAILCONF()
 
+void
+Qmgr::execNF_COMPLETEREP(Signal* signal)
+{
+  jamEntry();
+  NFCompleteRep rep = *(NFCompleteRep*)signal->getDataPtr();
+  if (rep.blockNo != DBTC)
+  {
+    jam();
+    ndbassert(false);
+    return;
+  }
+
+  /**
+   * This is a disgrace...but execNF_COMPLETEREP in ndbapi is a mess
+   *   actually equally messy as it is in ndbd...
+   *   this is therefore a simple way of having ndbapi to get
+   *   earlier information that transactions can be aborted
+   */
+  signal->theData[0] = rep.failedNodeId;
+  NodeRecPtr nodePtr;
+  for (nodePtr.i = 1; nodePtr.i < MAX_NODES; nodePtr.i++) 
+  {
+    jam();
+    ptrAss(nodePtr, nodeRec);
+    if (nodePtr.p->phase == ZAPI_ACTIVE && 
+        ndb_takeovertc(getNodeInfo(nodePtr.i).m_version))
+    {
+      jam();
+      sendSignal(nodePtr.p->blockRef, GSN_TAKE_OVERTCCONF, signal, 
+                 NFCompleteRep::SignalLength, JBB);
+    }//if
+  }//for
+  return;
+}
+
 /*******************************/
 /* DISCONNECT_REP             */
 /*******************************/

=== modified file 'storage/ndb/src/mgmsrv/MgmtSrvr.cpp'
--- a/storage/ndb/src/mgmsrv/MgmtSrvr.cpp	2008-09-02 09:27:09 +0000
+++ b/storage/ndb/src/mgmsrv/MgmtSrvr.cpp	2008-11-13 13:15:56 +0000
@@ -855,6 +855,8 @@ MgmtSrvr::sendVersionReq(int v_nodeId, 
 	do_send = 1; // retry with other node
       continue;
     }
+    case GSN_TAKE_OVERTCCONF:
+      continue;
     default:
       report_unknown_signal(signal);
       return SEND_OR_RECEIVE_FAILED;
@@ -1169,6 +1171,8 @@ int MgmtSrvr::sendSTOP_REQ(const Vector<
 	stoppedNodes.bitOR(mask);
       break;
     }
+    case GSN_TAKE_OVERTCCONF:
+      continue;
     default:
       report_unknown_signal(signal);
 #ifdef VM_TRACE
@@ -1729,6 +1733,8 @@ MgmtSrvr::setEventReportingLevelImpl(int
       nodes.clear(rep->failedNodeId);
       break;
     }
+    case GSN_TAKE_OVERTCCONF:
+      continue;
     default:
       report_unknown_signal(signal);
       return SEND_OR_RECEIVE_FAILED;
@@ -2014,6 +2020,9 @@ MgmtSrvr::handleReceivedSignal(NdbApiSig
     ndbout << "TAMPER ORD" << endl;
     break;
 
+  case GSN_TAKE_OVERTCCONF:
+    break;
+
   default:
     g_eventLogger->error("Unknown signal received. SignalNumber: "
                          "%i from (%d, %x)",
@@ -2208,6 +2217,8 @@ MgmtSrvr::alloc_node_id_req(NodeId free_
       // ignore NF_COMPLETEREP will come
       continue;
     }
+    case GSN_TAKE_OVERTCCONF:
+      continue;
     default:
       report_unknown_signal(signal);
       return SEND_OR_RECEIVE_FAILED;
@@ -2721,6 +2732,8 @@ MgmtSrvr::startBackup(Uint32& backupId, 
       // master node will report aborted backup
       break;
     }
+    case GSN_TAKE_OVERTCCONF:
+      continue;
     default:
       report_unknown_signal(signal);
       return SEND_OR_RECEIVE_FAILED;

=== modified file 'storage/ndb/src/ndbapi/Ndbif.cpp'
--- a/storage/ndb/src/ndbapi/Ndbif.cpp	2008-10-24 11:00:37 +0000
+++ b/storage/ndb/src/ndbapi/Ndbif.cpp	2008-11-13 13:15:56 +0000
@@ -905,6 +905,9 @@ Ndb::handleReceivedSignal(NdbApiSignal* 
     goto InvalidSignal;
     return;
   } 
+  case GSN_TAKE_OVERTCCONF:
+    abortTransactionsAfterNodeFailure(tFirstData); // theData[0]
+    break;
   default:
     goto InvalidSignal;
   }//swich

=== modified file 'storage/ndb/src/ndbapi/TransporterFacade.cpp'
--- a/storage/ndb/src/ndbapi/TransporterFacade.cpp	2008-08-12 09:40:26 +0000
+++ b/storage/ndb/src/ndbapi/TransporterFacade.cpp	2008-11-13 13:15:56 +0000
@@ -362,6 +362,16 @@ execute(void * callbackObj, SignalHeader
        }
        break;
      }
+     case GSN_TAKE_OVERTCCONF:
+     {
+       /**
+	* Report
+	*/
+       NdbApiSignal tSignal(* header);
+       tSignal.setDataPtr(theData);
+       theFacade->for_each(&tSignal, ptr);
+       return;
+     }
      default:
        break;
        

Thread
bzr push into mysql-5.1 branch (jonas:2733 to 2734) Bug#40697Jonas Oreland13 Nov