Commit 783dbfc3 authored by unknown's avatar unknown
Browse files

bug#11942


ndb/include/kernel/signaldata/AlterTable.hpp:
  Add error code for backup in progress
ndb/include/kernel/signaldata/DictTabInfo.hpp:
  Add backup state
ndb/include/kernel/signaldata/DropTable.hpp:
  Add error code for backup in progress
ndb/include/ndbapi/NdbDictionary.hpp:
  Add backup state
ndb/src/kernel/blocks/backup/Backup.cpp:
  1) remove invalid require (util_sequence_ref) crash
  2) Don't backup objects dropping/creating
  3) set correct error code on backup fragment ref (crash)
  4) save TrigAttrInfo header when getting log full (crash)
  5) lock/unlock tables during backup
ndb/src/kernel/blocks/dbdict/Dbdict.cpp:
  1) add mutex lock/unlock as part of drop/alter table
  2) add lock/unlock for backup
  3) remove TC from backup trigger loop
ndb/src/kernel/blocks/dbdict/Dbdict.hpp:
  Add BACKUP_ONGOING state
ndb/src/ndbapi/NdbDictionaryImpl.cpp:
  Add backup state
ndb/src/ndbapi/ndberror.c:
  Add error code for backup in progress
ndb/test/ndbapi/testBackup.cpp:
  Add testcase for testBackup -n BackupDDL
ndb/tools/drop_index.cpp:
  Fix ndb_drop_index
ndb/tools/listTables.cpp:
  Print of backup state
parent 6913d805
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -128,7 +128,8 @@ public:
    RecordTooBig = 738,
    InvalidPrimaryKeySize  = 739,
    NullablePrimaryKey = 740,
    UnsupportedChange = 741
    UnsupportedChange = 741,
    BackupInProgress = 746
  };

private:
+1 −0
Original line number Diff line number Diff line
@@ -209,6 +209,7 @@ public:
    StateBuilding = 2,
    StateDropping = 3,
    StateOnline = 4,
    StateBackup = 5,
    StateBroken = 9
  };

+2 −1
Original line number Diff line number Diff line
@@ -57,7 +57,8 @@ public:
    NoSuchTable         = 709,
    InvalidTableVersion = 241,
    DropInProgress      = 283,
    NoDropTableRecordAvailable = 1229
    NoDropTableRecordAvailable = 1229,
    BackupInProgress = 745
  };
};

+1 −0
Original line number Diff line number Diff line
@@ -118,6 +118,7 @@ public:
      StateBuilding = 2,      ///< Building, not yet usable
      StateDropping = 3,      ///< Offlining or dropping, not usable
      StateOnline = 4,        ///< Online, usable
      StateBackup = 5,        ///< Online, being backuped, usable
      StateBroken = 9         ///< Broken, should be dropped and re-created
    };

+38 −7
Original line number Diff line number Diff line
@@ -921,7 +921,6 @@ Backup::execUTIL_SEQUENCE_REF(Signal* signal)
  jamEntry();
  UtilSequenceRef * utilRef = (UtilSequenceRef*)signal->getDataPtr();
  ptr.i = utilRef->senderData;
  ndbrequire(ptr.i == RNIL);
  c_backupPool.getPtr(ptr);
  ndbrequire(ptr.p->masterData.gsn == GSN_UTIL_SEQUENCE_REQ);
  sendBackupRef(signal, ptr, BackupRef::SequenceFailure);
