ClusterMgr.hpp
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:6k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #ifndef ClusterMgr_H
  14. #define ClusterMgr_H
  15. #include "API.hpp"
  16. #include <ndb_limits.h>
  17. #include <NdbThread.h>
  18. #include <NdbMutex.h>
  19. #include <NdbCondition.h>
  20. #include <signaldata/ArbitSignalData.hpp>
  21. #include <signaldata/NodeStateSignalData.hpp>
  22. #include <NodeInfo.hpp>
  23. #include <NodeState.hpp>
  24. extern "C" void* runClusterMgr_C(void * me);
  25. /**
  26.  * @class ClusterMgr
  27.  */
  28. class ClusterMgr {
  29.   friend void* runClusterMgr_C(void * me);
  30.   friend void  execute(void *, struct SignalHeader * const, 
  31.        Uint8, Uint32 * const, LinearSectionPtr ptr[3]);
  32. public:
  33.   ClusterMgr(class TransporterFacade &);
  34.   ~ClusterMgr();
  35.   void init(struct ndb_mgm_configuration_iterator & config);
  36.   
  37.   void reportConnected(NodeId nodeId);
  38.   void reportDisconnected(NodeId nodeId);
  39.   
  40.   bool checkUpgradeCompatability(Uint32 nodeVersion);
  41.   void doStop();
  42.   void startThread();
  43.   
  44. private:
  45.   void threadMain();
  46.   
  47.   int  theStop;
  48.   class TransporterFacade & theFacade;
  49.   
  50. public:
  51.   struct Node {
  52.     Node();
  53.     bool defined;
  54.     bool connected;     // Transporter connected
  55.     bool compatible;    // Version is compatible
  56.     bool nfCompleteRep; // NF Complete Rep has arrived
  57.     bool m_alive;       // Node is alive
  58.     
  59.     NodeInfo  m_info;
  60.     NodeState m_state;
  61.     /**
  62.      * Heartbeat stuff
  63.      */
  64.     Uint32 hbFrequency; // Heartbeat frequence 
  65.     Uint32 hbCounter;   // # milliseconds passed since last hb sent
  66.     Uint32 hbSent;      // # heartbeats sent (without answer)
  67.   };
  68.   
  69.   const Node &  getNodeInfo(NodeId) const;
  70.   Uint32        getNoOfConnectedNodes() const;
  71.   
  72. private:
  73.   Uint32        noOfAliveNodes;
  74.   Uint32        noOfConnectedNodes;
  75.   Node          theNodes[MAX_NODES];
  76.   NdbThread*    theClusterMgrThread;
  77.   
  78.   /**
  79.    * Used for controlling start/stop of the thread
  80.    */
  81.   NdbMutex*     clusterMgrThreadMutex;
  82.   
  83.   void showState(NodeId nodeId);
  84.   void reportNodeFailed(NodeId nodeId);
  85.   /**
  86.    * Signals received
  87.    */
  88.   void execAPI_REGREQ    (const Uint32 * theData);
  89.   void execAPI_REGCONF   (const Uint32 * theData);
  90.   void execAPI_REGREF    (const Uint32 * theData);
  91.   void execNODE_FAILREP  (const Uint32 * theData);
  92.   void execNF_COMPLETEREP(const Uint32 * theData);
  93.   inline void set_node_alive(Node& node, bool alive){
  94.     if(node.m_alive && !alive)
  95.     {
  96.       assert(noOfAliveNodes);
  97.       noOfAliveNodes--;
  98.     }
  99.     else if(!node.m_alive && alive)
  100.     {
  101.       noOfAliveNodes++;
  102.     }
  103.     node.m_alive = alive;
  104.   }
  105. };
  106. inline
  107. const ClusterMgr::Node &
  108. ClusterMgr::getNodeInfo(NodeId nodeId) const {
  109.   return theNodes[nodeId];
  110. }
  111. inline
  112. Uint32
  113. ClusterMgr::getNoOfConnectedNodes() const {
  114.   return noOfConnectedNodes;
  115. }
  116. /*****************************************************************************/
  117. /**
  118.  * @class ArbitMgr
  119.  * Arbitration manager.  Runs in separate thread.
  120.  * Started only by a request from the kernel.
  121.  */
  122. extern "C" void* runArbitMgr_C(void* me);
  123. class ArbitMgr
  124. {
  125. public:
  126.   ArbitMgr(class TransporterFacade &);
  127.   ~ArbitMgr();
  128.   inline void setRank(unsigned n) { theRank = n; }
  129.   inline void setDelay(unsigned n) { theDelay = n; }
  130.   void doStart(const Uint32* theData);
  131.   void doChoose(const Uint32* theData);
  132.   void doStop(const Uint32* theData);
  133.   friend void* runArbitMgr_C(void* me);
  134. private:
  135.   class TransporterFacade & theFacade;
  136.   unsigned theRank;
  137.   unsigned theDelay;
  138.   void threadMain();
  139.   NdbThread* theThread;
  140.   NdbMutex* theThreadMutex;     // not really needed
  141.   struct ArbitSignal {
  142.     GlobalSignalNumber gsn;
  143.     ArbitSignalData data;
  144.     NDB_TICKS timestamp;
  145.     inline void init(GlobalSignalNumber aGsn, const Uint32* aData) {
  146.       gsn = aGsn;
  147.       if (aData != NULL)
  148.         memcpy(&data, aData, sizeof(data));
  149.       else
  150.         memset(&data, 0, sizeof(data));
  151.     }
  152.     inline void setTimestamp() {
  153.       timestamp = NdbTick_CurrentMillisecond();
  154.     }
  155.     inline NDB_TICKS getTimediff() {
  156.       NDB_TICKS now = NdbTick_CurrentMillisecond();
  157.       return now < timestamp ? 0 : now - timestamp;
  158.     }
  159.   };
  160.   NdbMutex* theInputMutex;
  161.   NdbCondition* theInputCond;
  162.   int theInputTimeout;
  163.   bool theInputFull;            // the predicate
  164.   ArbitSignal theInputBuffer;   // shared buffer
  165.   void sendSignalToThread(ArbitSignal& aSignal);
  166.   enum State {                  // thread states
  167.     StateInit,
  168.     StateStarted,               // thread started
  169.     StateChoose1,               // received one valid REQ
  170.     StateChoose2,               // received two valid REQs
  171.     StateFinished               // finished one way or other
  172.   };
  173.   State theState;
  174.   enum Stop {                   // stop code in ArbitSignal.data.code
  175.     StopExit = 1,               // at API exit
  176.     StopRequest = 2,            // request from kernel
  177.     StopRestart = 3             // stop before restart
  178.   };
  179.   void threadStart(ArbitSignal& aSignal);       // handle thread events
  180.   void threadChoose(ArbitSignal& aSignal);
  181.   void threadTimeout();
  182.   void threadStop(ArbitSignal& aSignal);
  183.   ArbitSignal theStartReq;
  184.   ArbitSignal theChooseReq1;
  185.   ArbitSignal theChooseReq2;
  186.   ArbitSignal theStopOrd;
  187.   void sendStartConf(ArbitSignal& aSignal, Uint32);
  188.   void sendChooseRef(ArbitSignal& aSignal, Uint32);
  189.   void sendChooseConf(ArbitSignal& aSignal, Uint32);
  190.   void sendStopRep(ArbitSignal& aSignal, Uint32);
  191.   void sendSignalToQmgr(ArbitSignal& aSignal);
  192. };
  193. #endif