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

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 NODE_STATE_HPP
  14. #define NODE_STATE_HPP
  15. #include <NdbOut.hpp>
  16. #include <NodeBitmask.hpp>
  17. class NodeState {
  18. public:
  19.   enum StartLevel {
  20.     /**
  21.      * SL_NOTHING 
  22.      *   Nothing is started
  23.      */
  24.     SL_NOTHING    = 0,
  25.     /**
  26.      * SL_CMVMI
  27.      *   CMVMI is started
  28.      *   Listening to management server
  29.      *   Qmgr knows nothing...
  30.      */
  31.     SL_CMVMI = 1,
  32.     
  33.     /**
  34.      * SL_STARTING
  35.      *   All blocks are starting
  36.      *   Initial or restart
  37.      *   During this phase is <b>startPhase</b> valid
  38.      */
  39.     SL_STARTING = 2,
  40.     
  41.     /**
  42.      * The database is started open for connections
  43.      */
  44.     SL_STARTED = 3,
  45.     SL_SINGLEUSER = 4,
  46.     /**
  47.      * SL_STOPPING_1 - Inform API
  48.      *   API is informed not to start transactions on node
  49.      *  The database is about to close
  50.      *
  51.      *   New TcSeize(s) are refused (TcSeizeRef)
  52.      */
  53.     SL_STOPPING_1 = 5,
  54.     
  55.     /**
  56.      * SL_STOPPING_2 - Close TC
  57.      *   New transactions(TC) are refused
  58.      */
  59.     SL_STOPPING_2 = 6,
  60.     
  61.     /**
  62.      * SL_STOPPING_3 - Wait for reads in LQH
  63.      *   No transactions are running in TC
  64.      *   New scans(s) and read(s) are refused in LQH
  65.      *   NS: The node is not Primary for any fragment
  66.      *   NS: No node is allow to start
  67.      */
  68.     SL_STOPPING_3 = 7,
  69.     
  70.     /**
  71.      * SL_STOPPING_4 - Close LQH
  72.      *   Node is out of DIGETNODES
  73.      *   Insert/Update/Delete can still be running in LQH
  74.      *   GCP is refused
  75.      *   Node is not startable w.o Node Recovery
  76.      */
  77.     SL_STOPPING_4 = 8
  78.   };
  79.   enum StartType {
  80.     ST_INITIAL_START = 0,
  81.     ST_SYSTEM_RESTART = 1,
  82.     ST_NODE_RESTART = 2,
  83.     ST_INITIAL_NODE_RESTART = 3,
  84.     ST_ILLEGAL_TYPE = 4
  85.   };
  86.   
  87.   /**
  88.    * Length in 32-bit words
  89.    */
  90.   STATIC_CONST( DataLength = 8 + NdbNodeBitmask::Size );
  91.   
  92.   /**
  93.    * Constructor(s)
  94.    */
  95.   NodeState();
  96.   NodeState(StartLevel);
  97.   NodeState(StartLevel, bool systemShutdown);
  98.   NodeState(StartLevel, Uint32 startPhase, StartType);
  99.   void init();
  100.  
  101.   /**
  102.    * Current start level
  103.    */
  104.   Uint32 startLevel;
  105.   /**
  106.    * Node group 
  107.    */
  108.   Uint32 nodeGroup;  // valid when startLevel == SL_STARTING
  109.   /**
  110.    * Dynamic id
  111.    */ 
  112.   union {
  113.     Uint32 dynamicId;    // valid when startLevel == SL_STARTING to API
  114.     Uint32 masterNodeId; // When from cntr
  115.   };
  116.     
  117.   /**
  118.    * 
  119.    */
  120.   union {
  121.     struct {
  122.       Uint32 startPhase;     // valid when startLevel == SL_STARTING
  123.       Uint32 restartType;    // valid when startLevel == SL_STARTING
  124.     } starting;
  125.     struct {
  126.       Uint32 systemShutdown; // valid when startLevel == SL_STOPPING_{X}
  127.       Uint32 timeout;
  128.       Uint32 alarmTime;
  129.     } stopping;
  130.     
  131.   };
  132.   Uint32 singleUserMode;
  133.   Uint32 singleUserApi;          //the single user node
  134.   BitmaskPOD<NdbNodeBitmask::Size> m_connected_nodes;
  135.   void setDynamicId(Uint32 dynamic);
  136.   void setNodeGroup(Uint32 group);
  137.   void setSingleUser(Uint32 s);
  138.   void setSingleUserApi(Uint32 n);
  139.   
  140.   /**
  141.    * Is a node restart in progress (ordinary or initial)
  142.    */
  143.   bool getNodeRestartInProgress() const;
  144.   /**
  145.    * Is a system restart ongoing
  146.    */
  147.   bool getSystemRestartInProgress() const;
  148.   /**
  149.    * Is in single user mode?
  150.    */
  151.   bool getSingleUserMode() const;
  152.   /**
  153.    * Is in single user mode
  154.    */
  155.   Uint32 getSingleUserApi() const;
  156.   friend NdbOut & operator<<(NdbOut&, const NodeState&); 
  157. };
  158. inline
  159. NodeState::NodeState(){
  160.   init();
  161. }
  162. inline
  163. void
  164. NodeState::init(){
  165.   startLevel = SL_CMVMI;
  166.   nodeGroup = 0xFFFFFFFF;
  167.   dynamicId = 0xFFFFFFFF;
  168.   singleUserMode = 0;
  169.   singleUserApi = 0xFFFFFFFF;
  170.   m_connected_nodes.clear();
  171. }
  172. inline
  173. NodeState::NodeState(StartLevel sl){
  174.   init();
  175.   startLevel = sl;
  176.   singleUserMode = 0;
  177.   singleUserApi = 0xFFFFFFFF;
  178. }
  179. inline
  180. NodeState::NodeState(StartLevel sl, Uint32 sp, StartType typeOfStart){
  181.   init();
  182.   startLevel = sl;
  183.   starting.startPhase = sp;
  184.   starting.restartType = typeOfStart;
  185.   singleUserMode = 0;
  186.   singleUserApi = 0xFFFFFFFF;
  187. }
  188. inline
  189. NodeState::NodeState(StartLevel sl, bool sys){
  190.   init();
  191.   startLevel = sl;
  192.   stopping.systemShutdown = sys;
  193.   singleUserMode = 0;
  194.   singleUserApi = 0xFFFFFFFF;
  195. }
  196. inline
  197. void NodeState::setDynamicId(Uint32 dynamic){
  198.   dynamicId = dynamic;
  199. }
  200.   
  201. inline
  202. void NodeState::setNodeGroup(Uint32 group){
  203.   nodeGroup = group;
  204. }
  205. inline 
  206. void NodeState::setSingleUser(Uint32 s) {
  207.   singleUserMode = s;
  208. }
  209. inline 
  210. void NodeState::setSingleUserApi(Uint32 n) {
  211.   singleUserApi = n;
  212. }
  213. inline 
  214. bool NodeState::getNodeRestartInProgress() const {
  215.   return startLevel == SL_STARTING && 
  216.     (starting.restartType == ST_NODE_RESTART || 
  217.      starting.restartType == ST_INITIAL_NODE_RESTART);
  218. }
  219. inline 
  220. bool NodeState::getSingleUserMode() const {
  221.   return singleUserMode;
  222. }
  223. inline 
  224. Uint32 NodeState::getSingleUserApi() const {
  225.   return singleUserApi;
  226. }
  227. inline 
  228. bool NodeState::getSystemRestartInProgress() const {
  229.   return startLevel == SL_STARTING && starting.restartType == ST_SYSTEM_RESTART;
  230. }
  231. inline
  232. NdbOut &
  233. operator<<(NdbOut& ndbout, const NodeState & state){
  234.   ndbout << "[NodeState: startLevel: ";
  235.   switch(state.startLevel){
  236.   case NodeState::SL_NOTHING:
  237.     ndbout << "<NOTHING> ]";
  238.     break;
  239.   case NodeState::SL_CMVMI:
  240.     ndbout << "<CMVMI> ]";
  241.     break;
  242.   case NodeState::SL_STARTING:
  243.     ndbout << "<STARTING type: ";
  244.     switch(state.starting.restartType){
  245.     case NodeState::ST_INITIAL_START:
  246.       ndbout << " INITIAL START";
  247.       break;
  248.     case NodeState::ST_SYSTEM_RESTART:
  249.       ndbout << " SYSTEM RESTART ";
  250.       break;
  251.     case NodeState::ST_NODE_RESTART:
  252.       ndbout << " NODE RESTART ";
  253.       break;
  254.     case NodeState::ST_INITIAL_NODE_RESTART:
  255.       ndbout << " INITIAL NODE RESTART ";
  256.       break;
  257.     case NodeState::ST_ILLEGAL_TYPE:
  258.     default:
  259.       ndbout << " UNKNOWN " << state.starting.restartType;
  260.     }
  261.     ndbout << " phase: " << state.starting.startPhase << "> ]";
  262.     break;
  263.   case NodeState::SL_STARTED:
  264.     ndbout << "<STARTED> ]";
  265.     break;
  266.   case NodeState::SL_STOPPING_1:
  267.     ndbout << "<STOPPING 1 sys: " << state.stopping.systemShutdown << "> ]";
  268.     break;
  269.   case NodeState::SL_STOPPING_2:
  270.     ndbout << "<STOPPING 2 sys: " << state.stopping.systemShutdown << "> ]";
  271.     break;
  272.   case NodeState::SL_STOPPING_3:
  273.     ndbout << "<STOPPING 3 sys: " << state.stopping.systemShutdown << "> ]";
  274.     break;
  275.   case NodeState::SL_STOPPING_4: 
  276.     ndbout << "<STOPPING 4 sys: " << state.stopping.systemShutdown << "> ]";
  277.     break;
  278.   default:
  279.     ndbout << "<UNKNOWN " << state.startLevel << "> ]";
  280.   }
  281.   return ndbout;
  282. }
  283. #endif