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

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. #define DBTC_C
  14. #include "Dbtc.hpp"
  15. #include <pc.hpp>
  16. #include <ndb_limits.h>
  17. #include <Properties.hpp>
  18. #include <Configuration.hpp>
  19. #define DEBUG(x) { ndbout << "TC::" << x << endl; }
  20. void Dbtc::initData() 
  21. {
  22.   cattrbufFilesize = ZATTRBUF_FILESIZE;
  23.   capiConnectFilesize = ZAPI_CONNECT_FILESIZE;
  24.   ccacheFilesize = ZAPI_CONNECT_FILESIZE;
  25.   chostFilesize = MAX_NODES;
  26.   cdatabufFilesize = ZDATABUF_FILESIZE;
  27.   cgcpFilesize = ZGCP_FILESIZE;
  28.   cscanrecFileSize = ZSCANREC_FILE_SIZE;
  29.   cscanFragrecFileSize = ZSCAN_FRAGREC_FILE_SIZE;
  30.   ctabrecFilesize = ZTABREC_FILESIZE;
  31.   ctcConnectFilesize = ZTC_CONNECT_FILESIZE;
  32.   cdihblockref = DBDIH_REF;
  33.   cdictblockref = DBDICT_REF;
  34.   clqhblockref = DBLQH_REF;
  35.   cerrorBlockref = NDBCNTR_REF;
  36.   cacheRecord = 0;
  37.   apiConnectRecord = 0;
  38.   tcConnectRecord = 0;
  39.   hostRecord = 0;
  40.   tableRecord = 0;
  41.   scanRecord = 0;
  42.   databufRecord = 0;
  43.   attrbufRecord = 0;
  44.   gcpRecord = 0;
  45.   tcFailRecord = 0;
  46.   c_apiConTimer = 0;
  47.   c_apiConTimer_line = 0;
  48.   // Records with constant sizes
  49.   tcFailRecord = (TcFailRecord*)allocRecord("TcFailRecord",
  50.     sizeof(TcFailRecord), 1);
  51.   // Variables
  52.   ctcTimer = 0;
  53.   // Trigger and index pools
  54.   c_theDefinedTriggerPool.setSize(c_maxNumberOfDefinedTriggers);
  55.   c_theFiredTriggerPool.setSize(c_maxNumberOfFiredTriggers);
  56.   c_theIndexPool.setSize(c_maxNumberOfIndexes);
  57.   c_theIndexOperationPool.setSize(c_maxNumberOfIndexOperations);
  58.   c_theAttributeBufferPool.setSize(c_transactionBufferSpace);
  59.   c_firedTriggerHash.setSize((c_maxNumberOfFiredTriggers+10)/10);
  60. }//Dbtc::initData()
  61. void Dbtc::initRecords() 
  62. {
  63.   void *p;
  64.   // Records with dynamic sizes
  65.   cacheRecord = (CacheRecord*)allocRecord("CacheRecord",
  66.   sizeof(CacheRecord), 
  67.   ccacheFilesize);
  68.   apiConnectRecord = (ApiConnectRecord*)allocRecord("ApiConnectRecord",
  69.     sizeof(ApiConnectRecord),
  70.     capiConnectFilesize);
  71.   for(unsigned i = 0; i<capiConnectFilesize; i++) {
  72.     p = &apiConnectRecord[i];
  73.     new (p) ApiConnectRecord(c_theFiredTriggerPool, 
  74.      c_theIndexOperationPool);
  75.   }
  76.   // Init all fired triggers
  77.   DLFifoList<TcFiredTriggerData> triggers(c_theFiredTriggerPool);
  78.   FiredTriggerPtr tptr;
  79.   while(triggers.seize(tptr) == true) {
  80.     p= tptr.p;
  81.     new (p) TcFiredTriggerData();
  82.   }
  83.   triggers.release();
  84.   /*
  85.   // Init all index records
  86.   ArrayList<TcIndexData> indexes(c_theIndexPool);
  87.   TcIndexDataPtr iptr;
  88.   while(indexes.seize(iptr) == true) {
  89.     new (iptr.p) TcIndexData(c_theAttrInfoListPool);
  90.   }
  91.   indexes.release();
  92.   */
  93.   // Init all index operation records
  94.   ArrayList<TcIndexOperation> indexOps(c_theIndexOperationPool);
  95.   TcIndexOperationPtr ioptr;
  96.   while(indexOps.seize(ioptr) == true) {
  97.     p= ioptr.p;
  98.     new (p) TcIndexOperation(c_theAttributeBufferPool);
  99.   }
  100.   indexOps.release();
  101.   c_apiConTimer = (UintR*)allocRecord("ApiConTimer",
  102.       sizeof(UintR),
  103.       capiConnectFilesize);
  104.   
  105.   c_apiConTimer_line = (UintR*)allocRecord("ApiConTimer_line",
  106.    sizeof(UintR),
  107.    capiConnectFilesize);
  108.   tcConnectRecord = (TcConnectRecord*)allocRecord("TcConnectRecord",
  109.   sizeof(TcConnectRecord),
  110.   ctcConnectFilesize);
  111.   
  112.   m_commitAckMarkerPool.setSize(capiConnectFilesize);
  113.   m_commitAckMarkerHash.setSize(512);
  114.   hostRecord = (HostRecord*)allocRecord("HostRecord",
  115. sizeof(HostRecord),
  116. chostFilesize);
  117.   tableRecord = (TableRecord*)allocRecord("TableRecord",
  118.   sizeof(TableRecord),
  119.   ctabrecFilesize);
  120.   scanRecord = (ScanRecord*)allocRecord("ScanRecord",
  121. sizeof(ScanRecord),
  122. cscanrecFileSize);
  123.   c_scan_frag_pool.setSize(cscanFragrecFileSize);
  124.   {
  125.     ScanFragRecPtr ptr;
  126.     SLList<ScanFragRec> tmp(c_scan_frag_pool);
  127.     while(tmp.seize(ptr)) {
  128.       new (ptr.p) ScanFragRec();
  129.     }
  130.     tmp.release();
  131.   }
  132.   indexOps.release();
  133.   
  134.   databufRecord = (DatabufRecord*)allocRecord("DatabufRecord",
  135.       sizeof(DatabufRecord),
  136.       cdatabufFilesize);
  137.   attrbufRecord = (AttrbufRecord*)allocRecord("AttrbufRecord",
  138.       sizeof(AttrbufRecord),
  139.       cattrbufFilesize);
  140.   gcpRecord = (GcpRecord*)allocRecord("GcpRecord",
  141.       sizeof(GcpRecord), 
  142.       cgcpFilesize);
  143.   
  144. }//Dbtc::initRecords()
  145. Dbtc::Dbtc(const class Configuration & conf):
  146.   SimulatedBlock(DBTC, conf),
  147.   c_theDefinedTriggers(c_theDefinedTriggerPool),
  148.   c_firedTriggerHash(c_theFiredTriggerPool),
  149.   c_maxNumberOfDefinedTriggers(0),
  150.   c_maxNumberOfFiredTriggers(0),
  151.   c_theIndexes(c_theIndexPool),
  152.   c_maxNumberOfIndexes(0),
  153.   c_maxNumberOfIndexOperations(0),
  154.   m_commitAckMarkerHash(m_commitAckMarkerPool)
  155. {
  156.   BLOCK_CONSTRUCTOR(Dbtc);
  157.   
  158.   const ndb_mgm_configuration_iterator * p = conf.getOwnConfigIterator();
  159.   ndbrequire(p != 0);
  160.   Uint32 transactionBufferMemory = 0;
  161.   Uint32 maxNoOfIndexes = 0, maxNoOfConcurrentIndexOperations = 0;
  162.   Uint32 maxNoOfTriggers = 0, maxNoOfFiredTriggers = 0;
  163.   ndb_mgm_get_int_parameter(p, CFG_DB_TRANS_BUFFER_MEM,  
  164.     &transactionBufferMemory);
  165.   ndb_mgm_get_int_parameter(p, CFG_DB_NO_UNIQUE_HASH_INDEXES, 
  166.     &maxNoOfIndexes);
  167.   ndb_mgm_get_int_parameter(p, CFG_DB_NO_INDEX_OPS, 
  168.     &maxNoOfConcurrentIndexOperations);
  169.   ndb_mgm_get_int_parameter(p, CFG_DB_NO_TRIGGERS, 
  170.     &maxNoOfTriggers);
  171.   ndb_mgm_get_int_parameter(p, CFG_DB_NO_TRIGGER_OPS, 
  172.     &maxNoOfFiredTriggers);
  173.   
  174.   c_transactionBufferSpace = 
  175.     transactionBufferMemory / AttributeBuffer::getSegmentSize();
  176.   c_maxNumberOfIndexes = maxNoOfIndexes;
  177.   c_maxNumberOfIndexOperations = maxNoOfConcurrentIndexOperations;
  178.   c_maxNumberOfDefinedTriggers = maxNoOfTriggers;
  179.   c_maxNumberOfFiredTriggers = maxNoOfFiredTriggers;
  180.   // Transit signals
  181.   addRecSignal(GSN_PACKED_SIGNAL, &Dbtc::execPACKED_SIGNAL); 
  182.   addRecSignal(GSN_ABORTED, &Dbtc::execABORTED);
  183.   addRecSignal(GSN_ATTRINFO, &Dbtc::execATTRINFO);
  184.   addRecSignal(GSN_CONTINUEB, &Dbtc::execCONTINUEB);
  185.   addRecSignal(GSN_KEYINFO, &Dbtc::execKEYINFO);
  186.   addRecSignal(GSN_SCAN_NEXTREQ, &Dbtc::execSCAN_NEXTREQ);
  187.   addRecSignal(GSN_TAKE_OVERTCREQ, &Dbtc::execTAKE_OVERTCREQ);
  188.   addRecSignal(GSN_TAKE_OVERTCCONF, &Dbtc::execTAKE_OVERTCCONF);
  189.   addRecSignal(GSN_LQHKEYREF, &Dbtc::execLQHKEYREF);
  190.   // Received signals
  191.   addRecSignal(GSN_DUMP_STATE_ORD, &Dbtc::execDUMP_STATE_ORD);
  192.   addRecSignal(GSN_SEND_PACKED, &Dbtc::execSEND_PACKED);
  193.   addRecSignal(GSN_SCAN_HBREP, &Dbtc::execSCAN_HBREP);
  194.   addRecSignal(GSN_COMPLETED, &Dbtc::execCOMPLETED);
  195.   addRecSignal(GSN_COMMITTED, &Dbtc::execCOMMITTED);
  196.   addRecSignal(GSN_DIGETPRIMCONF, &Dbtc::execDIGETPRIMCONF);
  197.   addRecSignal(GSN_DIGETPRIMREF, &Dbtc::execDIGETPRIMREF);
  198.   addRecSignal(GSN_DISEIZECONF, &Dbtc::execDISEIZECONF);
  199.   addRecSignal(GSN_DIVERIFYCONF, &Dbtc::execDIVERIFYCONF);
  200.   addRecSignal(GSN_DI_FCOUNTCONF, &Dbtc::execDI_FCOUNTCONF);
  201.   addRecSignal(GSN_DI_FCOUNTREF, &Dbtc::execDI_FCOUNTREF);
  202.   addRecSignal(GSN_GCP_NOMORETRANS, &Dbtc::execGCP_NOMORETRANS);
  203.   addRecSignal(GSN_LQHKEYCONF, &Dbtc::execLQHKEYCONF);
  204.   addRecSignal(GSN_NDB_STTOR, &Dbtc::execNDB_STTOR);
  205.   addRecSignal(GSN_READ_NODESCONF, &Dbtc::execREAD_NODESCONF);
  206.   addRecSignal(GSN_READ_NODESREF, &Dbtc::execREAD_NODESREF);
  207.   addRecSignal(GSN_STTOR, &Dbtc::execSTTOR);
  208.   addRecSignal(GSN_TC_COMMITREQ, &Dbtc::execTC_COMMITREQ);
  209.   addRecSignal(GSN_TC_CLOPSIZEREQ, &Dbtc::execTC_CLOPSIZEREQ);
  210.   addRecSignal(GSN_TCGETOPSIZEREQ, &Dbtc::execTCGETOPSIZEREQ);
  211.   addRecSignal(GSN_TCKEYREQ, &Dbtc::execTCKEYREQ);
  212.   addRecSignal(GSN_TCRELEASEREQ, &Dbtc::execTCRELEASEREQ);
  213.   addRecSignal(GSN_TCSEIZEREQ, &Dbtc::execTCSEIZEREQ);
  214.   addRecSignal(GSN_TCROLLBACKREQ, &Dbtc::execTCROLLBACKREQ);
  215.   addRecSignal(GSN_TC_HBREP, &Dbtc::execTC_HBREP);
  216.   addRecSignal(GSN_TC_SCHVERREQ, &Dbtc::execTC_SCHVERREQ);
  217.   addRecSignal(GSN_SCAN_TABREQ, &Dbtc::execSCAN_TABREQ);
  218.   addRecSignal(GSN_SCAN_FRAGCONF, &Dbtc::execSCAN_FRAGCONF);
  219.   addRecSignal(GSN_SCAN_FRAGREF, &Dbtc::execSCAN_FRAGREF);
  220.   addRecSignal(GSN_READ_CONFIG_REQ, &Dbtc::execREAD_CONFIG_REQ, true);
  221.   addRecSignal(GSN_LQH_TRANSCONF, &Dbtc::execLQH_TRANSCONF);
  222.   addRecSignal(GSN_COMPLETECONF, &Dbtc::execCOMPLETECONF);
  223.   addRecSignal(GSN_COMMITCONF, &Dbtc::execCOMMITCONF);
  224.   addRecSignal(GSN_ABORTCONF, &Dbtc::execABORTCONF);
  225.   addRecSignal(GSN_NODE_FAILREP, &Dbtc::execNODE_FAILREP);
  226.   addRecSignal(GSN_INCL_NODEREQ, &Dbtc::execINCL_NODEREQ);
  227.   addRecSignal(GSN_TIME_SIGNAL, &Dbtc::execTIME_SIGNAL);
  228.   addRecSignal(GSN_API_FAILREQ, &Dbtc::execAPI_FAILREQ);
  229.   addRecSignal(GSN_SET_VAR_REQ, &Dbtc::execSET_VAR_REQ);
  230.   addRecSignal(GSN_TC_COMMIT_ACK, &Dbtc::execTC_COMMIT_ACK);
  231.   addRecSignal(GSN_ABORT_ALL_REQ, &Dbtc::execABORT_ALL_REQ);
  232.   addRecSignal(GSN_CREATE_TRIG_REQ, &Dbtc::execCREATE_TRIG_REQ);
  233.   addRecSignal(GSN_DROP_TRIG_REQ, &Dbtc::execDROP_TRIG_REQ);
  234.   addRecSignal(GSN_FIRE_TRIG_ORD, &Dbtc::execFIRE_TRIG_ORD);
  235.   addRecSignal(GSN_TRIG_ATTRINFO, &Dbtc::execTRIG_ATTRINFO);
  236.   
  237.   addRecSignal(GSN_CREATE_INDX_REQ, &Dbtc::execCREATE_INDX_REQ);
  238.   addRecSignal(GSN_DROP_INDX_REQ, &Dbtc::execDROP_INDX_REQ);
  239.   addRecSignal(GSN_TCINDXREQ, &Dbtc::execTCINDXREQ);
  240.   addRecSignal(GSN_INDXKEYINFO, &Dbtc::execINDXKEYINFO);
  241.   addRecSignal(GSN_INDXATTRINFO, &Dbtc::execINDXATTRINFO);
  242.   addRecSignal(GSN_ALTER_INDX_REQ, &Dbtc::execALTER_INDX_REQ);
  243.   addRecSignal(GSN_TRANSID_AI_R, &Dbtc::execTRANSID_AI_R);
  244.   addRecSignal(GSN_KEYINFO20_R, &Dbtc::execKEYINFO20_R);
  245.   // Index table lookup
  246.   addRecSignal(GSN_TCKEYCONF, &Dbtc::execTCKEYCONF);
  247.   addRecSignal(GSN_TCKEYREF, &Dbtc::execTCKEYREF);
  248.   addRecSignal(GSN_TRANSID_AI, &Dbtc::execTRANSID_AI);
  249.   addRecSignal(GSN_TCROLLBACKREP, &Dbtc::execTCROLLBACKREP);
  250.   
  251.   //addRecSignal(GSN_CREATE_TAB_REQ, &Dbtc::execCREATE_TAB_REQ);
  252.   addRecSignal(GSN_DROP_TAB_REQ, &Dbtc::execDROP_TAB_REQ);
  253.   addRecSignal(GSN_PREP_DROP_TAB_REQ, &Dbtc::execPREP_DROP_TAB_REQ);
  254.   addRecSignal(GSN_WAIT_DROP_TAB_REF, &Dbtc::execWAIT_DROP_TAB_REF);
  255.   addRecSignal(GSN_WAIT_DROP_TAB_CONF, &Dbtc::execWAIT_DROP_TAB_CONF);
  256.   
  257.   addRecSignal(GSN_ALTER_TAB_REQ, &Dbtc::execALTER_TAB_REQ);
  258.   initData();
  259.   
  260. #ifdef VM_TRACE
  261.   {
  262.     void* tmp[] = { &apiConnectptr, 
  263.     &tcConnectptr,
  264.     &cachePtr,
  265.     &attrbufptr,
  266.     &hostptr,
  267.     &gcpPtr,
  268.     &tmpApiConnectptr,
  269.     &timeOutptr,
  270.     &scanFragptr,
  271.     &databufptr,
  272.     &tmpDatabufptr }; 
  273.     init_globals_list(tmp, sizeof(tmp)/sizeof(tmp[0]));
  274.   }
  275. #endif
  276. }//Dbtc::Dbtc()
  277. Dbtc::~Dbtc() 
  278. {
  279.   // Records with dynamic sizes
  280.   deallocRecord((void **)&cacheRecord, "CacheRecord",
  281. sizeof(CacheRecord), 
  282. ccacheFilesize);
  283.   
  284.   deallocRecord((void **)&apiConnectRecord, "ApiConnectRecord",
  285. sizeof(ApiConnectRecord),
  286. capiConnectFilesize);
  287.   
  288.   deallocRecord((void **)&tcConnectRecord, "TcConnectRecord",
  289. sizeof(TcConnectRecord),
  290. ctcConnectFilesize);
  291.   deallocRecord((void **)&hostRecord, "HostRecord",
  292. sizeof(HostRecord),
  293. chostFilesize);
  294.   
  295.   deallocRecord((void **)&tableRecord, "TableRecord",
  296. sizeof(TableRecord),
  297. ctabrecFilesize);
  298.   
  299.   deallocRecord((void **)&scanRecord, "ScanRecord",
  300. sizeof(ScanRecord),
  301. cscanrecFileSize);
  302.     
  303.   deallocRecord((void **)&databufRecord, "DatabufRecord",
  304. sizeof(DatabufRecord),
  305. cdatabufFilesize);
  306.   
  307.   deallocRecord((void **)&attrbufRecord, "AttrbufRecord",
  308. sizeof(AttrbufRecord),
  309. cattrbufFilesize);
  310.   
  311.   deallocRecord((void **)&gcpRecord, "GcpRecord",
  312. sizeof(GcpRecord), 
  313. cgcpFilesize);
  314.   
  315.   deallocRecord((void **)&tcFailRecord, "TcFailRecord",
  316. sizeof(TcFailRecord), 1);
  317.   
  318.   deallocRecord((void **)&c_apiConTimer, "ApiConTimer",
  319. sizeof(UintR),
  320. capiConnectFilesize);
  321.   deallocRecord((void **)&c_apiConTimer_line, "ApiConTimer",
  322. sizeof(UintR),
  323. capiConnectFilesize);
  324. }//Dbtc::~Dbtc()
  325. BLOCK_FUNCTIONS(Dbtc)