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

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. #include <ndb_global.h>
  14. #include "ClusterConfiguration.hpp"
  15. #include <ErrorHandlingMacros.hpp>
  16. #include <pc.hpp>
  17. #include <BlockNumbers.h>
  18. #include <signaldata/AccSizeAltReq.hpp>
  19. #include <signaldata/DictSizeAltReq.hpp>
  20. #include <signaldata/DihSizeAltReq.hpp>
  21. #include <signaldata/LqhSizeAltReq.hpp>
  22. #include <signaldata/TcSizeAltReq.hpp>
  23. #include <signaldata/TupSizeAltReq.hpp>
  24. #include <signaldata/TuxSizeAltReq.hpp>
  25. ClusterConfiguration::ClusterConfiguration()
  26. {
  27.   for (unsigned i= 0; i< MAX_SIZEALT_BLOCKS; i++)             // initialize
  28.     for (unsigned j= 0; j< MAX_SIZEALT_RECORD; j++) {
  29.       the_clusterData.SizeAltData.varSize[i][j].valid = false;
  30.       the_clusterData.SizeAltData.varSize[i][j].nrr = 0;
  31.     }
  32.   for (unsigned i1 = 0; i1< 5; i1++)                          // initialize
  33.     for (unsigned j1= 0; j1< CmvmiCfgConf::NO_OF_WORDS; j1++)
  34.       the_clusterData.ispValues[i1][j1] = 0;
  35.   
  36.   the_clusterData.SizeAltData.noOfNodes = 0;
  37.   the_clusterData.SizeAltData.noOfNDBNodes = 0;
  38.   the_clusterData.SizeAltData.noOfAPINodes = 0;
  39.   the_clusterData.SizeAltData.noOfMGMNodes = 0;
  40. }
  41. ClusterConfiguration::~ClusterConfiguration(){
  42. }
  43. void
  44. setValue(VarSize* dst, const int index, UintR variableValue){
  45.   assert(dst != NULL);
  46.   assert(index >= 0 && index < MAX_SIZEALT_RECORD);
  47.   dst[index].nrr   = variableValue;
  48.   dst[index].valid = true;
  49. }
  50. void
  51. ClusterConfiguration::calcSizeAlteration()
  52. {
  53.   SizeAlt *size = &the_clusterData.SizeAltData;
  54.   size->noOfTables++;           // Remove impact of system table
  55.   size->noOfTables += size->noOfIndexes; // Indexes are tables too
  56.   size->noOfAttributes += 2;  // ---"----
  57.   size->noOfTables *= 2;      // Remove impact of Dict need 2 ids for each table
  58.   Uint32 noOfDBNodes = size->noOfNDBNodes;
  59.   if (noOfDBNodes > 15) {
  60.     noOfDBNodes = 15;
  61.   }//if
  62.   Uint32 noOfLocalScanRecords = (noOfDBNodes * size->noOfScanRecords) + 1;
  63.   Uint32 noOfTCScanRecords = size->noOfScanRecords;
  64.   {
  65.     /**
  66.      * Acc Size Alt values
  67.      */
  68.     size->blockNo[ACC] = DBACC;
  69.     
  70.     VarSize * const acc = &(size->varSize[ACC][0]);
  71.     
  72.     // Can keep 65536 pages (= 0.5 GByte)
  73.     setValue(acc, AccSizeAltReq::IND_DIR_RANGE, 
  74.      4 * NO_OF_FRAG_PER_NODE * size->noOfTables* size->noOfReplicas); 
  75.     
  76.     setValue(acc, AccSizeAltReq::IND_DIR_ARRAY,
  77.      (size->noOfIndexPages >> 8) + 
  78.      4 * NO_OF_FRAG_PER_NODE * size->noOfTables* size->noOfReplicas);
  79.     
  80.     setValue(acc, AccSizeAltReq::IND_FRAGMENT,
  81.      2 * NO_OF_FRAG_PER_NODE * size->noOfTables* size->noOfReplicas);
  82.     
  83.     /*-----------------------------------------------------------------------*/
  84.     // The extra operation records added are used by the scan and node 
  85.     // recovery process. 
  86.     // Node recovery process will have its operations dedicated to ensure
  87.     // that they never have a problem with allocation of the operation record.
  88.     // The remainder are allowed for use by the scan processes.
  89.     /*-----------------------------------------------------------------------*/
  90.     setValue(acc, AccSizeAltReq::IND_OP_RECS,
  91.      size->noOfReplicas*((16 * size->noOfOperations) / 10 + 50) + 
  92.              (noOfLocalScanRecords * MAX_PARALLEL_SCANS_PER_FRAG) +
  93.              NODE_RECOVERY_SCAN_OP_RECORDS);
  94.     setValue(acc, AccSizeAltReq::IND_OVERFLOW_RECS,
  95.      size->noOfIndexPages + 
  96.      2 * NO_OF_FRAG_PER_NODE * size->noOfTables* size->noOfReplicas);
  97.     
  98.     setValue(acc, AccSizeAltReq::IND_PAGE8, 
  99.      size->noOfIndexPages + 32);
  100.   
  101.     setValue(acc, AccSizeAltReq::IND_ROOT_FRAG, 
  102.      NO_OF_FRAG_PER_NODE * size->noOfTables* size->noOfReplicas);
  103.     
  104.     setValue(acc, AccSizeAltReq::IND_TABLE, 
  105.      size->noOfTables);
  106.     
  107.     setValue(acc, AccSizeAltReq::IND_SCAN, 
  108.      noOfLocalScanRecords);
  109.   }
  110.   
  111.   {
  112.     /**
  113.      * Dict Size Alt values
  114.      */
  115.     size->blockNo[DICT] = DBDICT;
  116.     
  117.     VarSize * const dict = &(size->varSize[DICT][0]);
  118.     
  119.     setValue(dict, DictSizeAltReq::IND_ATTRIBUTE, 
  120.              size->noOfAttributes);
  121.     
  122.     setValue(dict, DictSizeAltReq::IND_CONNECT, 
  123.              size->noOfOperations + 32);   
  124.     
  125.     setValue(dict, DictSizeAltReq::IND_FRAG_CONNECT, 
  126.      NO_OF_FRAG_PER_NODE * size->noOfNDBNodes * size->noOfReplicas);
  127.     setValue(dict, DictSizeAltReq::IND_TABLE, 
  128.              size->noOfTables);
  129.     
  130.     setValue(dict, DictSizeAltReq::IND_TC_CONNECT, 
  131.              2* size->noOfOperations);
  132.   }
  133.   
  134.   {
  135.     /**
  136.      * Dih Size Alt values
  137.      */
  138.     size->blockNo[DIH] = DBDIH;
  139.     
  140.     VarSize * const dih = &(size->varSize[DIH][0]);
  141.     
  142.     setValue(dih, DihSizeAltReq::IND_API_CONNECT, 
  143.              2 * size->noOfTransactions);
  144.     
  145.     setValue(dih, DihSizeAltReq::IND_CONNECT, 
  146.              size->noOfOperations + 46);
  147.     
  148.     setValue(dih, DihSizeAltReq::IND_FRAG_CONNECT, 
  149.      NO_OF_FRAG_PER_NODE *  size->noOfTables *  size->noOfNDBNodes);
  150.     
  151.     int temp;
  152.     temp = size->noOfReplicas - 2;
  153.     if (temp < 0)
  154.       temp = 1;
  155.     else
  156.       temp++;
  157.     setValue(dih, DihSizeAltReq::IND_MORE_NODES, 
  158.              temp * NO_OF_FRAG_PER_NODE *
  159.              size->noOfTables *  size->noOfNDBNodes);
  160.     
  161.     setValue(dih, DihSizeAltReq::IND_REPLICAS, 
  162.              NO_OF_FRAG_PER_NODE * size->noOfTables *
  163.              size->noOfNDBNodes * size->noOfReplicas);
  164.     setValue(dih, DihSizeAltReq::IND_TABLE, 
  165.              size->noOfTables);
  166.   }
  167.   
  168.   {
  169.     /**
  170.      * Lqh Size Alt values
  171.      */
  172.     size->blockNo[LQH] = DBLQH;
  173.     
  174.     VarSize * const lqh = &(size->varSize[LQH][0]);
  175.     setValue(lqh, LqhSizeAltReq::IND_FRAG, 
  176.              NO_OF_FRAG_PER_NODE * size->noOfTables * size->noOfReplicas);
  177.     
  178.     setValue(lqh, LqhSizeAltReq::IND_CONNECT, 
  179.              size->noOfReplicas*((11 * size->noOfOperations) / 10 + 50));
  180.     
  181.     setValue(lqh, LqhSizeAltReq::IND_TABLE, 
  182.              size->noOfTables);
  183.     setValue(lqh, LqhSizeAltReq::IND_TC_CONNECT, 
  184.              size->noOfReplicas*((16 * size->noOfOperations) / 10 + 50));
  185.     
  186.     setValue(lqh, LqhSizeAltReq::IND_REPLICAS, 
  187.              size->noOfReplicas);
  188.     setValue(lqh, LqhSizeAltReq::IND_LOG_FILES, 
  189.              (4 * the_clusterData.ispValues[1][4]));
  190.     setValue(lqh, LqhSizeAltReq::IND_SCAN, 
  191.              noOfLocalScanRecords);
  192.   }
  193.   
  194.   {
  195.     /**
  196.      * Tc Size Alt values
  197.      */
  198.     size->blockNo[TC] = DBTC;
  199.     
  200.     VarSize * const tc = &(size->varSize[TC][0]);
  201.     
  202.     setValue(tc, TcSizeAltReq::IND_API_CONNECT, 
  203.              3 * size->noOfTransactions);
  204.     
  205.     setValue(tc, TcSizeAltReq::IND_TC_CONNECT, 
  206.              size->noOfOperations + 16 + size->noOfTransactions);
  207.     
  208.     setValue(tc, TcSizeAltReq::IND_TABLE, 
  209.              size->noOfTables);
  210.     
  211.     setValue(tc, TcSizeAltReq::IND_LOCAL_SCAN, 
  212.              noOfLocalScanRecords);
  213.     
  214.     setValue(tc, TcSizeAltReq::IND_TC_SCAN, 
  215.              noOfTCScanRecords);
  216.   }
  217.   
  218.   {
  219.     /**
  220.      * Tup Size Alt values
  221.      */
  222.     size->blockNo[TUP] = DBTUP;
  223.     
  224.     VarSize * const tup = &(size->varSize[TUP][0]);
  225.     setValue(tup, TupSizeAltReq::IND_DISK_PAGE_ARRAY, 
  226.      2 * NO_OF_FRAG_PER_NODE * size->noOfTables* size->noOfReplicas);
  227.     
  228.     setValue(tup, TupSizeAltReq::IND_DISK_PAGE_REPRESENT, 
  229.              size->noOfDiskClusters);
  230.     
  231.     setValue(tup, TupSizeAltReq::IND_FRAG, 
  232.          2 * NO_OF_FRAG_PER_NODE * size->noOfTables* size->noOfReplicas);
  233.     
  234.     setValue(tup, TupSizeAltReq::IND_PAGE_CLUSTER, 
  235.              size->noOfFreeClusters);
  236.     
  237.     setValue(tup, TupSizeAltReq::IND_LOGIC_PAGE, 
  238.              size->noOfDiskBufferPages + size->noOfDiskClusters);
  239.     
  240.     setValue(tup, TupSizeAltReq::IND_OP_RECS, 
  241.              size->noOfReplicas*((16 * size->noOfOperations) / 10 + 50));
  242.     
  243.     setValue(tup, TupSizeAltReq::IND_PAGE, 
  244.              size->noOfDataPages);
  245.     
  246.     setValue(tup, TupSizeAltReq::IND_PAGE_RANGE, 
  247.      4 * NO_OF_FRAG_PER_NODE * size->noOfTables* size->noOfReplicas);
  248.     
  249.     setValue(tup, TupSizeAltReq::IND_TABLE, 
  250.              size->noOfTables);
  251.     
  252.     setValue(tup, TupSizeAltReq::IND_TABLE_DESC, 
  253.      4 * NO_OF_FRAG_PER_NODE * size->noOfAttributes* size->noOfReplicas +
  254.      12 * NO_OF_FRAG_PER_NODE * size->noOfTables* size->noOfReplicas );
  255.     
  256.     setValue(tup, TupSizeAltReq::IND_DELETED_BLOCKS, 
  257.              size->noOfFreeClusters);
  258.     setValue(tup, TupSizeAltReq::IND_STORED_PROC,
  259.              noOfLocalScanRecords);
  260.   }
  261.   {
  262.     /**
  263.      * Tux Size Alt values
  264.      */
  265.     size->blockNo[TUX] = DBTUX;
  266.     
  267.     VarSize * const tux = &(size->varSize[TUX][0]);
  268.     
  269.     setValue(tux, TuxSizeAltReq::IND_INDEX, 
  270.              size->noOfTables);
  271.     
  272.     setValue(tux, TuxSizeAltReq::IND_FRAGMENT, 
  273.          2 * NO_OF_FRAG_PER_NODE * size->noOfTables * size->noOfReplicas);
  274.     
  275.     setValue(tux, TuxSizeAltReq::IND_ATTRIBUTE, 
  276.              size->noOfIndexes * 4);
  277.     
  278.     setValue(tux, TuxSizeAltReq::IND_SCAN, 
  279.      noOfLocalScanRecords);
  280.   }
  281. }
  282.   
  283. const ClusterConfiguration::ClusterData&
  284. ClusterConfiguration::clusterData() const
  285. {
  286.   return the_clusterData;
  287. }
  288. void ClusterConfiguration::init(const Properties & p, const Properties & db){
  289.   const char * msg = "Invalid configuration fetched";
  290.   ClusterData & cd = the_clusterData;
  291.   
  292.   struct AttribStorage { const char * attrib; Uint32 * storage; };
  293.   AttribStorage tmp[] = {
  294.     {"MaxNoOfConcurrentScans", &cd.SizeAltData.noOfScanRecords },
  295.     {"MaxNoOfTables", &cd.SizeAltData.noOfTables },
  296.     {"MaxNoOfIndexes", &cd.SizeAltData.noOfIndexes },
  297.     {"NoOfReplicas", &cd.SizeAltData.noOfReplicas },
  298.     {"MaxNoOfAttributes", &cd.SizeAltData.noOfAttributes },
  299.     {"MaxNoOfConcurrentOperations", &cd.SizeAltData.noOfOperations },
  300.     {"MaxNoOfConcurrentTransactions", &cd.SizeAltData.noOfTransactions },
  301.     {"NoOfIndexPages", &cd.SizeAltData.noOfIndexPages },
  302.     {"NoOfDataPages",  &cd.SizeAltData.noOfDataPages },
  303.     {"NoOfDiskBufferPages", &cd.SizeAltData.noOfDiskBufferPages },
  304.     {"NoOfDiskClusters", &cd.SizeAltData.noOfDiskClusters },
  305.     {"NoOfFreeDiskClusters", &cd.SizeAltData.noOfFreeClusters },
  306.     {"TimeToWaitAlive", &cd.ispValues[0][0] },
  307.     {"HeartbeatIntervalDbDb", &cd.ispValues[0][2] },
  308.     {"HeartbeatIntervalDbApi", &cd.ispValues[0][3] },
  309.     {"ArbitrationTimeout", &cd.ispValues[0][5] },
  310.     {"TimeBetweenLocalCheckpoints", &cd.ispValues[1][2] },
  311.     {"NoOfFragmentLogFiles", &cd.ispValues[1][4] },
  312.     {"MaxNoOfConcurrentScans", &cd.SizeAltData.noOfScanRecords },
  313.     {"NoOfConcurrentCheckpointsDuringRestart", &cd.ispValues[1][5] },
  314.     {"TransactionDeadlockDetectionTimeout", &cd.ispValues[1][6] },
  315.     {"NoOfConcurrentProcessesHandleTakeover", &cd.ispValues[1][7] },
  316.     {"TimeBetweenGlobalCheckpoints", &cd.ispValues[2][3] },
  317.     {"NoOfConcurrentCheckpointsAfterRestart", &cd.ispValues[2][4] },
  318.     {"TransactionInactiveTimeout", &cd.ispValues[2][7] },
  319.     {"NoOfDiskPagesToDiskDuringRestartTUP", &cd.ispValues[3][8] },
  320.     {"NoOfDiskPagesToDiskAfterRestartTUP", &cd.ispValues[3][9] },
  321.     {"NoOfDiskPagesToDiskDuringRestartACC", &cd.ispValues[3][10] },
  322.     {"NoOfDiskPagesToDiskAfterRestartACC", &cd.ispValues[3][11] },
  323.     {"NoOfDiskClustersPerDiskFile", &cd.ispValues[4][8] },
  324.     {"NoOfDiskFiles", &cd.ispValues[4][9] },
  325.     {"NoOfReplicas", &cd.ispValues[2][2] }
  326.   };
  327.   const int sz = sizeof(tmp)/sizeof(AttribStorage);
  328.   for(int i = 0; i<sz; i++){
  329.     if(!db.get(tmp[i].attrib, tmp[i].storage)){
  330.       char buf[255];
  331.       BaseString::snprintf(buf, sizeof(buf), "%s not found", tmp[i].attrib);
  332.       ERROR_SET(fatal, ERR_INVALID_CONFIG, msg, buf);
  333.     }
  334.   }
  335.   if(!p.get("NoOfNodes", &cd.SizeAltData.noOfNodes)){
  336.     ERROR_SET(fatal, ERR_INVALID_CONFIG, msg, "NoOfNodes missing");
  337.   }
  338.   
  339.   Properties::Iterator it(&p);
  340.   const char * name = 0;
  341.   Uint32 nodeNo = 0;
  342.   for(name = it.first(); name != NULL; name = it.next()){
  343.     if(strncmp(name, "Node_", strlen("Node_")) == 0){
  344.       Uint32 nodeId;
  345.       const char * nodeType;
  346.       const Properties * node;
  347.       
  348.       if(!p.get(name, &node)){
  349. ERROR_SET(fatal, ERR_INVALID_CONFIG, msg, "Node data missing");
  350.       }
  351.       
  352.       if(!node->get("Id", &nodeId)){
  353. ERROR_SET(fatal, ERR_INVALID_CONFIG, msg, "Node data (Id) missing");
  354.       }
  355.       
  356.       if(!node->get("Type", &nodeType)){
  357. ERROR_SET(fatal, ERR_INVALID_CONFIG, msg, "Node data (Type) missing");
  358.       }
  359.       
  360.       if(nodeId > MAX_NODES){
  361. char buf[255];
  362. snprintf(buf, sizeof(buf),
  363.  "Maximum DB node id allowed is: %d", MAX_NDB_NODES);
  364. ERROR_SET(fatal, ERR_INVALID_CONFIG, msg, buf);
  365.       }
  366.       
  367.       if(nodeId == 0){
  368. char buf[255];
  369. snprintf(buf, sizeof(buf),
  370.  "Minimum node id allowed in the cluster is: 1");
  371. ERROR_SET(fatal, ERR_INVALID_CONFIG, msg, buf);
  372.       }
  373.       for(unsigned j = 0; j<nodeNo; j++){
  374. if(cd.nodeData[j].nodeId == nodeId){
  375.   char buf[255];
  376.   BaseString::snprintf(buf, sizeof(buf), "Two node can not have the same node id");
  377.   ERROR_SET(fatal, ERR_INVALID_CONFIG, msg, buf);
  378. }
  379.       }
  380.       
  381.       {
  382. for(unsigned j = 0; j<LogLevel::LOGLEVEL_CATEGORIES; j++){
  383.   Uint32 logLevel;
  384.   if(db.get(LogLevel::LOGLEVEL_CATEGORY_NAME[j].name, &logLevel)){
  385.     cd.SizeAltData.logLevel.setLogLevel((LogLevel::EventCategory)j, 
  386. logLevel);
  387.   }
  388. }
  389.       }
  390.       
  391.       cd.nodeData[nodeNo].nodeId = nodeId;
  392.       const char* tmpApiMgmProperties = 0;
  393.       if(strcmp("DB", nodeType) == 0){
  394. cd.nodeData[nodeNo].nodeType = NodeInfo::DB;
  395. cd.SizeAltData.noOfNDBNodes++; // No of NDB processes
  396. if(nodeId > MAX_NDB_NODES){
  397.   char buf[255];
  398.   BaseString::snprintf(buf, sizeof(buf), "Maximum node id for a ndb node is: %d", MAX_NDB_NODES);
  399.   ERROR_SET(fatal, ERR_INVALID_CONFIG, msg, buf);
  400. }
  401. if(cd.SizeAltData.noOfNDBNodes > MAX_NDB_NODES){
  402.   char buf[255];
  403.   BaseString::snprintf(buf, sizeof(buf),
  404.    "Maximum %d ndb nodes is allowed in the cluster", 
  405.   MAX_NDB_NODES);
  406.   ERROR_SET(fatal, ERR_INVALID_CONFIG, msg, buf);
  407. }
  408.       } else if(strcmp("API", nodeType) == 0){
  409. cd.nodeData[nodeNo].nodeType = NodeInfo::API;
  410. cd.SizeAltData.noOfAPINodes++; // No of API processes
  411. tmpApiMgmProperties = "API";
  412.       } else if(strcmp("REP", nodeType) == 0){
  413. cd.nodeData[nodeNo].nodeType = NodeInfo::REP;
  414. //cd.SizeAltData.noOfAPINodes++; // No of API processes
  415. tmpApiMgmProperties = "REP";
  416.       } else if(strcmp("MGM", nodeType) == 0){
  417. cd.nodeData[nodeNo].nodeType = NodeInfo::MGM;
  418. cd.SizeAltData.noOfMGMNodes++; // No of MGM processes
  419. tmpApiMgmProperties = "MGM";
  420.       } else {
  421. ERROR_SET(fatal, ERR_INVALID_CONFIG, 
  422.   "Invalid configuration: Unknown node type",
  423.   nodeType);
  424.       }
  425.       
  426.       if (tmpApiMgmProperties) {
  427. /*
  428.   const Properties* q = 0;
  429.   
  430.   if (!p.get(tmpApiMgmProperties, nodeId, &q)) {
  431.   ERROR_SET(fatal, ERR_INVALID_CONFIG, msg, tmpApiMgmProperties);
  432.   } else {
  433. */
  434.         Uint32 rank = 0;
  435.         if (node->get("ArbitrationRank", &rank) && rank > 0) {
  436.           cd.nodeData[nodeNo].arbitRank = rank;
  437.   //        }
  438. }
  439.       } else {
  440. cd.nodeData[nodeNo].arbitRank = 0;
  441.       }
  442.       
  443.       nodeNo++;
  444.     }
  445.   } 
  446.   cd.SizeAltData.exist = true;
  447.   calcSizeAlteration();  
  448. }