List:Commits« Previous MessageNext Message »
From:Jonas Oreland Date:November 13 2008 2:14pm
Subject:bzr commit into mysql-5.1 branch (jonas:2733) Bug#40697
View as plain text  
#At file:///home/jonas/src/telco-6.2/

 2733 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

=== 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:14:11 +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:14:11 +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:14:11 +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:14:11 +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:14:11 +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:14:11 +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:14:11 +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:14:11 +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 commit into mysql-5.1 branch (jonas:2733) Bug#40697Jonas Oreland13 Nov