Sysfile.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 SYSFILE_HPP
  14. #define SYSFILE_HPP
  15. #include <ndb_types.h>
  16. #include <ndb_limits.h>
  17. #include <NodeBitmask.hpp>
  18. /**
  19.  * No bits in Sysfile to represent nodeid
  20.  */
  21. #define NODEID_BITS 8
  22. /**
  23.  * Constant representing that node do not belong to
  24.  * any node group
  25.  */
  26. #define NO_NODE_GROUP_ID ((1 << NODEID_BITS) - 1)
  27. /**
  28.  * Dummy macro to make emacs indent better
  29.  */
  30. #define _F(x) x
  31. /**
  32.  * No of 32 bits word in sysfile
  33.  * 
  34.  *   5 + 
  35.  *   MAX_NDB_NODES +                               // lastCompletedGCI
  36.  *   NODE_ARRAY_SIZE(MAX_NDB_NODES, 4) +           // nodeStatus
  37.  *   NODE_ARRAY_SIZE(MAX_NDB_NODES, NODEID_BITS) + // nodeGroups
  38.  *   NODE_ARRAY_SIZE(MAX_NDB_NODES, NODEID_BITS) + // takeOver
  39.  *   NodeBitmask::NDB_NODE_BITMASK_SIZE            // Lcp Active
  40.  */
  41. #define _SYSFILE_SIZE32 (5 + 
  42.                          MAX_NDB_NODES + 
  43.                          NODE_ARRAY_SIZE(MAX_NDB_NODES, 4) + 
  44.                          NODE_ARRAY_SIZE(MAX_NDB_NODES, NODEID_BITS) + 
  45.                          NODE_ARRAY_SIZE(MAX_NDB_NODES, NODEID_BITS) + 
  46.                          _NDB_NODE_BITMASK_SIZE)
  47. /**
  48.  * This struct defines the format of P<X>.sysfile
  49.  */
  50. struct Sysfile {
  51. public:
  52.   /**
  53.    * No of 32 bits words in the sysfile
  54.    */
  55.   STATIC_CONST( SYSFILE_SIZE32 = _SYSFILE_SIZE32 );
  56.   
  57.   Uint32 systemRestartBits;
  58.   static bool getInitialStartOngoing(const Uint32 & systemRestartBits);
  59.   static void setInitialStartOngoing(Uint32 & systemRestartBits);
  60.   static void clearInitialStartOngoing(Uint32 & systemRestartBits);
  61.   static bool getRestartOngoing(const Uint32 & systemRestartBits);
  62.   static void setRestartOngoing(Uint32 & systemRestartBits);
  63.   static void clearRestartOngoing(Uint32 & systemRestartBits);
  64.   static bool getLCPOngoing(const Uint32 & systemRestartBits);
  65.   static void setLCPOngoing(Uint32 & systemRestartBits);
  66.   static void clearLCPOngoing(Uint32 & systemRestartBits);
  67.   
  68.   Uint32 keepGCI;
  69.   Uint32 oldestRestorableGCI;
  70.   Uint32 newestRestorableGCI;
  71.   Uint32 latestLCP_ID;
  72.   
  73.   /**
  74.    * Last completed GCI for each node
  75.    */
  76.   Uint32 lastCompletedGCI[MAX_NDB_NODES];
  77.   
  78.   /**
  79.    * Active status bits
  80.    *
  81.    *  It takes 4 bits to represent it
  82.    */
  83.   enum ActiveStatus {
  84.     NS_Active                  = 0
  85.     ,NS_ActiveMissed_1         = 1
  86.     ,NS_ActiveMissed_2         = 2
  87.     ,NS_ActiveMissed_3         = 3
  88.     ,NS_HotSpare               = 4
  89.     ,NS_NotActive_NotTakenOver = 5
  90.     ,NS_TakeOver               = 6
  91.     ,NS_NotActive_TakenOver    = 7
  92.     ,NS_NotDefined             = 8
  93.     ,NS_Standby                = 9
  94.   };
  95.   STATIC_CONST( NODE_STATUS_SIZE = NODE_ARRAY_SIZE(MAX_NDB_NODES, 4) );
  96.   Uint32 nodeStatus[NODE_STATUS_SIZE];
  97.   static Uint32 getNodeStatus(NodeId, const Uint32 nodeStatus[]);
  98.   static void   setNodeStatus(NodeId, Uint32 nodeStatus[], Uint32 status);
  99.   
  100.   /**
  101.    * The node group of each node
  102.    *   Sizeof(NodeGroup) = 8 Bit
  103.    */
  104.   STATIC_CONST( NODE_GROUPS_SIZE = NODE_ARRAY_SIZE(MAX_NDB_NODES, 
  105.  NODEID_BITS) );
  106.   Uint32 nodeGroups[NODE_GROUPS_SIZE];
  107.   
  108.   static Uint16 getNodeGroup(NodeId, const Uint32 nodeGroups[]);
  109.   static void   setNodeGroup(NodeId, Uint32 nodeGroups[], Uint16 group);
  110.   /**
  111.    * Any node can take over for any node
  112.    */
  113.   STATIC_CONST( TAKE_OVER_SIZE = NODE_ARRAY_SIZE(MAX_NDB_NODES, 
  114.  NODEID_BITS) );
  115.   Uint32 takeOver[TAKE_OVER_SIZE];
  116.   static NodeId getTakeOverNode(NodeId, const Uint32 takeOver[]);
  117.   static void   setTakeOverNode(NodeId, Uint32 takeOver[], NodeId toNode);
  118.   
  119.   /**
  120.    * Is a node running a LCP
  121.    */
  122.   Uint32 lcpActive[NdbNodeBitmask::Size];
  123. };
  124. #if (MAX_NDB_NODES > (1<<NODEID_BITS))
  125. #error "Sysfile node id is too small"
  126. #endif
  127. /**
  128.  * Restart Info
  129.  *
  130.  * i = Initial start completed
  131.  * r = Crash during system restart
  132.  * l = Crash during local checkpoint
  133.  *           1111111111222222222233
  134.  * 01234567890123456789012345678901
  135.  * irl
  136.  */
  137. inline
  138. bool 
  139. Sysfile::getInitialStartOngoing(const Uint32 & systemRestartBits){
  140.   return systemRestartBits & 1;
  141. }
  142. inline 
  143. void 
  144. Sysfile::setInitialStartOngoing(Uint32 & systemRestartBits){
  145.   systemRestartBits |= 1;
  146. }
  147. inline
  148. void
  149. Sysfile::clearInitialStartOngoing(Uint32 & systemRestartBits){
  150.   systemRestartBits &= ~1;
  151. }
  152. inline 
  153. bool 
  154. Sysfile::getRestartOngoing(const Uint32 & systemRestartBits){
  155.   return (systemRestartBits & 2) != 0;
  156. }
  157. inline
  158. void 
  159. Sysfile::setRestartOngoing(Uint32 & systemRestartBits){
  160.   systemRestartBits |= 2;
  161. }
  162. inline
  163. void 
  164. Sysfile::clearRestartOngoing(Uint32 & systemRestartBits){
  165.   systemRestartBits &= ~2;
  166. }
  167. inline 
  168. bool
  169. Sysfile::getLCPOngoing(const Uint32 & systemRestartBits){
  170.   return systemRestartBits & 4;
  171. }
  172. inline
  173. void 
  174. Sysfile::setLCPOngoing(Uint32 & systemRestartBits){
  175.   systemRestartBits |= 4;
  176. }
  177. inline
  178. void 
  179. Sysfile::clearLCPOngoing(Uint32 & systemRestartBits){
  180.   systemRestartBits &= ~4;
  181. }
  182. inline
  183. Uint32 
  184. Sysfile::getNodeStatus(NodeId nodeId, const Uint32 nodeStatus[]){
  185.   const int word  = nodeId >> 3;
  186.   const int shift = (nodeId & 7) << 2;
  187.   
  188.   return (nodeStatus[word] >> shift) & 15;
  189. }
  190. inline
  191. void
  192. Sysfile::setNodeStatus(NodeId nodeId, Uint32 nodeStatus[], Uint32 status){
  193.   const int word  = nodeId >> 3;
  194.   const int shift = (nodeId & 7) << 2;
  195.   const Uint32 mask = ~(((Uint32)15) << shift);
  196.   const Uint32 tmp = nodeStatus[word];
  197.   
  198.   nodeStatus[word] = (tmp & mask) | ((status & 15) << shift);
  199. }
  200. inline
  201. Uint16
  202. Sysfile::getNodeGroup(NodeId nodeId, const Uint32 nodeGroups[]){
  203.   const int word = nodeId >> 2;
  204.   const int shift = (nodeId & 3) << 3;
  205.   
  206.   return (nodeGroups[word] >> shift) & 255;
  207. }
  208. inline
  209. void
  210. Sysfile::setNodeGroup(NodeId nodeId, Uint32 nodeGroups[], Uint16 group){
  211.   const int word = nodeId >> 2;
  212.   const int shift = (nodeId & 3) << 3;
  213.   
  214.   const Uint32 mask = ~(((Uint32)255) << shift);
  215.   const Uint32 tmp = nodeGroups[word];
  216.   
  217.   nodeGroups[word] = (tmp & mask) | ((group & 255) << shift);  
  218. }
  219. inline 
  220. NodeId 
  221. Sysfile::getTakeOverNode(NodeId nodeId, const Uint32 takeOver[]){
  222.   const int word = nodeId >> 2;
  223.   const int shift = (nodeId & 3) << 3;
  224.   
  225.   return (takeOver[word] >> shift) & 255;
  226. }
  227. inline
  228. void
  229. Sysfile::setTakeOverNode(NodeId nodeId, Uint32 takeOver[], NodeId toNode){
  230.   const int word = nodeId >> 2;
  231.   const int shift = (nodeId & 3) << 3;
  232.   
  233.   const Uint32 mask = ~(((Uint32)255) << shift);
  234.   const Uint32 tmp = takeOver[word];
  235.   
  236.   takeOver[word] = (tmp & mask) | ((toNode & 255) << shift);  
  237. }
  238. #endif