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

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 ARBIT_SIGNAL_DATA_H
  14. #define ARBIT_SIGNAL_DATA_H
  15. #include <string.h>
  16. #include <NodeBitmask.hpp>
  17. #include <NdbTick.h>
  18. #include <NdbHost.h>
  19. #include "SignalData.hpp"
  20. #include "SignalDataPrint.hpp"
  21. /**
  22.  * The ticket.
  23.  */
  24. class ArbitTicket {
  25. private:
  26.   Uint32 data[2];
  27. public:
  28.   STATIC_CONST( DataLength = 2 );
  29.   STATIC_CONST( TextLength = DataLength * 8 );  // hex digits
  30.   inline void clear() {
  31.     data[0] = 0;
  32.     data[1] = 0;
  33.   }
  34.   inline void update() {
  35.     Uint16 cnt = data[0] & 0xFFFF;              // previous count
  36.     Uint16 pid = NdbHost_GetProcessId();
  37.     data[0] = (pid << 16) | (cnt + 1);
  38.     data[1] = NdbTick_CurrentMillisecond();
  39.   }
  40.   inline bool match(ArbitTicket& aTicket) const {
  41.     return
  42.       data[0] == aTicket.data[0] &&
  43.       data[1] == aTicket.data[1];
  44.   }
  45.   inline void getText(char *buf, size_t buf_len) const {
  46.     BaseString::snprintf(buf, buf_len, "%08x%08x", data[0], data[1]);
  47.   }
  48. /*  inline char* getText() const {
  49.     static char buf[TextLength + 1];
  50.     getText(buf, sizeof(buf));
  51.     return buf;
  52.   } */
  53. };
  54. /**
  55.  * Result codes.  Part of signal data.  Each signal uses only
  56.  * a subset but a common namespace is convenient.
  57.  */
  58. class ArbitCode {
  59. public:
  60.   STATIC_CONST( ErrTextLength = 80 );
  61.   enum {
  62.     NoInfo = 0,
  63.     // CFG signals
  64.     CfgRank1 = 1,               // these have to be 1 and 2
  65.     CfgRank2 = 2,
  66.     // QMGR continueB thread state
  67.     ThreadStart = 11,           // continueB thread started
  68.     // PREP signals
  69.     PrepPart1 = 21,             // zero old ticket
  70.     PrepPart2 = 22,             // get new ticket
  71.     PrepAtrun = 23,             // late joiner gets ticket at RUN time
  72.     // arbitrator state
  73.     ApiStart = 31,              // arbitrator thread started
  74.     ApiFail = 32,               // arbitrator died
  75.     ApiExit = 33,               // arbitrator reported it will exit
  76.     // arbitration result
  77.     LoseNodes = 41,             // lose on ndb node count
  78.     WinNodes = 42,              // win on ndb node count
  79.     WinGroups = 43,             // we win, no need for arbitration
  80.     LoseGroups = 44,            // we lose, missing node group
  81.     Partitioning = 45,          // possible network partitioning
  82.     WinChoose = 46,             // positive reply
  83.     LoseChoose = 47,            // negative reply
  84.     LoseNorun = 48,             // arbitrator required but not running
  85.     LoseNocfg = 49,             // arbitrator required but none configured
  86.     // general error codes
  87.     ErrTicket = 91,             // invalid arbitrator-ticket
  88.     ErrToomany = 92,            // too many requests
  89.     ErrState = 93,              // invalid state
  90.     ErrTimeout = 94,            // timeout waiting for signals
  91.     ErrUnknown = 95             // unknown error
  92.   };
  93.   static inline void getErrText(Uint32 code, char* buf, size_t buf_len) {
  94.     switch (code) {
  95.     case ErrTicket:
  96.       BaseString::snprintf(buf, buf_len, "invalid arbitrator-ticket");
  97.       break;
  98.     case ErrToomany:
  99.       BaseString::snprintf(buf, buf_len, "too many requests");
  100.       break;
  101.     case ErrState:
  102.       BaseString::snprintf(buf, buf_len, "invalid state");
  103.       break;
  104.     case ErrTimeout:
  105.       BaseString::snprintf(buf, buf_len, "timeout");
  106.       break;
  107.     default:
  108.       BaseString::snprintf(buf, buf_len, "unknown error [code=%u]", code);
  109.       break;
  110.     }
  111.   }
  112. };
  113. /**
  114.  * Common class for arbitration signal data.
  115.  */
  116. class ArbitSignalData {
  117. public:
  118.   Uint32 sender;                // sender's node id (must be word 0)
  119.   Uint32 code;                  // result code or other info
  120.   Uint32 node;                  // arbitrator node id
  121.   ArbitTicket ticket;           // ticket
  122.   NodeBitmask mask;             // set of nodes
  123.   STATIC_CONST( SignalLength = 3 + ArbitTicket::DataLength + NodeBitmask::Size );
  124.   inline bool match(ArbitSignalData& aData) const {
  125.     return
  126.       node == aData.node &&
  127.       ticket.match(aData.ticket);
  128.   }
  129. };
  130. #endif