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

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 "Backup.hpp"
  14. #include <ndb_version.h>
  15. #include <NdbTCP.h>
  16. #include <Bitmask.hpp>
  17. #include <signaldata/NodeFailRep.hpp>
  18. #include <signaldata/ReadNodesConf.hpp>
  19. #include <signaldata/ScanFrag.hpp>
  20. #include <signaldata/GetTabInfo.hpp>
  21. #include <signaldata/DictTabInfo.hpp>
  22. #include <signaldata/ListTables.hpp>
  23. #include <signaldata/FsOpenReq.hpp>
  24. #include <signaldata/FsAppendReq.hpp>
  25. #include <signaldata/FsCloseReq.hpp>
  26. #include <signaldata/FsConf.hpp>
  27. #include <signaldata/FsRef.hpp>
  28. #include <signaldata/FsRemoveReq.hpp>
  29. #include <signaldata/BackupImpl.hpp>
  30. #include <signaldata/BackupSignalData.hpp>
  31. #include <signaldata/BackupContinueB.hpp>
  32. #include <signaldata/EventReport.hpp>
  33. #include <signaldata/UtilSequence.hpp>
  34. #include <signaldata/CreateTrig.hpp>
  35. #include <signaldata/AlterTrig.hpp>
  36. #include <signaldata/DropTrig.hpp>
  37. #include <signaldata/FireTrigOrd.hpp>
  38. #include <signaldata/TrigAttrInfo.hpp>
  39. #include <AttributeHeader.hpp>
  40. #include <signaldata/WaitGCP.hpp>
  41. #include <NdbTick.h>
  42. static NDB_TICKS startTime;
  43. static const Uint32 BACKUP_SEQUENCE = 0x1F000000;
  44. #ifdef VM_TRACE
  45. #define DEBUG_OUT(x) ndbout << x << endl
  46. #else
  47. #define DEBUG_OUT(x) 
  48. #endif
  49. //#define DEBUG_ABORT
  50. static Uint32 g_TypeOfStart = NodeState::ST_ILLEGAL_TYPE;
  51. #define SEND_BACKUP_STARTED_FLAG(A) (((A) & 0x3) > 0)
  52. #define SEND_BACKUP_COMPLETED_FLAG(A) (((A) & 0x3) > 1)
  53. void
  54. Backup::execSTTOR(Signal* signal) 
  55. {
  56.   jamEntry();                            
  57.   const Uint32 startphase  = signal->theData[1];
  58.   const Uint32 typeOfStart = signal->theData[7];
  59.   if (startphase == 3) {
  60.     jam();
  61.     g_TypeOfStart = typeOfStart;
  62.     signal->theData[0] = reference();
  63.     sendSignal(NDBCNTR_REF, GSN_READ_NODESREQ, signal, 1, JBB);
  64.     return;
  65.   }//if
  66.   if(startphase == 7 && g_TypeOfStart == NodeState::ST_INITIAL_START &&
  67.      c_masterNodeId == getOwnNodeId()){
  68.     jam();
  69.     createSequence(signal);
  70.     return;
  71.   }//if
  72.   
  73.   sendSTTORRY(signal);  
  74.   return;
  75. }//Dbdict::execSTTOR()
  76. void
  77. Backup::execREAD_NODESCONF(Signal* signal)
  78. {
  79.   jamEntry();
  80.   ReadNodesConf * conf = (ReadNodesConf *)signal->getDataPtr();
  81.  
  82.   c_aliveNodes.clear();
  83.   Uint32 count = 0;
  84.   for (Uint32 i = 0; i<MAX_NDB_NODES; i++) {
  85.     jam();
  86.     if(NodeBitmask::get(conf->allNodes, i)){
  87.       jam();
  88.       count++;
  89.       NodePtr node;
  90.       ndbrequire(c_nodes.seize(node));
  91.       
  92.       node.p->nodeId = i;
  93.       if(NodeBitmask::get(conf->inactiveNodes, i)) {
  94.         jam();
  95. node.p->alive = 0;
  96.       } else {
  97.         jam();
  98. node.p->alive = 1;
  99. c_aliveNodes.set(i);
  100.       }//if
  101.     }//if
  102.   }//for
  103.   c_masterNodeId = conf->masterNodeId;
  104.   ndbrequire(count == conf->noOfNodes);
  105.   sendSTTORRY(signal);
  106. }
  107. void
  108. Backup::sendSTTORRY(Signal* signal)
  109. {
  110.   signal->theData[0] = 0;
  111.   signal->theData[3] = 1;
  112.   signal->theData[4] = 3;
  113.   signal->theData[5] = 7;
  114.   signal->theData[6] = 255; // No more start phases from missra
  115.   sendSignal(NDBCNTR_REF, GSN_STTORRY, signal, 7, JBB);
  116. }
  117. void
  118. Backup::createSequence(Signal* signal)
  119. {
  120.   UtilSequenceReq * req = (UtilSequenceReq*)signal->getDataPtrSend();
  121.   
  122.   req->senderData  = RNIL;
  123.   req->sequenceId  = BACKUP_SEQUENCE;
  124.   req->requestType = UtilSequenceReq::Create;
  125.   
  126.   sendSignal(DBUTIL_REF, GSN_UTIL_SEQUENCE_REQ, 
  127.      signal, UtilSequenceReq::SignalLength, JBB);
  128. }
  129. void
  130. Backup::execCONTINUEB(Signal* signal)
  131. {
  132.   jamEntry();
  133.   const Uint32 Tdata0 = signal->theData[0];
  134.   const Uint32 Tdata1 = signal->theData[1];
  135.   const Uint32 Tdata2 = signal->theData[2];
  136.   
  137.   switch(Tdata0) {
  138.   case BackupContinueB::START_FILE_THREAD:
  139.   case BackupContinueB::BUFFER_UNDERFLOW:
  140.   {
  141.     jam();
  142.     BackupFilePtr filePtr;
  143.     c_backupFilePool.getPtr(filePtr, Tdata1);
  144.     checkFile(signal, filePtr);
  145.     return;
  146.   }
  147.   break;
  148.   case BackupContinueB::BUFFER_FULL_SCAN:
  149.   {
  150.     jam();
  151.     BackupFilePtr filePtr;
  152.     c_backupFilePool.getPtr(filePtr, Tdata1);
  153.     checkScan(signal, filePtr);
  154.     return;
  155.   }
  156.   break;
  157.   case BackupContinueB::BUFFER_FULL_FRAG_COMPLETE:
  158.   {
  159.     jam();
  160.     BackupFilePtr filePtr;
  161.     c_backupFilePool.getPtr(filePtr, Tdata1);
  162.     fragmentCompleted(signal, filePtr);
  163.     return;
  164.   }
  165.   break;
  166.   case BackupContinueB::BUFFER_FULL_META:
  167.   {
  168.     jam();
  169.     BackupRecordPtr ptr;
  170.     c_backupPool.getPtr(ptr, Tdata1);
  171.     
  172.     BackupFilePtr filePtr;
  173.     ptr.p->files.getPtr(filePtr, ptr.p->ctlFilePtr);
  174.     FsBuffer & buf = filePtr.p->operation.dataBuffer;
  175.     
  176.     if(buf.getFreeSize() + buf.getMinRead() < buf.getUsableSize()) {
  177.       jam();
  178.       TablePtr tabPtr;
  179.       c_tablePool.getPtr(tabPtr, Tdata2);
  180.       
  181.       DEBUG_OUT("Backup - Buffer full - " << buf.getFreeSize()
  182. << " + " << buf.getMinRead()
  183. << " < " << buf.getUsableSize()
  184. << " - tableId = " << tabPtr.p->tableId);
  185.       signal->theData[0] = BackupContinueB::BUFFER_FULL_META;
  186.       signal->theData[1] = Tdata1;
  187.       signal->theData[2] = Tdata2;
  188.       sendSignalWithDelay(BACKUP_REF, GSN_CONTINUEB, signal, 100, 3);
  189.       return;
  190.     }//if
  191.     
  192.     TablePtr tabPtr;
  193.     c_tablePool.getPtr(tabPtr, Tdata2);
  194.     GetTabInfoReq * req = (GetTabInfoReq *)signal->getDataPtrSend();
  195.     req->senderRef = reference();
  196.     req->senderData = ptr.i;
  197.     req->requestType = GetTabInfoReq::RequestById |
  198.       GetTabInfoReq::LongSignalConf;
  199.     req->tableId = tabPtr.p->tableId;
  200.     sendSignal(DBDICT_REF, GSN_GET_TABINFOREQ, signal, 
  201.        GetTabInfoReq::SignalLength, JBB);
  202.     return;
  203.   }
  204.   default:
  205.     ndbrequire(0);
  206.   }//switch
  207. }
  208. void
  209. Backup::execDUMP_STATE_ORD(Signal* signal)
  210. {
  211.   jamEntry();
  212.   
  213.   if(signal->theData[0] == 20){
  214.     if(signal->length() > 1){
  215.       c_defaults.m_dataBufferSize = (signal->theData[1] * 1024 * 1024);
  216.     }
  217.     if(signal->length() > 2){
  218.       c_defaults.m_logBufferSize = (signal->theData[2] * 1024 * 1024);
  219.     }
  220.     if(signal->length() > 3){
  221.       c_defaults.m_minWriteSize = signal->theData[3] * 1024;
  222.     }
  223.     if(signal->length() > 4){
  224.       c_defaults.m_maxWriteSize = signal->theData[4] * 1024;
  225.     }
  226.     
  227.     infoEvent("Backup: data: %d log: %d min: %d max: %d",
  228.       c_defaults.m_dataBufferSize,
  229.       c_defaults.m_logBufferSize,
  230.       c_defaults.m_minWriteSize,
  231.       c_defaults.m_maxWriteSize);
  232.     return;
  233.   }
  234.   if(signal->theData[0] == 21){
  235.     BackupReq * req = (BackupReq*)signal->getDataPtrSend();
  236.     req->senderData = 23;
  237.     req->backupDataLen = 0;
  238.     sendSignal(BACKUP_REF, GSN_BACKUP_REQ,signal,BackupReq::SignalLength, JBB);
  239.     startTime = NdbTick_CurrentMillisecond();
  240.     return;
  241.   }
  242.   if(signal->theData[0] == 22){
  243.     const Uint32 seq = signal->theData[1];
  244.     FsRemoveReq * req = (FsRemoveReq *)signal->getDataPtrSend();
  245.     req->userReference = reference();
  246.     req->userPointer = 23;
  247.     req->directory = 1;
  248.     req->ownDirectory = 1;
  249.     FsOpenReq::setVersion(req->fileNumber, 2);
  250.     FsOpenReq::setSuffix(req->fileNumber, FsOpenReq::S_CTL);
  251.     FsOpenReq::v2_setSequence(req->fileNumber, seq);
  252.     FsOpenReq::v2_setNodeId(req->fileNumber, getOwnNodeId());
  253.     sendSignal(NDBFS_REF, GSN_FSREMOVEREQ, signal, 
  254.        FsRemoveReq::SignalLength, JBA);
  255.     return;
  256.   }
  257.   if(signal->theData[0] == 23){
  258.     /**
  259.      * Print records
  260.      */
  261.     BackupRecordPtr ptr;
  262.     for(c_backups.first(ptr); ptr.i != RNIL; c_backups.next(ptr)){
  263.       infoEvent("BackupRecord %d: BackupId: %d MasterRef: %x ClientRef: %x",
  264. ptr.i, ptr.p->backupId, ptr.p->masterRef, ptr.p->clientRef);
  265.       infoEvent(" State: %d", ptr.p->slaveState.getState());
  266.       BackupFilePtr filePtr;
  267.       for(ptr.p->files.first(filePtr); filePtr.i != RNIL; 
  268.   ptr.p->files.next(filePtr)){
  269. jam();
  270. infoEvent(" file %d: type: %d open: %d running: %d done: %d scan: %d",
  271.   filePtr.i, filePtr.p->fileType, filePtr.p->fileOpened,
  272.   filePtr.p->fileRunning, 
  273.   filePtr.p->fileClosing, filePtr.p->scanRunning);
  274.       }
  275.     }
  276.   }
  277.   if(signal->theData[0] == 24){
  278.     /**
  279.      * Print size of records etc.
  280.      */
  281.     infoEvent("Backup - dump pool sizes");
  282.     infoEvent("BackupPool: %d BackupFilePool: %d TablePool: %d",
  283.       c_backupPool.getSize(), c_backupFilePool.getSize(), 
  284.       c_tablePool.getSize());
  285.     infoEvent("AttrPool: %d TriggerPool: %d FragmentPool: %d",
  286.       c_backupPool.getSize(), c_backupFilePool.getSize(), 
  287.       c_tablePool.getSize());
  288.     infoEvent("PagePool: %d",
  289.       c_pagePool.getSize());
  290.     if(signal->getLength() == 2 && signal->theData[1] == 2424)
  291.     {
  292.       ndbrequire(c_tablePool.getSize() == c_tablePool.getNoOfFree());
  293.       ndbrequire(c_attributePool.getSize() == c_attributePool.getNoOfFree());
  294.       ndbrequire(c_backupPool.getSize() == c_backupPool.getNoOfFree());
  295.       ndbrequire(c_backupFilePool.getSize() == c_backupFilePool.getNoOfFree());
  296.       ndbrequire(c_pagePool.getSize() == c_pagePool.getNoOfFree());
  297.       ndbrequire(c_fragmentPool.getSize() == c_fragmentPool.getNoOfFree());
  298.       ndbrequire(c_triggerPool.getSize() == c_triggerPool.getNoOfFree());
  299.     }
  300.   }
  301. }
  302. bool
  303. Backup::findTable(const BackupRecordPtr & ptr, 
  304.   TablePtr & tabPtr, Uint32 tableId) const
  305. {
  306.   for(ptr.p->tables.first(tabPtr); 
  307.       tabPtr.i != RNIL; 
  308.       ptr.p->tables.next(tabPtr)) {
  309.     jam();
  310.     if(tabPtr.p->tableId == tableId){
  311.       jam();
  312.       return true;
  313.     }//if
  314.   }//for
  315.   tabPtr.i = RNIL;
  316.   tabPtr.p = 0;
  317.   return false;
  318. }
  319. static Uint32 xps(Uint32 x, Uint64 ms)
  320. {
  321.   float fx = x;
  322.   float fs = ms;
  323.   
  324.   if(ms == 0 || x == 0) {
  325.     jam();
  326.     return 0;
  327.   }//if
  328.   jam();
  329.   return ((Uint32)(1000.0f * (fx + fs/2.1f))) / ((Uint32)fs);
  330. }
  331. struct Number {
  332.   Number(Uint32 r) { val = r;}
  333.   Number & operator=(Uint32 r) { val = r; return * this; }
  334.   Uint32 val;
  335. };
  336. NdbOut &
  337. operator<< (NdbOut & out, const Number & val){
  338.   char p = 0;
  339.   Uint32 loop = 1;
  340.   while(val.val > loop){
  341.     loop *= 1000;
  342.     p += 3;
  343.   }
  344.   if(loop != 1){
  345.     p -= 3;
  346.     loop /= 1000;
  347.   }
  348.   switch(p){
  349.   case 0:
  350.     break;
  351.   case 3:
  352.     p = 'k';
  353.     break;
  354.   case 6:
  355.     p = 'M';
  356.     break;
  357.   case 9:
  358.     p = 'G';
  359.     break;
  360.   default:
  361.     p = 0;
  362.   }
  363.   char str[2];
  364.   str[0] = p;
  365.   str[1] = 0;
  366.   Uint32 tmp = (val.val + (loop >> 1)) / loop;
  367. #if 1
  368.   if(p > 0)
  369.     out << tmp << str;
  370.   else
  371.     out << tmp;
  372. #else
  373.   out << val.val;
  374. #endif
  375.   return out;
  376. }
  377. void
  378. Backup::execBACKUP_CONF(Signal* signal)
  379. {
  380.   jamEntry();
  381.   BackupConf * conf = (BackupConf*)signal->getDataPtr();
  382.   
  383.   ndbout_c("Backup %d has started", conf->backupId);
  384. }
  385. void
  386. Backup::execBACKUP_REF(Signal* signal)
  387. {
  388.   jamEntry();
  389.   BackupRef * ref = (BackupRef*)signal->getDataPtr();
  390.   ndbout_c("Backup (%d) has NOT started %d", ref->senderData, ref->errorCode);
  391. }
  392. void
  393. Backup::execBACKUP_COMPLETE_REP(Signal* signal)
  394. {
  395.   jamEntry();
  396.   BackupCompleteRep* rep = (BackupCompleteRep*)signal->getDataPtr();
  397.  
  398.   startTime = NdbTick_CurrentMillisecond() - startTime;
  399.   
  400.   ndbout_c("Backup %d has completed", rep->backupId);
  401.   const Uint32 bytes = rep->noOfBytes;
  402.   const Uint32 records = rep->noOfRecords;
  403.   Number rps = xps(records, startTime);
  404.   Number bps = xps(bytes, startTime);
  405.   ndbout << " Data [ "
  406.  << Number(records) << " rows " 
  407.  << Number(bytes) << " bytes " << startTime << " ms ] " 
  408.  << " => "
  409.  << rps << " row/s & " << bps << "b/s" << endl;
  410.   bps = xps(rep->noOfLogBytes, startTime);
  411.   rps = xps(rep->noOfLogRecords, startTime);
  412.   ndbout << " Log [ "
  413.  << Number(rep->noOfLogRecords) << " log records " 
  414.  << Number(rep->noOfLogBytes) << " bytes " << startTime << " ms ] " 
  415.  << " => "
  416.  << rps << " records/s & " << bps << "b/s" << endl;
  417. }
  418. void
  419. Backup::execBACKUP_ABORT_REP(Signal* signal)
  420. {
  421.   jamEntry();
  422.   BackupAbortRep* rep = (BackupAbortRep*)signal->getDataPtr();
  423.   
  424.   ndbout_c("Backup %d has been aborted %d", rep->backupId, rep->reason);
  425. }
  426. const TriggerEvent::Value triggerEventValues[] = {
  427.   TriggerEvent::TE_INSERT,
  428.   TriggerEvent::TE_UPDATE,
  429.   TriggerEvent::TE_DELETE
  430. };
  431. const char* triggerNameFormat[] = {
  432.   "NDB$BACKUP_%d_%d_INSERT",
  433.   "NDB$BACKUP_%d_%d_UPDATE",
  434.   "NDB$BACKUP_%d_%d_DELETE"
  435. };
  436. const Backup::State 
  437. Backup::validSlaveTransitions[] = {
  438.   INITIAL,  DEFINING,
  439.   DEFINING, DEFINED,
  440.   DEFINED,  STARTED,
  441.   STARTED,  STARTED, // Several START_BACKUP_REQ is sent
  442.   STARTED,  SCANNING,
  443.   SCANNING, STARTED,
  444.   STARTED,  STOPPING,
  445.   STOPPING, CLEANING,
  446.   CLEANING, INITIAL,
  447.   
  448.   INITIAL,  ABORTING, // Node fail
  449.   DEFINING, ABORTING,
  450.   DEFINED,  ABORTING,
  451.   STARTED,  ABORTING,
  452.   SCANNING, ABORTING,
  453.   STOPPING, ABORTING,
  454.   CLEANING, ABORTING, // Node fail w/ master takeover
  455.   ABORTING, ABORTING, // Slave who initiates ABORT should have this transition
  456.   
  457.   ABORTING, INITIAL,
  458.   INITIAL,  INITIAL
  459. };
  460. const Uint32
  461. Backup::validSlaveTransitionsCount = 
  462. sizeof(Backup::validSlaveTransitions) / sizeof(Backup::State);
  463. void
  464. Backup::CompoundState::setState(State newState){
  465.   bool found = false;
  466.   const State currState = state;
  467.   for(unsigned i = 0; i<noOfValidTransitions; i+= 2) {
  468.     jam();
  469.     if(validTransitions[i]   == currState &&
  470.        validTransitions[i+1] == newState){
  471.       jam();
  472.       found = true;
  473.       break;
  474.     }
  475.   }
  476.   //ndbrequire(found);
  477.   
  478.   if (newState == INITIAL)
  479.     abortState = INITIAL;
  480.   if(newState == ABORTING && currState != ABORTING) {
  481.     jam();
  482.     abortState = currState;
  483.   }
  484.   state = newState;
  485. #ifdef DEBUG_ABORT
  486.   if (newState != currState) {
  487.     ndbout_c("%u: Old state = %u, new state = %u, abort state = %u",
  488.      id, currState, newState, abortState);
  489.   }
  490. #endif
  491. }
  492. void
  493. Backup::CompoundState::forceState(State newState)
  494. {
  495.   const State currState = state;
  496.   if (newState == INITIAL)
  497.     abortState = INITIAL;
  498.   if(newState == ABORTING && currState != ABORTING) {
  499.     jam();
  500.     abortState = currState;
  501.   }
  502.   state = newState;
  503. #ifdef DEBUG_ABORT
  504.   if (newState != currState) {
  505.     ndbout_c("%u: FORCE: Old state = %u, new state = %u, abort state = %u",
  506.      id, currState, newState, abortState);
  507.   }
  508. #endif
  509. }
  510. Backup::Table::Table(ArrayPool<Attribute> & ah, 
  511.      ArrayPool<Fragment> & fh) 
  512.   : attributes(ah), fragments(fh)
  513. {
  514.   triggerIds[0] = ILLEGAL_TRIGGER_ID;
  515.   triggerIds[1] = ILLEGAL_TRIGGER_ID;
  516.   triggerIds[2] = ILLEGAL_TRIGGER_ID;
  517.   triggerAllocated[0] = false;
  518.   triggerAllocated[1] = false;
  519.   triggerAllocated[2] = false;
  520. }
  521. /*****************************************************************************
  522.  * 
  523.  * Node state handling
  524.  *
  525.  *****************************************************************************/
  526. void
  527. Backup::execNODE_FAILREP(Signal* signal)
  528. {
  529.   jamEntry();
  530.   NodeFailRep * rep = (NodeFailRep*)signal->getDataPtr();
  531.   
  532.   bool doStuff = false;
  533.   /*
  534.   Start by saving important signal data which will be destroyed before the
  535.   process is completed.
  536.   */
  537.   NodeId new_master_node_id = rep->masterNodeId;
  538.   Uint32 theFailedNodes[NodeBitmask::Size];
  539.   for (Uint32 i = 0; i < NodeBitmask::Size; i++)
  540.     theFailedNodes[i] = rep->theNodes[i];
  541.   
  542.   c_masterNodeId = new_master_node_id;
  543.   NodePtr nodePtr;
  544.   for(c_nodes.first(nodePtr); nodePtr.i != RNIL; c_nodes.next(nodePtr)) {
  545.     jam();
  546.     if(NodeBitmask::get(theFailedNodes, nodePtr.p->nodeId)){
  547.       if(nodePtr.p->alive){
  548. jam();
  549. ndbrequire(c_aliveNodes.get(nodePtr.p->nodeId));
  550. doStuff = true;
  551.       } else {
  552.         jam();
  553. ndbrequire(!c_aliveNodes.get(nodePtr.p->nodeId));
  554.       }//if
  555.       nodePtr.p->alive = 0;
  556.       c_aliveNodes.clear(nodePtr.p->nodeId);
  557.     }//if
  558.   }//for
  559.   if(!doStuff){
  560.     jam();
  561.     return;
  562.   }//if
  563.   
  564. #ifdef DEBUG_ABORT
  565.   ndbout_c("****************** Node fail rep ******************");
  566. #endif
  567.   NodeId newCoordinator = c_masterNodeId;
  568.   BackupRecordPtr ptr;
  569.   for(c_backups.first(ptr); ptr.i != RNIL; c_backups.next(ptr)) {
  570.     jam();
  571.     checkNodeFail(signal, ptr, newCoordinator, theFailedNodes);
  572.   }
  573. }
  574. bool
  575. Backup::verifyNodesAlive(BackupRecordPtr ptr,
  576.  const NdbNodeBitmask& aNodeBitMask)
  577. {
  578.   Uint32 version = getNodeInfo(getOwnNodeId()).m_version;
  579.   for (Uint32 i = 0; i < MAX_NDB_NODES; i++) {
  580.     jam();
  581.     if(aNodeBitMask.get(i)) {
  582.       if(!c_aliveNodes.get(i)){
  583.         jam();
  584. ptr.p->setErrorCode(AbortBackupOrd::BackupFailureDueToNodeFail);
  585.         return false;
  586.       }//if
  587.       if(getNodeInfo(i).m_version != version)
  588.       {
  589. jam();
  590. ptr.p->setErrorCode(AbortBackupOrd::IncompatibleVersions);
  591. return false;
  592.       }
  593.     }//if
  594.   }//for
  595.   return true;
  596. }
  597. void
  598. Backup::checkNodeFail(Signal* signal,
  599.       BackupRecordPtr ptr,
  600.       NodeId newCoord,
  601.       Uint32 theFailedNodes[NodeBitmask::Size])
  602. {
  603.   NdbNodeBitmask mask;
  604.   mask.assign(2, theFailedNodes);
  605.   /* Update ptr.p->nodes to be up to date with current alive nodes
  606.    */
  607.   NodePtr nodePtr;
  608.   bool found = false;
  609.   for(c_nodes.first(nodePtr); nodePtr.i != RNIL; c_nodes.next(nodePtr)) {
  610.     jam();
  611.     if(NodeBitmask::get(theFailedNodes, nodePtr.p->nodeId)) {
  612.       jam();
  613.       if (ptr.p->nodes.get(nodePtr.p->nodeId)) {
  614. jam();
  615. ptr.p->nodes.clear(nodePtr.p->nodeId); 
  616. found = true;
  617.       }
  618.     }//if
  619.   }//for
  620.   if(!found) {
  621.     jam();
  622.     return; // failed node is not part of backup process, safe to continue
  623.   }
  624.   if(mask.get(refToNode(ptr.p->masterRef)))
  625.   {
  626.     /**
  627.      * Master died...abort
  628.      */
  629.     ptr.p->masterRef = reference();
  630.     ptr.p->nodes.clear();
  631.     ptr.p->nodes.set(getOwnNodeId());
  632.     ptr.p->setErrorCode(AbortBackupOrd::BackupFailureDueToNodeFail);
  633.     switch(ptr.p->m_gsn){
  634.     case GSN_DEFINE_BACKUP_REQ:
  635.     case GSN_START_BACKUP_REQ:
  636.     case GSN_BACKUP_FRAGMENT_REQ:
  637.     case GSN_STOP_BACKUP_REQ:
  638.       // I'm currently processing...reply to self and abort...
  639.       ptr.p->masterData.gsn = ptr.p->m_gsn;
  640.       ptr.p->masterData.sendCounter = ptr.p->nodes;
  641.       return;
  642.     case GSN_DEFINE_BACKUP_REF:
  643.     case GSN_DEFINE_BACKUP_CONF:
  644.     case GSN_START_BACKUP_REF:
  645.     case GSN_START_BACKUP_CONF:
  646.     case GSN_BACKUP_FRAGMENT_REF:
  647.     case GSN_BACKUP_FRAGMENT_CONF:
  648.     case GSN_STOP_BACKUP_REF:
  649.     case GSN_STOP_BACKUP_CONF:
  650.       ptr.p->masterData.gsn = GSN_DEFINE_BACKUP_REQ;
  651.       masterAbort(signal, ptr);
  652.       return;
  653.     case GSN_ABORT_BACKUP_ORD:
  654.       // Already aborting
  655.       return;
  656.     }
  657.   }
  658.   else if (newCoord == getOwnNodeId())
  659.   {
  660.     /**
  661.      * I'm master for this backup
  662.      */
  663.     jam();
  664.     CRASH_INSERTION((10001));
  665. #ifdef DEBUG_ABORT
  666.     ndbout_c("**** Master: Node failed: Master id = %u", 
  667.      refToNode(ptr.p->masterRef));
  668. #endif
  669.     Uint32 gsn, len, pos;
  670.     ptr.p->nodes.bitANDC(mask);
  671.     switch(ptr.p->masterData.gsn){
  672.     case GSN_DEFINE_BACKUP_REQ:
  673.     {
  674.       DefineBackupRef * ref = (DefineBackupRef*)signal->getDataPtr();
  675.       ref->backupPtr = ptr.i;
  676.       ref->backupId = ptr.p->backupId;
  677.       ref->errorCode = AbortBackupOrd::BackupFailureDueToNodeFail;
  678.       gsn= GSN_DEFINE_BACKUP_REF;
  679.       len= DefineBackupRef::SignalLength;
  680.       pos= &ref->nodeId - signal->getDataPtr();
  681.       break;
  682.     }
  683.     case GSN_START_BACKUP_REQ:
  684.     {
  685.       StartBackupRef * ref = (StartBackupRef*)signal->getDataPtr();
  686.       ref->backupPtr = ptr.i;
  687.       ref->backupId = ptr.p->backupId;
  688.       ref->errorCode = AbortBackupOrd::BackupFailureDueToNodeFail;
  689.       ref->signalNo = ptr.p->masterData.startBackup.signalNo;
  690.       gsn= GSN_START_BACKUP_REF;
  691.       len= StartBackupRef::SignalLength;
  692.       pos= &ref->nodeId - signal->getDataPtr();
  693.       break;
  694.     }
  695.     case GSN_BACKUP_FRAGMENT_REQ:
  696.     {
  697.       BackupFragmentRef * ref = (BackupFragmentRef*)signal->getDataPtr();
  698.       ref->backupPtr = ptr.i;
  699.       ref->backupId = ptr.p->backupId;
  700.       ref->errorCode = AbortBackupOrd::BackupFailureDueToNodeFail;
  701.       gsn= GSN_BACKUP_FRAGMENT_REF;
  702.       len= BackupFragmentRef::SignalLength;
  703.       pos= &ref->nodeId - signal->getDataPtr();
  704.       break;
  705.     }
  706.     case GSN_STOP_BACKUP_REQ:
  707.     {
  708.       StopBackupRef * ref = (StopBackupRef*)signal->getDataPtr();
  709.       ref->backupPtr = ptr.i;
  710.       ref->backupId = ptr.p->backupId;
  711.       ref->errorCode = AbortBackupOrd::BackupFailureDueToNodeFail;
  712.       gsn= GSN_STOP_BACKUP_REF;
  713.       len= StopBackupRef::SignalLength;
  714.       pos= &ref->nodeId - signal->getDataPtr();
  715.       break;
  716.     }
  717.     case GSN_CREATE_TRIG_REQ:
  718.     case GSN_ALTER_TRIG_REQ:
  719.     case GSN_WAIT_GCP_REQ:
  720.     case GSN_UTIL_SEQUENCE_REQ:
  721.     case GSN_UTIL_LOCK_REQ:
  722.     case GSN_DROP_TRIG_REQ:
  723.       return;
  724.     }
  725.     
  726.     for(Uint32 i = 0; (i = mask.find(i+1)) != NdbNodeBitmask::NotFound; )
  727.     {
  728.       signal->theData[pos] = i;
  729.       sendSignal(reference(), gsn, signal, len, JBB);
  730. #ifdef DEBUG_ABORT
  731.       ndbout_c("sending %d to self from %d", gsn, i);
  732. #endif
  733.     }
  734.     return;
  735.   }//if
  736.   
  737.   /**
  738.    * I abort myself as slave if not master
  739.    */
  740.   CRASH_INSERTION((10021));
  741. void
  742. Backup::execINCL_NODEREQ(Signal* signal)
  743. {
  744.   jamEntry();
  745.   
  746.   const Uint32 senderRef = signal->theData[0];
  747.   const Uint32 inclNode  = signal->theData[1];
  748.   NodePtr node;
  749.   for(c_nodes.first(node); node.i != RNIL; c_nodes.next(node)) {
  750.     jam();
  751.     const Uint32 nodeId = node.p->nodeId;
  752.     if(inclNode == nodeId){
  753.       jam();
  754.       
  755.       ndbrequire(node.p->alive == 0);
  756.       ndbrequire(!c_aliveNodes.get(nodeId));
  757.       
  758.       node.p->alive = 1;
  759.       c_aliveNodes.set(nodeId);
  760.       
  761.       break;
  762.     }//if
  763.   }//for
  764.   signal->theData[0] = reference();
  765.   sendSignal(senderRef, GSN_INCL_NODECONF, signal, 1, JBB);
  766. }
  767. /*****************************************************************************
  768.  * 
  769.  * Master functionallity - Define backup
  770.  *
  771.  *****************************************************************************/
  772. void
  773. Backup::execBACKUP_REQ(Signal* signal)
  774. {
  775.   jamEntry();
  776.   BackupReq * req = (BackupReq*)signal->getDataPtr();
  777.   
  778.   const Uint32 senderData = req->senderData;
  779.   const BlockReference senderRef = signal->senderBlockRef();
  780.   const Uint32 dataLen32 = req->backupDataLen; // In 32 bit words
  781.   const Uint32 flags = signal->getLength() > 2 ? req->flags : 2;
  782.   if(getOwnNodeId() != getMasterNodeId()) {
  783.     jam();
  784.     sendBackupRef(senderRef, flags, signal, senderData, BackupRef::IAmNotMaster);
  785.     return;
  786.   }//if
  787.   if (m_diskless)
  788.   {
  789.     sendBackupRef(senderRef, flags, signal, senderData, 
  790.   BackupRef::CannotBackupDiskless);
  791.     return;
  792.   }
  793.   
  794.   if(dataLen32 != 0) {
  795.     jam();
  796.     sendBackupRef(senderRef, flags, signal, senderData, 
  797.   BackupRef::BackupDefinitionNotImplemented);
  798.     return;
  799.   }//if
  800.   
  801. #ifdef DEBUG_ABORT
  802.   dumpUsedResources();
  803. #endif
  804.   /**
  805.    * Seize a backup record
  806.    */
  807.   BackupRecordPtr ptr;
  808.   c_backups.seize(ptr);
  809.   if(ptr.i == RNIL) {
  810.     jam();
  811.     sendBackupRef(senderRef, flags, signal, senderData, BackupRef::OutOfBackupRecord);
  812.     return;
  813.   }//if
  814.   ndbrequire(ptr.p->pages.empty());
  815.   ndbrequire(ptr.p->tables.isEmpty());
  816.   
  817.   ptr.p->m_gsn = 0;
  818.   ptr.p->errorCode = 0;
  819.   ptr.p->clientRef = senderRef;
  820.   ptr.p->clientData = senderData;
  821.   ptr.p->flags = flags;
  822.   ptr.p->masterRef = reference();
  823.   ptr.p->nodes = c_aliveNodes;
  824.   ptr.p->backupId = 0;
  825.   ptr.p->backupKey[0] = 0;
  826.   ptr.p->backupKey[1] = 0;
  827.   ptr.p->backupDataLen = 0;
  828.   ptr.p->masterData.errorCode = 0;
  829.   ptr.p->masterData.dropTrig.tableId = RNIL;
  830.   ptr.p->masterData.alterTrig.tableId = RNIL;
  831.   
  832.   UtilSequenceReq * utilReq = (UtilSequenceReq*)signal->getDataPtrSend();
  833.     
  834.   ptr.p->masterData.gsn = GSN_UTIL_SEQUENCE_REQ;
  835.   utilReq->senderData  = ptr.i;
  836.   utilReq->sequenceId  = BACKUP_SEQUENCE;
  837.   utilReq->requestType = UtilSequenceReq::NextVal;
  838.   sendSignal(DBUTIL_REF, GSN_UTIL_SEQUENCE_REQ, 
  839.      signal, UtilSequenceReq::SignalLength, JBB);
  840. }
  841. void
  842. Backup::execUTIL_SEQUENCE_REF(Signal* signal)
  843. {
  844.   BackupRecordPtr ptr;
  845.   jamEntry();
  846.   UtilSequenceRef * utilRef = (UtilSequenceRef*)signal->getDataPtr();
  847.   ptr.i = utilRef->senderData;
  848.   c_backupPool.getPtr(ptr);
  849.   ndbrequire(ptr.p->masterData.gsn == GSN_UTIL_SEQUENCE_REQ);
  850.   sendBackupRef(signal, ptr, BackupRef::SequenceFailure);
  851. }//execUTIL_SEQUENCE_REF()
  852. void
  853. Backup::sendBackupRef(Signal* signal, BackupRecordPtr ptr, Uint32 errorCode)
  854. {
  855.   jam();
  856.   sendBackupRef(ptr.p->clientRef, ptr.p->flags, signal, ptr.p->clientData, errorCode);
  857.   cleanup(signal, ptr);
  858. }
  859. void
  860. Backup::sendBackupRef(BlockReference senderRef, Uint32 flags, Signal *signal,
  861.       Uint32 senderData, Uint32 errorCode)
  862. {
  863.   jam();
  864.   if (SEND_BACKUP_STARTED_FLAG(flags))
  865.   {
  866.     BackupRef* ref = (BackupRef*)signal->getDataPtrSend();
  867.     ref->senderData = senderData;
  868.     ref->errorCode = errorCode;
  869.     ref->masterRef = numberToRef(BACKUP, getMasterNodeId());
  870.     sendSignal(senderRef, GSN_BACKUP_REF, signal, BackupRef::SignalLength, JBB);
  871.   }
  872.   if(errorCode != BackupRef::IAmNotMaster){
  873.     signal->theData[0] = EventReport::BackupFailedToStart;
  874.     signal->theData[1] = senderRef;
  875.     signal->theData[2] = errorCode;
  876.     sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 3, JBB);
  877.   }
  878. }
  879. void
  880. Backup::execUTIL_SEQUENCE_CONF(Signal* signal)
  881. {
  882.   jamEntry();
  883.   UtilSequenceConf * conf = (UtilSequenceConf*)signal->getDataPtr();
  884.   
  885.   if(conf->requestType == UtilSequenceReq::Create) 
  886.   {
  887.     jam();
  888.     sendSTTORRY(signal); // At startup in NDB
  889.     return;
  890.   }
  891.   BackupRecordPtr ptr;
  892.   ptr.i = conf->senderData;
  893.   c_backupPool.getPtr(ptr);
  894.   ndbrequire(ptr.p->masterData.gsn == GSN_UTIL_SEQUENCE_REQ);
  895.   if (ptr.p->checkError())
  896.   {
  897.     jam();
  898.     sendBackupRef(signal, ptr, ptr.p->errorCode);
  899.     return;
  900.   }//if
  901.   if (ERROR_INSERTED(10023)) 
  902.   {
  903.     sendBackupRef(signal, ptr, 323);
  904.     return;
  905.   }//if
  906.   {
  907.     Uint64 backupId;
  908.     memcpy(&backupId,conf->sequenceValue,8);
  909.     ptr.p->backupId= (Uint32)backupId;
  910.   }
  911.   ptr.p->backupKey[0] = (getOwnNodeId() << 16) | (ptr.p->backupId & 0xFFFF);
  912.   ptr.p->backupKey[1] = NdbTick_CurrentMillisecond();
  913.   ptr.p->masterData.gsn = GSN_UTIL_LOCK_REQ;
  914.   Mutex mutex(signal, c_mutexMgr, ptr.p->masterData.m_defineBackupMutex);
  915.   Callback c = { safe_cast(&Backup::defineBackupMutex_locked), ptr.i };
  916.   ndbrequire(mutex.lock(c));
  917.   return;
  918. }
  919. void
  920. Backup::defineBackupMutex_locked(Signal* signal, Uint32 ptrI, Uint32 retVal){
  921.   jamEntry();
  922.   ndbrequire(retVal == 0);
  923.   
  924.   BackupRecordPtr ptr;
  925.   ptr.i = ptrI;
  926.   c_backupPool.getPtr(ptr);
  927.   
  928.   ndbrequire(ptr.p->masterData.gsn == GSN_UTIL_LOCK_REQ);
  929.   ptr.p->masterData.gsn = GSN_UTIL_LOCK_REQ;
  930.   Mutex mutex(signal, c_mutexMgr, ptr.p->masterData.m_dictCommitTableMutex);
  931.   Callback c = { safe_cast(&Backup::dictCommitTableMutex_locked), ptr.i };
  932.   ndbrequire(mutex.lock(c));
  933. }
  934. void
  935. Backup::dictCommitTableMutex_locked(Signal* signal, Uint32 ptrI,Uint32 retVal)
  936. {
  937.   jamEntry();
  938.   ndbrequire(retVal == 0);
  939.   
  940.   /**
  941.    * We now have both the mutexes
  942.    */
  943.   BackupRecordPtr ptr;
  944.   ptr.i = ptrI;
  945.   c_backupPool.getPtr(ptr);
  946.   ndbrequire(ptr.p->masterData.gsn == GSN_UTIL_LOCK_REQ);
  947.   if (ERROR_INSERTED(10031)) {
  948.     ptr.p->setErrorCode(331);
  949.   }//if
  950.   if (ptr.p->checkError())
  951.   {
  952.     jam();
  953.     
  954.     /**
  955.      * Unlock mutexes
  956.      */
  957.     jam();
  958.     Mutex mutex1(signal, c_mutexMgr, ptr.p->masterData.m_dictCommitTableMutex);
  959.     jam();
  960.     mutex1.unlock(); // ignore response
  961.     
  962.     jam();
  963.     Mutex mutex2(signal, c_mutexMgr, ptr.p->masterData.m_defineBackupMutex);
  964.     jam();
  965.     mutex2.unlock(); // ignore response
  966.     
  967.     sendBackupRef(signal, ptr, ptr.p->errorCode);
  968.     return;
  969.   }//if
  970.   
  971.   sendDefineBackupReq(signal, ptr);
  972. }
  973. /*****************************************************************************
  974.  * 
  975.  * Master functionallity - Define backup cont'd (from now on all slaves are in)
  976.  *
  977.  *****************************************************************************/
  978. bool
  979. Backup::haveAllSignals(BackupRecordPtr ptr, Uint32 gsn, Uint32 nodeId)
  980.   ndbrequire(ptr.p->masterRef == reference());
  981.   ndbrequire(ptr.p->masterData.gsn == gsn);
  982.   ndbrequire(!ptr.p->masterData.sendCounter.done());
  983.   ndbrequire(ptr.p->masterData.sendCounter.isWaitingFor(nodeId));
  984.   
  985.   ptr.p->masterData.sendCounter.clearWaitingFor(nodeId);
  986.   return ptr.p->masterData.sendCounter.done();
  987. }
  988. void
  989. Backup::sendDefineBackupReq(Signal *signal, BackupRecordPtr ptr)
  990. {
  991.   /**
  992.    * Sending define backup to all participants
  993.    */
  994.   DefineBackupReq * req = (DefineBackupReq*)signal->getDataPtrSend();
  995.   req->backupId = ptr.p->backupId;
  996.   req->clientRef = ptr.p->clientRef;
  997.   req->clientData = ptr.p->clientData;
  998.   req->senderRef = reference();
  999.   req->backupPtr = ptr.i;
  1000.   req->backupKey[0] = ptr.p->backupKey[0];
  1001.   req->backupKey[1] = ptr.p->backupKey[1];
  1002.   req->nodes = ptr.p->nodes;
  1003.   req->backupDataLen = ptr.p->backupDataLen;
  1004.   req->flags = ptr.p->flags;
  1005.   
  1006.   ptr.p->masterData.gsn = GSN_DEFINE_BACKUP_REQ;
  1007.   ptr.p->masterData.sendCounter = ptr.p->nodes;
  1008.   NodeReceiverGroup rg(BACKUP, ptr.p->nodes);
  1009.   sendSignal(rg, GSN_DEFINE_BACKUP_REQ, signal, 
  1010.      DefineBackupReq::SignalLength, JBB);
  1011.   
  1012.   /**
  1013.    * Now send backup data
  1014.    */
  1015.   const Uint32 len = ptr.p->backupDataLen;
  1016.   if(len == 0){
  1017.     /**
  1018.      * No data to send
  1019.      */
  1020.     jam();
  1021.     return;
  1022.   }//if
  1023.   
  1024.   /**
  1025.    * Not implemented
  1026.    */
  1027.   ndbrequire(0);
  1028. }
  1029. void
  1030. Backup::execDEFINE_BACKUP_REF(Signal* signal)
  1031. {
  1032.   jamEntry();
  1033.   DefineBackupRef* ref = (DefineBackupRef*)signal->getDataPtr();
  1034.   
  1035.   const Uint32 ptrI = ref->backupPtr;
  1036.   //const Uint32 backupId = ref->backupId;
  1037.   const Uint32 nodeId = ref->nodeId;
  1038.   
  1039.   BackupRecordPtr ptr;
  1040.   c_backupPool.getPtr(ptr, ptrI);
  1041.   
  1042.   ptr.p->setErrorCode(ref->errorCode);
  1043.   defineBackupReply(signal, ptr, nodeId);
  1044. }
  1045. void
  1046. Backup::execDEFINE_BACKUP_CONF(Signal* signal)
  1047. {
  1048.   jamEntry();
  1049.   DefineBackupConf* conf = (DefineBackupConf*)signal->getDataPtr();
  1050.   const Uint32 ptrI = conf->backupPtr;
  1051.   //const Uint32 backupId = conf->backupId;
  1052.   const Uint32 nodeId = refToNode(signal->senderBlockRef());
  1053.   BackupRecordPtr ptr;
  1054.   c_backupPool.getPtr(ptr, ptrI);
  1055.   if (ERROR_INSERTED(10024))
  1056.   {
  1057.     ptr.p->setErrorCode(324);
  1058.   }
  1059.   defineBackupReply(signal, ptr, nodeId);
  1060. }
  1061. void
  1062. Backup::defineBackupReply(Signal* signal, BackupRecordPtr ptr, Uint32 nodeId)
  1063. {
  1064.   if (!haveAllSignals(ptr, GSN_DEFINE_BACKUP_REQ, nodeId)) {
  1065.     jam();
  1066.     return;
  1067.   }
  1068.   /**
  1069.    * Unlock mutexes
  1070.    */
  1071.   jam();
  1072.   Mutex mutex1(signal, c_mutexMgr, ptr.p->masterData.m_dictCommitTableMutex);
  1073.   jam();
  1074.   mutex1.unlock(); // ignore response
  1075.   jam();
  1076.   Mutex mutex2(signal, c_mutexMgr, ptr.p->masterData.m_defineBackupMutex);
  1077.   jam();
  1078.   mutex2.unlock(); // ignore response
  1079.   if(ptr.p->checkError())
  1080.   {
  1081.     jam();
  1082.     masterAbort(signal, ptr);
  1083.     return;
  1084.   }
  1085.   
  1086.   /**
  1087.    * Reply to client
  1088.    */
  1089.   CRASH_INSERTION((10034));
  1090.   if (SEND_BACKUP_STARTED_FLAG(ptr.p->flags))
  1091.   {
  1092.     BackupConf * conf = (BackupConf*)signal->getDataPtrSend();
  1093.     conf->backupId = ptr.p->backupId;
  1094.     conf->senderData = ptr.p->clientData;
  1095.     conf->nodes = ptr.p->nodes;
  1096.     sendSignal(ptr.p->clientRef, GSN_BACKUP_CONF, signal, 
  1097.        BackupConf::SignalLength, JBB);
  1098.   }
  1099.   signal->theData[0] = EventReport::BackupStarted;
  1100.   signal->theData[1] = ptr.p->clientRef;
  1101.   signal->theData[2] = ptr.p->backupId;
  1102.   ptr.p->nodes.copyto(NdbNodeBitmask::Size, signal->theData+3);
  1103.   sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 3+NdbNodeBitmask::Size, JBB);
  1104.   
  1105.   /**
  1106.    * Prepare Trig
  1107.    */
  1108.   TablePtr tabPtr;
  1109.   ndbrequire(ptr.p->tables.first(tabPtr));
  1110.   sendCreateTrig(signal, ptr, tabPtr);
  1111. }
  1112. /*****************************************************************************
  1113.  * 
  1114.  * Master functionallity - Prepare triggers
  1115.  *
  1116.  *****************************************************************************/
  1117. void
  1118. Backup::createAttributeMask(TablePtr tabPtr, 
  1119.     Bitmask<MAXNROFATTRIBUTESINWORDS> & mask)
  1120. {
  1121.   mask.clear();
  1122.   Table & table = * tabPtr.p;
  1123.   for(Uint32 i = 0; i<table.noOfAttributes; i++) {
  1124.     jam();
  1125.     AttributePtr attr;
  1126.     table.attributes.getPtr(attr, i);
  1127.     mask.set(i);
  1128.   }
  1129. }
  1130. void
  1131. Backup::sendCreateTrig(Signal* signal, 
  1132.    BackupRecordPtr ptr, TablePtr tabPtr)
  1133. {
  1134.   CreateTrigReq * req =(CreateTrigReq *)signal->getDataPtrSend();
  1135.   
  1136.   ptr.p->masterData.gsn = GSN_CREATE_TRIG_REQ;
  1137.   ptr.p->masterData.sendCounter = 3;
  1138.   ptr.p->masterData.createTrig.tableId = tabPtr.p->tableId;
  1139.   req->setUserRef(reference());
  1140.   req->setConnectionPtr(ptr.i);
  1141.   req->setRequestType(CreateTrigReq::RT_USER);
  1142.   
  1143.   Bitmask<MAXNROFATTRIBUTESINWORDS> attrMask;
  1144.   createAttributeMask(tabPtr, attrMask);
  1145.   req->setAttributeMask(attrMask);
  1146.   req->setTableId(tabPtr.p->tableId);
  1147.   req->setIndexId(RNIL);        // not used
  1148.   req->setTriggerId(RNIL);      // to be created
  1149.   req->setTriggerType(TriggerType::SUBSCRIPTION);
  1150.   req->setTriggerActionTime(TriggerActionTime::TA_DETACHED);
  1151.   req->setMonitorReplicas(true);
  1152.   req->setMonitorAllAttributes(false);
  1153.   req->setOnline(false);        // leave trigger offline
  1154.   char triggerName[MAX_TAB_NAME_SIZE];
  1155.   Uint32 nameBuffer[2 + ((MAX_TAB_NAME_SIZE + 3) >> 2)];  // SP string
  1156.   LinearWriter w(nameBuffer, sizeof(nameBuffer) >> 2);
  1157.   LinearSectionPtr lsPtr[3];
  1158.   
  1159.   for (int i=0; i < 3; i++) {
  1160.     req->setTriggerEvent(triggerEventValues[i]);
  1161.     BaseString::snprintf(triggerName, sizeof(triggerName), triggerNameFormat[i],
  1162.      ptr.p->backupId, tabPtr.p->tableId);
  1163.     w.reset();
  1164.     w.add(CreateTrigReq::TriggerNameKey, triggerName);
  1165.     lsPtr[0].p = nameBuffer;
  1166.     lsPtr[0].sz = w.getWordsUsed();
  1167.     sendSignal(DBDICT_REF, GSN_CREATE_TRIG_REQ, 
  1168.        signal, CreateTrigReq::SignalLength, JBB, lsPtr, 1);
  1169.   }
  1170. }
  1171. void
  1172. Backup::execCREATE_TRIG_CONF(Signal* signal)
  1173. {
  1174.   jamEntry();
  1175.   CreateTrigConf * conf = (CreateTrigConf*)signal->getDataPtr();
  1176.   
  1177.   const Uint32 ptrI = conf->getConnectionPtr();
  1178.   const Uint32 tableId = conf->getTableId();
  1179.   const TriggerEvent::Value type = conf->getTriggerEvent();
  1180.   const Uint32 triggerId = conf->getTriggerId();
  1181.   BackupRecordPtr ptr;
  1182.   c_backupPool.getPtr(ptr, ptrI);
  1183.   /**
  1184.    * Verify that I'm waiting for this conf
  1185.    */
  1186.   ndbrequire(ptr.p->masterRef == reference());
  1187.   ndbrequire(ptr.p->masterData.gsn == GSN_CREATE_TRIG_REQ);
  1188.   ndbrequire(ptr.p->masterData.sendCounter.done() == false);
  1189.   ndbrequire(ptr.p->masterData.createTrig.tableId == tableId);
  1190.   
  1191.   TablePtr tabPtr;
  1192.   ndbrequire(findTable(ptr, tabPtr, tableId));
  1193.   ndbrequire(type < 3); // if some decides to change the enums
  1194.   ndbrequire(tabPtr.p->triggerIds[type] == ILLEGAL_TRIGGER_ID);
  1195.   tabPtr.p->triggerIds[type] = triggerId;
  1196.   
  1197.   createTrigReply(signal, ptr);
  1198. }
  1199. void
  1200. Backup::execCREATE_TRIG_REF(Signal* signal)
  1201. {
  1202.   CreateTrigRef* ref = (CreateTrigRef*)signal->getDataPtr();
  1203.   const Uint32 ptrI = ref->getConnectionPtr();
  1204.   const Uint32 tableId = ref->getTableId();
  1205.   BackupRecordPtr ptr;
  1206.   c_backupPool.getPtr(ptr, ptrI);
  1207.   /**
  1208.    * Verify that I'm waiting for this ref
  1209.    */
  1210.   ndbrequire(ptr.p->masterRef == reference());
  1211.   ndbrequire(ptr.p->masterData.gsn == GSN_CREATE_TRIG_REQ);
  1212.   ndbrequire(ptr.p->masterData.sendCounter.done() == false);
  1213.   ndbrequire(ptr.p->masterData.createTrig.tableId == tableId);
  1214.   ptr.p->setErrorCode(ref->getErrorCode());
  1215.   
  1216.   createTrigReply(signal, ptr);
  1217. }
  1218. void
  1219. Backup::createTrigReply(Signal* signal, BackupRecordPtr ptr)
  1220. {
  1221.   CRASH_INSERTION(10003);
  1222.   /**
  1223.    * Check finished with table
  1224.    */
  1225.   ptr.p->masterData.sendCounter--;
  1226.   if(ptr.p->masterData.sendCounter.done() == false){
  1227.     jam();
  1228.     return;
  1229.   }//if
  1230.   if (ERROR_INSERTED(10025)) 
  1231.   {
  1232.     ptr.p->errorCode = 325;
  1233.   }
  1234.   if(ptr.p->checkError()) {
  1235.     jam();
  1236.     masterAbort(signal, ptr);
  1237.     return;
  1238.   }//if
  1239.   TablePtr tabPtr;
  1240.   ndbrequire(findTable(ptr, tabPtr, ptr.p->masterData.createTrig.tableId));
  1241.   
  1242.   /**
  1243.    * Next table
  1244.    */
  1245.   ptr.p->tables.next(tabPtr);
  1246.   if(tabPtr.i != RNIL){
  1247.     jam();
  1248.     sendCreateTrig(signal, ptr, tabPtr);
  1249.     return;
  1250.   }//if
  1251.   /**
  1252.    * Finished with all tables, send StartBackupReq
  1253.    */
  1254.   ptr.p->tables.first(tabPtr);
  1255.   ptr.p->masterData.startBackup.signalNo = 0;
  1256.   ptr.p->masterData.startBackup.noOfSignals = 
  1257.     (ptr.p->tables.noOfElements() + StartBackupReq::MaxTableTriggers - 1) / 
  1258.     StartBackupReq::MaxTableTriggers;
  1259.   sendStartBackup(signal, ptr, tabPtr);
  1260. }
  1261. /*****************************************************************************
  1262.  * 
  1263.  * Master functionallity - Start backup
  1264.  *
  1265.  *****************************************************************************/
  1266. void
  1267. Backup::sendStartBackup(Signal* signal, BackupRecordPtr ptr, TablePtr tabPtr)
  1268. {
  1269.   ptr.p->masterData.startBackup.tablePtr = tabPtr.i;
  1270.   
  1271.   StartBackupReq* req = (StartBackupReq*)signal->getDataPtrSend();
  1272.   req->backupId = ptr.p->backupId;
  1273.   req->backupPtr = ptr.i;
  1274.   req->signalNo = ptr.p->masterData.startBackup.signalNo;
  1275.   req->noOfSignals = ptr.p->masterData.startBackup.noOfSignals;
  1276.   Uint32 i;
  1277.   for(i = 0; i<StartBackupReq::MaxTableTriggers; i++) {
  1278.     jam();
  1279.     req->tableTriggers[i].tableId = tabPtr.p->tableId;
  1280.     req->tableTriggers[i].triggerIds[0] = tabPtr.p->triggerIds[0];
  1281.     req->tableTriggers[i].triggerIds[1] = tabPtr.p->triggerIds[1];
  1282.     req->tableTriggers[i].triggerIds[2] = tabPtr.p->triggerIds[2];
  1283.     if(!ptr.p->tables.next(tabPtr)){
  1284.       jam();
  1285.       i++;
  1286.       break;
  1287.     }//if
  1288.   }//for
  1289.   req->noOfTableTriggers = i;
  1290.   ptr.p->masterData.gsn = GSN_START_BACKUP_REQ;
  1291.   ptr.p->masterData.sendCounter = ptr.p->nodes;
  1292.   NodeReceiverGroup rg(BACKUP, ptr.p->nodes);
  1293.   sendSignal(rg, GSN_START_BACKUP_REQ, signal, 
  1294.      StartBackupReq::HeaderLength + 
  1295.      (i * StartBackupReq::TableTriggerLength), JBB);
  1296. }
  1297. void
  1298. Backup::execSTART_BACKUP_REF(Signal* signal)
  1299. {
  1300.   jamEntry();
  1301.   StartBackupRef* ref = (StartBackupRef*)signal->getDataPtr();
  1302.   const Uint32 ptrI = ref->backupPtr;
  1303.   //const Uint32 backupId = ref->backupId;
  1304.   const Uint32 signalNo = ref->signalNo;
  1305.   const Uint32 nodeId = ref->nodeId;
  1306.   BackupRecordPtr ptr;
  1307.   c_backupPool.getPtr(ptr, ptrI);
  1308.   ptr.p->setErrorCode(ref->errorCode);
  1309.   startBackupReply(signal, ptr, nodeId, signalNo);
  1310. }
  1311. void
  1312. Backup::execSTART_BACKUP_CONF(Signal* signal)
  1313. {
  1314.   jamEntry();
  1315.   
  1316.   StartBackupConf* conf = (StartBackupConf*)signal->getDataPtr();
  1317.   const Uint32 ptrI = conf->backupPtr;
  1318.   //const Uint32 backupId = conf->backupId;
  1319.   const Uint32 signalNo = conf->signalNo;
  1320.   const Uint32 nodeId = refToNode(signal->senderBlockRef());
  1321.   
  1322.   BackupRecordPtr ptr;
  1323.   c_backupPool.getPtr(ptr, ptrI);
  1324.   startBackupReply(signal, ptr, nodeId, signalNo);
  1325. }
  1326. void
  1327. Backup::startBackupReply(Signal* signal, BackupRecordPtr ptr, 
  1328.  Uint32 nodeId, Uint32 signalNo)
  1329. {
  1330.   CRASH_INSERTION((10004));
  1331.   ndbrequire(ptr.p->masterData.startBackup.signalNo == signalNo);
  1332.   if (!haveAllSignals(ptr, GSN_START_BACKUP_REQ, nodeId)) {
  1333.     jam();
  1334.     return;
  1335.   }
  1336.   if (ERROR_INSERTED(10026))
  1337.   {
  1338.     ptr.p->errorCode = 326;
  1339.   }
  1340.   if(ptr.p->checkError()){
  1341.     jam();
  1342.     masterAbort(signal, ptr);
  1343.     return;
  1344.   }
  1345.   TablePtr tabPtr;
  1346.   c_tablePool.getPtr(tabPtr, ptr.p->masterData.startBackup.tablePtr);
  1347.   for(Uint32 i = 0; i<StartBackupReq::MaxTableTriggers; i++) {
  1348.     jam();
  1349.     if(!ptr.p->tables.next(tabPtr)) {
  1350.       jam();
  1351.       break;
  1352.     }//if
  1353.   }//for
  1354.   
  1355.   if(tabPtr.i != RNIL) {
  1356.     jam();
  1357.     ptr.p->masterData.startBackup.signalNo++;
  1358.     sendStartBackup(signal, ptr, tabPtr);
  1359.     return;
  1360.   }
  1361.   sendAlterTrig(signal, ptr);
  1362. }
  1363. /*****************************************************************************
  1364.  * 
  1365.  * Master functionallity - Activate triggers
  1366.  *
  1367.  *****************************************************************************/
  1368. void
  1369. Backup::sendAlterTrig(Signal* signal, BackupRecordPtr ptr)
  1370. {
  1371.   AlterTrigReq * req =(AlterTrigReq *)signal->getDataPtrSend();
  1372.   
  1373.   ptr.p->masterData.gsn = GSN_ALTER_TRIG_REQ;
  1374.   ptr.p->masterData.sendCounter = 0;
  1375.   
  1376.   req->setUserRef(reference());
  1377.   req->setConnectionPtr(ptr.i);
  1378.   req->setRequestType(AlterTrigReq::RT_USER);
  1379.   req->setTriggerInfo(0);       // not used on ALTER via DICT
  1380.   req->setOnline(true);
  1381.   req->setReceiverRef(reference());
  1382.   TablePtr tabPtr;
  1383.   if (ptr.p->masterData.alterTrig.tableId == RNIL) {
  1384.     jam();
  1385.     ptr.p->tables.first(tabPtr);
  1386.   } else {
  1387.     jam();
  1388.     ndbrequire(findTable(ptr, tabPtr, ptr.p->masterData.alterTrig.tableId));
  1389.     ptr.p->tables.next(tabPtr);
  1390.   }//if
  1391.   if (tabPtr.i != RNIL) {
  1392.     jam();
  1393.     ptr.p->masterData.alterTrig.tableId = tabPtr.p->tableId;
  1394.     req->setTableId(tabPtr.p->tableId);
  1395.     req->setTriggerId(tabPtr.p->triggerIds[0]);
  1396.     sendSignal(DBDICT_REF, GSN_ALTER_TRIG_REQ, 
  1397.        signal, AlterTrigReq::SignalLength, JBB);
  1398.     
  1399.     req->setTriggerId(tabPtr.p->triggerIds[1]);
  1400.     sendSignal(DBDICT_REF, GSN_ALTER_TRIG_REQ, 
  1401.        signal, AlterTrigReq::SignalLength, JBB);
  1402.     req->setTriggerId(tabPtr.p->triggerIds[2]);
  1403.     sendSignal(DBDICT_REF, GSN_ALTER_TRIG_REQ, 
  1404.        signal, AlterTrigReq::SignalLength, JBB);
  1405.     ptr.p->masterData.sendCounter += 3;
  1406.     return;
  1407.   }//if
  1408.   ptr.p->masterData.alterTrig.tableId = RNIL;
  1409.   /**
  1410.    * Finished with all tables
  1411.    */
  1412.   ptr.p->masterData.gsn = GSN_WAIT_GCP_REQ;
  1413.   ptr.p->masterData.waitGCP.startBackup = true;
  1414.   
  1415.   WaitGCPReq * waitGCPReq = (WaitGCPReq*)signal->getDataPtrSend();
  1416.   waitGCPReq->senderRef = reference();
  1417.   waitGCPReq->senderData = ptr.i;
  1418.   waitGCPReq->requestType = WaitGCPReq::CompleteForceStart;
  1419.   sendSignal(DBDIH_REF, GSN_WAIT_GCP_REQ, signal, 
  1420.      WaitGCPReq::SignalLength,JBB);
  1421. }
  1422. void
  1423. Backup::execALTER_TRIG_CONF(Signal* signal)
  1424. {
  1425.   jamEntry();
  1426.   AlterTrigConf* conf = (AlterTrigConf*)signal->getDataPtr();
  1427.   const Uint32 ptrI = conf->getConnectionPtr();
  1428.   
  1429.   BackupRecordPtr ptr;
  1430.   c_backupPool.getPtr(ptr, ptrI);
  1431.   
  1432.   alterTrigReply(signal, ptr);
  1433. }
  1434. void
  1435. Backup::execALTER_TRIG_REF(Signal* signal)
  1436. {
  1437.   jamEntry();
  1438.   AlterTrigRef* ref = (AlterTrigRef*)signal->getDataPtr();
  1439.   const Uint32 ptrI = ref->getConnectionPtr();
  1440.   
  1441.   BackupRecordPtr ptr;
  1442.   c_backupPool.getPtr(ptr, ptrI);
  1443.   ptr.p->setErrorCode(ref->getErrorCode());
  1444.   
  1445.   alterTrigReply(signal, ptr);
  1446. }
  1447. void
  1448. Backup::alterTrigReply(Signal* signal, BackupRecordPtr ptr)
  1449. {
  1450.   CRASH_INSERTION((10005));
  1451.   ndbrequire(ptr.p->masterRef == reference());
  1452.   ndbrequire(ptr.p->masterData.gsn == GSN_ALTER_TRIG_REQ);
  1453.   ndbrequire(ptr.p->masterData.sendCounter.done() == false);
  1454.   ptr.p->masterData.sendCounter--;
  1455.   if(ptr.p->masterData.sendCounter.done() == false){
  1456.     jam();
  1457.     return;
  1458.   }//if
  1459.   if(ptr.p->checkError()){
  1460.     jam();
  1461.     masterAbort(signal, ptr);
  1462.     return;
  1463.   }//if
  1464.   sendAlterTrig(signal, ptr);
  1465. }
  1466. void
  1467. Backup::execWAIT_GCP_REF(Signal* signal)
  1468. {
  1469.   jamEntry();
  1470.   
  1471.   CRASH_INSERTION((10006));
  1472.   WaitGCPRef * ref = (WaitGCPRef*)signal->getDataPtr();
  1473.   const Uint32 ptrI = ref->senderData;
  1474.   
  1475.   BackupRecordPtr ptr;
  1476.   c_backupPool.getPtr(ptr, ptrI);
  1477.   ndbrequire(ptr.p->masterRef == reference());
  1478.   ndbrequire(ptr.p->masterData.gsn == GSN_WAIT_GCP_REQ);
  1479.   WaitGCPReq * req = (WaitGCPReq*)signal->getDataPtrSend();
  1480.   req->senderRef = reference();
  1481.   req->senderData = ptr.i;
  1482.   req->requestType = WaitGCPReq::CompleteForceStart;
  1483.   sendSignal(DBDIH_REF, GSN_WAIT_GCP_REQ, signal, 
  1484.      WaitGCPReq::SignalLength,JBB);
  1485. }
  1486. void
  1487. Backup::execWAIT_GCP_CONF(Signal* signal){
  1488.   jamEntry();
  1489.   CRASH_INSERTION((10007));
  1490.   WaitGCPConf * conf = (WaitGCPConf*)signal->getDataPtr();
  1491.   const Uint32 ptrI = conf->senderData;
  1492.   const Uint32 gcp = conf->gcp;
  1493.   
  1494.   BackupRecordPtr ptr;
  1495.   c_backupPool.getPtr(ptr, ptrI);
  1496.   
  1497.   ndbrequire(ptr.p->masterRef == reference());
  1498.   ndbrequire(ptr.p->masterData.gsn == GSN_WAIT_GCP_REQ);
  1499.   
  1500.   if(ptr.p->checkError()) {
  1501.     jam();
  1502.     masterAbort(signal, ptr);
  1503.     return;
  1504.   }//if
  1505.   
  1506.   if(ptr.p->masterData.waitGCP.startBackup) {
  1507.     jam();
  1508.     CRASH_INSERTION((10008));
  1509.     ptr.p->startGCP = gcp;
  1510.     ptr.p->masterData.sendCounter= 0;
  1511.     ptr.p->masterData.gsn = GSN_BACKUP_FRAGMENT_REQ;
  1512.     nextFragment(signal, ptr);
  1513.     return;
  1514.   } else {
  1515.     jam();
  1516.     if(gcp >= ptr.p->startGCP + 3)
  1517.     {
  1518.       CRASH_INSERTION((10009));
  1519.       ptr.p->stopGCP = gcp;
  1520.       sendDropTrig(signal, ptr); // regular dropping of triggers
  1521.       return;
  1522.     }//if
  1523.     
  1524.     /**
  1525.      * Make sure that we got entire stopGCP 
  1526.      */
  1527.     WaitGCPReq * req = (WaitGCPReq*)signal->getDataPtrSend();
  1528.     req->senderRef = reference();
  1529.     req->senderData = ptr.i;
  1530.     req->requestType = WaitGCPReq::CompleteForceStart;
  1531.     sendSignal(DBDIH_REF, GSN_WAIT_GCP_REQ, signal, 
  1532.        WaitGCPReq::SignalLength,JBB);
  1533.     return;
  1534.   }
  1535. }
  1536. /*****************************************************************************
  1537.  * 
  1538.  * Master functionallity - Backup fragment
  1539.  *
  1540.  *****************************************************************************/
  1541. void
  1542. Backup::nextFragment(Signal* signal, BackupRecordPtr ptr)
  1543. {
  1544.   jam();
  1545.   BackupFragmentReq* req = (BackupFragmentReq*)signal->getDataPtrSend();
  1546.   req->backupPtr = ptr.i;
  1547.   req->backupId = ptr.p->backupId;
  1548.   NodeBitmask nodes = ptr.p->nodes;
  1549.   Uint32 idleNodes = nodes.count();
  1550.   Uint32 saveIdleNodes = idleNodes;
  1551.   ndbrequire(idleNodes > 0);
  1552.   TablePtr tabPtr;
  1553.   ptr.p->tables.first(tabPtr);
  1554.   for(; tabPtr.i != RNIL && idleNodes > 0; ptr.p->tables.next(tabPtr)) {
  1555.     jam();
  1556.     FragmentPtr fragPtr;
  1557.     Array<Fragment> & frags = tabPtr.p->fragments;
  1558.     const Uint32 fragCount = frags.getSize();
  1559.     
  1560.     for(Uint32 i = 0; i<fragCount && idleNodes > 0; i++) {
  1561.       jam();
  1562.       tabPtr.p->fragments.getPtr(fragPtr, i);
  1563.       const Uint32 nodeId = fragPtr.p->node;
  1564.       if(fragPtr.p->scanning != 0) {
  1565.         jam();
  1566. ndbrequire(nodes.get(nodeId));
  1567. nodes.clear(nodeId);
  1568. idleNodes--;
  1569.       } else if(fragPtr.p->scanned == 0 && nodes.get(nodeId)){
  1570. jam();
  1571. fragPtr.p->scanning = 1;
  1572. nodes.clear(nodeId);
  1573. idleNodes--;
  1574. req->tableId = tabPtr.p->tableId;
  1575. req->fragmentNo = i;
  1576. req->count = 0;
  1577. ptr.p->masterData.sendCounter++;
  1578. const BlockReference ref = numberToRef(BACKUP, nodeId);
  1579. sendSignal(ref, GSN_BACKUP_FRAGMENT_REQ, signal,
  1580.    BackupFragmentReq::SignalLength, JBB);
  1581.       }//if
  1582.     }//for
  1583.   }//for
  1584.   
  1585.   if(idleNodes != saveIdleNodes){
  1586.     jam();
  1587.     return;
  1588.   }//if
  1589.   /**
  1590.    * Finished with all tables
  1591.    */
  1592.   {
  1593.     ptr.p->masterData.gsn = GSN_WAIT_GCP_REQ;
  1594.     ptr.p->masterData.waitGCP.startBackup = false;
  1595.     
  1596.     WaitGCPReq * req = (WaitGCPReq*)signal->getDataPtrSend();
  1597.     req->senderRef = reference();
  1598.     req->senderData = ptr.i;
  1599.     req->requestType = WaitGCPReq::CompleteForceStart;
  1600.     sendSignal(DBDIH_REF, GSN_WAIT_GCP_REQ, signal, 
  1601.        WaitGCPReq::SignalLength, JBB);
  1602.   }
  1603. }
  1604. void
  1605. Backup::execBACKUP_FRAGMENT_CONF(Signal* signal)
  1606. {
  1607.   jamEntry();
  1608.   CRASH_INSERTION((10010));
  1609.   
  1610.   BackupFragmentConf * conf = (BackupFragmentConf*)signal->getDataPtr();
  1611.   const Uint32 ptrI = conf->backupPtr;
  1612.   //const Uint32 backupId = conf->backupId;
  1613.   const Uint32 tableId = conf->tableId;
  1614.   const Uint32 fragmentNo = conf->fragmentNo;
  1615.   const Uint32 nodeId = refToNode(signal->senderBlockRef());
  1616.   const Uint32 noOfBytes = conf->noOfBytes;
  1617.   const Uint32 noOfRecords = conf->noOfRecords;
  1618.   
  1619.   BackupRecordPtr ptr;
  1620.   c_backupPool.getPtr(ptr, ptrI);
  1621.   ptr.p->noOfBytes += noOfBytes;
  1622.   ptr.p->noOfRecords += noOfRecords;
  1623.   ptr.p->masterData.sendCounter--;
  1624.   TablePtr tabPtr;
  1625.   ndbrequire(findTable(ptr, tabPtr, tableId));
  1626.   FragmentPtr fragPtr;
  1627.   tabPtr.p->fragments.getPtr(fragPtr, fragmentNo);
  1628.   ndbrequire(fragPtr.p->scanned == 0);
  1629.   ndbrequire(fragPtr.p->scanning == 1);
  1630.   ndbrequire(fragPtr.p->node == nodeId);
  1631.   fragPtr.p->scanned = 1;
  1632.   fragPtr.p->scanning = 0;
  1633.   if (ERROR_INSERTED(10028)) 
  1634.   {
  1635.     ptr.p->errorCode = 328;
  1636.   }
  1637.   if(ptr.p->checkError()) 
  1638.   {
  1639.     if(ptr.p->masterData.sendCounter.done())
  1640.     {
  1641.       jam();
  1642.       masterAbort(signal, ptr);
  1643.       return;
  1644.     }//if
  1645.   }
  1646.   else
  1647.   {
  1648.     nextFragment(signal, ptr);
  1649.   }
  1650. }
  1651. void
  1652. Backup::execBACKUP_FRAGMENT_REF(Signal* signal)
  1653. {
  1654.   jamEntry();
  1655.   CRASH_INSERTION((10011));
  1656.   BackupFragmentRef * ref = (BackupFragmentRef*)signal->getDataPtr();
  1657.   const Uint32 ptrI = ref->backupPtr;
  1658.   //const Uint32 backupId = ref->backupId;
  1659.   const Uint32 nodeId = ref->nodeId;
  1660.   
  1661.   BackupRecordPtr ptr;
  1662.   c_backupPool.getPtr(ptr, ptrI);
  1663.   TablePtr tabPtr;
  1664.   ptr.p->tables.first(tabPtr);
  1665.   for(; tabPtr.i != RNIL; ptr.p->tables.next(tabPtr)) {
  1666.     jam();
  1667.     FragmentPtr fragPtr;
  1668.     Array<Fragment> & frags = tabPtr.p->fragments;
  1669.     const Uint32 fragCount = frags.getSize();
  1670.     
  1671.     for(Uint32 i = 0; i<fragCount; i++) {
  1672.       jam();
  1673.       tabPtr.p->fragments.getPtr(fragPtr, i);
  1674.         if(fragPtr.p->scanning != 0 && nodeId == fragPtr.p->node) 
  1675.       {
  1676.         jam();
  1677. ndbrequire(fragPtr.p->scanned == 0);
  1678. fragPtr.p->scanned = 1;
  1679. fragPtr.p->scanning = 0;
  1680. goto done;
  1681.       }
  1682.     }
  1683.   }
  1684.   ndbrequire(false);
  1685. done:
  1686.   ptr.p->masterData.sendCounter--;
  1687.   ptr.p->setErrorCode(ref->errorCode);
  1688.   
  1689.   if(ptr.p->masterData.sendCounter.done())
  1690.   {
  1691.     jam();
  1692.     masterAbort(signal, ptr);
  1693.     return;
  1694.   }//if
  1695.   
  1696.   AbortBackupOrd *ord = (AbortBackupOrd*)signal->getDataPtrSend();
  1697.   ord->backupId = ptr.p->backupId;
  1698.   ord->backupPtr = ptr.i;
  1699.   ord->requestType = AbortBackupOrd::LogBufferFull;
  1700.   ord->senderData= ptr.i;
  1701.   execABORT_BACKUP_ORD(signal);
  1702. }
  1703. /*****************************************************************************
  1704.  * 
  1705.  * Master functionallity - Drop triggers
  1706.  *
  1707.  *****************************************************************************/
  1708. void
  1709. Backup::sendDropTrig(Signal* signal, BackupRecordPtr ptr)
  1710. {
  1711.   TablePtr tabPtr;
  1712.   if (ptr.p->masterData.dropTrig.tableId == RNIL) {
  1713.     jam();
  1714.     ptr.p->tables.first(tabPtr);
  1715.   } else {
  1716.     jam();
  1717.     ndbrequire(findTable(ptr, tabPtr, ptr.p->masterData.dropTrig.tableId));
  1718.     ptr.p->tables.next(tabPtr);
  1719.   }//if
  1720.   if (tabPtr.i != RNIL) {
  1721.     jam();
  1722.     sendDropTrig(signal, ptr, tabPtr);
  1723.   } else {
  1724.     jam();
  1725.     ptr.p->masterData.dropTrig.tableId = RNIL;
  1726.     sendStopBackup(signal, ptr);
  1727.   }//if
  1728. }
  1729. void
  1730. Backup::sendDropTrig(Signal* signal, BackupRecordPtr ptr, TablePtr tabPtr)
  1731. {
  1732.   jam();
  1733.   DropTrigReq * req = (DropTrigReq *)signal->getDataPtrSend();
  1734.   ptr.p->masterData.gsn = GSN_DROP_TRIG_REQ;
  1735.   ptr.p->masterData.sendCounter = 0;
  1736.     
  1737.   req->setConnectionPtr(ptr.i);
  1738.   req->setUserRef(reference()); // Sending to myself
  1739.   req->setRequestType(DropTrigReq::RT_USER);
  1740.   req->setIndexId(RNIL);
  1741.   req->setTriggerInfo(0);       // not used on DROP via DICT
  1742.   char triggerName[MAX_TAB_NAME_SIZE];
  1743.   Uint32 nameBuffer[2 + ((MAX_TAB_NAME_SIZE + 3) >> 2)];  // SP string
  1744.   LinearWriter w(nameBuffer, sizeof(nameBuffer) >> 2);
  1745.   LinearSectionPtr lsPtr[3];
  1746.   
  1747.   ptr.p->masterData.dropTrig.tableId = tabPtr.p->tableId;
  1748.   req->setTableId(tabPtr.p->tableId);
  1749.   for (int i = 0; i < 3; i++) {
  1750.     Uint32 id = tabPtr.p->triggerIds[i];
  1751.     req->setTriggerId(id);
  1752.     if (id != ILLEGAL_TRIGGER_ID) {
  1753.       sendSignal(DBDICT_REF, GSN_DROP_TRIG_REQ, 
  1754.  signal, DropTrigReq::SignalLength, JBB);
  1755.     } else {
  1756.       BaseString::snprintf(triggerName, sizeof(triggerName), triggerNameFormat[i],
  1757.        ptr.p->backupId, tabPtr.p->tableId);
  1758.       w.reset();
  1759.       w.add(CreateTrigReq::TriggerNameKey, triggerName);
  1760.       lsPtr[0].p = nameBuffer;
  1761.       lsPtr[0].sz = w.getWordsUsed();
  1762.       sendSignal(DBDICT_REF, GSN_DROP_TRIG_REQ, 
  1763.  signal, DropTrigReq::SignalLength, JBB, lsPtr, 1);
  1764.     }
  1765.     ptr.p->masterData.sendCounter ++;
  1766.   }
  1767. }
  1768. void
  1769. Backup::execDROP_TRIG_REF(Signal* signal)
  1770. {
  1771.   jamEntry();
  1772.   DropTrigRef* ref = (DropTrigRef*)signal->getDataPtr();
  1773.   const Uint32 ptrI = ref->getConnectionPtr();
  1774.   
  1775.   BackupRecordPtr ptr;
  1776.   c_backupPool.getPtr(ptr, ptrI);
  1777.  
  1778.   //ndbrequire(ref->getErrorCode() == DropTrigRef::NoSuchTrigger);
  1779.   dropTrigReply(signal, ptr);
  1780. }
  1781. void
  1782. Backup::execDROP_TRIG_CONF(Signal* signal)
  1783. {
  1784.   jamEntry();
  1785.   
  1786.   DropTrigConf* conf = (DropTrigConf*)signal->getDataPtr();
  1787.   const Uint32 ptrI = conf->getConnectionPtr();
  1788.   
  1789.   BackupRecordPtr ptr;
  1790.   c_backupPool.getPtr(ptr, ptrI);
  1791.   
  1792.   dropTrigReply(signal, ptr);
  1793. }
  1794. void
  1795. Backup::dropTrigReply(Signal* signal, BackupRecordPtr ptr)
  1796. {
  1797.   CRASH_INSERTION((10012));
  1798.   ndbrequire(ptr.p->masterRef == reference());
  1799.   ndbrequire(ptr.p->masterData.gsn == GSN_DROP_TRIG_REQ);
  1800.   ndbrequire(ptr.p->masterData.sendCounter.done() == false);
  1801.   
  1802.   ptr.p->masterData.sendCounter--;
  1803.   if(ptr.p->masterData.sendCounter.done() == false){
  1804.     jam();
  1805.     return;
  1806.   }//if
  1807.   
  1808.   sendDropTrig(signal, ptr); // recursive next
  1809. }
  1810. /*****************************************************************************
  1811.  * 
  1812.  * Master functionallity - Stop backup
  1813.  *
  1814.  *****************************************************************************/
  1815. void
  1816. Backup::execSTOP_BACKUP_REF(Signal* signal)
  1817. {
  1818.   jamEntry();
  1819.   StopBackupRef* ref = (StopBackupRef*)signal->getDataPtr();
  1820.   const Uint32 ptrI = ref->backupPtr;
  1821.   //const Uint32 backupId = ref->backupId;
  1822.   const Uint32 nodeId = ref->nodeId;
  1823.   
  1824.   BackupRecordPtr ptr;
  1825.   c_backupPool.getPtr(ptr, ptrI);
  1826.   ptr.p->setErrorCode(ref->errorCode);
  1827.   stopBackupReply(signal, ptr, nodeId);
  1828. }
  1829. void
  1830. Backup::sendStopBackup(Signal* signal, BackupRecordPtr ptr)
  1831. {
  1832.   jam();
  1833.   StopBackupReq* stop = (StopBackupReq*)signal->getDataPtrSend();
  1834.   stop->backupPtr = ptr.i;
  1835.   stop->backupId = ptr.p->backupId;
  1836.   stop->startGCP = ptr.p->startGCP;
  1837.   stop->stopGCP = ptr.p->stopGCP;
  1838.   ptr.p->masterData.gsn = GSN_STOP_BACKUP_REQ;
  1839.   ptr.p->masterData.sendCounter = ptr.p->nodes;
  1840.   NodeReceiverGroup rg(BACKUP, ptr.p->nodes);
  1841.   sendSignal(rg, GSN_STOP_BACKUP_REQ, signal, 
  1842.      StopBackupReq::SignalLength, JBB);
  1843. }
  1844. void
  1845. Backup::execSTOP_BACKUP_CONF(Signal* signal)
  1846. {
  1847.   jamEntry();
  1848.   
  1849.   StopBackupConf* conf = (StopBackupConf*)signal->getDataPtr();
  1850.   const Uint32 ptrI = conf->backupPtr;
  1851.   //const Uint32 backupId = conf->backupId;
  1852.   const Uint32 nodeId = refToNode(signal->senderBlockRef());
  1853.   
  1854.   BackupRecordPtr ptr;
  1855.   c_backupPool.getPtr(ptr, ptrI);
  1856.   ptr.p->noOfLogBytes += conf->noOfLogBytes;
  1857.   ptr.p->noOfLogRecords += conf->noOfLogRecords;
  1858.   
  1859.   stopBackupReply(signal, ptr, nodeId);
  1860. }
  1861. void
  1862. Backup::stopBackupReply(Signal* signal, BackupRecordPtr ptr, Uint32 nodeId)
  1863. {
  1864.   CRASH_INSERTION((10013));
  1865.   if (!haveAllSignals(ptr, GSN_STOP_BACKUP_REQ, nodeId)) {
  1866.     jam();
  1867.     return;
  1868.   }
  1869.   sendAbortBackupOrd(signal, ptr, AbortBackupOrd::BackupComplete);
  1870.   
  1871.   if(!ptr.p->checkError())
  1872.   {
  1873.     if (SEND_BACKUP_COMPLETED_FLAG(ptr.p->flags))
  1874.     {
  1875.       BackupCompleteRep * rep = (BackupCompleteRep*)signal->getDataPtrSend();
  1876.       rep->backupId = ptr.p->backupId;
  1877.       rep->senderData = ptr.p->clientData;
  1878.       rep->startGCP = ptr.p->startGCP;
  1879.       rep->stopGCP = ptr.p->stopGCP;
  1880.       rep->noOfBytes = ptr.p->noOfBytes;
  1881.       rep->noOfRecords = ptr.p->noOfRecords;
  1882.       rep->noOfLogBytes = ptr.p->noOfLogBytes;
  1883.       rep->noOfLogRecords = ptr.p->noOfLogRecords;
  1884.       rep->nodes = ptr.p->nodes;
  1885.       sendSignal(ptr.p->clientRef, GSN_BACKUP_COMPLETE_REP, signal,
  1886.  BackupCompleteRep::SignalLength, JBB);
  1887.     }
  1888.     signal->theData[0] = EventReport::BackupCompleted;
  1889.     signal->theData[1] = ptr.p->clientRef;
  1890.     signal->theData[2] = ptr.p->backupId;
  1891.     signal->theData[3] = ptr.p->startGCP;
  1892.     signal->theData[4] = ptr.p->stopGCP;
  1893.     signal->theData[5] = ptr.p->noOfBytes;
  1894.     signal->theData[6] = ptr.p->noOfRecords;
  1895.     signal->theData[7] = ptr.p->noOfLogBytes;
  1896.     signal->theData[8] = ptr.p->noOfLogRecords;
  1897.     ptr.p->nodes.copyto(NdbNodeBitmask::Size, signal->theData+9);
  1898.     sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 9+NdbNodeBitmask::Size, JBB);
  1899.   }
  1900.   else
  1901.   {
  1902.     masterAbort(signal, ptr);
  1903.   }
  1904. }
  1905. /*****************************************************************************
  1906.  * 
  1907.  * Master functionallity - Abort backup
  1908.  *
  1909.  *****************************************************************************/
  1910. void
  1911. Backup::masterAbort(Signal* signal, BackupRecordPtr ptr)
  1912. {
  1913.   jam();
  1914. #ifdef DEBUG_ABORT
  1915.   ndbout_c("************ masterAbort");
  1916. #endif
  1917.   if(ptr.p->masterData.errorCode != 0)
  1918.   {
  1919.     jam();
  1920.     return;
  1921.   }
  1922.   if (SEND_BACKUP_COMPLETED_FLAG(ptr.p->flags))
  1923.   {
  1924.     BackupAbortRep* rep = (BackupAbortRep*)signal->getDataPtrSend();
  1925.     rep->backupId = ptr.p->backupId;
  1926.     rep->senderData = ptr.p->clientData;
  1927.     rep->reason = ptr.p->errorCode;
  1928.     sendSignal(ptr.p->clientRef, GSN_BACKUP_ABORT_REP, signal, 
  1929.        BackupAbortRep::SignalLength, JBB);
  1930.   }
  1931.   signal->theData[0] = EventReport::BackupAborted;
  1932.   signal->theData[1] = ptr.p->clientRef;
  1933.   signal->theData[2] = ptr.p->backupId;
  1934.   signal->theData[3] = ptr.p->errorCode;
  1935.   sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 4, JBB);
  1936.   ndbrequire(ptr.p->errorCode);
  1937.   ptr.p->masterData.errorCode = ptr.p->errorCode;
  1938.   AbortBackupOrd *ord = (AbortBackupOrd*)signal->getDataPtrSend();
  1939.   ord->backupId = ptr.p->backupId;
  1940.   ord->backupPtr = ptr.i;
  1941.   ord->senderData= ptr.i;
  1942.   NodeReceiverGroup rg(BACKUP, ptr.p->nodes);
  1943.   
  1944.   switch(ptr.p->masterData.gsn){
  1945.   case GSN_DEFINE_BACKUP_REQ:
  1946.     ord->requestType = AbortBackupOrd::BackupFailure;
  1947.     sendSignal(rg, GSN_ABORT_BACKUP_ORD, signal, 
  1948.        AbortBackupOrd::SignalLength, JBB);
  1949.     return;
  1950.   case GSN_CREATE_TRIG_REQ:
  1951.   case GSN_START_BACKUP_REQ:
  1952.   case GSN_ALTER_TRIG_REQ:
  1953.   case GSN_WAIT_GCP_REQ:
  1954.   case GSN_BACKUP_FRAGMENT_REQ:
  1955.     jam();
  1956.     ptr.p->stopGCP= ptr.p->startGCP + 1;
  1957.     sendDropTrig(signal, ptr); // dropping due to error
  1958.     return;
  1959.   case GSN_UTIL_SEQUENCE_REQ:
  1960.   case GSN_UTIL_LOCK_REQ:
  1961.   case GSN_DROP_TRIG_REQ:
  1962.     ndbrequire(false);
  1963.     return;
  1964.   case GSN_STOP_BACKUP_REQ:
  1965.     return;
  1966.   }
  1967. }
  1968. void
  1969. Backup::abort_scan(Signal * signal, BackupRecordPtr ptr)
  1970. {
  1971.   AbortBackupOrd *ord = (AbortBackupOrd*)signal->getDataPtrSend();
  1972.   ord->backupId = ptr.p->backupId;
  1973.   ord->backupPtr = ptr.i;
  1974.   ord->senderData= ptr.i;
  1975.   ord->requestType = AbortBackupOrd::AbortScan;
  1976.   TablePtr tabPtr;
  1977.   ptr.p->tables.first(tabPtr);
  1978.   for(; tabPtr.i != RNIL; ptr.p->tables.next(tabPtr)) {
  1979.     jam();
  1980.     FragmentPtr fragPtr;
  1981.     Array<Fragment> & frags = tabPtr.p->fragments;
  1982.     const Uint32 fragCount = frags.getSize();
  1983.     
  1984.     for(Uint32 i = 0; i<fragCount; i++) {
  1985.       jam();
  1986.       tabPtr.p->fragments.getPtr(fragPtr, i);
  1987.       const Uint32 nodeId = fragPtr.p->node;
  1988.       if(fragPtr.p->scanning != 0 && ptr.p->nodes.get(nodeId)) {
  1989.         jam();
  1990. const BlockReference ref = numberToRef(BACKUP, nodeId);
  1991. sendSignal(ref, GSN_ABORT_BACKUP_ORD, signal,
  1992.    AbortBackupOrd::SignalLength, JBB);
  1993.       }
  1994.     }
  1995.   }
  1996. }
  1997. /*****************************************************************************
  1998.  * 
  1999.  * Slave functionallity: Define Backup 
  2000.  *
  2001.  *****************************************************************************/
  2002. void
  2003. Backup::defineBackupRef(Signal* signal, BackupRecordPtr ptr, Uint32 errCode)
  2004. {
  2005.   ptr.p->m_gsn = GSN_DEFINE_BACKUP_REF;
  2006.   ptr.p->setErrorCode(errCode);
  2007.   ndbrequire(ptr.p->errorCode != 0);
  2008.   
  2009.   DefineBackupRef* ref = (DefineBackupRef*)signal->getDataPtrSend();
  2010.   ref->backupId = ptr.p->backupId;
  2011.   ref->backupPtr = ptr.i;
  2012.   ref->errorCode = ptr.p->errorCode;
  2013.   ref->nodeId = getOwnNodeId();
  2014.   sendSignal(ptr.p->masterRef, GSN_DEFINE_BACKUP_REF, signal, 
  2015.      DefineBackupRef::SignalLength, JBB);
  2016. }
  2017. void
  2018. Backup::execDEFINE_BACKUP_REQ(Signal* signal)
  2019. {
  2020.   jamEntry();
  2021.   DefineBackupReq* req = (DefineBackupReq*)signal->getDataPtr();
  2022.   
  2023.   BackupRecordPtr ptr;
  2024.   const Uint32 ptrI = req->backupPtr;
  2025.   const Uint32 backupId = req->backupId;
  2026.   const BlockReference senderRef = req->senderRef;
  2027.   if(senderRef == reference()){
  2028.     /**
  2029.      * Signal sent from myself -> record already seized
  2030.      */
  2031.     jam();
  2032.     c_backupPool.getPtr(ptr, ptrI);
  2033.   } else { // from other node
  2034.     jam();
  2035. #ifdef DEBUG_ABORT
  2036.     dumpUsedResources();
  2037. #endif
  2038.     if(!c_backups.seizeId(ptr, ptrI)) {
  2039.       jam();
  2040.       ndbrequire(false); // If master has succeeded slave should succed
  2041.     }//if
  2042.   }//if
  2043.   CRASH_INSERTION((10014));
  2044.   
  2045.   ptr.p->m_gsn = GSN_DEFINE_BACKUP_REQ;
  2046.   ptr.p->slaveState.forceState(INITIAL);
  2047.   ptr.p->slaveState.setState(DEFINING);
  2048.   ptr.p->errorCode = 0;
  2049.   ptr.p->clientRef = req->clientRef;
  2050.   ptr.p->clientData = req->clientData;
  2051.   if(senderRef == reference())
  2052.     ptr.p->flags = req->flags;
  2053.   else
  2054.     ptr.p->flags = req->flags & ~((Uint32)0x3); /* remove waitCompleted flags
  2055.  * as non master should never
  2056.  * reply
  2057.  */
  2058.   ptr.p->masterRef = senderRef;
  2059.   ptr.p->nodes = req->nodes;
  2060.   ptr.p->backupId = backupId;
  2061.   ptr.p->backupKey[0] = req->backupKey[0];
  2062.   ptr.p->backupKey[1] = req->backupKey[1];
  2063.   ptr.p->backupDataLen = req->backupDataLen;
  2064.   ptr.p->masterData.dropTrig.tableId = RNIL;
  2065.   ptr.p->masterData.alterTrig.tableId = RNIL;
  2066.   ptr.p->masterData.errorCode = 0;
  2067.   ptr.p->noOfBytes = 0;
  2068.   ptr.p->noOfRecords = 0;
  2069.   ptr.p->noOfLogBytes = 0;
  2070.   ptr.p->noOfLogRecords = 0;
  2071.   ptr.p->currGCP = 0;
  2072.   
  2073.   /**
  2074.    * Allocate files
  2075.    */
  2076.   BackupFilePtr files[3];
  2077.   Uint32 noOfPages[] = {
  2078.     NO_OF_PAGES_META_FILE,
  2079.     2,   // 32k
  2080.     0    // 3M
  2081.   };
  2082.   const Uint32 maxInsert[] = {
  2083.     2048,  // Temporarily to solve TR515
  2084.     //25,      // 100 bytes
  2085.     2048,    // 4k
  2086.     16*3000, // Max 16 tuples
  2087.   };
  2088.   Uint32 minWrite[] = {
  2089.     8192,
  2090.     8192,
  2091.     32768
  2092.   };
  2093.   Uint32 maxWrite[] = {
  2094.     8192,
  2095.     8192,
  2096.     32768
  2097.   };
  2098.   
  2099.   minWrite[1] = c_defaults.m_minWriteSize;
  2100.   maxWrite[1] = c_defaults.m_maxWriteSize;
  2101.   noOfPages[1] = (c_defaults.m_logBufferSize + sizeof(Page32) - 1) / 
  2102.     sizeof(Page32);
  2103.   minWrite[2] = c_defaults.m_minWriteSize;
  2104.   maxWrite[2] = c_defaults.m_maxWriteSize;
  2105.   noOfPages[2] = (c_defaults.m_dataBufferSize + sizeof(Page32) - 1) / 
  2106.     sizeof(Page32);
  2107.   
  2108.   for(Uint32 i = 0; i<3; i++) {
  2109.     jam();
  2110.     if(!ptr.p->files.seize(files[i])) {
  2111.       jam();
  2112.       defineBackupRef(signal, ptr, 
  2113.       DefineBackupRef::FailedToAllocateFileRecord);
  2114.       return;
  2115.     }//if
  2116.     files[i].p->tableId = RNIL;
  2117.     files[i].p->backupPtr = ptr.i;
  2118.     files[i].p->filePointer = RNIL;
  2119.     files[i].p->fileClosing = 0;
  2120.     files[i].p->fileOpened = 0;
  2121.     files[i].p->fileRunning = 0;    
  2122.     files[i].p->scanRunning = 0;
  2123.     files[i].p->errorCode = 0;
  2124.     
  2125.     if(files[i].p->pages.seize(noOfPages[i]) == false) {
  2126.       jam();
  2127.       DEBUG_OUT("Failed to seize " << noOfPages[i] << " pages");
  2128.       defineBackupRef(signal, ptr, DefineBackupRef::FailedToAllocateBuffers);
  2129.       return;
  2130.     }//if
  2131.     Page32Ptr pagePtr;
  2132.     files[i].p->pages.getPtr(pagePtr, 0);
  2133.     
  2134.     const char * msg = files[i].p->
  2135.       operation.dataBuffer.setup((Uint32*)pagePtr.p, 
  2136.  noOfPages[i] * (sizeof(Page32) >> 2),
  2137.  128,
  2138.  minWrite[i] >> 2,
  2139.  maxWrite[i] >> 2,
  2140.  maxInsert[i]);
  2141.     if(msg != 0) {
  2142.       jam();
  2143.       defineBackupRef(signal, ptr, DefineBackupRef::FailedToSetupFsBuffers);
  2144.       return;
  2145.     }//if
  2146.   }//for
  2147.   files[0].p->fileType = BackupFormat::CTL_FILE;
  2148.   files[1].p->fileType = BackupFormat::LOG_FILE;
  2149.   files[2].p->fileType = BackupFormat::DATA_FILE;
  2150.   
  2151.   ptr.p->ctlFilePtr = files[0].i;
  2152.   ptr.p->logFilePtr = files[1].i;
  2153.   ptr.p->dataFilePtr = files[2].i;
  2154.   
  2155.   if (!verifyNodesAlive(ptr, ptr.p->nodes)) {
  2156.     jam();
  2157.     defineBackupRef(signal, ptr, DefineBackupRef::Undefined);
  2158.     return;
  2159.   }//if
  2160.   if (ERROR_INSERTED(10027)) {
  2161.     jam();
  2162.     defineBackupRef(signal, ptr, 327);
  2163.     return;
  2164.   }//if
  2165.   if(ptr.p->backupDataLen == 0) {
  2166.     jam();
  2167.     backupAllData(signal, ptr);
  2168.     return;
  2169.   }//if
  2170.   
  2171.   /**
  2172.    * Not implemented
  2173.    */
  2174.   ndbrequire(0);
  2175. }
  2176. void
  2177. Backup::backupAllData(Signal* signal, BackupRecordPtr ptr)
  2178. {
  2179.   /**
  2180.    * Get all tables from dict
  2181.    */
  2182.   ListTablesReq * req = (ListTablesReq*)signal->getDataPtrSend();
  2183.   req->senderRef = reference();
  2184.   req->senderData = ptr.i;
  2185.   req->requestData = 0;
  2186.   sendSignal(DBDICT_REF, GSN_LIST_TABLES_REQ, signal, 
  2187.      ListTablesReq::SignalLength, JBB);
  2188. }
  2189. void
  2190. Backup::execLIST_TABLES_CONF(Signal* signal)
  2191. {
  2192.   jamEntry();
  2193.   
  2194.   ListTablesConf* conf = (ListTablesConf*)signal->getDataPtr();
  2195.   BackupRecordPtr ptr;
  2196.   c_backupPool.getPtr(ptr, conf->senderData);
  2197.   
  2198.   const Uint32 len = signal->length() - ListTablesConf::HeaderLength;
  2199.   for(unsigned int i = 0; i<len; i++) {
  2200.     jam();
  2201.     Uint32 tableId = ListTablesConf::getTableId(conf->tableData[i]);
  2202.     Uint32 tableType = ListTablesConf::getTableType(conf->tableData[i]);
  2203.     Uint32 state= ListTablesConf::getTableState(conf->tableData[i]);
  2204.     if (!DictTabInfo::isTable(tableType) && !DictTabInfo::isIndex(tableType)){
  2205.       jam();
  2206.       continue;
  2207.     }//if
  2208.     if (state != DictTabInfo::StateOnline)
  2209.     {
  2210.       jam();
  2211.       continue;
  2212.     }//if
  2213.     TablePtr tabPtr;
  2214.     ptr.p->tables.seize(tabPtr);
  2215.     if(tabPtr.i == RNIL) {
  2216.       jam();
  2217.       defineBackupRef(signal, ptr, DefineBackupRef::FailedToAllocateTables);
  2218.       return;
  2219.     }//if
  2220.     tabPtr.p->tableId = tableId;
  2221.     tabPtr.p->tableType = tableType;
  2222.   }//for
  2223.   
  2224.   if(len == ListTablesConf::DataLength) {
  2225.     jam();
  2226.     /**
  2227.      * Not finished...
  2228.      */
  2229.     return;
  2230.   }//if
  2231.   /**
  2232.    * All tables fetched
  2233.    */
  2234.   openFiles(signal, ptr);
  2235. }
  2236. void
  2237. Backup::openFiles(Signal* signal, BackupRecordPtr ptr)
  2238. {
  2239.   jam();
  2240.   BackupFilePtr filePtr;
  2241.   FsOpenReq * req = (FsOpenReq *)signal->getDataPtrSend();
  2242.   req->userReference = reference();
  2243.   req->fileFlags = 
  2244.     FsOpenReq::OM_WRITEONLY | 
  2245.     FsOpenReq::OM_TRUNCATE |
  2246.     FsOpenReq::OM_CREATE | 
  2247.     FsOpenReq::OM_APPEND |
  2248.     FsOpenReq::OM_SYNC;
  2249.   FsOpenReq::v2_setCount(req->fileNumber, 0xFFFFFFFF);
  2250.   
  2251.   /**
  2252.    * Ctl file
  2253.    */
  2254.   c_backupFilePool.getPtr(filePtr, ptr.p->ctlFilePtr);
  2255.   ndbrequire(filePtr.p->fileRunning == 0);
  2256.   filePtr.p->fileRunning = 1;
  2257.   req->userPointer = filePtr.i;
  2258.   FsOpenReq::setVersion(req->fileNumber, 2);
  2259.   FsOpenReq::setSuffix(req->fileNumber, FsOpenReq::S_CTL);
  2260.   FsOpenReq::v2_setSequence(req->fileNumber, ptr.p->backupId);
  2261.   FsOpenReq::v2_setNodeId(req->fileNumber, getOwnNodeId());
  2262.   sendSignal(NDBFS_REF, GSN_FSOPENREQ, signal, FsOpenReq::SignalLength, JBA);
  2263.   /**
  2264.    * Log file
  2265.    */
  2266.   c_backupFilePool.getPtr(filePtr, ptr.p->logFilePtr);
  2267.   ndbrequire(filePtr.p->fileRunning == 0);
  2268.   filePtr.p->fileRunning = 1;
  2269.   
  2270.   req->userPointer = filePtr.i;
  2271.   FsOpenReq::setVersion(req->fileNumber, 2);
  2272.   FsOpenReq::setSuffix(req->fileNumber, FsOpenReq::S_LOG);
  2273.   FsOpenReq::v2_setSequence(req->fileNumber, ptr.p->backupId);
  2274.   FsOpenReq::v2_setNodeId(req->fileNumber, getOwnNodeId());
  2275.   sendSignal(NDBFS_REF, GSN_FSOPENREQ, signal, FsOpenReq::SignalLength, JBA);
  2276.   /**
  2277.    * Data file
  2278.    */
  2279.   c_backupFilePool.getPtr(filePtr, ptr.p->dataFilePtr);
  2280.   ndbrequire(filePtr.p->fileRunning == 0);
  2281.   filePtr.p->fileRunning = 1;
  2282.   req->userPointer = filePtr.i;
  2283.   FsOpenReq::setVersion(req->fileNumber, 2);
  2284.   FsOpenReq::setSuffix(req->fileNumber, FsOpenReq::S_DATA);
  2285.   FsOpenReq::v2_setSequence(req->fileNumber, ptr.p->backupId);
  2286.   FsOpenReq::v2_setNodeId(req->fileNumber, getOwnNodeId());
  2287.   FsOpenReq::v2_setCount(req->fileNumber, 0);
  2288.   sendSignal(NDBFS_REF, GSN_FSOPENREQ, signal, FsOpenReq::SignalLength, JBA);
  2289. }
  2290. void
  2291. Backup::execFSOPENREF(Signal* signal)
  2292. {
  2293.   jamEntry();
  2294.   FsRef * ref = (FsRef *)signal->getDataPtr();
  2295.   
  2296.   const Uint32 userPtr = ref->userPointer;
  2297.   
  2298.   BackupFilePtr filePtr;
  2299.   c_backupFilePool.getPtr(filePtr, userPtr);
  2300.   
  2301.   BackupRecordPtr ptr;
  2302.   c_backupPool.getPtr(ptr, filePtr.p->backupPtr);
  2303.   ptr.p->setErrorCode(ref->errorCode);
  2304.   openFilesReply(signal, ptr, filePtr);
  2305. }
  2306. void
  2307. Backup::execFSOPENCONF(Signal* signal)
  2308. {
  2309.   jamEntry();
  2310.   
  2311.   FsConf * conf = (FsConf *)signal->getDataPtr();
  2312.   
  2313.   const Uint32 userPtr = conf->userPointer;
  2314.   const Uint32 filePointer = conf->filePointer;
  2315.   
  2316.   BackupFilePtr filePtr;
  2317.   c_backupFilePool.getPtr(filePtr, userPtr);
  2318.   filePtr.p->filePointer = filePointer; 
  2319.   
  2320.   BackupRecordPtr ptr;
  2321.   c_backupPool.getPtr(ptr, filePtr.p->backupPtr);
  2322.   ndbrequire(filePtr.p->fileOpened == 0);
  2323.   filePtr.p->fileOpened = 1;
  2324.   openFilesReply(signal, ptr, filePtr);
  2325. }
  2326. void
  2327. Backup::openFilesReply(Signal* signal, 
  2328.        BackupRecordPtr ptr, BackupFilePtr filePtr)
  2329. {
  2330.   jam();
  2331.   /**
  2332.    * Mark files as "opened"
  2333.    */
  2334.   ndbrequire(filePtr.p->fileRunning == 1);
  2335.   filePtr.p->fileRunning = 0;
  2336.   
  2337.   /**
  2338.    * Check if all files have recived open_reply
  2339.    */
  2340.   for(ptr.p->files.first(filePtr); filePtr.i!=RNIL;ptr.p->files.next(filePtr)) 
  2341.   {
  2342.     jam();
  2343.     if(filePtr.p->fileRunning == 1) {
  2344.       jam();
  2345.       return;
  2346.     }//if
  2347.   }//for
  2348.   /**
  2349.    * Did open succeed for all files
  2350.    */
  2351.   if(ptr.p->checkError()) {
  2352.     jam();
  2353.     defineBackupRef(signal, ptr);
  2354.     return;
  2355.   }//if
  2356.   /**
  2357.    * Insert file headers
  2358.    */
  2359.   ptr.p->files.getPtr(filePtr, ptr.p->ctlFilePtr);
  2360.   if(!insertFileHeader(BackupFormat::CTL_FILE, ptr.p, filePtr.p)) {
  2361.     jam();
  2362.     defineBackupRef(signal, ptr, DefineBackupRef::FailedInsertFileHeader);
  2363.     return;
  2364.   }//if
  2365.   ptr.p->files.getPtr(filePtr, ptr.p->logFilePtr);
  2366.   if(!insertFileHeader(BackupFormat::LOG_FILE, ptr.p, filePtr.p)) {
  2367.     jam();
  2368.     defineBackupRef(signal, ptr, DefineBackupRef::FailedInsertFileHeader);
  2369.     return;
  2370.   }//if
  2371.   ptr.p->files.getPtr(filePtr, ptr.p->dataFilePtr);
  2372.   if(!insertFileHeader(BackupFormat::DATA_FILE, ptr.p, filePtr.p)) {
  2373.     jam();
  2374.     defineBackupRef(signal, ptr, DefineBackupRef::FailedInsertFileHeader);
  2375.     return;
  2376.   }//if
  2377.   /**
  2378.    * Start CTL file thread
  2379.    */
  2380.   ptr.p->files.getPtr(filePtr, ptr.p->ctlFilePtr);
  2381.   filePtr.p->fileRunning = 1;
  2382.   
  2383.   signal->theData[0] = BackupContinueB::START_FILE_THREAD;
  2384.   signal->theData[1] = ptr.p->ctlFilePtr;
  2385.   sendSignalWithDelay(BACKUP_REF, GSN_CONTINUEB, signal, 100, 2);
  2386.   /**
  2387.    * Insert table list in ctl file
  2388.    */
  2389.   FsBuffer & buf = filePtr.p->operation.dataBuffer;
  2390.   const Uint32 sz = 
  2391.     (sizeof(BackupFormat::CtlFile::TableList) >> 2) +
  2392.     ptr.p->tables.noOfElements() - 1;
  2393.   
  2394.   Uint32 * dst;
  2395.   ndbrequire(sz < buf.getMaxWrite());
  2396.   if(!buf.getWritePtr(&dst, sz)) {
  2397.     jam();
  2398.     defineBackupRef(signal, ptr, DefineBackupRef::FailedInsertTableList);
  2399.     return;
  2400.   }//if
  2401.   
  2402.   BackupFormat::CtlFile::TableList* tl = 
  2403.     (BackupFormat::CtlFile::TableList*)dst;
  2404.   tl->SectionType   = htonl(BackupFormat::TABLE_LIST);
  2405.   tl->SectionLength = htonl(sz);
  2406.   TablePtr tabPtr;
  2407.   Uint32 count = 0;
  2408.   for(ptr.p->tables.first(tabPtr); 
  2409.       tabPtr.i != RNIL;
  2410.       ptr.p->tables.next(tabPtr)){
  2411.     jam();
  2412.     tl->TableIds[count] = htonl(tabPtr.p->tableId);
  2413.     count++;
  2414.   }//for
  2415.   
  2416.   buf.updateWritePtr(sz);
  2417.   
  2418.   /**
  2419.    * Start getting table definition data
  2420.    */
  2421.   ndbrequire(ptr.p->tables.first(tabPtr));
  2422.   signal->theData[0] = BackupContinueB::BUFFER_FULL_META;
  2423.   signal->theData[1] = ptr.i;
  2424.   signal->theData[2] = tabPtr.i;
  2425.   sendSignalWithDelay(BACKUP_REF, GSN_CONTINUEB, signal, 100, 3);
  2426.   return;
  2427. }
  2428. bool
  2429. Backup::insertFileHeader(BackupFormat::FileType ft, 
  2430.  BackupRecord * ptrP,
  2431.  BackupFile * filePtrP){
  2432.   FsBuffer & buf = filePtrP->operation.dataBuffer;
  2433.   const Uint32 sz = sizeof(BackupFormat::FileHeader) >> 2;
  2434.   Uint32 * dst;
  2435.   ndbrequire(sz < buf.getMaxWrite());
  2436.   if(!buf.getWritePtr(&dst, sz)) {
  2437.     jam();
  2438.     return false;
  2439.   }//if
  2440.   
  2441.   BackupFormat::FileHeader* header = (BackupFormat::FileHeader*)dst;
  2442.   ndbrequire(sizeof(header->Magic) == sizeof(BACKUP_MAGIC));
  2443.   memcpy(header->Magic, BACKUP_MAGIC, sizeof(BACKUP_MAGIC));
  2444.   header->NdbVersion    = htonl(NDB_VERSION);
  2445.   header->SectionType   = htonl(BackupFormat::FILE_HEADER);
  2446.   header->SectionLength = htonl(sz - 3);
  2447.   header->FileType      = htonl(ft);
  2448.   header->BackupId      = htonl(ptrP->backupId);
  2449.   header->BackupKey_0   = htonl(ptrP->backupKey[0]);
  2450.   header->BackupKey_1   = htonl(ptrP->backupKey[1]);
  2451.   header->ByteOrder     = 0x12345678;
  2452.   
  2453.   buf.updateWritePtr(sz);
  2454.   return true;
  2455. }
  2456. void
  2457. Backup::execGET_TABINFOREF(Signal* signal)
  2458. {
  2459.   GetTabInfoRef * ref = (GetTabInfoRef*)signal->getDataPtr();
  2460.   
  2461.   const Uint32 senderData = ref->senderData;
  2462.   BackupRecordPtr ptr;
  2463.   c_backupPool.getPtr(ptr, senderData);
  2464.   defineBackupRef(signal, ptr, ref->errorCode);
  2465. }
  2466. void
  2467. Backup::execGET_TABINFO_CONF(Signal* signal)
  2468. {
  2469.   jamEntry();
  2470.   if(!assembleFragments(signal)) {
  2471.     jam();
  2472.     return;
  2473.   }//if
  2474.   GetTabInfoConf * const conf = (GetTabInfoConf*)signal->getDataPtr();
  2475.   //const Uint32 senderRef = info->senderRef;
  2476.   const Uint32 len = conf->totalLen;
  2477.   const Uint32 senderData = conf->senderData;
  2478.   BackupRecordPtr ptr;
  2479.   c_backupPool.getPtr(ptr, senderData);
  2480.   
  2481.   SegmentedSectionPtr dictTabInfoPtr;
  2482.   signal->getSection(dictTabInfoPtr, GetTabInfoConf::DICT_TAB_INFO);
  2483.   ndbrequire(dictTabInfoPtr.sz == len);
  2484.   /**
  2485.    * No of pages needed
  2486.    */
  2487.   const Uint32 noPages = (len + sizeof(Page32) - 1) / sizeof(Page32);
  2488.   if(ptr.p->pages.getSize() < noPages) {
  2489.     jam();
  2490.     ptr.p->pages.release();
  2491.     if(ptr.p->pages.seize(noPages) == false) {
  2492.       jam();
  2493.       ptr.p->setErrorCode(DefineBackupRef::FailedAllocateTableMem);
  2494.       ndbrequire(false);
  2495.       releaseSections(signal);
  2496.       defineBackupRef(signal, ptr);
  2497.       return;
  2498.     }//if
  2499.   }//if
  2500.   
  2501.   BackupFilePtr filePtr;
  2502.   ptr.p->files.getPtr(filePtr, ptr.p->ctlFilePtr);
  2503.   FsBuffer & buf = filePtr.p->operation.dataBuffer;
  2504.   { // Write into ctl file
  2505.     Uint32* dst, dstLen = len + 2;
  2506.     if(!buf.getWritePtr(&dst, dstLen)) {
  2507.       jam();
  2508.       ndbrequire(false);
  2509.       ptr.p->setErrorCode(DefineBackupRef::FailedAllocateTableMem);
  2510.       releaseSections(signal);
  2511.       defineBackupRef(signal, ptr);
  2512.       return;
  2513.     }//if
  2514.     if(dst != 0) {
  2515.       jam();
  2516.       BackupFormat::CtlFile::TableDescription * desc = 
  2517.         (BackupFormat::CtlFile::TableDescription*)dst;
  2518.       desc->SectionType = htonl(BackupFormat::TABLE_DESCRIPTION);
  2519.       desc->SectionLength = htonl(len + 2);
  2520.       dst += 2;
  2521.       copy(dst, dictTabInfoPtr);
  2522.       buf.updateWritePtr(dstLen);
  2523.     }//if
  2524.   }
  2525.   
  2526.   ndbrequire(ptr.p->pages.getSize() >= noPages);
  2527.   Page32Ptr pagePtr;
  2528.   ptr.p->pages.getPtr(pagePtr, 0);
  2529.   copy(&pagePtr.p->data[0], dictTabInfoPtr);
  2530.   releaseSections(signal);
  2531.   
  2532.   if(ptr.p->checkError()) {
  2533.     jam();
  2534.     defineBackupRef(signal, ptr);
  2535.     return;
  2536.   }//if
  2537.   TablePtr tabPtr = parseTableDescription(signal, ptr, len);
  2538.   if(tabPtr.i == RNIL) {
  2539.     jam();
  2540.     defineBackupRef(signal, ptr);
  2541.     return;
  2542.   }//if
  2543.   TablePtr tmp = tabPtr;
  2544.   ptr.p->tables.next(tabPtr);
  2545.   if(DictTabInfo::isIndex(tmp.p->tableType))
  2546.   {
  2547.     jam();
  2548.     ptr.p->tables.release(tmp);
  2549.   }
  2550.   else
  2551.   {
  2552.     jam();
  2553.     signal->theData[0] = tmp.p->tableId;
  2554.     signal->theData[1] = 1; // lock
  2555.     EXECUTE_DIRECT(DBDICT, GSN_BACKUP_FRAGMENT_REQ, signal, 2);
  2556.   }
  2557.   if(tabPtr.i == RNIL) {
  2558.     jam();
  2559.     
  2560.     ptr.p->pages.release();
  2561.     
  2562.     ndbrequire(ptr.p->tables.first(tabPtr));
  2563.     signal->theData[0] = RNIL;
  2564.     signal->theData[1] = tabPtr.p->tableId;
  2565.     signal->theData[2] = ptr.i;
  2566.     sendSignal(DBDIH_REF, GSN_DI_FCOUNTREQ, signal, 3, JBB);
  2567.     return;
  2568.   }//if
  2569.   signal->theData[0] = BackupContinueB::BUFFER_FULL_META;
  2570.   signal->theData[1] = ptr.i;
  2571.   signal->theData[2] = tabPtr.i;
  2572.   sendSignalWithDelay(BACKUP_REF, GSN_CONTINUEB, signal, 100, 3);
  2573.   return;
  2574. }
  2575. Backup::TablePtr
  2576. Backup::parseTableDescription(Signal* signal, BackupRecordPtr ptr, Uint32 len)
  2577. {
  2578.   Page32Ptr pagePtr;
  2579.   ptr.p->pages.getPtr(pagePtr, 0);
  2580.   
  2581.   SimplePropertiesLinearReader it(&pagePtr.p->data[0], len);
  2582.   
  2583.   it.first();
  2584.   
  2585.   DictTabInfo::Table tmpTab; tmpTab.init();
  2586.   SimpleProperties::UnpackStatus stat;
  2587.   stat = SimpleProperties::unpack(it, &tmpTab, 
  2588.   DictTabInfo::TableMapping, 
  2589.   DictTabInfo::TableMappingSize, 
  2590.   true, true);
  2591.   ndbrequire(stat == SimpleProperties::Break);
  2592.   
  2593.   TablePtr tabPtr;
  2594.   ndbrequire(findTable(ptr, tabPtr, tmpTab.TableId));
  2595.   if(DictTabInfo::isIndex(tabPtr.p->tableType)){
  2596.     jam();
  2597.     return tabPtr;
  2598.   }
  2599.   
  2600.   /**
  2601.    * Initialize table object
  2602.    */
  2603.   tabPtr.p->frag_mask = RNIL;
  2604.   tabPtr.p->schemaVersion = tmpTab.TableVersion;
  2605.   tabPtr.p->noOfAttributes = tmpTab.NoOfAttributes;
  2606.   tabPtr.p->noOfNull = 0;
  2607.   tabPtr.p->noOfVariable = 0; // Computed while iterating over attribs
  2608.   tabPtr.p->sz_FixedAttributes = 0; // Computed while iterating over attribs
  2609.   tabPtr.p->triggerIds[0] = ILLEGAL_TRIGGER_ID;
  2610.   tabPtr.p->triggerIds[1] = ILLEGAL_TRIGGER_ID;
  2611.   tabPtr.p->triggerIds[2] = ILLEGAL_TRIGGER_ID;
  2612.   tabPtr.p->triggerAllocated[0] = false;
  2613.   tabPtr.p->triggerAllocated[1] = false;
  2614.   tabPtr.p->triggerAllocated[2] = false;
  2615.   if(tabPtr.p->attributes.seize(tabPtr.p->noOfAttributes) == false) {
  2616.     jam();
  2617.     ptr.p->setErrorCode(DefineBackupRef::FailedToAllocateAttributeRecord);
  2618.     tabPtr.i = RNIL;
  2619.     return tabPtr;
  2620.   }//if
  2621.   
  2622.   const Uint32 count = tabPtr.p->noOfAttributes;
  2623.   for(Uint32 i = 0; i<count; i++) {
  2624.     jam();
  2625.     DictTabInfo::Attribute tmp; tmp.init();
  2626.     stat = SimpleProperties::unpack(it, &tmp, 
  2627.     DictTabInfo::AttributeMapping, 
  2628.     DictTabInfo::AttributeMappingSize,
  2629.     true, true);
  2630.     
  2631.     ndbrequire(stat == SimpleProperties::Break);
  2632.     const Uint32 arr = tmp.AttributeArraySize;
  2633.     const Uint32 sz = 1 << tmp.AttributeSize;
  2634.     const Uint32 sz32 = (sz * arr + 31) >> 5;
  2635.     AttributePtr attrPtr;
  2636.     tabPtr.p->attributes.getPtr(attrPtr, tmp.AttributeId);
  2637.     
  2638.     attrPtr.p->data.nullable = tmp.AttributeNullableFlag;
  2639.     attrPtr.p->data.fixed = (tmp.AttributeArraySize != 0);
  2640.     attrPtr.p->data.sz32 = sz32;
  2641.     /**
  2642.      * Either
  2643.      * 1) Fixed
  2644.      * 2) Nullable
  2645.      * 3) Variable
  2646.      */
  2647.     if(attrPtr.p->data.fixed == true && attrPtr.p->data.nullable == false) {
  2648.       jam();
  2649.       attrPtr.p->data.offset = tabPtr.p->sz_FixedAttributes;
  2650.       tabPtr.p->sz_FixedAttributes += sz32;
  2651.     }//if
  2652.     
  2653.     if(attrPtr.p->data.fixed == true && attrPtr.p->data.nullable == true) {
  2654.       jam();
  2655.       attrPtr.p->data.offset = 0;
  2656.       
  2657.       attrPtr.p->data.offsetNull = tabPtr.p->noOfNull;
  2658.       tabPtr.p->noOfNull++;
  2659.       tabPtr.p->noOfVariable++;
  2660.     }//if
  2661.     
  2662.     if(attrPtr.p->data.fixed == false) {
  2663.       jam();
  2664.       tabPtr.p->noOfVariable++;
  2665.       ndbrequire(0);
  2666.     }//if
  2667.     
  2668.     it.next(); // Move Past EndOfAttribute
  2669.   }//for
  2670.   return tabPtr;
  2671. }
  2672. void
  2673. Backup::execDI_FCOUNTCONF(Signal* signal)
  2674. {
  2675.   jamEntry();
  2676.   
  2677.   const Uint32 userPtr = signal->theData[0];
  2678.   const Uint32 fragCount = signal->theData[1];
  2679.   const Uint32 tableId = signal->theData[2];
  2680.   const Uint32 senderData = signal->theData[3];
  2681.   ndbrequire(userPtr == RNIL && signal->length() == 5);
  2682.   
  2683.   BackupRecordPtr ptr;
  2684.   c_backupPool.getPtr(ptr, senderData);
  2685.   TablePtr tabPtr;
  2686.   ndbrequire(findTable(ptr, tabPtr, tableId));
  2687.   
  2688.   ndbrequire(tabPtr.p->fragments.seize(fragCount) != false);
  2689.   tabPtr.p->frag_mask = calculate_frag_mask(fragCount);
  2690.   for(Uint32 i = 0; i<fragCount; i++) {
  2691.     jam();
  2692.     FragmentPtr fragPtr;
  2693.     tabPtr.p->fragments.getPtr(fragPtr, i);
  2694.     fragPtr.p->scanned = 0;
  2695.     fragPtr.p->scanning = 0;
  2696.     fragPtr.p->tableId = tableId;
  2697.     fragPtr.p->node = RNIL;
  2698.   }//for
  2699.   
  2700.   /**
  2701.    * Next table
  2702.    */
  2703.   if(ptr.p->tables.next(tabPtr)) {
  2704.     jam();
  2705.     signal->theData[0] = RNIL;
  2706.     signal->theData[1] = tabPtr.p->tableId;
  2707.     signal->theData[2] = ptr.i;
  2708.     sendSignal(DBDIH_REF, GSN_DI_FCOUNTREQ, signal, 3, JBB);    
  2709.     return;
  2710.   }//if
  2711.   
  2712.   ptr.p->tables.first(tabPtr);
  2713.   getFragmentInfo(signal, ptr, tabPtr, 0);
  2714. }
  2715. void
  2716. Backup::getFragmentInfo(Signal* signal, 
  2717. BackupRecordPtr ptr, TablePtr tabPtr, Uint32 fragNo)
  2718. {
  2719.   jam();
  2720.   
  2721.   for(; tabPtr.i != RNIL; ptr.p->tables.next(tabPtr)) {
  2722.     jam();
  2723.     const Uint32 fragCount = tabPtr.p->fragments.getSize();
  2724.     for(; fragNo < fragCount; fragNo ++) {
  2725.       jam();
  2726.       FragmentPtr fragPtr;
  2727.       tabPtr.p->fragments.getPtr(fragPtr, fragNo);
  2728.       
  2729.       if(fragPtr.p->scanned == 0 && fragPtr.p->scanning == 0) {
  2730. jam();
  2731. signal->theData[0] = RNIL;
  2732. signal->theData[1] = ptr.i;
  2733. signal->theData[2] = tabPtr.p->tableId;
  2734. signal->theData[3] = fragNo;
  2735. sendSignal(DBDIH_REF, GSN_DIGETPRIMREQ, signal, 4, JBB);
  2736. return;
  2737.       }//if
  2738.     }//for
  2739.     fragNo = 0;
  2740.   }//for
  2741.   
  2742.   getFragmentInfoDone(signal, ptr);
  2743. }
  2744. void
  2745. Backup::execDIGETPRIMCONF(Signal* signal)
  2746. {
  2747.   jamEntry();
  2748.   
  2749.   const Uint32 userPtr = signal->theData[0];
  2750.   const Uint32 senderData = signal->theData[1];
  2751.   const Uint32 nodeCount = signal->theData[6];
  2752.   const Uint32 tableId = signal->theData[7];
  2753.   const Uint32 fragNo = signal->theData[8];
  2754.   ndbrequire(userPtr == RNIL && signal->length() == 9);
  2755.   ndbrequire(nodeCount > 0 && nodeCount <= MAX_REPLICAS);
  2756.   
  2757.   BackupRecordPtr ptr;
  2758.   c_backupPool.getPtr(ptr, senderData);
  2759.   TablePtr tabPtr;
  2760.   ndbrequire(findTable(ptr, tabPtr, tableId));
  2761.   FragmentPtr fragPtr;
  2762.   tabPtr.p->fragments.getPtr(fragPtr, fragNo);
  2763.   fragPtr.p->node = signal->theData[2];
  2764.   getFragmentInfo(signal, ptr, tabPtr, fragNo + 1);
  2765. }
  2766. void
  2767. Backup::getFragmentInfoDone(Signal* signal, BackupRecordPtr ptr)
  2768. {
  2769.   ptr.p->m_gsn = GSN_DEFINE_BACKUP_CONF;
  2770.   ptr.p->slaveState.setState(DEFINED);
  2771.   DefineBackupConf * conf = (DefineBackupConf*)signal->getDataPtr();
  2772.   conf->backupPtr = ptr.i;
  2773.   conf->backupId = ptr.p->backupId;
  2774.   sendSignal(ptr.p->masterRef, GSN_DEFINE_BACKUP_CONF, signal,
  2775.      DefineBackupConf::SignalLength, JBB);
  2776. }
  2777. /*****************************************************************************
  2778.  * 
  2779.  * Slave functionallity: Start backup
  2780.  *
  2781.  *****************************************************************************/
  2782. void
  2783. Backup::execSTART_BACKUP_REQ(Signal* signal)
  2784. {
  2785.   jamEntry();
  2786.   CRASH_INSERTION((10015));
  2787.   
  2788.   StartBackupReq* req = (StartBackupReq*)signal->getDataPtr();
  2789.   const Uint32 ptrI = req->backupPtr;
  2790.   //const Uint32 backupId = req->backupId;
  2791.   const Uint32 signalNo = req->signalNo;
  2792.   
  2793.   BackupRecordPtr ptr;
  2794.   c_backupPool.getPtr(ptr, ptrI);
  2795.   
  2796.   ptr.p->slaveState.setState(STARTED);
  2797.   ptr.p->m_gsn = GSN_START_BACKUP_REQ;
  2798.   for(Uint32 i = 0; i<req->noOfTableTriggers; i++) {
  2799.     jam();
  2800.     TablePtr tabPtr;
  2801.     ndbrequire(findTable(ptr, tabPtr, req->tableTriggers[i].tableId));
  2802.     for(Uint32 j = 0; j<3; j++) {
  2803.       jam();
  2804.       const Uint32 triggerId = req->tableTriggers[i].triggerIds[j];
  2805.       tabPtr.p->triggerIds[j] = triggerId;
  2806.       
  2807.       TriggerPtr trigPtr;
  2808.       if(!ptr.p->triggers.seizeId(trigPtr, triggerId)) {
  2809.         jam();
  2810. ptr.p->m_gsn = GSN_START_BACKUP_REF;
  2811. StartBackupRef* ref = (StartBackupRef*)signal->getDataPtrSend();
  2812. ref->backupPtr = ptr.i;
  2813. ref->backupId = ptr.p->backupId;
  2814. ref->signalNo = signalNo;
  2815. ref->errorCode = StartBackupRef::FailedToAllocateTriggerRecord;
  2816. ref->nodeId = getOwnNodeId();
  2817. sendSignal(ptr.p->masterRef, GSN_START_BACKUP_REF, signal,
  2818.    StartBackupRef::SignalLength, JBB);
  2819. return;
  2820.       }//if
  2821.       tabPtr.p->triggerAllocated[j] = true;
  2822.       trigPtr.p->backupPtr = ptr.i;
  2823.       trigPtr.p->tableId = tabPtr.p->tableId;
  2824.       trigPtr.p->tab_ptr_i = tabPtr.i;
  2825.       trigPtr.p->logEntry = 0;
  2826.       trigPtr.p->event = j;
  2827.       trigPtr.p->maxRecordSize = 2048;
  2828.       trigPtr.p->operation = 
  2829. &ptr.p->files.getPtr(ptr.p->logFilePtr)->operation;
  2830.       trigPtr.p->operation->noOfBytes = 0;
  2831.       trigPtr.p->operation->noOfRecords = 0;
  2832.       trigPtr.p->errorCode = 0;
  2833.     }//for
  2834.   }//for
  2835.   
  2836.   /**
  2837.    * Start file threads...
  2838.    */
  2839.   BackupFilePtr filePtr;
  2840.   for(ptr.p->files.first(filePtr); 
  2841.       filePtr.i!=RNIL; 
  2842.       ptr.p->files.next(filePtr)){
  2843.     jam();
  2844.     if(filePtr.p->fileRunning == 0) {
  2845.       jam();
  2846.       filePtr.p->fileRunning = 1;
  2847.       signal->theData[0] = BackupContinueB::START_FILE_THREAD;
  2848.       signal->theData[1] = filePtr.i;
  2849.       sendSignalWithDelay(BACKUP_REF, GSN_CONTINUEB, signal, 100, 2);
  2850.     }//if
  2851.   }//for
  2852.   
  2853.   ptr.p->m_gsn = GSN_START_BACKUP_CONF;
  2854.   StartBackupConf* conf = (StartBackupConf*)signal->getDataPtrSend();
  2855.   conf->backupPtr = ptr.i;
  2856.   conf->backupId = ptr.p->backupId;
  2857.   conf->signalNo = signalNo;
  2858.   sendSignal(ptr.p->masterRef, GSN_START_BACKUP_CONF, signal,
  2859.      StartBackupConf::SignalLength, JBB);
  2860. }
  2861. /*****************************************************************************
  2862.  * 
  2863.  * Slave functionallity: Backup fragment
  2864.  *
  2865.  *****************************************************************************/
  2866. void
  2867. Backup::execBACKUP_FRAGMENT_REQ(Signal* signal)
  2868. {
  2869.   jamEntry();
  2870.   BackupFragmentReq* req = (BackupFragmentReq*)signal->getDataPtr();
  2871.   CRASH_INSERTION((10016));
  2872.   const Uint32 ptrI = req->backupPtr;
  2873.   //const Uint32 backupId = req->backupId;
  2874.   const Uint32 tableId = req->tableId;
  2875.   const Uint32 fragNo = req->fragmentNo;
  2876.   const Uint32 count = req->count;
  2877.   
  2878.   /**
  2879.    * Get backup record
  2880.    */
  2881.   BackupRecordPtr ptr;
  2882.   c_backupPool.getPtr(ptr, ptrI);
  2883.   ptr.p->slaveState.setState(SCANNING);
  2884.   ptr.p->m_gsn = GSN_BACKUP_FRAGMENT_REQ;
  2885.   /**
  2886.    * Get file
  2887.    */
  2888.   BackupFilePtr filePtr;
  2889.   c_backupFilePool.getPtr(filePtr, ptr.p->dataFilePtr);
  2890.   
  2891.   ndbrequire(filePtr.p->backupPtr == ptrI);
  2892.   ndbrequire(filePtr.p->fileOpened == 1);
  2893.   ndbrequire(filePtr.p->fileRunning == 1);
  2894.   ndbrequire(filePtr.p->scanRunning == 0);
  2895.   ndbrequire(filePtr.p->fileClosing == 0);
  2896.   
  2897.   /**
  2898.    * Get table
  2899.    */
  2900.   TablePtr tabPtr;
  2901.   ndbrequire(findTable(ptr, tabPtr, tableId));
  2902.   /**
  2903.    * Get fragment
  2904.    */
  2905.   FragmentPtr fragPtr;
  2906.   tabPtr.p->fragments.getPtr(fragPtr, fragNo);
  2907.   ndbrequire(fragPtr.p->scanned == 0);
  2908.   ndbrequire(fragPtr.p->scanning == 0 || 
  2909.      refToNode(ptr.p->masterRef) == getOwnNodeId());
  2910.   
  2911.   /**
  2912.    * Init operation
  2913.    */
  2914.   if(filePtr.p->tableId != tableId) {
  2915.     jam();
  2916.     filePtr.p->operation.init(tabPtr);
  2917.     filePtr.p->tableId = tableId;
  2918.   }//if
  2919.   
  2920.   /**
  2921.    * Check for space in buffer
  2922.    */
  2923.   if(!filePtr.p->operation.newFragment(tableId, fragNo)) {
  2924.     jam();
  2925.     req->count = count + 1;
  2926.     sendSignalWithDelay(BACKUP_REF, GSN_BACKUP_FRAGMENT_REQ, signal, 50,
  2927. signal->length());
  2928.     ptr.p->slaveState.setState(STARTED);
  2929.     return;
  2930.   }//if
  2931.   
  2932.   /**
  2933.    * Mark things as "in use"
  2934.    */
  2935.   fragPtr.p->scanning = 1;
  2936.   filePtr.p->fragmentNo = fragNo;
  2937.   /**
  2938.    * Start scan
  2939.    */
  2940.   {
  2941.     filePtr.p->scanRunning = 1;
  2942.     
  2943.     Table & table = * tabPtr.p;
  2944.     ScanFragReq * req = (ScanFragReq *)signal->getDataPtrSend();
  2945.     const Uint32 parallelism = 16;
  2946.     const Uint32 attrLen = 5 + table.noOfAttributes;
  2947.     req->senderData = filePtr.i;
  2948.     req->resultRef = reference();
  2949.     req->schemaVersion = table.schemaVersion;
  2950.     req->fragmentNoKeyLen = fragNo;
  2951.     req->requestInfo = 0;
  2952.     req->savePointId = 0;
  2953.     req->tableId = table.tableId;
  2954.     ScanFragReq::setReadCommittedFlag(req->requestInfo, 1);
  2955.     ScanFragReq::setLockMode(req->requestInfo, 0);
  2956.     ScanFragReq::setHoldLockFlag(req->requestInfo, 0);
  2957.     ScanFragReq::setKeyinfoFlag(req->requestInfo, 0);
  2958.     ScanFragReq::setAttrLen(req->requestInfo,attrLen); 
  2959.     req->transId1 = 0;
  2960.     req->transId2 = (BACKUP << 20) + (getOwnNodeId() << 8);
  2961.     req->clientOpPtr= filePtr.i;
  2962.     req->batch_size_rows= parallelism;
  2963.     req->batch_size_bytes= 0;
  2964.     sendSignal(DBLQH_REF, GSN_SCAN_FRAGREQ, signal,
  2965.                ScanFragReq::SignalLength, JBB);
  2966.     
  2967.     signal->theData[0] = filePtr.i;
  2968.     signal->theData[1] = 0;
  2969.     signal->theData[2] = (BACKUP << 20) + (getOwnNodeId() << 8);
  2970.     
  2971.     // Return all
  2972.     signal->theData[3] = table.noOfAttributes;
  2973.     signal->theData[4] = 0;
  2974.     signal->theData[5] = 0;
  2975.     signal->theData[6] = 0;
  2976.     signal->theData[7] = 0;
  2977.     
  2978.     Uint32 dataPos = 8;
  2979.     Uint32 i;
  2980.     for(i = 0; i<table.noOfAttributes; i++) {
  2981.       jam();
  2982.       AttributePtr attr;
  2983.       table.attributes.getPtr(attr, i);
  2984.       
  2985.       AttributeHeader::init(&signal->theData[dataPos], i, 0);
  2986.       dataPos++;
  2987.       if(dataPos == 25) {
  2988.         jam();
  2989. sendSignal(DBLQH_REF, GSN_ATTRINFO, signal, 25, JBB);
  2990. dataPos = 3;
  2991.       }//if
  2992.     }//for
  2993.     if(dataPos != 3) {
  2994.       jam();
  2995.       sendSignal(DBLQH_REF, GSN_ATTRINFO, signal, dataPos, JBB);
  2996.     }//if
  2997.   }
  2998. }
  2999. void
  3000. Backup::execSCAN_HBREP(Signal* signal)
  3001. {
  3002.   jamEntry();
  3003. }
  3004. void
  3005. Backup::execTRANSID_AI(Signal* signal)
  3006. {
  3007.   jamEntry();
  3008.   const Uint32 filePtrI = signal->theData[0];
  3009.   //const Uint32 transId1 = signal->theData[1];
  3010.   //const Uint32 transId2 = signal->theData[2];
  3011.   const Uint32 dataLen  = signal->length() - 3;
  3012.   
  3013.   BackupFilePtr filePtr;
  3014.   c_backupFilePool.getPtr(filePtr, filePtrI);
  3015.   OperationRecord & op = filePtr.p->operation;
  3016.   
  3017.   TablePtr tabPtr;
  3018.   c_tablePool.getPtr(tabPtr, op.tablePtr);
  3019.   
  3020.   Table & table = * tabPtr.p;
  3021.   
  3022.   /**
  3023.    * Unpack data
  3024.    */
  3025.   op.attrSzTotal += dataLen;
  3026.   Uint32 srcSz = dataLen;
  3027.   const Uint32 * src = &signal->theData[3];
  3028.   Uint32 * dst = op.dst;
  3029.   Uint32 dstSz = op.attrSzLeft;
  3030.   
  3031.   while(srcSz > 0) {
  3032.     jam();
  3033.     if(dstSz == 0) {
  3034.       jam();
  3035.       /**
  3036.        * Finished with one attribute now find next
  3037.        */
  3038.       const AttributeHeader attrHead(* src);
  3039.       const Uint32 attrId = attrHead.getAttributeId();
  3040.       const bool null = attrHead.isNULL();
  3041.       const Attribute::Data attr = table.attributes.getPtr(attrId)->data;
  3042.       
  3043.       srcSz -= attrHead.getHeaderSize();
  3044.       src   += attrHead.getHeaderSize();
  3045.       
  3046.       if(null) {
  3047. jam();
  3048. ndbrequire(attr.nullable);
  3049. op.nullAttribute(attr.offsetNull);
  3050. dstSz = 0;
  3051. continue;
  3052.       }//if
  3053.       
  3054.       dstSz = attrHead.getDataSize();
  3055.       ndbrequire(dstSz == attr.sz32);
  3056.       if(attr.fixed && ! attr.nullable) {
  3057. jam();
  3058. dst = op.newAttrib(attr.offset, dstSz);
  3059.       } else if (attr.fixed && attr.nullable) {
  3060. jam();
  3061. dst = op.newNullable(attrId, dstSz);
  3062.       } else {
  3063. ndbrequire(false);
  3064. //dst = op.newVariable(attrId, attrSize);
  3065.       }//if
  3066.     }//if
  3067.     
  3068.     const Uint32 szCopy = (dstSz > srcSz) ? srcSz : dstSz;
  3069.     memcpy(dst, src, (szCopy << 2));
  3070.     srcSz -= szCopy;
  3071.     dstSz -= szCopy;
  3072.     src   += szCopy;
  3073.     dst   += szCopy;
  3074.   }//while
  3075.   op.dst        = dst;
  3076.   op.attrSzLeft = dstSz;
  3077.   
  3078.   if(op.finished()){
  3079.     jam();
  3080.     op.newRecord(op.dst);
  3081.   }
  3082. }
  3083. void 
  3084. Backup::OperationRecord::init(const TablePtr & ptr)
  3085. {
  3086.   
  3087.   tablePtr = ptr.i;
  3088.   noOfAttributes = ptr.p->noOfAttributes;
  3089.   
  3090.   sz_Bitmask = (ptr.p->noOfNull + 31) >> 5;
  3091.   sz_FixedAttribs = ptr.p->sz_FixedAttributes;
  3092.   if(ptr.p->noOfVariable == 0) {
  3093.     jam();
  3094.     maxRecordSize = 1 + sz_Bitmask + sz_FixedAttribs;
  3095.   } else {
  3096.     jam();
  3097.     maxRecordSize = 
  3098.       1 + sz_Bitmask + 2048 /* Max tuple size */ + 2 * ptr.p->noOfVariable;
  3099.   }//if
  3100. }
  3101. bool
  3102. Backup::OperationRecord::newFragment(Uint32 tableId, Uint32 fragNo)
  3103. {
  3104.   Uint32 * tmp;
  3105.   const Uint32 headSz = (sizeof(BackupFormat::DataFile::FragmentHeader) >> 2);
  3106.   const Uint32 sz = headSz + 16 * maxRecordSize;
  3107.   
  3108.   ndbrequire(sz < dataBuffer.getMaxWrite());
  3109.   if(dataBuffer.getWritePtr(&tmp, sz)) {
  3110.     jam();
  3111.     BackupFormat::DataFile::FragmentHeader * head = 
  3112.       (BackupFormat::DataFile::FragmentHeader*)tmp;
  3113.     head->SectionType   = htonl(BackupFormat::FRAGMENT_HEADER);
  3114.     head->SectionLength = htonl(headSz);
  3115.     head->TableId       = htonl(tableId);
  3116.     head->FragmentNo    = htonl(fragNo);
  3117.     head->ChecksumType  = htonl(0);
  3118.     opNoDone = opNoConf = opLen = 0;
  3119.     newRecord(tmp + headSz);
  3120.     scanStart = tmp;
  3121.     scanStop  = (tmp + headSz);
  3122.     
  3123.     noOfRecords = 0;
  3124.     noOfBytes = 0;
  3125.     return true;
  3126.   }//if
  3127.   return false;
  3128. }
  3129. bool
  3130. Backup::OperationRecord::fragComplete(Uint32 tableId, Uint32 fragNo)
  3131. {
  3132.   Uint32 * tmp;
  3133.   const Uint32 footSz = sizeof(BackupFormat::DataFile::FragmentFooter) >> 2;
  3134.   if(dataBuffer.getWritePtr(&tmp, footSz + 1)) {
  3135.     jam();
  3136.     * tmp = 0; // Finish record stream
  3137.     tmp++;
  3138.     BackupFormat::DataFile::FragmentFooter * foot = 
  3139.       (BackupFormat::DataFile::FragmentFooter*)tmp;
  3140.     foot->SectionType   = htonl(BackupFormat::FRAGMENT_FOOTER);
  3141.     foot->SectionLength = htonl(footSz);
  3142.     foot->TableId       = htonl(tableId);
  3143.     foot->FragmentNo    = htonl(fragNo);
  3144.     foot->NoOfRecords   = htonl(noOfRecords);
  3145.     foot->Checksum      = htonl(0);
  3146.     dataBuffer.updateWritePtr(footSz + 1);
  3147.     return true;
  3148.   }//if
  3149.   return false;
  3150. }
  3151. bool
  3152. Backup::OperationRecord::newScan()
  3153. {
  3154.   Uint32 * tmp;
  3155.   ndbrequire(16 * maxRecordSize < dataBuffer.getMaxWrite());
  3156.   if(dataBuffer.getWritePtr(&tmp, 16 * maxRecordSize)) {
  3157.     jam();
  3158.     opNoDone = opNoConf = opLen = 0;
  3159.     newRecord(tmp);
  3160.     scanStart = tmp;
  3161.     scanStop = tmp;
  3162.     return true;
  3163.   }//if
  3164.   return false;
  3165. }
  3166. bool
  3167. Backup::OperationRecord::closeScan()
  3168. {
  3169.   opNoDone = opNoConf = opLen = 0;
  3170.   return true;
  3171. }
  3172. bool 
  3173. Backup::OperationRecord::scanConf(Uint32 noOfOps, Uint32 total_len)
  3174. {
  3175.   const Uint32 done = opNoDone-opNoConf;
  3176.   
  3177.   ndbrequire(noOfOps == done);
  3178.   ndbrequire(opLen == total_len);
  3179.   opNoConf = opNoDone;
  3180.   
  3181.   const Uint32 len = (scanStop - scanStart);
  3182.   ndbrequire(len < dataBuffer.getMaxWrite());
  3183.   dataBuffer.updateWritePtr(len);
  3184.   noOfBytes += (len << 2);
  3185.   return true;
  3186. }
  3187. void
  3188. Backup::execSCAN_FRAGREF(Signal* signal)
  3189. {
  3190.   jamEntry();
  3191.   ScanFragRef * ref = (ScanFragRef*)signal->getDataPtr();
  3192.   
  3193.   const Uint32 filePtrI = ref->senderData;
  3194.   BackupFilePtr filePtr;
  3195.   c_backupFilePool.getPtr(filePtr, filePtrI);
  3196.   
  3197.   filePtr.p->errorCode = ref->errorCode;
  3198.   filePtr.p->scanRunning = 0;
  3199.   
  3200.   backupFragmentRef(signal, filePtr);
  3201. }
  3202. void
  3203. Backup::execSCAN_FRAGCONF(Signal* signal)
  3204. {
  3205.   jamEntry();
  3206.   CRASH_INSERTION((10017));
  3207.   ScanFragConf * conf = (ScanFragConf*)signal->getDataPtr();
  3208.   
  3209.   const Uint32 filePtrI = conf->senderData;
  3210.   BackupFilePtr filePtr;
  3211.   c_backupFilePool.getPtr(filePtr, filePtrI);
  3212.   OperationRecord & op = filePtr.p->operation;
  3213.   
  3214.   op.scanConf(conf->completedOps, conf->total_len);
  3215.   const Uint32 completed = conf->fragmentCompleted;
  3216.   if(completed != 2) {
  3217.     jam();
  3218.     
  3219.     checkScan(signal, filePtr);
  3220.     return;
  3221.   }//if
  3222.   fragmentCompleted(signal, filePtr);
  3223. }
  3224. void
  3225. Backup::fragmentCompleted(Signal* signal, BackupFilePtr filePtr)
  3226. {
  3227.   jam();
  3228.   if(filePtr.p->errorCode != 0)
  3229.   {
  3230.     jam();    
  3231.     filePtr.p->scanRunning = 0;
  3232.     backupFragmentRef(signal, filePtr); // Scan completed
  3233.     return;
  3234.   }//if
  3235.     
  3236.   OperationRecord & op = filePtr.p->operation;
  3237.   if(!op.fragComplete(filePtr.p->tableId, filePtr.p->fragmentNo)) {
  3238.     jam();
  3239.     signal->theData[0] = BackupContinueB::BUFFER_FULL_FRAG_COMPLETE;
  3240.     signal->theData[1] = filePtr.i;
  3241.     sendSignalWithDelay(BACKUP_REF, GSN_CONTINUEB, signal, 50, 2);
  3242.     return;
  3243.   }//if
  3244.   
  3245.   filePtr.p->scanRunning = 0;
  3246.   
  3247.   BackupRecordPtr ptr;
  3248.   c_backupPool.getPtr(ptr, filePtr.p->backupPtr);
  3249.   BackupFragmentConf * conf = (BackupFragmentConf*)signal->getDataPtrSend();
  3250.   conf->backupId = ptr.p->backupId;
  3251.   conf->backupPtr = ptr.i;
  3252.   conf->tableId = filePtr.p->tableId;
  3253.   conf->fragmentNo = filePtr.p->fragmentNo;
  3254.   conf->noOfRecords = op.noOfRecords;
  3255.   conf->noOfBytes = op.noOfBytes;
  3256.   sendSignal(ptr.p->masterRef, GSN_BACKUP_FRAGMENT_CONF, signal,
  3257.      BackupFragmentConf::SignalLength, JBB);
  3258.   
  3259.   ptr.p->m_gsn = GSN_BACKUP_FRAGMENT_CONF;
  3260.   ptr.p->slaveState.setState(STARTED);
  3261.   return;
  3262. }
  3263. void
  3264. Backup::backupFragmentRef(Signal * signal, BackupFilePtr filePtr)
  3265. {
  3266.   BackupRecordPtr ptr;
  3267.   c_backupPool.getPtr(ptr, filePtr.p->backupPtr);
  3268.   ptr.p->m_gsn = GSN_BACKUP_FRAGMENT_REF;
  3269.   
  3270.   BackupFragmentRef * ref = (BackupFragmentRef*)signal->getDataPtrSend();
  3271.   ref->backupId = ptr.p->backupId;
  3272.   ref->backupPtr = ptr.i;
  3273.   ref->nodeId = getOwnNodeId();
  3274.   ref->errorCode = filePtr.p->errorCode;
  3275.   sendSignal(ptr.p->masterRef, GSN_BACKUP_FRAGMENT_REF, signal,
  3276.      BackupFragmentRef::SignalLength, JBB);
  3277. }
  3278.  
  3279. void
  3280. Backup::checkScan(Signal* signal, BackupFilePtr filePtr)
  3281. {  
  3282.   OperationRecord & op = filePtr.p->operation;
  3283.   if(filePtr.p->errorCode != 0)
  3284.   {
  3285.     jam();
  3286.     /**
  3287.      * Close scan
  3288.      */
  3289.     op.closeScan();
  3290.     ScanFragNextReq * req = (ScanFragNextReq *)signal->getDataPtrSend();
  3291.     req->senderData = filePtr.i;
  3292.     req->closeFlag = 1;
  3293.     req->transId1 = 0;
  3294.     req->transId2 = (BACKUP << 20) + (getOwnNodeId() << 8);
  3295.     sendSignal(DBLQH_REF, GSN_SCAN_NEXTREQ, signal, 
  3296.        ScanFragNextReq::SignalLength, JBB);
  3297.     return;
  3298.   }//if
  3299.   
  3300.   if(op.newScan()) {
  3301.     jam();
  3302.     
  3303.     ScanFragNextReq * req = (ScanFragNextReq *)signal->getDataPtrSend();
  3304.     req->senderData = filePtr.i;
  3305.     req->closeFlag = 0;
  3306.     req->transId1 = 0;
  3307.     req->transId2 = (BACKUP << 20) + (getOwnNodeId() << 8);
  3308.     req->batch_size_rows= 16;
  3309.     req->batch_size_bytes= 0;
  3310.     if(ERROR_INSERTED(10032))
  3311.       sendSignalWithDelay(DBLQH_REF, GSN_SCAN_NEXTREQ, signal, 
  3312.   100, ScanFragNextReq::SignalLength);
  3313.     else if(ERROR_INSERTED(10033))
  3314.     {
  3315.       SET_ERROR_INSERT_VALUE(10032);
  3316.       sendSignalWithDelay(DBLQH_REF, GSN_SCAN_NEXTREQ, signal, 
  3317.   10000, ScanFragNextReq::SignalLength);
  3318.       
  3319.       BackupRecordPtr ptr;
  3320.       c_backupPool.getPtr(ptr, filePtr.p->backupPtr);
  3321.       AbortBackupOrd *ord = (AbortBackupOrd*)signal->getDataPtrSend();
  3322.       ord->backupId = ptr.p->backupId;
  3323.       ord->backupPtr = ptr.i;
  3324.       ord->requestType = AbortBackupOrd::FileOrScanError;
  3325.       ord->senderData= ptr.i;
  3326.       sendSignal(ptr.p->masterRef, GSN_ABORT_BACKUP_ORD, signal, 
  3327.  AbortBackupOrd::SignalLength, JBB);
  3328.     }
  3329.     else
  3330.       sendSignal(DBLQH_REF, GSN_SCAN_NEXTREQ, signal, 
  3331.  ScanFragNextReq::SignalLength, JBB);
  3332.     return;
  3333.   }//if
  3334.   
  3335.   signal->theData[0] = BackupContinueB::BUFFER_FULL_SCAN;
  3336.   signal->theData[1] = filePtr.i;
  3337.   sendSignalWithDelay(BACKUP_REF, GSN_CONTINUEB, signal, 50, 2);
  3338. }
  3339. void
  3340. Backup::execFSAPPENDREF(Signal* signal)
  3341. {
  3342.   jamEntry();
  3343.   
  3344.   FsRef * ref = (FsRef *)signal->getDataPtr();
  3345.   const Uint32 filePtrI = ref->userPointer;
  3346.   const Uint32 errCode = ref->errorCode;
  3347.   
  3348.   BackupFilePtr filePtr;
  3349.   c_backupFilePool.getPtr(filePtr, filePtrI);
  3350.   filePtr.p->fileRunning = 0;  
  3351.   filePtr.p->errorCode = errCode;
  3352.   checkFile(signal, filePtr);
  3353. }
  3354. void
  3355. Backup::execFSAPPENDCONF(Signal* signal)
  3356. {
  3357.   jamEntry();
  3358.   
  3359.   CRASH_INSERTION((10018));
  3360.   //FsConf * conf = (FsConf*)signal->getDataPtr();
  3361.   const Uint32 filePtrI = signal->theData[0]; //conf->userPointer;
  3362.   const Uint32 bytes = signal->theData[1]; //conf->bytes;
  3363.   
  3364.   BackupFilePtr filePtr;
  3365.   c_backupFilePool.getPtr(filePtr, filePtrI);
  3366.   
  3367.   OperationRecord & op = filePtr.p->operation;
  3368.   
  3369.   op.dataBuffer.updateReadPtr(bytes >> 2);
  3370.   checkFile(signal, filePtr);
  3371. }
  3372. void
  3373. Backup::checkFile(Signal* signal, BackupFilePtr filePtr)
  3374. {
  3375. #ifdef DEBUG_ABORT
  3376.   //  ndbout_c("---- check file filePtr.i = %u", filePtr.i);
  3377. #endif
  3378.   OperationRecord & op = filePtr.p->operation;
  3379.   
  3380.   Uint32 * tmp, sz; bool eof;
  3381.   if(op.dataBuffer.getReadPtr(&tmp, &sz, &eof)) 
  3382.   {
  3383.     jam();
  3384.     
  3385.     jam();
  3386.     FsAppendReq * req = (FsAppendReq *)signal->getDataPtrSend();
  3387.     req->filePointer   = filePtr.p->filePointer;
  3388.     req->userPointer   = filePtr.i;
  3389.     req->userReference = reference();
  3390.     req->varIndex      = 0;
  3391.     req->offset        = tmp - c_startOfPages;
  3392.     req->size          = sz;
  3393.     
  3394.     sendSignal(NDBFS_REF, GSN_FSAPPENDREQ, signal, 
  3395.        FsAppendReq::SignalLength, JBA);
  3396.     return;
  3397.   }
  3398.   
  3399.   if(!eof) {
  3400.     jam();
  3401.     signal->theData[0] = BackupContinueB::BUFFER_UNDERFLOW;
  3402.     signal->theData[1] = filePtr.i;
  3403.     sendSignalWithDelay(BACKUP_REF, GSN_CONTINUEB, signal, 50, 2);
  3404.     return;
  3405.   }//if
  3406.   
  3407.   if(sz > 0) {
  3408.     jam();
  3409.     FsAppendReq * req = (FsAppendReq *)signal->getDataPtrSend();
  3410.     req->filePointer   = filePtr.p->filePointer;
  3411.     req->userPointer   = filePtr.i;
  3412.     req->userReference = reference();
  3413.     req->varIndex      = 0;
  3414.     req->offset        = tmp - c_startOfPages;
  3415.     req->size          = sz; // Avrunda uppot
  3416.     
  3417.     sendSignal(NDBFS_REF, GSN_FSAPPENDREQ, signal, 
  3418.        FsAppendReq::SignalLength, JBA);
  3419.     return;
  3420.   }//if
  3421.   
  3422.   filePtr.p->fileRunning = 0;
  3423.   filePtr.p->fileClosing = 1;
  3424.   
  3425.   FsCloseReq * req = (FsCloseReq *)signal->getDataPtrSend();
  3426.   req->filePointer = filePtr.p->filePointer;
  3427.   req->userPointer = filePtr.i;
  3428.   req->userReference = reference();
  3429.   req->fileFlag = 0;
  3430. #ifdef DEBUG_ABORT
  3431.   ndbout_c("***** a FSCLOSEREQ filePtr.i = %u", filePtr.i);
  3432. #endif
  3433.   sendSignal(NDBFS_REF, GSN_FSCLOSEREQ, signal, FsCloseReq::SignalLength, JBA);
  3434. }
  3435. /****************************************************************************
  3436.  * 
  3437.  * Slave functionallity: Perform logging
  3438.  *
  3439.  ****************************************************************************/
  3440. Uint32
  3441. Backup::calculate_frag_mask(Uint32 count)
  3442. {
  3443.   Uint32 mask = 1;
  3444.   while (mask < count) mask <<= 1;
  3445.   mask -= 1;
  3446.   return mask;
  3447. }
  3448. void
  3449. Backup::execBACKUP_TRIG_REQ(Signal* signal)
  3450. {
  3451.   /*
  3452.   TUP asks if this trigger is to be fired on this node.
  3453.   */
  3454.   TriggerPtr trigPtr;
  3455.   TablePtr tabPtr;
  3456.   FragmentPtr fragPtr;
  3457.   Uint32 trigger_id = signal->theData[0];
  3458.   Uint32 frag_id = signal->theData[1];
  3459.   Uint32 result;
  3460.   jamEntry();
  3461.   c_triggerPool.getPtr(trigPtr, trigger_id);
  3462.   c_tablePool.getPtr(tabPtr, trigPtr.p->tab_ptr_i);
  3463.   frag_id = frag_id & tabPtr.p->frag_mask;
  3464.   /*
  3465.   At the moment the fragment identity known by TUP is the
  3466.   actual fragment id but with possibly an extra bit set.
  3467.   This is due to that ACC splits the fragment. Thus fragment id 5 can
  3468.   here be either 5 or 13. Thus masking with 2 ** n - 1 where number of
  3469.   fragments <= 2 ** n will always provide a correct fragment id.
  3470.   */
  3471.   tabPtr.p->fragments.getPtr(fragPtr, frag_id);
  3472.   if (fragPtr.p->node != getOwnNodeId()) {
  3473.     jam();
  3474.     result = ZFALSE;
  3475.   } else {
  3476.     jam();
  3477.     result = ZTRUE;
  3478.   }//if
  3479.   signal->theData[0] = result;
  3480. }
  3481. void
  3482. Backup::execTRIG_ATTRINFO(Signal* signal) {
  3483.   jamEntry();
  3484.   CRASH_INSERTION((10019));
  3485.   TrigAttrInfo * trg = (TrigAttrInfo*)signal->getDataPtr();
  3486.   TriggerPtr trigPtr;
  3487.   c_triggerPool.getPtr(trigPtr, trg->getTriggerId());
  3488.   ndbrequire(trigPtr.p->event != ILLEGAL_TRIGGER_ID); // Online...
  3489.   
  3490.   if(trigPtr.p->errorCode != 0) {
  3491.     jam();
  3492.     return;
  3493.   }//if
  3494.   
  3495.   if(trg->getAttrInfoType() == TrigAttrInfo::BEFORE_VALUES) {
  3496.     jam();
  3497.     /**
  3498.      * Backup is doing REDO logging and don't need before values
  3499.      */
  3500.     return;
  3501.   }//if
  3502.   BackupFormat::LogFile::LogEntry * logEntry = trigPtr.p->logEntry;
  3503.   if(logEntry == 0) 
  3504.   {
  3505.     jam();
  3506.     Uint32 * dst;
  3507.     FsBuffer & buf = trigPtr.p->operation->dataBuffer;
  3508.     ndbrequire(trigPtr.p->maxRecordSize <= buf.getMaxWrite());
  3509.     if(ERROR_INSERTED(10030) ||
  3510.        !buf.getWritePtr(&dst, trigPtr.p->maxRecordSize)) 
  3511.     {
  3512.       jam();
  3513.       Uint32 save[TrigAttrInfo::StaticLength];
  3514.       memcpy(save, signal->getDataPtr(), 4*TrigAttrInfo::StaticLength);
  3515.       BackupRecordPtr ptr;
  3516.       c_backupPool.getPtr(ptr, trigPtr.p->backupPtr);
  3517.       trigPtr.p->errorCode = AbortBackupOrd::LogBufferFull;
  3518.       AbortBackupOrd *ord = (AbortBackupOrd*)signal->getDataPtrSend();
  3519.       ord->backupId = ptr.p->backupId;
  3520.       ord->backupPtr = ptr.i;
  3521.       ord->requestType = AbortBackupOrd::LogBufferFull;
  3522.       ord->senderData= ptr.i;
  3523.       sendSignal(ptr.p->masterRef, GSN_ABORT_BACKUP_ORD, signal, 
  3524.  AbortBackupOrd::SignalLength, JBB);
  3525.       memcpy(signal->getDataPtrSend(), save, 4*TrigAttrInfo::StaticLength);
  3526.       return;
  3527.     }//if
  3528.         
  3529.     logEntry = (BackupFormat::LogFile::LogEntry *)dst;
  3530.     trigPtr.p->logEntry = logEntry;
  3531.     logEntry->Length       = 0;
  3532.     logEntry->TableId      = htonl(trigPtr.p->tableId);
  3533.     logEntry->TriggerEvent = htonl(trigPtr.p->event);
  3534.   } else {
  3535.     ndbrequire(logEntry->TableId == htonl(trigPtr.p->tableId));
  3536.     ndbrequire(logEntry->TriggerEvent == htonl(trigPtr.p->event));
  3537.   }//if
  3538.   
  3539.   const Uint32 pos = logEntry->Length; 
  3540.   const Uint32 dataLen = signal->length() - TrigAttrInfo::StaticLength;
  3541.   memcpy(&logEntry->Data[pos], trg->getData(), dataLen << 2);
  3542.   logEntry->Length = pos + dataLen;
  3543. }
  3544. void
  3545. Backup::execFIRE_TRIG_ORD(Signal* signal)
  3546. {
  3547.   jamEntry();
  3548.   FireTrigOrd* trg = (FireTrigOrd*)signal->getDataPtr();
  3549.   const Uint32 gci = trg->getGCI();
  3550.   const Uint32 trI = trg->getTriggerId();
  3551.   TriggerPtr trigPtr;
  3552.   c_triggerPool.getPtr(trigPtr, trI);
  3553.   
  3554.   ndbrequire(trigPtr.p->event != ILLEGAL_TRIGGER_ID);
  3555.   if(trigPtr.p->errorCode != 0) {
  3556.     jam();
  3557.     return;
  3558.   }//if
  3559.   ndbrequire(trigPtr.p->logEntry != 0);
  3560.   Uint32 len = trigPtr.p->logEntry->Length;
  3561.   BackupRecordPtr ptr;
  3562.   c_backupPool.getPtr(ptr, trigPtr.p->backupPtr);
  3563.   if(gci != ptr.p->currGCP) 
  3564.   {
  3565.     jam();
  3566.     
  3567.     trigPtr.p->logEntry->TriggerEvent = htonl(trigPtr.p->event | 0x10000);
  3568.     trigPtr.p->logEntry->Data[len] = htonl(gci);
  3569.     len ++;
  3570.     ptr.p->currGCP = gci;
  3571.   }//if
  3572.   
  3573.   len += (sizeof(BackupFormat::LogFile::LogEntry) >> 2) - 2;
  3574.   trigPtr.p->logEntry->Length = htonl(len);
  3575.   ndbrequire(len + 1 <= trigPtr.p->operation->dataBuffer.getMaxWrite());
  3576.   trigPtr.p->operation->dataBuffer.updateWritePtr(len + 1);
  3577.   trigPtr.p->logEntry = 0;
  3578.   
  3579.   trigPtr.p->operation->noOfBytes += (len + 1) << 2;
  3580.   trigPtr.p->operation->noOfRecords += 1;
  3581. }
  3582. void
  3583. Backup::sendAbortBackupOrd(Signal* signal, BackupRecordPtr ptr, 
  3584.    Uint32 requestType)
  3585. {
  3586.   jam();
  3587.   AbortBackupOrd *ord = (AbortBackupOrd*)signal->getDataPtrSend();
  3588.   ord->backupId = ptr.p->backupId;
  3589.   ord->backupPtr = ptr.i;
  3590.   ord->requestType = requestType;
  3591.   ord->senderData= ptr.i;
  3592.   NodePtr node;
  3593.   for(c_nodes.first(node); node.i != RNIL; c_nodes.next(node)) {
  3594.     jam();
  3595.     const Uint32 nodeId = node.p->nodeId;
  3596.     if(node.p->alive && ptr.p->nodes.get(nodeId)) {
  3597.       jam();
  3598.       sendSignal(numberToRef(BACKUP, nodeId), GSN_ABORT_BACKUP_ORD, signal, 
  3599.  AbortBackupOrd::SignalLength, JBB);
  3600.     }//if
  3601.   }//for
  3602. }
  3603. /*****************************************************************************
  3604.  * 
  3605.  * Slave functionallity: Stop backup
  3606.  *
  3607.  *****************************************************************************/
  3608. void
  3609. Backup::execSTOP_BACKUP_REQ(Signal* signal)
  3610. {
  3611.   jamEntry();
  3612.   StopBackupReq * req = (StopBackupReq*)signal->getDataPtr();
  3613.   
  3614.   CRASH_INSERTION((10020));
  3615.   const Uint32 ptrI = req->backupPtr;
  3616.   //const Uint32 backupId = req->backupId;
  3617.   const Uint32 startGCP = req->startGCP;
  3618.   const Uint32 stopGCP = req->stopGCP;
  3619.   /**
  3620.    * At least one GCP must have passed
  3621.    */
  3622.   ndbrequire(stopGCP > startGCP);
  3623.   
  3624.   /**
  3625.    * Get backup record
  3626.    */
  3627.   BackupRecordPtr ptr;
  3628.   c_backupPool.getPtr(ptr, ptrI);
  3629.   ptr.p->slaveState.setState(STOPPING);
  3630.   ptr.p->m_gsn = GSN_STOP_BACKUP_REQ;
  3631.   /**
  3632.    * Insert footers
  3633.    */
  3634.   {
  3635.     BackupFilePtr filePtr;
  3636.     ptr.p->files.getPtr(filePtr, ptr.p->logFilePtr);
  3637.     Uint32 * dst;
  3638.     ndbrequire(filePtr.p->operation.dataBuffer.getWritePtr(&dst, 1));
  3639.     * dst = 0;
  3640.     filePtr.p->operation.dataBuffer.updateWritePtr(1);
  3641.   }
  3642.   {
  3643.     BackupFilePtr filePtr;
  3644.     ptr.p->files.getPtr(filePtr, ptr.p->ctlFilePtr);
  3645.     
  3646.     const Uint32 gcpSz = sizeof(BackupFormat::CtlFile::GCPEntry) >> 2;
  3647.     
  3648.     Uint32 * dst;
  3649.     ndbrequire(filePtr.p->operation.dataBuffer.getWritePtr(&dst, gcpSz));
  3650.     
  3651.     BackupFormat::CtlFile::GCPEntry * gcp = 
  3652.       (BackupFormat::CtlFile::GCPEntry*)dst;
  3653.     
  3654.     gcp->SectionType   = htonl(BackupFormat::GCP_ENTRY);
  3655.     gcp->SectionLength = htonl(gcpSz);
  3656.     gcp->StartGCP      = htonl(startGCP);
  3657.     gcp->StopGCP       = htonl(stopGCP - 1);
  3658.     filePtr.p->operation.dataBuffer.updateWritePtr(gcpSz);
  3659.   }
  3660.   {
  3661.     TablePtr tabPtr;
  3662.     for(ptr.p->tables.first(tabPtr); tabPtr.i != RNIL;
  3663. ptr.p->tables.next(tabPtr))
  3664.     {
  3665.       signal->theData[0] = tabPtr.p->tableId;
  3666.       signal->theData[1] = 0; // unlock
  3667.       EXECUTE_DIRECT(DBDICT, GSN_BACKUP_FRAGMENT_REQ, signal, 2);
  3668.     }
  3669.   }
  3670.   
  3671.   closeFiles(signal, ptr);
  3672. }
  3673. void
  3674. Backup::closeFiles(Signal* sig, BackupRecordPtr ptr)
  3675. {
  3676.   /**
  3677.    * Close all files
  3678.    */
  3679.   BackupFilePtr filePtr;
  3680.   int openCount = 0;
  3681.   for(ptr.p->files.first(filePtr); filePtr.i!=RNIL; ptr.p->files.next(filePtr))
  3682.   {
  3683.     if(filePtr.p->fileOpened == 0) {
  3684.       jam();
  3685.       continue;
  3686.     }
  3687.     
  3688.     jam();
  3689.     openCount++;
  3690.     
  3691.     if(filePtr.p->fileClosing == 1){
  3692.       jam();
  3693.       continue;
  3694.     }//if
  3695.     
  3696.     filePtr.p->fileClosing = 1;
  3697.     
  3698.     if(filePtr.p->fileRunning == 1){
  3699.       jam();
  3700. #ifdef DEBUG_ABORT
  3701.       ndbout_c("Close files fileRunning == 1, filePtr.i=%u", filePtr.i);
  3702. #endif
  3703.       filePtr.p->operation.dataBuffer.eof();
  3704.     } else {
  3705.       jam();
  3706.       
  3707.       FsCloseReq * req = (FsCloseReq *)sig->getDataPtrSend();
  3708.       req->filePointer = filePtr.p->filePointer;
  3709.       req->userPointer = filePtr.i;
  3710.       req->userReference = reference();
  3711.       req->fileFlag = 0;
  3712. #ifdef DEBUG_ABORT
  3713.       ndbout_c("***** b FSCLOSEREQ filePtr.i = %u", filePtr.i);
  3714. #endif
  3715.       sendSignal(NDBFS_REF, GSN_FSCLOSEREQ, sig, 
  3716.  FsCloseReq::SignalLength, JBA);
  3717.     }//if
  3718.   }//for
  3719.   
  3720.   if(openCount == 0){
  3721.     jam();
  3722.     closeFilesDone(sig, ptr);
  3723.   }//if
  3724. }
  3725. void
  3726. Backup::execFSCLOSEREF(Signal* signal)
  3727. {
  3728.   jamEntry();
  3729.   
  3730.   FsRef * ref = (FsRef*)signal->getDataPtr();
  3731.   const Uint32 filePtrI = ref->userPointer;
  3732.   
  3733.   BackupFilePtr filePtr;
  3734.   c_backupFilePool.getPtr(filePtr, filePtrI);
  3735.   BackupRecordPtr ptr;
  3736.   c_backupPool.getPtr(ptr, filePtr.p->backupPtr);
  3737.   
  3738.   filePtr.p->fileOpened = 1;
  3739.   FsConf * conf = (FsConf*)signal->getDataPtr();
  3740.   conf->userPointer = filePtrI;
  3741.   
  3742.   execFSCLOSECONF(signal);
  3743. }
  3744. void
  3745. Backup::execFSCLOSECONF(Signal* signal)
  3746. {
  3747.   jamEntry();
  3748.   FsConf * conf = (FsConf*)signal->getDataPtr();
  3749.   const Uint32 filePtrI = conf->userPointer;
  3750.   
  3751.   BackupFilePtr filePtr;
  3752.   c_backupFilePool.getPtr(filePtr, filePtrI);
  3753. #ifdef DEBUG_ABORT
  3754.   ndbout_c("***** FSCLOSECONF filePtrI = %u", filePtrI);
  3755. #endif
  3756.   ndbrequire(filePtr.p->fileClosing == 1);
  3757.   ndbrequire(filePtr.p->fileOpened == 1);
  3758.   ndbrequire(filePtr.p->fileRunning == 0);
  3759.   ndbrequire(filePtr.p->scanRunning == 0);      
  3760.   
  3761.   filePtr.p->fileOpened = 0;
  3762.   
  3763.   BackupRecordPtr ptr;
  3764.   c_backupPool.getPtr(ptr, filePtr.p->backupPtr);
  3765.   for(ptr.p->files.first(filePtr); filePtr.i!=RNIL;ptr.p->files.next(filePtr)) 
  3766.   {
  3767.     jam();
  3768.     if(filePtr.p->fileOpened == 1) {
  3769.       jam();
  3770. #ifdef DEBUG_ABORT
  3771.       ndbout_c("waiting for more FSCLOSECONF's filePtr.i = %u", filePtr.i);
  3772. #endif
  3773.       return; // we will be getting more FSCLOSECONF's
  3774.     }//if
  3775.   }//for
  3776.   closeFilesDone(signal, ptr);
  3777. }
  3778. void
  3779. Backup::closeFilesDone(Signal* signal, BackupRecordPtr ptr)
  3780. {
  3781.   jam();
  3782.   
  3783.   jam();
  3784.   BackupFilePtr filePtr;
  3785.   ptr.p->files.getPtr(filePtr, ptr.p->logFilePtr);
  3786.   
  3787.   StopBackupConf* conf = (StopBackupConf*)signal->getDataPtrSend();
  3788.   conf->backupId = ptr.p->backupId;
  3789.   conf->backupPtr = ptr.i;
  3790.   conf->noOfLogBytes = filePtr.p->operation.noOfBytes;
  3791.   conf->noOfLogRecords = filePtr.p->operation.noOfRecords;
  3792.   sendSignal(ptr.p->masterRef, GSN_STOP_BACKUP_CONF, signal,
  3793.      StopBackupConf::SignalLength, JBB);
  3794.   
  3795.   ptr.p->m_gsn = GSN_STOP_BACKUP_CONF;
  3796.   ptr.p->slaveState.setState(CLEANING);
  3797. }
  3798. /*****************************************************************************
  3799.  * 
  3800.  * Slave functionallity: Abort backup
  3801.  *
  3802.  *****************************************************************************/
  3803. /*****************************************************************************
  3804.  * 
  3805.  * Slave functionallity: Abort backup
  3806.  *
  3807.  *****************************************************************************/
  3808. void
  3809. Backup::execABORT_BACKUP_ORD(Signal* signal)
  3810. {
  3811.   jamEntry();
  3812.   AbortBackupOrd* ord = (AbortBackupOrd*)signal->getDataPtr();
  3813.   const Uint32 backupId = ord->backupId;
  3814.   const AbortBackupOrd::RequestType requestType = 
  3815.     (AbortBackupOrd::RequestType)ord->requestType;
  3816.   const Uint32 senderData = ord->senderData;
  3817.   
  3818. #ifdef DEBUG_ABORT
  3819.   ndbout_c("******** ABORT_BACKUP_ORD ********* nodeId = %u", 
  3820.    refToNode(signal->getSendersBlockRef()));
  3821.   ndbout_c("backupId = %u, requestType = %u, senderData = %u, ",
  3822.    backupId, requestType, senderData);
  3823.   dumpUsedResources();
  3824. #endif
  3825.   BackupRecordPtr ptr;
  3826.   if(requestType == AbortBackupOrd::ClientAbort) {
  3827.     if (getOwnNodeId() != getMasterNodeId()) {
  3828.       jam();
  3829.       // forward to master
  3830. #ifdef DEBUG_ABORT
  3831.       ndbout_c("---- Forward to master nodeId = %u", getMasterNodeId());
  3832. #endif
  3833.       sendSignal(calcBackupBlockRef(getMasterNodeId()), GSN_ABORT_BACKUP_ORD, 
  3834.  signal, AbortBackupOrd::SignalLength, JBB);
  3835.       return;
  3836.     }
  3837.     jam();
  3838.     for(c_backups.first(ptr); ptr.i != RNIL; c_backups.next(ptr)) {
  3839.       jam();
  3840.       if(ptr.p->backupId == backupId && ptr.p->clientData == senderData) {
  3841.         jam();
  3842. break;
  3843.       }//if
  3844.     }//for
  3845.     if(ptr.i == RNIL) {
  3846.       jam();
  3847.       return;
  3848.     }//if
  3849.   } else {
  3850.     if (c_backupPool.findId(senderData)) {
  3851.       jam();
  3852.       c_backupPool.getPtr(ptr, senderData);
  3853.     } else { 
  3854.       jam();
  3855. #ifdef DEBUG_ABORT
  3856.       ndbout_c("Backup: abort request type=%u on id=%u,%u not found",
  3857.        requestType, backupId, senderData);
  3858. #endif
  3859.       return;
  3860.     }
  3861.   }//if
  3862.   
  3863.   ptr.p->m_gsn = GSN_ABORT_BACKUP_ORD;
  3864.   const bool isCoordinator = (ptr.p->masterRef == reference());
  3865.   
  3866.   bool ok = false;
  3867.   switch(requestType){
  3868.     /**
  3869.      * Requests sent to master
  3870.      */
  3871.   case AbortBackupOrd::ClientAbort:
  3872.     jam();
  3873.     // fall through
  3874.   case AbortBackupOrd::LogBufferFull:
  3875.     jam();
  3876.     // fall through
  3877.   case AbortBackupOrd::FileOrScanError:
  3878.     jam();
  3879.     ndbrequire(isCoordinator);
  3880.     ptr.p->setErrorCode(requestType);
  3881.     if(ptr.p->masterData.gsn == GSN_BACKUP_FRAGMENT_REQ)
  3882.     {
  3883.       /**
  3884.        * Only scans are actively aborted
  3885.        */
  3886.       abort_scan(signal, ptr);
  3887.     }
  3888.     return;
  3889.     
  3890.     /**
  3891.      * Requests sent to slave
  3892.      */
  3893.   case AbortBackupOrd::AbortScan:
  3894.     jam();
  3895.     ptr.p->setErrorCode(requestType);
  3896.     return;
  3897.     
  3898.   case AbortBackupOrd::BackupComplete:
  3899.     jam();
  3900.     cleanup(signal, ptr);
  3901.     return;
  3902.   case AbortBackupOrd::BackupFailure:
  3903.   case AbortBackupOrd::BackupFailureDueToNodeFail:
  3904.   case AbortBackupOrd::OkToClean:
  3905.   case AbortBackupOrd::IncompatibleVersions:
  3906. #ifndef VM_TRACE
  3907.   default:
  3908. #endif
  3909.     ptr.p->setErrorCode(requestType);
  3910.     ok= true;
  3911.   }
  3912.   ndbrequire(ok);
  3913.   
  3914.   Uint32 ref= ptr.p->masterRef;
  3915.   ptr.p->masterRef = reference();
  3916.   ptr.p->nodes.clear();
  3917.   ptr.p->nodes.set(getOwnNodeId());
  3918.   
  3919.   if(ref == reference())
  3920.   {
  3921.     ptr.p->stopGCP= ptr.p->startGCP + 1;
  3922.     sendDropTrig(signal, ptr);
  3923.   }
  3924.   else
  3925.   {
  3926.     ptr.p->masterData.gsn = GSN_STOP_BACKUP_REQ;
  3927.     ptr.p->masterData.sendCounter.clearWaitingFor();
  3928.     ptr.p->masterData.sendCounter.setWaitingFor(getOwnNodeId());
  3929.     closeFiles(signal, ptr);
  3930.   }
  3931. }
  3932. void
  3933. Backup::dumpUsedResources()
  3934. {
  3935.   jam();
  3936.   BackupRecordPtr ptr;
  3937.   for(c_backups.first(ptr); ptr.i != RNIL; c_backups.next(ptr)) {
  3938.     ndbout_c("Backup id=%u, slaveState.getState = %u, errorCode=%u",
  3939.      ptr.p->backupId,
  3940.      ptr.p->slaveState.getState(),
  3941.      ptr.p->errorCode);
  3942.     TablePtr tabPtr;
  3943.     for(ptr.p->tables.first(tabPtr);
  3944. tabPtr.i != RNIL;
  3945. ptr.p->tables.next(tabPtr)) {
  3946.       jam();
  3947.       for(Uint32 j = 0; j<3; j++) {
  3948. jam();
  3949. TriggerPtr trigPtr;
  3950. if(tabPtr.p->triggerAllocated[j]) {
  3951.   jam();
  3952.   c_triggerPool.getPtr(trigPtr, tabPtr.p->triggerIds[j]);
  3953.   ndbout_c("Allocated[%u] Triggerid = %u, event = %u",
  3954.  j,
  3955.  tabPtr.p->triggerIds[j],
  3956.  trigPtr.p->event);
  3957. }//if
  3958.       }//for
  3959.     }//for
  3960.     
  3961.     BackupFilePtr filePtr;
  3962.     for(ptr.p->files.first(filePtr);
  3963. filePtr.i != RNIL;
  3964. ptr.p->files.next(filePtr)) {
  3965.       jam();
  3966.       ndbout_c("filePtr.i = %u, filePtr.p->fileOpened=%u fileRunning=%u "
  3967.        "scanRunning=%u",
  3968.        filePtr.i,
  3969.        filePtr.p->fileOpened,
  3970.        filePtr.p->fileRunning,
  3971.        filePtr.p->scanRunning);
  3972.     }//for
  3973.   }
  3974. }
  3975. void
  3976. Backup::cleanup(Signal* signal, BackupRecordPtr ptr)
  3977. {
  3978.   TablePtr tabPtr;
  3979.   for(ptr.p->tables.first(tabPtr); tabPtr.i != RNIL;ptr.p->tables.next(tabPtr))
  3980.   {
  3981.     jam();
  3982.     tabPtr.p->attributes.release();
  3983.     tabPtr.p->fragments.release();
  3984.     for(Uint32 j = 0; j<3; j++) {
  3985.       jam();
  3986.       TriggerPtr trigPtr;
  3987.       if(tabPtr.p->triggerAllocated[j]) {
  3988.         jam();
  3989. c_triggerPool.getPtr(trigPtr, tabPtr.p->triggerIds[j]);
  3990. trigPtr.p->event = ILLEGAL_TRIGGER_ID;
  3991.         tabPtr.p->triggerAllocated[j] = false;
  3992.       }//if
  3993.       tabPtr.p->triggerIds[j] = ILLEGAL_TRIGGER_ID;
  3994.     }//for
  3995.     {
  3996.       signal->theData[0] = tabPtr.p->tableId;
  3997.       signal->theData[1] = 0; // unlock
  3998.       EXECUTE_DIRECT(DBDICT, GSN_BACKUP_FRAGMENT_REQ, signal, 2);
  3999.     }
  4000.   }//for
  4001.   BackupFilePtr filePtr;
  4002.   for(ptr.p->files.first(filePtr);
  4003.       filePtr.i != RNIL; 
  4004.       ptr.p->files.next(filePtr)) {
  4005.     jam();
  4006.     ndbrequire(filePtr.p->fileOpened == 0);
  4007.     ndbrequire(filePtr.p->fileRunning == 0);
  4008.     ndbrequire(filePtr.p->scanRunning == 0);
  4009.     filePtr.p->pages.release();
  4010.   }//for
  4011.   ptr.p->files.release();
  4012.   ptr.p->tables.release();
  4013.   ptr.p->triggers.release();
  4014.   ptr.p->pages.release();
  4015.   ptr.p->backupId = ~0;
  4016.   
  4017.   if(ptr.p->checkError())
  4018.     removeBackup(signal, ptr);
  4019.   else
  4020.     c_backups.release(ptr);
  4021. }
  4022. void
  4023. Backup::removeBackup(Signal* signal, BackupRecordPtr ptr)
  4024. {
  4025.   jam();
  4026.   
  4027.   FsRemoveReq * req = (FsRemoveReq *)signal->getDataPtrSend();
  4028.   req->userReference = reference();
  4029.   req->userPointer = ptr.i;
  4030.   req->directory = 1;
  4031.   req->ownDirectory = 1;
  4032.   FsOpenReq::setVersion(req->fileNumber, 2);
  4033.   FsOpenReq::setSuffix(req->fileNumber, FsOpenReq::S_CTL);
  4034.   FsOpenReq::v2_setSequence(req->fileNumber, ptr.p->backupId);
  4035.   FsOpenReq::v2_setNodeId(req->fileNumber, getOwnNodeId());
  4036.   sendSignal(NDBFS_REF, GSN_FSREMOVEREQ, signal, 
  4037.      FsRemoveReq::SignalLength, JBA);
  4038. }
  4039. void
  4040. Backup::execFSREMOVEREF(Signal* signal)
  4041. {
  4042.   jamEntry();
  4043.   FsRef * ref = (FsRef*)signal->getDataPtr();
  4044.   const Uint32 ptrI = ref->userPointer;
  4045.   FsConf * conf = (FsConf*)signal->getDataPtr();
  4046.   conf->userPointer = ptrI;
  4047.   execFSREMOVECONF(signal);
  4048. }
  4049. void
  4050. Backup::execFSREMOVECONF(Signal* signal){
  4051.   jamEntry();
  4052.   FsConf * conf = (FsConf*)signal->getDataPtr();
  4053.   const Uint32 ptrI = conf->userPointer;
  4054.   
  4055.   /**
  4056.    * Get backup record
  4057.    */
  4058.   BackupRecordPtr ptr;
  4059.   c_backupPool.getPtr(ptr, ptrI);
  4060.   c_backups.release(ptr);
  4061. }