Commit 50eee915 authored by unknown's avatar unknown
Browse files

ndb - bug#21271

  make each fragment use own LCP file, so that (s/n)r can use different LCP-no for different fragments


storage/ndb/include/kernel/signaldata/FsOpenReq.hpp:
  Add fragment id to LCP filename
storage/ndb/src/kernel/blocks/ERROR_codes.txt:
  Add new error code
storage/ndb/src/kernel/blocks/backup/Backup.cpp:
  put each fragment in own LCP file
storage/ndb/src/kernel/blocks/backup/Backup.hpp:
  put each fragment in own LCP file
storage/ndb/src/kernel/blocks/dblqh/Dblqh.hpp:
  Use fifo lists
storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp:
  1) use fifo lists
  2) restore each fragment separatly
  3) add error codes
storage/ndb/src/kernel/blocks/restore.cpp:
  Add fragment id to LCP filename
storage/ndb/src/kernel/blocks/ndbfs/Filename.cpp:
  Add fragment id to LCP filename
storage/ndb/test/ndbapi/testNodeRestart.cpp:
  Add testcase
storage/ndb/test/run-test/daily-basic-tests.txt:
  add testcase
parent fe9d004c
Loading
Loading
Loading
Loading
+13 −1
Original line number Diff line number Diff line
@@ -136,9 +136,11 @@ private:
   */
  static Uint32 v5_getLcpNo(const Uint32 fileNumber[]);
  static Uint32 v5_getTableId(const Uint32 fileNumber[]);
  static Uint32 v5_getFragmentId(const Uint32 fileNumber[]);

  static void v5_setLcpNo(Uint32 fileNumber[], Uint32 no);
  static void v5_setTableId(Uint32 fileNumber[], Uint32 no);
  static void v5_setFragmentId(Uint32 fileNumber[], Uint32 no);
};

/**
@@ -318,5 +320,15 @@ void FsOpenReq::v5_setLcpNo(Uint32 fileNumber[], Uint32 val){
  fileNumber[1] = val;
}

inline 
Uint32 FsOpenReq::v5_getFragmentId(const Uint32 fileNumber[]){
  return fileNumber[2];
}

inline
void FsOpenReq::v5_setFragmentId(Uint32 fileNumber[], Uint32 val){
  fileNumber[2] = val;
}

#endif
+1 −1
Original line number Diff line number Diff line
@@ -3,7 +3,7 @@ Next NDBCNTR 1000
Next NDBFS 2000
Next DBACC 3002
Next DBTUP 4024
Next DBLQH 5043
Next DBLQH 5045
Next DBDICT 6007
Next DBDIH 7177
Next DBTC 8037
+55 −92
Original line number Diff line number Diff line
@@ -3796,6 +3796,13 @@ Backup::fragmentCompleted(Signal* signal, BackupFilePtr filePtr)
  BackupRecordPtr ptr;
  c_backupPool.getPtr(ptr, filePtr.p->backupPtr);

  if (ptr.p->is_lcp())
  {
    ptr.p->slaveState.setState(STOPPING);
    filePtr.p->operation.dataBuffer.eof();
  }
  else
  {
    BackupFragmentConf * conf = (BackupFragmentConf*)signal->getDataPtrSend();
    conf->backupId = ptr.p->backupId;
    conf->backupPtr = ptr.i;
@@ -3810,6 +3817,7 @@ Backup::fragmentCompleted(Signal* signal, BackupFilePtr filePtr)

    ptr.p->m_gsn = GSN_BACKUP_FRAGMENT_CONF;
    ptr.p->slaveState.setState(STARTED);
  }
  return;
}

@@ -4719,29 +4727,8 @@ Backup::execLCP_PREPARE_REQ(Signal* signal)
  BackupRecordPtr ptr;
  c_backupPool.getPtr(ptr, req.backupPtr);

  bool first= true;
  TablePtr tabPtr;
  if(ptr.p->tables.first(tabPtr) && tabPtr.p->tableId != req.tableId)
  {
    jam();
    first= false;
    tabPtr.p->attributes.release();
    tabPtr.p->fragments.release();
    ptr.p->tables.release();
    ptr.p->errorCode = 0;
  } 

  if(ptr.p->tables.first(tabPtr) && ptr.p->errorCode == 0)
  {
    jam();
    FragmentPtr fragPtr;
    tabPtr.p->fragments.getPtr(fragPtr, 0);
    fragPtr.p->fragmentId = req.fragmentId;
    
    lcp_open_file_done(signal, ptr);
    return;
  } 
  else if(ptr.p->errorCode == 0)
  if(ptr.p->errorCode == 0)
  {
    jam();
    FragmentPtr fragPtr;
@@ -4759,6 +4746,9 @@ Backup::execLCP_PREPARE_REQ(Signal* signal)
    fragPtr.p->scanned = 0;
    fragPtr.p->scanning = 0;
    fragPtr.p->tableId = req.tableId;

    ptr.p->backupId= req.backupId;
    lcp_open_file(signal, ptr);
  } 
  else
  {
@@ -4767,43 +4757,38 @@ Backup::execLCP_PREPARE_REQ(Signal* signal)
    tabPtr.p->fragments.getPtr(fragPtr, 0);
    fragPtr.p->fragmentId = req.fragmentId;
    defineBackupRef(signal, ptr, ptr.p->errorCode);
    return;
  }
  
  if(first)
  {
    jam();
    // start file thread
    ptr.p->backupId= req.backupId;
    lcp_open_file(signal, ptr);
    return;
  }
  else
  {
    jam();
    ndbrequire(ptr.p->backupId == req.backupId);
  }
  
  /**
   * Close previous file
   */
  jam();
  BackupFilePtr filePtr;
  c_backupFilePool.getPtr(filePtr, ptr.p->dataFilePtr);
  filePtr.p->operation.dataBuffer.eof();
}

