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

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 DBTUP_C
  14. #include "Dbtup.hpp"
  15. #include <RefConvert.hpp>
  16. #include <ndb_limits.h>
  17. #include <pc.hpp>
  18. #include <signaldata/DropTab.hpp>
  19. #include <signaldata/DumpStateOrd.hpp>
  20. #include <signaldata/EventReport.hpp>
  21. #include <Vector.hpp>
  22. #define ljam() { jamLine(30000 + __LINE__); }
  23. #define ljamEntry() { jamEntryLine(30000 + __LINE__); }
  24. /* **************************************************************** */
  25. /* ---------------------------------------------------------------- */
  26. /* ------------------------ DEBUG MODULE -------------------------- */
  27. /* ---------------------------------------------------------------- */
  28. /* **************************************************************** */
  29. void Dbtup::execDEBUG_SIG(Signal* signal) 
  30. {
  31.   PagePtr regPagePtr;
  32.   ljamEntry();
  33.   regPagePtr.i = signal->theData[0];
  34.   ptrCheckGuard(regPagePtr, cnoOfPage, page);
  35. }//Dbtup::execDEBUG_SIG()
  36. #ifdef TEST_MR
  37. #include <time.h>
  38. void startTimer(struct timespec *tp)
  39. {
  40.   clock_gettime(CLOCK_REALTIME, tp);
  41. }//startTimer()
  42. int stopTimer(struct timespec *tp)
  43. {
  44.   double timer_count;
  45.   struct timespec theStopTime;
  46.   clock_gettime(CLOCK_REALTIME, &theStopTime);
  47.   timer_count = (double)(1000000*((double)theStopTime.tv_sec - (double)tp->tv_sec)) + 
  48.                 (double)((double)((double)theStopTime.tv_nsec - (double)tp->tv_nsec)/(double)1000);
  49.   return (int)timer_count;
  50. }//stopTimer()
  51. #endif // end TEST_MR
  52. struct Chunk {
  53.   Uint32 pageId;
  54.   Uint32 pageCount;
  55. };
  56. void
  57. Dbtup::reportMemoryUsage(Signal* signal, int incDec){
  58.   signal->theData[0] = EventReport::MemoryUsage;
  59.   signal->theData[1] = incDec;
  60.   signal->theData[2] = sizeof(Page);
  61.   signal->theData[3] = cnoOfAllocatedPages;
  62.   signal->theData[4] = cnoOfPage;
  63.   signal->theData[5] = DBTUP;
  64.   sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 6, JBB);
  65. }
  66. void
  67. Dbtup::execDUMP_STATE_ORD(Signal* signal)
  68. {
  69.   Uint32 type = signal->theData[0];
  70.   if(type == DumpStateOrd::DumpPageMemory){
  71.     reportMemoryUsage(signal, 0);
  72.     return;
  73.   }
  74.   DumpStateOrd * const dumpState = (DumpStateOrd *)&signal->theData[0];
  75. #if 0
  76.   if (type == 100) {
  77.     RelTabMemReq * const req = (RelTabMemReq *)signal->getDataPtrSend();
  78.     req->primaryTableId = 2;
  79.     req->secondaryTableId = RNIL;
  80.     req->userPtr = 2;
  81.     req->userRef = DBDICT_REF;
  82.     sendSignal(cownref, GSN_REL_TABMEMREQ, signal,
  83.                RelTabMemReq::SignalLength, JBB);
  84.     return;
  85.   }//if
  86.   if (type == 101) {
  87.     RelTabMemReq * const req = (RelTabMemReq *)signal->getDataPtrSend();
  88.     req->primaryTableId = 4;
  89.     req->secondaryTableId = 5;
  90.     req->userPtr = 4;
  91.     req->userRef = DBDICT_REF;
  92.     sendSignal(cownref, GSN_REL_TABMEMREQ, signal,
  93.                RelTabMemReq::SignalLength, JBB);
  94.     return;
  95.   }//if
  96.   if (type == 102) {
  97.     RelTabMemReq * const req = (RelTabMemReq *)signal->getDataPtrSend();
  98.     req->primaryTableId = 6;
  99.     req->secondaryTableId = 8;
  100.     req->userPtr = 6;
  101.     req->userRef = DBDICT_REF;
  102.     sendSignal(cownref, GSN_REL_TABMEMREQ, signal,
  103.                RelTabMemReq::SignalLength, JBB);
  104.     return;
  105.   }//if
  106.   if (type == 103) {
  107.     DropTabFileReq * const req = (DropTabFileReq *)signal->getDataPtrSend();
  108.     req->primaryTableId = 2;
  109.     req->secondaryTableId = RNIL;
  110.     req->userPtr = 2;
  111.     req->userRef = DBDICT_REF;
  112.     sendSignal(cownref, GSN_DROP_TABFILEREQ, signal,
  113.                DropTabFileReq::SignalLength, JBB);
  114.     return;
  115.   }//if
  116.   if (type == 104) {
  117.     DropTabFileReq * const req = (DropTabFileReq *)signal->getDataPtrSend();
  118.     req->primaryTableId = 4;
  119.     req->secondaryTableId = 5;
  120.     req->userPtr = 4;
  121.     req->userRef = DBDICT_REF;
  122.     sendSignal(cownref, GSN_DROP_TABFILEREQ, signal,
  123.                DropTabFileReq::SignalLength, JBB);
  124.     return;
  125.   }//if
  126.   if (type == 105) {
  127.     DropTabFileReq * const req = (DropTabFileReq *)signal->getDataPtrSend();
  128.     req->primaryTableId = 6;
  129.     req->secondaryTableId = 8;
  130.     req->userPtr = 6;
  131.     req->userRef = DBDICT_REF;
  132.     sendSignal(cownref, GSN_DROP_TABFILEREQ, signal,
  133.                DropTabFileReq::SignalLength, JBB);
  134.     return;
  135.   }//if
  136. #endif
  137. #ifdef ERROR_INSERT
  138.   if (type == DumpStateOrd::EnableUndoDelayDataWrite) {
  139.     ndbout << "Dbtup:: delay write of datapages for table = " 
  140.    << dumpState->args[1]<< endl;
  141.     c_errorInsert4000TableId = dumpState->args[1];
  142.     SET_ERROR_INSERT_VALUE(4000);
  143.     return;
  144.   }//if
  145. #endif
  146. #ifdef VM_TRACE
  147.   if (type == 1211){
  148.     ndbout_c("Startar modul test av Page Manager");
  149.     Vector<Chunk> chunks;
  150.     const Uint32 LOOPS = 1000;
  151.     for(Uint32 i = 0; i<LOOPS; i++){
  152.       // Case
  153.       Uint32 c = (rand() % 3);
  154.       const Uint32 free = cnoOfPage - cnoOfAllocatedPages;
  155.       
  156.       Uint32 alloc = 0;
  157.       if(free <= 1){
  158. c = 0;
  159. alloc = 1;
  160.       } else 
  161. alloc = 1 + (rand() % (free - 1));
  162.       
  163.       if(chunks.size() == 0 && c == 0){
  164. c = 1 + rand() % 2;
  165.       }
  166.       ndbout_c("loop=%d case=%d free=%d alloc=%d", i, c, free, alloc);
  167.       switch(c){ 
  168.       case 0:{ // Release
  169. const int ch = rand() % chunks.size();
  170. Chunk chunk = chunks[ch];
  171. chunks.erase(ch);
  172. returnCommonArea(chunk.pageId, chunk.pageCount);
  173.       }
  174. break;
  175.       case 2: { // Seize(n) - fail
  176. alloc += free;
  177. // Fall through
  178.       }
  179.       case 1: { // Seize(n) (success)
  180. Chunk chunk;
  181. allocConsPages(alloc, chunk.pageCount, chunk.pageId);
  182. ndbrequire(chunk.pageCount <= alloc);
  183. if(chunk.pageCount != 0){
  184.   chunks.push_back(chunk);
  185.   if(chunk.pageCount != alloc) {
  186.     ndbout_c("  Tried to allocate %d - only allocated %d - free: %d",
  187.      alloc, chunk.pageCount, free);
  188.   }
  189. } else {
  190.   ndbout_c("  Failed to alloc %d pages with %d pages free",
  191.    alloc, free);
  192. }
  193. for(Uint32 i = 0; i<chunk.pageCount; i++){
  194.   PagePtr pagePtr;
  195.   pagePtr.i = chunk.pageId + i;
  196.   ptrCheckGuard(pagePtr, cnoOfPage, page);
  197.   pagePtr.p->pageWord[ZPAGE_STATE_POS] = ~ZFREE_COMMON;
  198. }
  199. if(alloc == 1 && free > 0)
  200.   ndbrequire(chunk.pageCount == alloc);
  201.       }
  202. break;
  203.       }
  204.     }
  205.     while(chunks.size() > 0){
  206.       Chunk chunk = chunks.back();
  207.       returnCommonArea(chunk.pageId, chunk.pageCount);      
  208.       chunks.erase(chunks.size() - 1);
  209.     }
  210.   }
  211. #endif
  212. }//Dbtup::execDUMP_STATE_ORD()
  213. /* ---------------------------------------------------------------- */
  214. /* ---------      MEMORY       CHECK        ----------------------- */
  215. /* ---------------------------------------------------------------- */
  216. void Dbtup::execMEMCHECKREQ(Signal* signal) 
  217. {
  218.   PagePtr regPagePtr;
  219.   DiskBufferSegmentInfoPtr dbsiPtr;
  220.   CheckpointInfoPtr ciPtr;
  221.   UndoPagePtr regUndoPagePtr;
  222.   Uint32* data = &signal->theData[0];
  223.   ljamEntry();
  224.   BlockReference blockref = signal->theData[0];
  225.   Uint32 i;
  226.   for (i = 0; i < 25; i++) {
  227.     ljam();
  228.     data[i] = 0;
  229.   }//for
  230.   for (i = 0; i < 16; i++) {
  231.     regPagePtr.i = cfreepageList[i];
  232.     ljam();
  233.     while (regPagePtr.i != RNIL) {
  234.       ljam();
  235.       ptrCheckGuard(regPagePtr, cnoOfPage, page);
  236.       regPagePtr.i = regPagePtr.p->pageWord[ZPAGE_NEXT_POS];
  237.       data[0]++;
  238.     }//while
  239.   }//for
  240.   regUndoPagePtr.i = cfirstfreeUndoSeg;
  241.   while (regUndoPagePtr.i != RNIL) {
  242.     ljam();
  243.     ptrCheckGuard(regUndoPagePtr, cnoOfUndoPage, undoPage);
  244.     regUndoPagePtr.i = regUndoPagePtr.p->undoPageWord[ZPAGE_NEXT_POS];
  245.     data[1] += ZUB_SEGMENT_SIZE;
  246.   }//while
  247.   ciPtr.i = cfirstfreeLcp;
  248.   while (ciPtr.i != RNIL) {
  249.     ljam();
  250.     ptrCheckGuard(ciPtr, cnoOfLcpRec, checkpointInfo);
  251.     ciPtr.i = ciPtr.p->lcpNextRec;
  252.     data[2]++;
  253.   }//while
  254.   dbsiPtr.i = cfirstfreePdx;
  255.   while (dbsiPtr.i != ZNIL) {
  256.     ljam();
  257.     ptrCheckGuard(dbsiPtr, cnoOfConcurrentWriteOp, diskBufferSegmentInfo);
  258.     dbsiPtr.i = dbsiPtr.p->pdxNextRec;
  259.     data[3]++;
  260.   }//while
  261.   sendSignal(blockref, GSN_MEMCHECKCONF, signal, 25, JBB);
  262. }//Dbtup::memCheck()
  263. // ------------------------------------------------------------------------
  264. // Help function to be used when debugging. Prints out a tuple page.
  265. // printLimit is the number of bytes that is printed out from the page. A 
  266. // page is of size 32768 bytes as of March 2003.
  267. // ------------------------------------------------------------------------
  268. void Dbtup::printoutTuplePage(Uint32 fragid, Uint32 pageid, Uint32 printLimit) 
  269. {
  270.   PagePtr tmpPageP;
  271.   FragrecordPtr tmpFragP;
  272.   TablerecPtr tmpTableP;
  273.   Uint32 tmpTupleSize;
  274.   tmpPageP.i = pageid;
  275.   ptrCheckGuard(tmpPageP, cnoOfPage, page);
  276.   tmpFragP.i = fragid;
  277.   ptrCheckGuard(tmpFragP, cnoOfFragrec, fragrecord);
  278.   tmpTableP.i = tmpFragP.p->fragTableId;
  279.   ptrCheckGuard(tmpTableP, cnoOfTablerec, tablerec);
  280.   tmpTupleSize = tmpTableP.p->tupheadsize;
  281.   ndbout << "Fragid: " << fragid << " Pageid: " << pageid << endl
  282.  << "----------------------------------------" << endl;
  283.   ndbout << "PageHead : ";
  284.   for (Uint32 i1 = 0; i1 < ZPAGE_HEADER_SIZE; i1++) {
  285.     if (i1 == 3)
  286.       ndbout << (tmpPageP.p->pageWord[i1] >> 16) << "," << (tmpPageP.p->pageWord[i1] & 0xffff) << " ";
  287.     else if (tmpPageP.p->pageWord[i1] == 4059165169u)
  288.       ndbout <<  "F1F1F1F1 ";
  289.     else if (tmpPageP.p->pageWord[i1] == 268435455u)
  290.       ndbout << "RNIL ";
  291.     else
  292.       ndbout << tmpPageP.p->pageWord[i1] << " ";
  293.   }//for
  294.   ndbout << endl;
  295.   for (Uint32 i = ZPAGE_HEADER_SIZE; i < printLimit; i += tmpTupleSize) {
  296.     ndbout << "pagepos " << i << " : ";
  297.  
  298.     for (Uint32 j = i; j < i + tmpTupleSize; j++) {
  299.       if (tmpPageP.p->pageWord[j] == 4059165169u)
  300. ndbout <<  "F1F1F1F1 ";
  301.       else if (tmpPageP.p->pageWord[j] == 268435455u)
  302. ndbout << "RNIL ";
  303.       else
  304. ndbout << tmpPageP.p->pageWord[j] << " ";
  305.     }//for
  306.     ndbout << endl;
  307.   }//for
  308. }//Dbtup::printoutTuplePage
  309. #ifdef VM_TRACE
  310. NdbOut&
  311. operator<<(NdbOut& out, const Dbtup::Operationrec& op)
  312. {
  313.   out << "[Operationrec " << hex << &op;
  314.   // table
  315.   out << " [tableRef " << dec << op.tableRef << "]";
  316.   out << " [fragId " << dec << op.fragId << "]";
  317.   out << " [fragmentPtr " << hex << op.fragmentPtr << "]";
  318.   // type
  319.   out << " [optype " << dec << op.optype << "]";
  320.   out << " [deleteInsertFlag " << dec << op.deleteInsertFlag << "]";
  321.   out << " [dirtyOp " << dec << op.dirtyOp << "]";
  322.   out << " [interpretedExec " << dec << op.interpretedExec << "]";
  323.   out << " [opSimple " << dec << op.opSimple << "]";
  324.   // state
  325.   out << " [tupleState " << dec << (Uint32) op.tupleState << "]";
  326.   out << " [transstate " << dec << (Uint32) op.transstate << "]";
  327.   out << " [inFragList " << dec << op.inFragList << "]";
  328.   out << " [inActiveOpList " << dec << op.inActiveOpList << "]";
  329.   out << " [undoLogged " << dec << (Uint32) op.undoLogged << "]";
  330.   // links
  331.   out << " [prevActiveOp " << hex << op.prevActiveOp << "]";
  332.   out << " [nextActiveOp " << hex << op.nextActiveOp << "]";
  333.   // tuples
  334.   out << " [tupVersion " << hex << op.tupVersion << "]";
  335.   out << " [fragPageId " << dec << op.fragPageId << "]";
  336.   out << " [pageIndex " << dec << op.pageIndex << "]";
  337.   out << " [realPageId " << hex << op.realPageId << "]";
  338.   out << " [pageOffset " << dec << op.pageOffset << "]";
  339.   out << " [fragPageIdC " << dec << op.fragPageIdC << "]";
  340.   out << " [pageIndexC " << dec << op.pageIndexC << "]";
  341.   out << " [realPageIdC " << hex << op.realPageIdC << "]";
  342.   out << " [pageOffsetC " << dec << op.pageOffsetC << "]";
  343.   // trans
  344.   out << " [transid1 " << hex << op.transid1 << "]";
  345.   out << " [transid2 " << hex << op.transid2 << "]";
  346.   out << "]";
  347.   return out;
  348. }
  349. // uses global tabptr
  350. NdbOut&
  351. operator<<(NdbOut& out, const Dbtup::Th& th)
  352. {
  353.   // ugly
  354.   Dbtup* tup = (Dbtup*)globalData.getBlock(DBTUP);
  355.   const Dbtup::Tablerec& tab = *tup->tabptr.p;
  356.   unsigned i = 0;
  357.   out << "[Th " << hex << &th;
  358.   out << " [op " << hex << th.data[i++] << "]";
  359.   out << " [version " << hex << (Uint16)th.data[i++] << "]";
  360.   if (tab.checksumIndicator)
  361.     out << " [checksum " << hex << th.data[i++] << "]";
  362.   out << " [nullbits";
  363.   for (unsigned j = 0; j < tab.tupNullWords; j++)
  364.     out << " " << hex << th.data[i++];
  365.   out << "]";
  366.   if (tab.GCPIndicator)
  367.     out << " [gcp " << dec << th.data[i++] << "]";
  368.   out << " [data";
  369.   while (i < tab.tupheadsize)
  370.     out << " " << hex << th.data[i++];
  371.   out << "]";
  372.   out << "]";
  373.   return out;
  374. }
  375. #endif
  376. #ifdef VM_TRACE
  377. template class Vector<Chunk>;
  378. #endif