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

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 <ndb_opts.h>
  15. #include "Configuration.hpp"
  16. #include <ErrorHandlingMacros.hpp>
  17. #include "GlobalData.hpp"
  18. #include <ConfigRetriever.hpp>
  19. #include <IPCConfig.hpp>
  20. #include <ndb_version.h>
  21. #include <NdbMem.h>
  22. #include <NdbOut.hpp>
  23. #include <WatchDog.hpp>
  24. #include <mgmapi_configuration.hpp>
  25. #include <mgmapi_config_parameters_debug.h>
  26. #include <kernel_config_parameters.h>
  27. #include <kernel_types.h>
  28. #include <ndb_limits.h>
  29. #include <ndbapi_limits.h>
  30. #include "pc.hpp"
  31. #include <LogLevel.hpp>
  32. #include <NdbSleep.h>
  33. extern "C" {
  34.   void ndbSetOwnVersion();
  35. }
  36. #include <EventLogger.hpp>
  37. extern EventLogger g_eventLogger;
  38. enum ndbd_options {
  39.   OPT_INITIAL = NDB_STD_OPTIONS_LAST,
  40.   OPT_NODAEMON
  41. };
  42. NDB_STD_OPTS_VARS;
  43. static int _daemon, _no_daemon, _initial, _no_start;
  44. /**
  45.  * Arguments to NDB process
  46.  */ 
  47. static struct my_option my_long_options[] =
  48. {
  49.   NDB_STD_OPTS("ndbd"),
  50.   { "initial", OPT_INITIAL,
  51.     "Perform initial start of ndbd, including cleaning the file system. "
  52.     "Consult documentation before using this",
  53.     (gptr*) &_initial, (gptr*) &_initial, 0,
  54.     GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0 },
  55.   { "nostart", 'n',
  56.     "Don't start ndbd immediately. Ndbd will await command from ndb_mgmd",
  57.     (gptr*) &_no_start, (gptr*) &_no_start, 0,
  58.     GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0 },
  59.   { "daemon", 'd', "Start ndbd as daemon (default)",
  60.     (gptr*) &_daemon, (gptr*) &_daemon, 0,
  61.     GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0 },
  62.   { "nodaemon", OPT_NODAEMON,
  63.     "Do not start ndbd as daemon, provided for testing purposes",
  64.     (gptr*) &_no_daemon, (gptr*) &_no_daemon, 0,
  65.     GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0 },
  66.   { 0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}
  67. };
  68. static void short_usage_sub(void)
  69. {
  70.   printf("Usage: %s [OPTIONS]n", my_progname);
  71. }
  72. static void usage()
  73. {
  74.   short_usage_sub();
  75.   ndb_std_print_version();
  76.   my_print_help(my_long_options);
  77.   my_print_variables(my_long_options);
  78. }
  79. static my_bool
  80. get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
  81.        char *argument)
  82. {
  83.   return ndb_std_get_one_option(optid, opt,
  84. argument ? argument : "d:t:O,/tmp/ndbd.trace");
  85. }
  86. bool
  87. Configuration::init(int argc, char** argv)
  88. {  
  89.   const char *load_default_groups[]= { "mysql_cluster","ndbd",0 };
  90.   load_defaults("my",load_default_groups,&argc,&argv);
  91.   int ho_error;
  92.   if ((ho_error=handle_options(&argc, &argv, my_long_options, get_one_option)))
  93.     exit(ho_error);
  94.   if (_no_daemon) {
  95.     _daemon= 0;
  96.   }
  97.   DBUG_PRINT("info", ("no_start=%d", _no_start));
  98.   DBUG_PRINT("info", ("initial=%d", _initial));
  99.   DBUG_PRINT("info", ("daemon=%d", _daemon));
  100.   DBUG_PRINT("info", ("connect_str=%s", opt_connect_str));
  101.   ndbSetOwnVersion();
  102.   // Check the start flag
  103.   if (_no_start)
  104.     globalData.theRestartFlag = initial_state;
  105.   else 
  106.     globalData.theRestartFlag = perform_start;
  107.   // Check the initial flag
  108.   if (_initial)
  109.     _initialStart = true;
  110.   
  111.   // Check connectstring
  112.   if (opt_connect_str)
  113.     _connectString = strdup(opt_connect_str);
  114.   
  115.   // Check daemon flag
  116.   if (_daemon)
  117.     _daemonMode = true;
  118.   // Save programname
  119.   if(argc > 0 && argv[0] != 0)
  120.     _programName = strdup(argv[0]);
  121.   else
  122.     _programName = strdup("");
  123.   
  124.   globalData.ownId= 0;
  125.   return true;
  126. }
  127. Configuration::Configuration()
  128. {
  129.   _programName = 0;
  130.   _connectString = 0;
  131.   _fsPath = 0;
  132.   _backupPath = 0;
  133.   _initialStart = false;
  134.   _daemonMode = false;
  135.   m_config_retriever= 0;
  136.   m_clusterConfig= 0;
  137. }
  138. Configuration::~Configuration(){
  139.   if(_programName != NULL)
  140.     free(_programName);
  141.   if(_fsPath != NULL)
  142.     free(_fsPath);
  143.   if(_backupPath != NULL)
  144.     free(_backupPath);
  145.   if (m_config_retriever) {
  146.     delete m_config_retriever;
  147.   }
  148. }
  149. void
  150. Configuration::closeConfiguration(){
  151.   if (m_config_retriever) {
  152.     delete m_config_retriever;
  153.   }
  154.   m_config_retriever= 0;
  155. }
  156. void
  157. Configuration::fetch_configuration(){
  158.   /**
  159.    * Fetch configuration from management server
  160.    */
  161.   if (m_config_retriever) {
  162.     delete m_config_retriever;
  163.   }
  164.   m_mgmd_port= 0;
  165.   m_mgmd_host= 0;
  166.   m_config_retriever= new ConfigRetriever(getConnectString(),
  167.   NDB_VERSION, NODE_TYPE_DB);
  168.   if (m_config_retriever->hasError())
  169.   {
  170.     ERROR_SET(fatal, ERR_INVALID_CONFIG,
  171.       "Could not connect initialize handle to management server",
  172.       m_config_retriever->getErrorString());
  173.   }
  174.   if(m_config_retriever->do_connect(12,5,1) == -1){
  175.     const char * s = m_config_retriever->getErrorString();
  176.     if(s == 0)
  177.       s = "No error given!";
  178.     /* Set stop on error to true otherwise NDB will
  179.        go into an restart loop...
  180.     */
  181.     ERROR_SET(fatal, ERR_INVALID_CONFIG, "Could not connect to ndb_mgmd", s);
  182.   }
  183.   
  184.   m_mgmd_port= m_config_retriever->get_mgmd_port();
  185.   m_mgmd_host= m_config_retriever->get_mgmd_host();
  186.   ConfigRetriever &cr= *m_config_retriever;
  187.   
  188.   /**
  189.    * if we have a nodeid set (e.g in a restart situation)
  190.    * reuse it
  191.    */
  192.   if (globalData.ownId)
  193.     cr.setNodeId(globalData.ownId);
  194.   globalData.ownId = cr.allocNodeId(2 /*retry*/,3 /*delay*/);
  195.   
  196.   if(globalData.ownId == 0){
  197.     ERROR_SET(fatal, ERR_INVALID_CONFIG, 
  198.       "Unable to alloc node id", m_config_retriever->getErrorString());
  199.   }
  200.   
  201.   ndb_mgm_configuration * p = cr.getConfig();
  202.   if(p == 0){
  203.     const char * s = cr.getErrorString();
  204.     if(s == 0)
  205.       s = "No error given!";
  206.     
  207.     /* Set stop on error to true otherwise NDB will
  208.        go into an restart loop...
  209.     */
  210.     
  211.     ERROR_SET(fatal, ERR_INVALID_CONFIG, "Could not fetch configuration"
  212.       "/invalid configuration", s);
  213.   }
  214.   if(m_clusterConfig)
  215.     free(m_clusterConfig);
  216.   
  217.   m_clusterConfig = p;
  218.   
  219.   ndb_mgm_configuration_iterator iter(* p, CFG_SECTION_NODE);
  220.   if (iter.find(CFG_NODE_ID, globalData.ownId)){
  221.     ERROR_SET(fatal, ERR_INVALID_CONFIG, "Invalid configuration fetched", "DB missing");
  222.   }
  223.   
  224.   if(iter.get(CFG_DB_STOP_ON_ERROR, &_stopOnError)){
  225.     ERROR_SET(fatal, ERR_INVALID_CONFIG, "Invalid configuration fetched", 
  226.       "StopOnError missing");
  227.   }
  228. }
  229. static char * get_and_validate_path(ndb_mgm_configuration_iterator &iter,
  230.     Uint32 param, const char *param_string)
  231.   const char* path = NULL;
  232.   if(iter.get(param, &path)){
  233.     ERROR_SET(fatal, ERR_INVALID_CONFIG, "Invalid configuration fetched missing ", 
  234.       param_string);
  235.   } 
  236.   
  237.   if(path == 0 || strlen(path) == 0){
  238.     ERROR_SET(fatal, ERR_INVALID_CONFIG,
  239.       "Invalid configuration fetched. Configuration does not contain valid ",
  240.       param_string);
  241.   }
  242.   
  243.   // check that it is pointing on a valid directory
  244.   // 
  245.   char buf2[PATH_MAX];
  246.   memset(buf2, 0,sizeof(buf2));
  247. #ifdef NDB_WIN32
  248.   char* szFilePart;
  249.   if(!GetFullPathName(path, sizeof(buf2), buf2, &szFilePart) ||
  250.      (GetFileAttributes(buf2) & FILE_ATTRIBUTE_READONLY))
  251. #else
  252.   if((::realpath(path, buf2) == NULL)||
  253.        (::access(buf2, W_OK) != 0))
  254. #endif
  255.   {
  256.     ERROR_SET(fatal, AFS_ERROR_INVALIDPATH, path, " Filename::init()");
  257.   }
  258.   
  259.   if (strcmp(&buf2[strlen(buf2) - 1], DIR_SEPARATOR))
  260.     strcat(buf2, DIR_SEPARATOR);
  261.   
  262.   return strdup(buf2);
  263. }
  264. void
  265. Configuration::setupConfiguration(){
  266.   DBUG_ENTER("Configuration::setupConfiguration");
  267.   ndb_mgm_configuration * p = m_clusterConfig;
  268.   /**
  269.    * Configure transporters
  270.    */
  271.   {  
  272.     int res = IPCConfig::configureTransporters(globalData.ownId,
  273.        * p, 
  274.        globalTransporterRegistry);
  275.     if(res <= 0){
  276.       ERROR_SET(fatal, ERR_INVALID_CONFIG, "Invalid configuration fetched", 
  277. "No transporters configured");
  278.     }
  279.   }
  280.   /**
  281.    * Setup cluster configuration data
  282.    */
  283.   ndb_mgm_configuration_iterator iter(* p, CFG_SECTION_NODE);
  284.   if (iter.find(CFG_NODE_ID, globalData.ownId)){
  285.     ERROR_SET(fatal, ERR_INVALID_CONFIG, "Invalid configuration fetched", "DB missing");
  286.   }
  287.   unsigned type;
  288.   if(!(iter.get(CFG_TYPE_OF_SECTION, &type) == 0 && type == NODE_TYPE_DB)){
  289.     ERROR_SET(fatal, ERR_INVALID_CONFIG, "Invalid configuration fetched",
  290.       "I'm wrong type of node");
  291.   }
  292.   
  293.   if(iter.get(CFG_DB_NO_SAVE_MSGS, &_maxErrorLogs)){
  294.     ERROR_SET(fatal, ERR_INVALID_CONFIG, "Invalid configuration fetched", 
  295.       "MaxNoOfSavedMessages missing");
  296.   }
  297.   
  298.   if(iter.get(CFG_DB_MEMLOCK, &_lockPagesInMainMemory)){
  299.     ERROR_SET(fatal, ERR_INVALID_CONFIG, "Invalid configuration fetched", 
  300.       "LockPagesInMainMemory missing");
  301.   }
  302.   if(iter.get(CFG_DB_WATCHDOG_INTERVAL, &_timeBetweenWatchDogCheck)){
  303.     ERROR_SET(fatal, ERR_INVALID_CONFIG, "Invalid configuration fetched", 
  304.       "TimeBetweenWatchDogCheck missing");
  305.   }
  306.   /**
  307.    * Get paths
  308.    */  
  309.   if (_fsPath)
  310.     free(_fsPath);
  311.   _fsPath= get_and_validate_path(iter, CFG_DB_FILESYSTEM_PATH, "FileSystemPath");
  312.   if (_backupPath)
  313.     free(_backupPath);
  314.   _backupPath= get_and_validate_path(iter, CFG_DB_BACKUP_DATADIR, "BackupDataDir");
  315.   if(iter.get(CFG_DB_STOP_ON_ERROR_INSERT, &m_restartOnErrorInsert)){
  316.     ERROR_SET(fatal, ERR_INVALID_CONFIG, "Invalid configuration fetched", 
  317.       "RestartOnErrorInsert missing");
  318.   }
  319.   /**
  320.    * Create the watch dog thread
  321.    */
  322.   { 
  323.     Uint32 t = _timeBetweenWatchDogCheck;
  324.     t = globalEmulatorData.theWatchDog ->setCheckInterval(t);
  325.     _timeBetweenWatchDogCheck = t;
  326.   }
  327.   
  328.   ConfigValues* cf = ConfigValuesFactory::extractCurrentSection(iter.m_config);
  329.   m_clusterConfigIter = ndb_mgm_create_configuration_iterator
  330.     (p, CFG_SECTION_NODE);
  331.   calcSizeAlt(cf);
  332.   DBUG_VOID_RETURN;
  333. }
  334. bool 
  335. Configuration::lockPagesInMainMemory() const {
  336.   return _lockPagesInMainMemory;
  337. }
  338. int 
  339. Configuration::timeBetweenWatchDogCheck() const {
  340.   return _timeBetweenWatchDogCheck;
  341. }
  342. void 
  343. Configuration::timeBetweenWatchDogCheck(int value) {
  344.   _timeBetweenWatchDogCheck = value;
  345. }
  346. int 
  347. Configuration::maxNoOfErrorLogs() const {
  348.   return _maxErrorLogs;
  349. }
  350. void 
  351. Configuration::maxNoOfErrorLogs(int val){
  352.   _maxErrorLogs = val;
  353. }
  354. bool
  355. Configuration::stopOnError() const {
  356.   return _stopOnError;
  357. }
  358. void 
  359. Configuration::stopOnError(bool val){
  360.   _stopOnError = val;
  361. }
  362. int
  363. Configuration::getRestartOnErrorInsert() const {
  364.   return m_restartOnErrorInsert;
  365. }
  366. void
  367. Configuration::setRestartOnErrorInsert(int i){
  368.   m_restartOnErrorInsert = i;
  369. }
  370. const char *
  371. Configuration::getConnectString() const {
  372.   return _connectString;
  373. }
  374. char *
  375. Configuration::getConnectStringCopy() const {
  376.   if(_connectString != 0)
  377.     return strdup(_connectString);
  378.   return 0;
  379. }
  380. const ndb_mgm_configuration_iterator * 
  381. Configuration::getOwnConfigIterator() const {
  382.   return m_ownConfigIterator;
  383. }
  384.   
  385. ndb_mgm_configuration_iterator * 
  386. Configuration::getClusterConfigIterator() const {
  387.   return m_clusterConfigIter;
  388. }
  389. void
  390. Configuration::calcSizeAlt(ConfigValues * ownConfig){
  391.   const char * msg = "Invalid configuration fetched";
  392.   char buf[255];
  393.   unsigned int noOfTables = 0;
  394.   unsigned int noOfUniqueHashIndexes = 0;
  395.   unsigned int noOfOrderedIndexes = 0;
  396.   unsigned int noOfTriggers = 0;
  397.   unsigned int noOfReplicas = 0;
  398.   unsigned int noOfDBNodes = 0;
  399.   unsigned int noOfAPINodes = 0;
  400.   unsigned int noOfMGMNodes = 0;
  401.   unsigned int noOfNodes = 0;
  402.   unsigned int noOfAttributes = 0;
  403.   unsigned int noOfOperations = 0;
  404.   unsigned int noOfLocalOperations = 0;
  405.   unsigned int noOfTransactions = 0;
  406.   unsigned int noOfIndexPages = 0;
  407.   unsigned int noOfDataPages = 0;
  408.   unsigned int noOfScanRecords = 0;
  409.   unsigned int noOfLocalScanRecords = 0;
  410.   unsigned int noBatchSize = 0;
  411.   m_logLevel = new LogLevel();
  412.   
  413.   struct AttribStorage { int paramId; Uint32 * storage; bool computable; };
  414.   AttribStorage tmp[] = {
  415.     { CFG_DB_NO_SCANS, &noOfScanRecords, false },
  416.     { CFG_DB_NO_LOCAL_SCANS, &noOfLocalScanRecords, true },
  417.     { CFG_DB_BATCH_SIZE, &noBatchSize, false },
  418.     { CFG_DB_NO_TABLES, &noOfTables, false },
  419.     { CFG_DB_NO_ORDERED_INDEXES, &noOfOrderedIndexes, false },
  420.     { CFG_DB_NO_UNIQUE_HASH_INDEXES, &noOfUniqueHashIndexes, false },
  421.     { CFG_DB_NO_TRIGGERS, &noOfTriggers, true },
  422.     { CFG_DB_NO_REPLICAS, &noOfReplicas, false },
  423.     { CFG_DB_NO_ATTRIBUTES, &noOfAttributes, false },
  424.     { CFG_DB_NO_OPS, &noOfOperations, false },
  425.     { CFG_DB_NO_LOCAL_OPS, &noOfLocalOperations, true },
  426.     { CFG_DB_NO_TRANSACTIONS, &noOfTransactions, false }
  427.   };
  428.   ndb_mgm_configuration_iterator db(*(ndb_mgm_configuration*)ownConfig, 0);
  429.   
  430.   const int sz = sizeof(tmp)/sizeof(AttribStorage);
  431.   for(int i = 0; i<sz; i++){
  432.     if(ndb_mgm_get_int_parameter(&db, tmp[i].paramId, tmp[i].storage)){
  433.       if (tmp[i].computable) {
  434.         *tmp[i].storage = 0;
  435.       } else {
  436.         BaseString::snprintf(buf, sizeof(buf),"ConfigParam: %d not found", tmp[i].paramId);
  437.         ERROR_SET(fatal, ERR_INVALID_CONFIG, msg, buf);
  438.       }
  439.     }
  440.   }
  441.   Uint64 indexMem = 0, dataMem = 0;
  442.   ndb_mgm_get_int64_parameter(&db, CFG_DB_DATA_MEM, &dataMem);
  443.   ndb_mgm_get_int64_parameter(&db, CFG_DB_INDEX_MEM, &indexMem);
  444.   if(dataMem == 0){
  445.     BaseString::snprintf(buf, sizeof(buf), "ConfigParam: %d not found", CFG_DB_DATA_MEM);
  446.     ERROR_SET(fatal, ERR_INVALID_CONFIG, msg, buf);
  447.   }
  448.   if(indexMem == 0){
  449.     BaseString::snprintf(buf, sizeof(buf), "ConfigParam: %d not found", CFG_DB_INDEX_MEM);
  450.     ERROR_SET(fatal, ERR_INVALID_CONFIG, msg, buf);
  451.   }
  452.   noOfDataPages = (dataMem / 32768);
  453.   noOfIndexPages = (indexMem / 8192);
  454.   for(unsigned j = 0; j<LogLevel::LOGLEVEL_CATEGORIES; j++){
  455.     Uint32 tmp;
  456.     if(!ndb_mgm_get_int_parameter(&db, CFG_MIN_LOGLEVEL+j, &tmp)){
  457.       m_logLevel->setLogLevel((LogLevel::EventCategory)j, tmp);
  458.     }
  459.   }
  460.   
  461.   // tmp
  462.   ndb_mgm_configuration_iterator * p = m_clusterConfigIter;
  463.   Uint32 nodeNo = noOfNodes = 0;
  464.   NodeBitmask nodes;
  465.   for(ndb_mgm_first(p); ndb_mgm_valid(p); ndb_mgm_next(p), nodeNo++){
  466.     
  467.     Uint32 nodeId;
  468.     Uint32 nodeType;
  469.     
  470.     if(ndb_mgm_get_int_parameter(p, CFG_NODE_ID, &nodeId)){
  471.       ERROR_SET(fatal, ERR_INVALID_CONFIG, msg, "Node data (Id) missing");
  472.     }
  473.     
  474.     if(ndb_mgm_get_int_parameter(p, CFG_TYPE_OF_SECTION, &nodeType)){
  475.       ERROR_SET(fatal, ERR_INVALID_CONFIG, msg, "Node data (Type) missing");
  476.     }
  477.     
  478.     if(nodeId > MAX_NODES || nodeId == 0){
  479.       BaseString::snprintf(buf, sizeof(buf),
  480.        "Invalid node id: %d", nodeId);
  481.       ERROR_SET(fatal, ERR_INVALID_CONFIG, msg, buf);
  482.     }
  483.     
  484.     if(nodes.get(nodeId)){
  485.       BaseString::snprintf(buf, sizeof(buf), "Two node can not have the same node id: %d",
  486.        nodeId);
  487.       ERROR_SET(fatal, ERR_INVALID_CONFIG, msg, buf);
  488.     }
  489.     nodes.set(nodeId);
  490.         
  491.     switch(nodeType){
  492.     case NODE_TYPE_DB:
  493.       noOfDBNodes++; // No of NDB processes
  494.       
  495.       if(nodeId > MAX_NDB_NODES){
  496.   BaseString::snprintf(buf, sizeof(buf), "Maximum node id for a ndb node is: %d", 
  497.  MAX_NDB_NODES);
  498. ERROR_SET(fatal, ERR_INVALID_CONFIG, msg, buf);
  499.       }
  500.       break;
  501.     case NODE_TYPE_API:
  502.       noOfAPINodes++; // No of API processes
  503.       break;
  504.     case NODE_TYPE_REP:
  505.       break;
  506.     case NODE_TYPE_MGM:
  507.       noOfMGMNodes++; // No of MGM processes
  508.       break;
  509.     case NODE_TYPE_EXT_REP:
  510.       break;
  511.     default:
  512.       BaseString::snprintf(buf, sizeof(buf), "Unknown node type: %d", nodeType);
  513.       ERROR_SET(fatal, ERR_INVALID_CONFIG, msg, buf);
  514.     }
  515.   }
  516.   noOfNodes = nodeNo;
  517.   noOfTables+= 2; // Add System tables
  518.   noOfAttributes += 9;  // Add System table attributes
  519.   ConfigValues::Iterator it2(*ownConfig, db.m_config);
  520.   it2.set(CFG_DB_NO_TABLES, noOfTables);
  521.   it2.set(CFG_DB_NO_ATTRIBUTES, noOfAttributes);
  522.   {
  523.     Uint32 neededNoOfTriggers =   /* types: Insert/Update/Delete/Custom */
  524.       3 * noOfUniqueHashIndexes + /* for unique hash indexes, I/U/D */
  525.       3 * NDB_MAX_ACTIVE_EVENTS + /* for events in suma, I/U/D */
  526.       3 * noOfTables +            /* for backup, I/U/D */
  527.       noOfOrderedIndexes;         /* for ordered indexes, C */
  528.     if (noOfTriggers < neededNoOfTriggers)
  529.     {
  530.       noOfTriggers= neededNoOfTriggers;
  531.       it2.set(CFG_DB_NO_TRIGGERS, noOfTriggers);
  532.     }
  533.   }
  534.   /**
  535.    * Do size calculations
  536.    */
  537.   ConfigValuesFactory cfg(ownConfig);
  538.   Uint32 noOfMetaTables= noOfTables + noOfOrderedIndexes +
  539.                            noOfUniqueHashIndexes;
  540.   Uint32 noOfMetaTablesDict= noOfMetaTables;
  541.   if (noOfMetaTablesDict > MAX_TABLES)
  542.     noOfMetaTablesDict= MAX_TABLES;
  543.   {
  544.     /**
  545.      * Dict Size Alt values
  546.      */
  547.     cfg.put(CFG_DICT_ATTRIBUTE, 
  548.     noOfAttributes);
  549.     cfg.put(CFG_DICT_TABLE,
  550.     noOfMetaTablesDict);
  551.   }
  552.   if (noOfLocalScanRecords == 0) {
  553.     noOfLocalScanRecords = (noOfDBNodes * noOfScanRecords) + 1;
  554.   }
  555.   if (noOfLocalOperations == 0) {
  556.     noOfLocalOperations= (11 * noOfOperations) / 10;
  557.   }
  558.   Uint32 noOfTCScanRecords = noOfScanRecords;
  559.   {
  560.     Uint32 noOfAccTables= noOfMetaTables/*noOfTables+noOfUniqueHashIndexes*/;
  561.     /**
  562.      * Acc Size Alt values
  563.      */
  564.     // Can keep 65536 pages (= 0.5 GByte)
  565.     cfg.put(CFG_ACC_DIR_RANGE, 
  566.     4 * NO_OF_FRAG_PER_NODE * noOfAccTables* noOfReplicas); 
  567.     
  568.     cfg.put(CFG_ACC_DIR_ARRAY,
  569.     (noOfIndexPages >> 8) + 
  570.     4 * NO_OF_FRAG_PER_NODE * noOfAccTables* noOfReplicas);
  571.     
  572.     cfg.put(CFG_ACC_FRAGMENT,
  573.     2 * NO_OF_FRAG_PER_NODE * noOfAccTables* noOfReplicas);
  574.     
  575.     /*-----------------------------------------------------------------------*/
  576.     // The extra operation records added are used by the scan and node 
  577.     // recovery process. 
  578.     // Node recovery process will have its operations dedicated to ensure
  579.     // that they never have a problem with allocation of the operation record.
  580.     // The remainder are allowed for use by the scan processes.
  581.     /*-----------------------------------------------------------------------*/
  582.     cfg.put(CFG_ACC_OP_RECS,
  583.     (noOfLocalOperations + 50) + 
  584.     (noOfLocalScanRecords * noBatchSize) +
  585.     NODE_RECOVERY_SCAN_OP_RECORDS);
  586.     
  587.     cfg.put(CFG_ACC_OVERFLOW_RECS,
  588.     noOfIndexPages + 
  589.     2 * NO_OF_FRAG_PER_NODE * noOfAccTables* noOfReplicas);
  590.     
  591.     cfg.put(CFG_ACC_PAGE8, 
  592.     noOfIndexPages + 32);
  593.     
  594.     cfg.put(CFG_ACC_ROOT_FRAG, 
  595.     NO_OF_FRAG_PER_NODE * noOfAccTables* noOfReplicas);
  596.     
  597.     cfg.put(CFG_ACC_TABLE, noOfAccTables);
  598.     
  599.     cfg.put(CFG_ACC_SCAN, noOfLocalScanRecords);
  600.   }
  601.   
  602.   {
  603.     /**
  604.      * Dih Size Alt values
  605.      */
  606.     cfg.put(CFG_DIH_API_CONNECT, 
  607.     2 * noOfTransactions);
  608.     
  609.     cfg.put(CFG_DIH_CONNECT, 
  610.     noOfOperations + noOfTransactions + 46);
  611.     
  612.     Uint32 noFragPerTable= ((noOfDBNodes + NO_OF_FRAGS_PER_CHUNK - 1) >>
  613.                            LOG_NO_OF_FRAGS_PER_CHUNK) <<
  614.                            LOG_NO_OF_FRAGS_PER_CHUNK;
  615.     cfg.put(CFG_DIH_FRAG_CONNECT, 
  616.     noFragPerTable *  noOfMetaTables);
  617.     
  618.     int temp;
  619.     temp = noOfReplicas - 2;
  620.     if (temp < 0)
  621.       temp = 1;
  622.     else
  623.       temp++;
  624.     cfg.put(CFG_DIH_MORE_NODES, 
  625.     temp * NO_OF_FRAG_PER_NODE *
  626.     noOfMetaTables *  noOfDBNodes);
  627.     cfg.put(CFG_DIH_REPLICAS, 
  628.     NO_OF_FRAG_PER_NODE * noOfMetaTables *
  629.     noOfDBNodes * noOfReplicas);
  630.     cfg.put(CFG_DIH_TABLE, 
  631.     noOfMetaTables);
  632.   }
  633.   
  634.   {
  635.     /**
  636.      * Lqh Size Alt values
  637.      */
  638.     cfg.put(CFG_LQH_FRAG, 
  639.     NO_OF_FRAG_PER_NODE * noOfMetaTables * noOfReplicas);
  640.     
  641.     cfg.put(CFG_LQH_TABLE, 
  642.     noOfMetaTables);
  643.     cfg.put(CFG_LQH_TC_CONNECT, 
  644.     noOfLocalOperations + 50);
  645.     
  646.     cfg.put(CFG_LQH_SCAN, 
  647.     noOfLocalScanRecords);
  648.   }
  649.   
  650.   {
  651.     /**
  652.      * Tc Size Alt values
  653.      */
  654.     cfg.put(CFG_TC_API_CONNECT, 
  655.     3 * noOfTransactions);
  656.     
  657.     cfg.put(CFG_TC_TC_CONNECT, 
  658.     (2 * noOfOperations) + 16 + noOfTransactions);
  659.     
  660.     cfg.put(CFG_TC_TABLE, 
  661.     noOfMetaTables);
  662.     
  663.     cfg.put(CFG_TC_LOCAL_SCAN, 
  664.     noOfLocalScanRecords);
  665.     
  666.     cfg.put(CFG_TC_SCAN, 
  667.     noOfTCScanRecords);
  668.   }
  669.   
  670.   {
  671.     /**
  672.      * Tup Size Alt values
  673.      */
  674.     cfg.put(CFG_TUP_FRAG, 
  675.     2 * NO_OF_FRAG_PER_NODE * noOfMetaTables* noOfReplicas);
  676.     
  677.     cfg.put(CFG_TUP_OP_RECS, 
  678.     noOfLocalOperations + 50);
  679.     
  680.     cfg.put(CFG_TUP_PAGE, 
  681.     noOfDataPages);
  682.     
  683.     cfg.put(CFG_TUP_PAGE_RANGE, 
  684.     4 * NO_OF_FRAG_PER_NODE * noOfMetaTables* noOfReplicas);
  685.     
  686.     cfg.put(CFG_TUP_TABLE, 
  687.     noOfMetaTables);
  688.     
  689.     cfg.put(CFG_TUP_TABLE_DESC, 
  690.     2 * 6 * NO_OF_FRAG_PER_NODE * noOfAttributes * noOfReplicas +
  691.     2 * 10 * NO_OF_FRAG_PER_NODE * noOfMetaTables * noOfReplicas );
  692.     
  693.     cfg.put(CFG_TUP_STORED_PROC,
  694.     noOfLocalScanRecords);
  695.   }
  696.   {
  697.     /**
  698.      * Tux Size Alt values
  699.      */
  700.     cfg.put(CFG_TUX_INDEX, 
  701.     noOfMetaTables /*noOfOrderedIndexes*/);
  702.     
  703.     cfg.put(CFG_TUX_FRAGMENT,
  704.     2 * NO_OF_FRAG_PER_NODE * noOfOrderedIndexes * noOfReplicas);
  705.     
  706.     cfg.put(CFG_TUX_ATTRIBUTE, 
  707.     noOfOrderedIndexes * 4);
  708.     cfg.put(CFG_TUX_SCAN_OP, noOfLocalScanRecords); 
  709.   }
  710.   m_ownConfig = (ndb_mgm_configuration*)cfg.getConfigValues();
  711.   m_ownConfigIterator = ndb_mgm_create_configuration_iterator
  712.     (m_ownConfig, 0);
  713. }
  714. void
  715. Configuration::setInitialStart(bool val){
  716.   _initialStart = val;
  717. }