@@ -2418,10 +2417,16 @@ Backup::execLIST_TABLES_CONF(Signal* signal)
    jam();
    Uint32 tableId = ListTablesConf::getTableId(conf->tableData[i]);
    Uint32 tableType = ListTablesConf::getTableType(conf->tableData[i]);
    Uint32 state= ListTablesConf::getTableState(conf->tableData[i]);
    if (!DictTabInfo::isTable(tableType) && !DictTabInfo::isIndex(tableType)){
      jam();
      continue;
    }//if
    if (state != DictTabInfo::StateOnline)
    {
      jam();
      continue;
    }//if
    TablePtr tabPtr;
    ptr.p->tables.seize(tabPtr);
    if(tabPtr.i == RNIL) {
@@ -2791,9 +2796,18 @@ Backup::execGET_TABINFO_CONF(Signal* signal)

  TablePtr tmp = tabPtr;
  ptr.p->tables.next(tabPtr);
  if(DictTabInfo::isIndex(tmp.p->tableType)){
  if(DictTabInfo::isIndex(tmp.p->tableType))
  {
    jam();
    ptr.p->tables.release(tmp);
  }
  else
  {
    jam();
    signal->theData[0] = tmp.p->tableId;
    signal->theData[1] = 1; // lock
    EXECUTE_DIRECT(DBDICT, GSN_BACKUP_FRAGMENT_REQ, signal, 2);
  }

  if(tabPtr.i == RNIL) {
    jam();
@@ -3575,7 +3589,7 @@ Backup::backupFragmentRef(Signal * signal, BackupFilePtr filePtr)
  ref->backupId = ptr.p->backupId;
  ref->backupPtr = ptr.i;
  ref->nodeId = getOwnNodeId();
  ref->errorCode = ptr.p->errorCode;
  ref->errorCode = filePtr.p->errorCode;
  sendSignal(ptr.p->masterRef, GSN_BACKUP_FRAGMENT_REF, signal,
	     BackupFragmentRef::SignalLength, JBB);
}
@@ -3836,6 +3850,8 @@ Backup::execTRIG_ATTRINFO(Signal* signal) {
       !buf.getWritePtr(&dst, trigPtr.p->maxRecordSize)) 
    {
      jam();
      Uint32 save[TrigAttrInfo::StaticLength];
      memcpy(save, signal->getDataPtr(), 4*TrigAttrInfo::StaticLength);
      BackupRecordPtr ptr;
      c_backupPool.getPtr(ptr, trigPtr.p->backupPtr);
      trigPtr.p->errorCode = AbortBackupOrd::LogBufferFull;
@@ -3846,6 +3862,8 @@ Backup::execTRIG_ATTRINFO(Signal* signal) {
      ord->senderData= ptr.i;
      sendSignal(ptr.p->masterRef, GSN_ABORT_BACKUP_ORD, signal, 
		 AbortBackupOrd::SignalLength, JBB);

      memcpy(signal->getDataPtrSend(), save, 4*TrigAttrInfo::StaticLength);
      return;
    }//if
        
@@ -3996,6 +4014,17 @@ Backup::execSTOP_BACKUP_REQ(Signal* signal)
    filePtr.p->operation.dataBuffer.updateWritePtr(gcpSz);
  }

  {
    TablePtr tabPtr;
    for(ptr.p->tables.first(tabPtr); tabPtr.i != RNIL;
	ptr.p->tables.next(tabPtr))
    {
      signal->theData[0] = tabPtr.p->tableId;
      signal->theData[1] = 0; // unlock
      EXECUTE_DIRECT(DBDICT, GSN_BACKUP_FRAGMENT_REQ, signal, 2);
    }
  }
  
  closeFiles(signal, ptr);
}

@@ -4338,6 +4367,11 @@ Backup::cleanup(Signal* signal, BackupRecordPtr ptr)
      }//if
      tabPtr.p->triggerIds[j] = ILLEGAL_TRIGGER_ID;
    }//for
    {
      signal->theData[0] = tabPtr.p->tableId;
      signal->theData[1] = 0; // unlock
      EXECUTE_DIRECT(DBDICT, GSN_BACKUP_FRAGMENT_REQ, signal, 2);
    }
  }//for

  BackupFilePtr filePtr;
@@ -4352,9 +4386,6 @@ Backup::cleanup(Signal* signal, BackupRecordPtr ptr)
  }//for

  ptr.p->files.release();
  ptr.p->tables.release();
  ptr.p->triggers.release();

  ptr.p->tables.release();
  ptr.p->triggers.release();
  ptr.p->pages.release();
Loading