void
Backup::lcp_close_file_conf(Signal* signal, BackupRecordPtr ptr)
{
  if(!ptr.p->tables.isEmpty())
{
  jam();
    lcp_open_file(signal, ptr);
    return;
  }
  
  lcp_send_end_lcp_conf(signal, ptr);
  TablePtr tabPtr;
  ndbrequire(ptr.p->tables.first(tabPtr));
  Uint32 tableId = tabPtr.p->tableId;

  FragmentPtr fragPtr;
  tabPtr.p->fragments.getPtr(fragPtr, 0);
  Uint32 fragmentId = fragPtr.p->fragmentId;
  
  tabPtr.p->attributes.release();
  tabPtr.p->fragments.release();
  ptr.p->tables.release();
  ptr.p->errorCode = 0;
  
  BackupFragmentConf * conf = (BackupFragmentConf*)signal->getDataPtrSend();
  conf->backupId = ptr.p->backupId;
  conf->backupPtr = ptr.i;
  conf->tableId = tableId;
  conf->fragmentNo = fragmentId;
  conf->noOfRecordsLow = 0;
  conf->noOfRecordsHigh = 0;
  conf->noOfBytesLow = 0;
  conf->noOfBytesHigh = 0;
  sendSignal(ptr.p->masterRef, GSN_BACKUP_FRAGMENT_CONF, signal,
	     BackupFragmentConf::SignalLength, JBB);
}

void
@@ -4840,6 +4825,7 @@ Backup::lcp_open_file(Signal* signal, BackupRecordPtr ptr)
  FsOpenReq::setSuffix(req->fileNumber, FsOpenReq::S_DATA);
  FsOpenReq::v5_setLcpNo(req->fileNumber, fragPtr.p->lcp_no);
  FsOpenReq::v5_setTableId(req->fileNumber, tabPtr.p->tableId);
  FsOpenReq::v5_setFragmentId(req->fileNumber, fragPtr.p->fragmentId);
  sendSignal(NDBFS_REF, GSN_FSOPENREQ, signal, FsOpenReq::SignalLength, JBA);
}

@@ -4872,38 +4858,15 @@ Backup::execEND_LCPREQ(Signal* signal)
  c_backupPool.getPtr(ptr, req->backupPtr);
  ndbrequire(ptr.p->backupId == req->backupId);

  ptr.p->slaveState.setState(STOPPING);

  TablePtr tabPtr;
  if(ptr.p->tables.first(tabPtr))
  {
    tabPtr.p->attributes.release();
    tabPtr.p->fragments.release();
    ptr.p->tables.release();
  
    BackupFilePtr filePtr;
    c_backupFilePool.getPtr(filePtr, ptr.p->dataFilePtr);
    filePtr.p->operation.dataBuffer.eof();
    return;
  } 
  
  lcp_send_end_lcp_conf(signal, ptr);
}

void
Backup::lcp_send_end_lcp_conf(Signal* signal, BackupRecordPtr ptr)
{
  EndLcpConf* conf= (EndLcpConf*)signal->getDataPtr();

  conf->senderData = ptr.p->clientData;
  conf->senderRef = reference();
  
  ptr.p->errorCode = 0;
  ptr.p->slaveState.setState(CLEANING);
  ptr.p->slaveState.setState(INITIAL);
  ptr.p->slaveState.setState(DEFINING);
  ptr.p->slaveState.setState(DEFINED);

  EndLcpConf* conf= (EndLcpConf*)signal->getDataPtr();
  conf->senderData = ptr.p->clientData;
  conf->senderRef = reference();
  sendSignal(ptr.p->masterRef, GSN_END_LCPCONF,
	     signal, EndLcpConf::SignalLength, JBB);
}
+0 −1
Original line number Diff line number Diff line
@@ -645,7 +645,6 @@ public:
  void lcp_open_file(Signal* signal, BackupRecordPtr ptr);
  void lcp_open_file_done(Signal*, BackupRecordPtr);
  void lcp_close_file_conf(Signal* signal, BackupRecordPtr);
  void lcp_send_end_lcp_conf(Signal* signal, BackupRecordPtr);

  bool ready_to_write(bool ready, Uint32 sz, bool eof, BackupFile *fileP);
};
+4 −4
Original line number Diff line number Diff line
@@ -2794,10 +2794,10 @@ private:
/*THIS VARIABLE IS THE HEAD OF A LINKED LIST OF FRAGMENTS WAITING TO BE      */
/*RESTORED FROM DISK.                                                        */
/* ------------------------------------------------------------------------- */
  DLList<Fragrecord> c_lcp_waiting_fragments;  // StartFragReq'ed
  DLList<Fragrecord> c_lcp_restoring_fragments; // Restoring as we speek
  DLList<Fragrecord> c_lcp_complete_fragments;  // Restored
  DLList<Fragrecord> c_redo_complete_fragments; // Redo'ed
  DLFifoList<Fragrecord> c_lcp_waiting_fragments;  // StartFragReq'ed
  DLFifoList<Fragrecord> c_lcp_restoring_fragments; // Restoring as we speek
  DLFifoList<Fragrecord> c_lcp_complete_fragments;  // Restored
  DLFifoList<Fragrecord> c_redo_complete_fragments; // Redo'ed
  
/* ------------------------------------------------------------------------- */
/*USED DURING SYSTEM RESTART, INDICATES THE OLDEST GCI THAT CAN BE RESTARTED */
Loading