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

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 DBTUX_GEN_CPP
  14. #include "Dbtux.hpp"
  15. Dbtux::Dbtux(const Configuration& conf) :
  16.   SimulatedBlock(DBTUX, conf),
  17.   c_tup(0),
  18.   c_descPageList(RNIL),
  19. #ifdef VM_TRACE
  20.   debugFile(0),
  21.   debugOut(*new NullOutputStream()),
  22.   debugFlags(0),
  23. #endif
  24.   c_internalStartPhase(0),
  25.   c_typeOfStart(NodeState::ST_ILLEGAL_TYPE),
  26.   c_dataBuffer(0)
  27. {
  28.   BLOCK_CONSTRUCTOR(Dbtux);
  29.   // verify size assumptions (also when release-compiled)
  30.   ndbrequire(
  31.       (sizeof(TreeEnt) & 0x3) == 0 &&
  32.       (sizeof(TreeNode) & 0x3) == 0 &&
  33.       (sizeof(DescHead) & 0x3) == 0 &&
  34.       (sizeof(DescAttr) & 0x3) == 0
  35.   );
  36.   /*
  37.    * DbtuxGen.cpp
  38.    */
  39.   addRecSignal(GSN_CONTINUEB, &Dbtux::execCONTINUEB);
  40.   addRecSignal(GSN_STTOR, &Dbtux::execSTTOR);
  41.   addRecSignal(GSN_READ_CONFIG_REQ, &Dbtux::execREAD_CONFIG_REQ, true);
  42.   /*
  43.    * DbtuxMeta.cpp
  44.    */
  45.   addRecSignal(GSN_TUXFRAGREQ, &Dbtux::execTUXFRAGREQ);
  46.   addRecSignal(GSN_TUX_ADD_ATTRREQ, &Dbtux::execTUX_ADD_ATTRREQ);
  47.   addRecSignal(GSN_ALTER_INDX_REQ, &Dbtux::execALTER_INDX_REQ);
  48.   addRecSignal(GSN_DROP_TAB_REQ, &Dbtux::execDROP_TAB_REQ);
  49.   /*
  50.    * DbtuxMaint.cpp
  51.    */
  52.   addRecSignal(GSN_TUX_MAINT_REQ, &Dbtux::execTUX_MAINT_REQ);
  53.   /*
  54.    * DbtuxScan.cpp
  55.    */
  56.   addRecSignal(GSN_ACC_SCANREQ, &Dbtux::execACC_SCANREQ);
  57.   addRecSignal(GSN_TUX_BOUND_INFO, &Dbtux::execTUX_BOUND_INFO);
  58.   addRecSignal(GSN_NEXT_SCANREQ, &Dbtux::execNEXT_SCANREQ);
  59.   addRecSignal(GSN_ACC_CHECK_SCAN, &Dbtux::execACC_CHECK_SCAN);
  60.   addRecSignal(GSN_ACCKEYCONF, &Dbtux::execACCKEYCONF);
  61.   addRecSignal(GSN_ACCKEYREF, &Dbtux::execACCKEYREF);
  62.   addRecSignal(GSN_ACC_ABORTCONF, &Dbtux::execACC_ABORTCONF);
  63.   /*
  64.    * DbtuxDebug.cpp
  65.    */
  66.   addRecSignal(GSN_DUMP_STATE_ORD, &Dbtux::execDUMP_STATE_ORD);
  67. }
  68. Dbtux::~Dbtux()
  69. {
  70. }
  71. void
  72. Dbtux::execCONTINUEB(Signal* signal)
  73. {
  74.   jamEntry();
  75.   const Uint32* data = signal->getDataPtr();
  76.   switch (data[0]) {
  77.   case TuxContinueB::DropIndex: // currently unused
  78.     {
  79.       IndexPtr indexPtr;
  80.       c_indexPool.getPtr(indexPtr, data[1]);
  81.       dropIndex(signal, indexPtr, data[2], data[3]);
  82.     }
  83.     break;
  84.   default:
  85.     ndbrequire(false);
  86.     break;
  87.   }
  88. }
  89. /*
  90.  * STTOR is sent to one block at a time.  In NDBCNTR it triggers
  91.  * NDB_STTOR to the "old" blocks.  STTOR carries start phase (SP) and
  92.  * NDB_STTOR carries internal start phase (ISP).
  93.  *
  94.  *      SP      ISP     activities
  95.  *      1       none
  96.  *      2       1       
  97.  *      3       2       recover metadata, activate indexes
  98.  *      4       3       recover data
  99.  *      5       4-6     
  100.  *      6       skip    
  101.  *      7       skip    
  102.  *      8       7       build non-logged indexes on SR
  103.  *
  104.  * DBTUX catches type of start (IS, SR, NR, INR) at SP 3 and updates
  105.  * internal start phase at SP 7.  These are used to prevent index
  106.  * maintenance operations caused by redo log at SR.
  107.  */
  108. void
  109. Dbtux::execSTTOR(Signal* signal)
  110. {
  111.   jamEntry();
  112.   Uint32 startPhase = signal->theData[1];
  113.   switch (startPhase) {
  114.   case 1:
  115.     jam();
  116.     CLEAR_ERROR_INSERT_VALUE;
  117.     c_tup = (Dbtup*)globalData.getBlock(DBTUP);
  118.     ndbrequire(c_tup != 0);
  119.     break;
  120.   case 3:
  121.     jam();
  122.     c_typeOfStart = signal->theData[7];
  123.     break;
  124.   case 7:
  125.     c_internalStartPhase = 6;
  126.   default:
  127.     jam();
  128.     break;
  129.   }
  130.   signal->theData[0] = 0;       // garbage
  131.   signal->theData[1] = 0;       // garbage
  132.   signal->theData[2] = 0;       // garbage
  133.   signal->theData[3] = 1;
  134.   signal->theData[4] = 3;       // for c_typeOfStart
  135.   signal->theData[5] = 7;       // for c_internalStartPhase
  136.   signal->theData[6] = 255;
  137.   sendSignal(NDBCNTR_REF, GSN_STTORRY, signal, 7, JBB);
  138. }
  139. void
  140. Dbtux::execREAD_CONFIG_REQ(Signal* signal)
  141. {
  142.   jamEntry();
  143.  
  144.   const ReadConfigReq * req = (ReadConfigReq*)signal->getDataPtr();
  145.   Uint32 ref = req->senderRef;
  146.   Uint32 senderData = req->senderData;
  147.   ndbrequire(req->noOfParameters == 0);
  148.   Uint32 nIndex;
  149.   Uint32 nFragment;
  150.   Uint32 nAttribute;
  151.   Uint32 nScanOp; 
  152.   const ndb_mgm_configuration_iterator * p = 
  153.     theConfiguration.getOwnConfigIterator();
  154.   ndbrequire(p != 0);
  155.   ndbrequire(!ndb_mgm_get_int_parameter(p, CFG_TUX_INDEX, &nIndex));
  156.   ndbrequire(!ndb_mgm_get_int_parameter(p, CFG_TUX_FRAGMENT, &nFragment));
  157.   ndbrequire(!ndb_mgm_get_int_parameter(p, CFG_TUX_ATTRIBUTE, &nAttribute));
  158.   ndbrequire(!ndb_mgm_get_int_parameter(p, CFG_TUX_SCAN_OP, &nScanOp));
  159.   const Uint32 nDescPage = (nIndex * DescHeadSize + nAttribute * DescAttrSize + DescPageSize - 1) / DescPageSize;
  160.   const Uint32 nScanBoundWords = nScanOp * ScanBoundSegmentSize * 4;
  161.   
  162.   c_indexPool.setSize(nIndex);
  163.   c_fragPool.setSize(nFragment);
  164.   c_descPagePool.setSize(nDescPage);
  165.   c_fragOpPool.setSize(MaxIndexFragments);
  166.   c_scanOpPool.setSize(nScanOp);
  167.   c_scanBoundPool.setSize(nScanBoundWords);
  168.   /*
  169.    * Index id is physical array index.  We seize and initialize all
  170.    * index records now.
  171.    */
  172.   IndexPtr indexPtr;
  173.   while (1) {
  174.     jam();
  175.     refresh_watch_dog();
  176.     c_indexPool.seize(indexPtr);
  177.     if (indexPtr.i == RNIL) {
  178.       jam();
  179.       break;
  180.     }
  181.     new (indexPtr.p) Index();
  182.   }
  183.   // allocate buffers
  184.   c_keyAttrs = (Uint32*)allocRecord("c_keyAttrs", sizeof(Uint32), MaxIndexAttributes);
  185.   c_sqlCmp = (NdbSqlUtil::Cmp**)allocRecord("c_sqlCmp", sizeof(NdbSqlUtil::Cmp*), MaxIndexAttributes);
  186.   c_searchKey = (Uint32*)allocRecord("c_searchKey", sizeof(Uint32), MaxAttrDataSize);
  187.   c_entryKey = (Uint32*)allocRecord("c_entryKey", sizeof(Uint32), MaxAttrDataSize);
  188.   c_dataBuffer = (Uint32*)allocRecord("c_dataBuffer", sizeof(Uint64), (MaxAttrDataSize + 1) >> 1);
  189.   // ack
  190.   ReadConfigConf * conf = (ReadConfigConf*)signal->getDataPtrSend();
  191.   conf->senderRef = reference();
  192.   conf->senderData = senderData;
  193.   sendSignal(ref, GSN_READ_CONFIG_CONF, signal, 
  194.      ReadConfigConf::SignalLength, JBB);
  195. }
  196. // utils
  197. void
  198. Dbtux::setKeyAttrs(const Frag& frag)
  199. {
  200.   Data keyAttrs = c_keyAttrs; // global
  201.   NdbSqlUtil::Cmp** sqlCmp = c_sqlCmp; // global
  202.   const unsigned numAttrs = frag.m_numAttrs;
  203.   const DescEnt& descEnt = getDescEnt(frag.m_descPage, frag.m_descOff);
  204.   for (unsigned i = 0; i < numAttrs; i++) {
  205.     const DescAttr& descAttr = descEnt.m_descAttr[i];
  206.     Uint32 size = AttributeDescriptor::getSizeInWords(descAttr.m_attrDesc);
  207.     // set attr id and fixed size
  208.     keyAttrs.ah() = AttributeHeader(descAttr.m_primaryAttrId, size);
  209.     keyAttrs += 1;
  210.     // set comparison method pointer
  211.     const NdbSqlUtil::Type& sqlType = NdbSqlUtil::getTypeBinary(descAttr.m_typeId);
  212.     ndbrequire(sqlType.m_cmp != 0);
  213.     *(sqlCmp++) = sqlType.m_cmp;
  214.   }
  215. }
  216. void
  217. Dbtux::readKeyAttrs(const Frag& frag, TreeEnt ent, unsigned start, Data keyData)
  218. {
  219.   ConstData keyAttrs = c_keyAttrs; // global
  220.   const Uint32 tableFragPtrI = frag.m_tupTableFragPtrI[ent.m_fragBit];
  221.   const TupLoc tupLoc = ent.m_tupLoc;
  222.   const Uint32 tupVersion = ent.m_tupVersion;
  223.   ndbrequire(start < frag.m_numAttrs);
  224.   const Uint32 numAttrs = frag.m_numAttrs - start;
  225.   // skip to start position in keyAttrs only
  226.   keyAttrs += start;
  227.   int ret = c_tup->tuxReadAttrs(tableFragPtrI, tupLoc.getPageId(), tupLoc.getPageOffset(), tupVersion, keyAttrs, numAttrs, keyData);
  228.   jamEntry();
  229.   // TODO handle error
  230.   ndbrequire(ret > 0);
  231. }
  232. void
  233. Dbtux::readTablePk(const Frag& frag, TreeEnt ent, Data pkData, unsigned& pkSize)
  234. {
  235.   const Uint32 tableFragPtrI = frag.m_tupTableFragPtrI[ent.m_fragBit];
  236.   const TupLoc tupLoc = ent.m_tupLoc;
  237.   int ret = c_tup->tuxReadPk(tableFragPtrI, tupLoc.getPageId(), tupLoc.getPageOffset(), pkData);
  238.   jamEntry();
  239.   // TODO handle error
  240.   ndbrequire(ret > 0);
  241.   pkSize = ret;
  242. }
  243. /*
  244.  * Copy attribute data with headers.  Input is all index key data.
  245.  * Copies whatever fits.
  246.  */
  247. void
  248. Dbtux::copyAttrs(const Frag& frag, ConstData data1, Data data2, unsigned maxlen2)
  249. {
  250.   unsigned n = frag.m_numAttrs;
  251.   unsigned len2 = maxlen2;
  252.   while (n != 0) {
  253.     jam();
  254.     const unsigned dataSize = data1.ah().getDataSize();
  255.     // copy header
  256.     if (len2 == 0)
  257.       return;
  258.     data2[0] = data1[0];
  259.     data1 += 1;
  260.     data2 += 1;
  261.     len2 -= 1;
  262.     // copy data
  263.     for (unsigned i = 0; i < dataSize; i++) {
  264.       if (len2 == 0)
  265.         return;
  266.       data2[i] = data1[i];
  267.       len2 -= 1;
  268.     }
  269.     data1 += dataSize;
  270.     data2 += dataSize;
  271.     n -= 1;
  272.   }
  273. #ifdef VM_TRACE
  274.   memset(data2, DataFillByte, len2 << 2);
  275. #endif
  276. }
  277. BLOCK_FUNCTIONS(Dbtux)