Commit 77285cb6 authored by kostja@bodhi.local's avatar kostja@bodhi.local

Merge bk-internal.mysql.com:/home/bk/mysql-5.0

into  bodhi.local:/opt/local/work/mysql-5.0-runtime-merge-41
parents 4f3636dd 72fa4883
...@@ -101,15 +101,15 @@ uninstall-local: ...@@ -101,15 +101,15 @@ uninstall-local:
@RM@ -f -r $(DESTDIR)$(testdir) @RM@ -f -r $(DESTDIR)$(testdir)
std_data/client-key.pem: $(top_srcdir)/SSL/$(@F) std_data/client-key.pem: $(top_srcdir)/SSL/$(@F)
@CP@ -f $(top_srcdir)/SSL/$(@F) $(srcdir)/std_data @RM@ -f $@; @CP@ $(top_srcdir)/SSL/$(@F) $(srcdir)/std_data
std_data/client-cert.pem: $(top_srcdir)/SSL/$(@F) std_data/client-cert.pem: $(top_srcdir)/SSL/$(@F)
@CP@ -f $(top_srcdir)/SSL/$(@F) $(srcdir)/std_data @RM@ -f $@; @CP@ $(top_srcdir)/SSL/$(@F) $(srcdir)/std_data
std_data/cacert.pem: $(top_srcdir)/SSL/$(@F) std_data/cacert.pem: $(top_srcdir)/SSL/$(@F)
@CP@ -f $(top_srcdir)/SSL/$(@F) $(srcdir)/std_data @RM@ -f $@; @CP@ $(top_srcdir)/SSL/$(@F) $(srcdir)/std_data
std_data/server-cert.pem: $(top_srcdir)/SSL/$(@F) std_data/server-cert.pem: $(top_srcdir)/SSL/$(@F)
@CP@ -f $(top_srcdir)/SSL/$(@F) $(srcdir)/std_data @RM@ -f $@; @CP@ $(top_srcdir)/SSL/$(@F) $(srcdir)/std_data
std_data/server-key.pem: $(top_srcdir)/SSL/$(@F) std_data/server-key.pem: $(top_srcdir)/SSL/$(@F)
@CP@ -f $(top_srcdir)/SSL/$(@F) $(srcdir)/std_data @RM@ -f $@; @CP@ $(top_srcdir)/SSL/$(@F) $(srcdir)/std_data
SUFFIXES = .sh SUFFIXES = .sh
......
...@@ -587,6 +587,7 @@ extern const GlobalSignalNumber NO_OF_SIGNAL_NAMES; ...@@ -587,6 +587,7 @@ extern const GlobalSignalNumber NO_OF_SIGNAL_NAMES;
#define GSN_BLOCK_COMMIT_ORD 485 #define GSN_BLOCK_COMMIT_ORD 485
#define GSN_UNBLOCK_COMMIT_ORD 486 #define GSN_UNBLOCK_COMMIT_ORD 486
#define GSN_NODE_START_REP 502
#define GSN_NODE_STATE_REP 487 #define GSN_NODE_STATE_REP 487
#define GSN_CHANGE_NODE_STATE_REQ 488 #define GSN_CHANGE_NODE_STATE_REQ 488
#define GSN_CHANGE_NODE_STATE_CONF 489 #define GSN_CHANGE_NODE_STATE_CONF 489
......
...@@ -399,6 +399,8 @@ const GsnName SignalNames [] = { ...@@ -399,6 +399,8 @@ const GsnName SignalNames [] = {
,{ GSN_TUP_COM_UNBLOCK, "TUP_COM_UNBLOCK" } ,{ GSN_TUP_COM_UNBLOCK, "TUP_COM_UNBLOCK" }
,{ GSN_DUMP_STATE_ORD, "DUMP_STATE_ORD" } ,{ GSN_DUMP_STATE_ORD, "DUMP_STATE_ORD" }
,{ GSN_NODE_START_REP, "NODE_START_REP" }
,{ GSN_START_INFOREQ, "START_INFOREQ" } ,{ GSN_START_INFOREQ, "START_INFOREQ" }
,{ GSN_START_INFOREF, "START_INFOREF" } ,{ GSN_START_INFOREF, "START_INFOREF" }
,{ GSN_START_INFOCONF, "START_INFOCONF" } ,{ GSN_START_INFOCONF, "START_INFOCONF" }
......
...@@ -2,7 +2,7 @@ Next QMGR 1 ...@@ -2,7 +2,7 @@ Next QMGR 1
Next NDBCNTR 1000 Next NDBCNTR 1000
Next NDBFS 2000 Next NDBFS 2000
Next DBACC 3002 Next DBACC 3002
Next DBTUP 4013 Next DBTUP 4014
Next DBLQH 5043 Next DBLQH 5043
Next DBDICT 6007 Next DBDICT 6007
Next DBDIH 7177 Next DBDIH 7177
...@@ -437,6 +437,8 @@ Drop Table/Index: ...@@ -437,6 +437,8 @@ Drop Table/Index:
8036: Fail next index drop in TC 8036: Fail next index drop in TC
6006: Crash participant in create index 6006: Crash participant in create index
4013: verify TUP tab descr before and after next DROP TABLE
System Restart: System Restart:
--------------- ---------------
......
...@@ -85,9 +85,13 @@ DIH/s ...@@ -85,9 +85,13 @@ DIH/s
START_MECONF START_MECONF
DIH/s DIH/s
* sp7 - release DICT lock * (copy data, omitted)
DIH/s * SL_STARTED - release DICT lock
CNTR/s
NODE_START_REP
DIH/s
DICT_UNLOCK_ORD DICT_UNLOCK_ORD
DICT/m DICT/m
......
...@@ -1599,6 +1599,9 @@ private: ...@@ -1599,6 +1599,9 @@ private:
*/ */
void startInfoReply(Signal *, Uint32 nodeId); void startInfoReply(Signal *, Uint32 nodeId);
// DIH specifics for execNODE_START_REP (sendDictUnlockOrd)
void exec_node_start_rep(Signal* signal);
/* /*
* Lock master DICT. Only current use is by starting node * Lock master DICT. Only current use is by starting node
* during NR. A pool of slave records is convenient anyway. * during NR. A pool of slave records is convenient anyway.
......
...@@ -1356,24 +1356,6 @@ void Dbdih::execNDB_STTOR(Signal* signal) ...@@ -1356,24 +1356,6 @@ void Dbdih::execNDB_STTOR(Signal* signal)
} }
ndbrequire(false); ndbrequire(false);
break; break;
case ZNDB_SPH7:
jam();
switch (typestart) {
case NodeState::ST_INITIAL_START:
case NodeState::ST_SYSTEM_RESTART:
jam();
ndbsttorry10Lab(signal, __LINE__);
return;
case NodeState::ST_NODE_RESTART:
case NodeState::ST_INITIAL_NODE_RESTART:
jam();
sendDictUnlockOrd(signal, c_dictLockSlavePtrI_nodeRestart);
c_dictLockSlavePtrI_nodeRestart = RNIL;
ndbsttorry10Lab(signal, __LINE__);
return;
}
ndbrequire(false);
break;
default: default:
jam(); jam();
ndbsttorry10Lab(signal, __LINE__); ndbsttorry10Lab(signal, __LINE__);
...@@ -1381,6 +1363,27 @@ void Dbdih::execNDB_STTOR(Signal* signal) ...@@ -1381,6 +1363,27 @@ void Dbdih::execNDB_STTOR(Signal* signal)
}//switch }//switch
}//Dbdih::execNDB_STTOR() }//Dbdih::execNDB_STTOR()
void
Dbdih::exec_node_start_rep(Signal* signal)
{
/*
* Send DICT_UNLOCK_ORD when this node is SL_STARTED.
*
* Sending it before (sp 7) conflicts with code which assumes
* SL_STARTING means we are in copy phase of NR.
*
* NodeState::starting.restartType is not supposed to be used
* when SL_STARTED. Also it seems NODE_START_REP can arrive twice.
*
* For these reasons there are no consistency checks and
* we rely on c_dictLockSlavePtrI_nodeRestart alone.
*/
if (c_dictLockSlavePtrI_nodeRestart != RNIL) {
sendDictUnlockOrd(signal, c_dictLockSlavePtrI_nodeRestart);
c_dictLockSlavePtrI_nodeRestart = RNIL;
}
}
void void
Dbdih::createMutexes(Signal * signal, Uint32 count){ Dbdih::createMutexes(Signal * signal, Uint32 count){
Callback c = { safe_cast(&Dbdih::createMutex_done), count }; Callback c = { safe_cast(&Dbdih::createMutex_done), count };
...@@ -1605,6 +1608,7 @@ void Dbdih::nodeRestartPh2Lab(Signal* signal) ...@@ -1605,6 +1608,7 @@ void Dbdih::nodeRestartPh2Lab(Signal* signal)
void Dbdih::recvDictLockConf_nodeRestart(Signal* signal, Uint32 data, Uint32 ret) void Dbdih::recvDictLockConf_nodeRestart(Signal* signal, Uint32 data, Uint32 ret)
{ {
ndbrequire(c_dictLockSlavePtrI_nodeRestart == RNIL); ndbrequire(c_dictLockSlavePtrI_nodeRestart == RNIL);
ndbrequire(data != RNIL);
c_dictLockSlavePtrI_nodeRestart = data; c_dictLockSlavePtrI_nodeRestart = data;
nodeRestartPh2Lab2(signal); nodeRestartPh2Lab2(signal);
......
...@@ -2185,15 +2185,18 @@ private: ...@@ -2185,15 +2185,18 @@ private:
// Public methods // Public methods
Uint32 getTabDescrOffsets(const Tablerec* regTabPtr, Uint32* offset); Uint32 getTabDescrOffsets(const Tablerec* regTabPtr, Uint32* offset);
Uint32 allocTabDescr(const Tablerec* regTabPtr, Uint32* offset); Uint32 allocTabDescr(const Tablerec* regTabPtr, Uint32* offset);
void freeTabDescr(Uint32 retRef, Uint32 retNo); void freeTabDescr(Uint32 retRef, Uint32 retNo, bool normal = true);
Uint32 getTabDescrWord(Uint32 index); Uint32 getTabDescrWord(Uint32 index);
void setTabDescrWord(Uint32 index, Uint32 word); void setTabDescrWord(Uint32 index, Uint32 word);
// Private methods // Private methods
Uint32 sizeOfReadFunction(); Uint32 sizeOfReadFunction();
void removeTdArea(Uint32 tabDesRef, Uint32 list); void removeTdArea(Uint32 tabDesRef, Uint32 list);
void insertTdArea(Uint32 sizeOfChunk, Uint32 tabDesRef, Uint32 list); void insertTdArea(Uint32 tabDesRef, Uint32 list);
Uint32 itdaMergeTabDescr(Uint32 retRef, Uint32 retNo); void itdaMergeTabDescr(Uint32& retRef, Uint32& retNo, bool normal);
#ifdef VM_TRACE
void verifytabdes();
#endif
//------------------------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------------------------
// Page Memory Manager // Page Memory Manager
......
...@@ -601,6 +601,11 @@ void ...@@ -601,6 +601,11 @@ void
Dbtup::execDROP_TAB_REQ(Signal* signal) Dbtup::execDROP_TAB_REQ(Signal* signal)
{ {
ljamEntry(); ljamEntry();
if (ERROR_INSERTED(4013)) {
#ifdef VM_TRACE
verifytabdes();
#endif
}
DropTabReq* req = (DropTabReq*)signal->getDataPtr(); DropTabReq* req = (DropTabReq*)signal->getDataPtr();
TablerecPtr tabPtr; TablerecPtr tabPtr;
...@@ -719,5 +724,11 @@ void Dbtup::execFSREMOVECONF(Signal* signal) ...@@ -719,5 +724,11 @@ void Dbtup::execFSREMOVECONF(Signal* signal)
releaseTabDescr(tabPtr.p); releaseTabDescr(tabPtr.p);
initTab(tabPtr.p); initTab(tabPtr.p);
if (ERROR_INSERTED(4013)) {
CLEAR_ERROR_INSERT_VALUE;
#ifdef VM_TRACE
verifytabdes();
#endif
}
}//Dbtup::execFSREMOVECONF() }//Dbtup::execFSREMOVECONF()
...@@ -24,13 +24,15 @@ ...@@ -24,13 +24,15 @@
#define ljam() { jamLine(22000 + __LINE__); } #define ljam() { jamLine(22000 + __LINE__); }
#define ljamEntry() { jamEntryLine(22000 + __LINE__); } #define ljamEntry() { jamEntryLine(22000 + __LINE__); }
/* **************************************************************** */ /*
/* *********** TABLE DESCRIPTOR MEMORY MANAGER ******************** */ * TABLE DESCRIPTOR MEMORY MANAGER
/* **************************************************************** */ *
/* This module is used to allocate and deallocate table descriptor */ * Each table has a descriptor which is a contiguous array of words.
/* memory attached to fragments (could be allocated per table */ * The descriptor is allocated from a global array using a buddy
/* instead. Performs its task by a buddy algorithm. */ * algorithm. Free lists exist for each power of 2 words. Freeing
/* **************************************************************** */ * a piece first merges with free right and left neighbours and then
* divides itself up into free list chunks.
*/
Uint32 Uint32
Dbtup::getTabDescrOffsets(const Tablerec* regTabPtr, Uint32* offset) Dbtup::getTabDescrOffsets(const Tablerec* regTabPtr, Uint32* offset)
...@@ -59,7 +61,7 @@ Uint32 Dbtup::allocTabDescr(const Tablerec* regTabPtr, Uint32* offset) ...@@ -59,7 +61,7 @@ Uint32 Dbtup::allocTabDescr(const Tablerec* regTabPtr, Uint32* offset)
Uint32 reference = RNIL; Uint32 reference = RNIL;
Uint32 allocSize = getTabDescrOffsets(regTabPtr, offset); Uint32 allocSize = getTabDescrOffsets(regTabPtr, offset);
/* ---------------------------------------------------------------- */ /* ---------------------------------------------------------------- */
/* ALWAYS ALLOCATE A MULTIPLE OF 16 BYTES */ /* ALWAYS ALLOCATE A MULTIPLE OF 16 WORDS */
/* ---------------------------------------------------------------- */ /* ---------------------------------------------------------------- */
allocSize = (((allocSize - 1) >> 4) + 1) << 4; allocSize = (((allocSize - 1) >> 4) + 1) << 4;
Uint32 list = nextHigherTwoLog(allocSize - 1); /* CALCULATE WHICH LIST IT BELONGS TO */ Uint32 list = nextHigherTwoLog(allocSize - 1); /* CALCULATE WHICH LIST IT BELONGS TO */
...@@ -72,9 +74,9 @@ Uint32 Dbtup::allocTabDescr(const Tablerec* regTabPtr, Uint32* offset) ...@@ -72,9 +74,9 @@ Uint32 Dbtup::allocTabDescr(const Tablerec* regTabPtr, Uint32* offset)
Uint32 retNo = (1 << i) - allocSize; /* CALCULATE THE DIFFERENCE */ Uint32 retNo = (1 << i) - allocSize; /* CALCULATE THE DIFFERENCE */
if (retNo >= ZTD_FREE_SIZE) { if (retNo >= ZTD_FREE_SIZE) {
ljam(); ljam();
Uint32 retRef = reference + allocSize; /* SET THE RETURN POINTER */ // return unused words, of course without attempting left merge
retNo = itdaMergeTabDescr(retRef, retNo); /* MERGE WITH POSSIBLE RIGHT NEIGHBOURS */ Uint32 retRef = reference + allocSize;
freeTabDescr(retRef, retNo); /* RETURN UNUSED TD SPACE TO THE TD AREA */ freeTabDescr(retRef, retNo, false);
} else { } else {
ljam(); ljam();
allocSize = 1 << i; allocSize = 1 << i;
...@@ -100,17 +102,19 @@ Uint32 Dbtup::allocTabDescr(const Tablerec* regTabPtr, Uint32* offset) ...@@ -100,17 +102,19 @@ Uint32 Dbtup::allocTabDescr(const Tablerec* regTabPtr, Uint32* offset)
}//if }//if
}//Dbtup::allocTabDescr() }//Dbtup::allocTabDescr()
void Dbtup::freeTabDescr(Uint32 retRef, Uint32 retNo) void Dbtup::freeTabDescr(Uint32 retRef, Uint32 retNo, bool normal)
{ {
itdaMergeTabDescr(retRef, retNo, normal); /* MERGE WITH POSSIBLE NEIGHBOURS */
while (retNo >= ZTD_FREE_SIZE) { while (retNo >= ZTD_FREE_SIZE) {
ljam(); ljam();
Uint32 list = nextHigherTwoLog(retNo); Uint32 list = nextHigherTwoLog(retNo);
list--; /* RETURN TO NEXT LOWER LIST */ list--; /* RETURN TO NEXT LOWER LIST */
Uint32 sizeOfChunk = 1 << list; Uint32 sizeOfChunk = 1 << list;
insertTdArea(sizeOfChunk, retRef, list); insertTdArea(retRef, list);
retRef += sizeOfChunk; retRef += sizeOfChunk;
retNo -= sizeOfChunk; retNo -= sizeOfChunk;
}//while }//while
ndbassert(retNo == 0);
}//Dbtup::freeTabDescr() }//Dbtup::freeTabDescr()
Uint32 Uint32
...@@ -127,7 +131,7 @@ Dbtup::setTabDescrWord(Uint32 index, Uint32 word) ...@@ -127,7 +131,7 @@ Dbtup::setTabDescrWord(Uint32 index, Uint32 word)
tableDescriptor[index].tabDescr = word; tableDescriptor[index].tabDescr = word;
}//Dbtup::setTabDescrWord() }//Dbtup::setTabDescrWord()
void Dbtup::insertTdArea(Uint32 sizeOfChunk, Uint32 tabDesRef, Uint32 list) void Dbtup::insertTdArea(Uint32 tabDesRef, Uint32 list)
{ {
ndbrequire(list < 16); ndbrequire(list < 16);
setTabDescrWord(tabDesRef + ZTD_FL_HEADER, ZTD_TYPE_FREE); setTabDescrWord(tabDesRef + ZTD_FL_HEADER, ZTD_TYPE_FREE);
...@@ -144,19 +148,14 @@ void Dbtup::insertTdArea(Uint32 sizeOfChunk, Uint32 tabDesRef, Uint32 list) ...@@ -144,19 +148,14 @@ void Dbtup::insertTdArea(Uint32 sizeOfChunk, Uint32 tabDesRef, Uint32 list)
setTabDescrWord((tabDesRef + (1 << list)) - ZTD_TR_SIZE, 1 << list); setTabDescrWord((tabDesRef + (1 << list)) - ZTD_TR_SIZE, 1 << list);
}//Dbtup::insertTdArea() }//Dbtup::insertTdArea()
/* ---------------------------------------------------------------- */ /*
/* ----------------------- MERGE_TAB_DESCR ------------------------ */ * Merge to-be-removed chunk (which need not be initialized with header
/* ---------------------------------------------------------------- */ * and trailer) with left and right buddies. The start point retRef
/* INPUT: TAB_DESCR_PTR POINTING AT THE CURRENT CHUNK */ * moves to left and the size retNo increases to match the new chunk.
/* */ */
/* SHORTNAME: MTD */ void Dbtup::itdaMergeTabDescr(Uint32& retRef, Uint32& retNo, bool normal)
/* -----------------------------------------------------------------*/
Uint32 Dbtup::itdaMergeTabDescr(Uint32 retRef, Uint32 retNo)
{ {
/* THE SIZE OF THE PART TO MERGE MUST BE OF THE SAME SIZE AS THE INSERTED PART */ // merge right
/* THIS IS TRUE EITHER IF ONE PART HAS THE SAME SIZE OR THE SUM OF BOTH PARTS */
/* TOGETHER HAS THE SAME SIZE AS THE PART TO BE INSERTED */
/* FIND THE SIZES OF THE PARTS TO THE RIGHT OF THE PART TO BE REINSERTED */
while ((retRef + retNo) < cnoOfTabDescrRec) { while ((retRef + retNo) < cnoOfTabDescrRec) {
ljam(); ljam();
Uint32 tabDesRef = retRef + retNo; Uint32 tabDesRef = retRef + retNo;
...@@ -170,11 +169,28 @@ Uint32 Dbtup::itdaMergeTabDescr(Uint32 retRef, Uint32 retNo) ...@@ -170,11 +169,28 @@ Uint32 Dbtup::itdaMergeTabDescr(Uint32 retRef, Uint32 retNo)
removeTdArea(tabDesRef, list); removeTdArea(tabDesRef, list);
} else { } else {
ljam(); ljam();
return retNo; break;
}//if }
}//while }
ndbrequire((retRef + retNo) == cnoOfTabDescrRec); // merge left
return retNo; const bool mergeLeft = normal;
while (mergeLeft && retRef > 0) {
ljam();
Uint32 trailerWord = getTabDescrWord(retRef - ZTD_TR_TYPE);
if (trailerWord == ZTD_TYPE_FREE) {
ljam();
Uint32 sizeOfMergedPart = getTabDescrWord(retRef - ZTD_TR_SIZE);
ndbrequire(retRef >= sizeOfMergedPart);
retRef -= sizeOfMergedPart;
retNo += sizeOfMergedPart;
Uint32 list = nextHigherTwoLog(sizeOfMergedPart - 1);
removeTdArea(retRef, list);
} else {
ljam();
break;
}
}
ndbrequire((retRef + retNo) <= cnoOfTabDescrRec);
}//Dbtup::itdaMergeTabDescr() }//Dbtup::itdaMergeTabDescr()
/* ---------------------------------------------------------------- */ /* ---------------------------------------------------------------- */
...@@ -210,3 +226,94 @@ void Dbtup::removeTdArea(Uint32 tabDesRef, Uint32 list) ...@@ -210,3 +226,94 @@ void Dbtup::removeTdArea(Uint32 tabDesRef, Uint32 list)
setTabDescrWord(tabDescrPrevPtr + ZTD_FL_NEXT, tabDescrNextPtr); setTabDescrWord(tabDescrPrevPtr + ZTD_FL_NEXT, tabDescrNextPtr);
}//if }//if
}//Dbtup::removeTdArea() }//Dbtup::removeTdArea()
#ifdef VM_TRACE
void
Dbtup::verifytabdes()
{
struct WordType {
short fl; // free list 0-15
short ti; // table id
WordType() : fl(-1), ti(-1) {}
};
WordType* wt = new WordType [cnoOfTabDescrRec];
uint free_frags = 0;
// free lists
{
for (uint i = 0; i < 16; i++) {
Uint32 desc2 = RNIL;
Uint32 desc = cfreeTdList[i];
while (desc != RNIL) {
const Uint32 size = (1 << i);
ndbrequire(size >= ZTD_FREE_SIZE);
ndbrequire(desc + size <= cnoOfTabDescrRec);
{ Uint32 index = desc + ZTD_FL_HEADER;
ndbrequire(tableDescriptor[index].tabDescr == ZTD_TYPE_FREE);
}
{ Uint32 index = desc + ZTD_FL_SIZE;
ndbrequire(tableDescriptor[index].tabDescr == size);
}
{ Uint32 index = desc + size - ZTD_TR_TYPE;
ndbrequire(tableDescriptor[index].tabDescr == ZTD_TYPE_FREE);
}
{ Uint32 index = desc + size - ZTD_TR_SIZE;
ndbrequire(tableDescriptor[index].tabDescr == size);
}
{ Uint32 index = desc + ZTD_FL_PREV;
ndbrequire(tableDescriptor[index].tabDescr == desc2);
}
for (uint j = 0; j < size; j++) {
ndbrequire(wt[desc + j].fl == -1);
wt[desc + j].fl = i;
}
desc2 = desc;
desc = tableDescriptor[desc + ZTD_FL_NEXT].tabDescr;
free_frags++;
}
}
}
// tables
{
for (uint i = 0; i < cnoOfTablerec; i++) {
TablerecPtr ptr;
ptr.i = i;
ptrAss(ptr, tablerec);
if (ptr.p->tableStatus == DEFINED) {
Uint32 offset[10];
const Uint32 alloc = getTabDescrOffsets(ptr.p, offset);
const Uint32 desc = ptr.p->readKeyArray - offset[3];
Uint32 size = alloc;
if (size % ZTD_FREE_SIZE != 0)
size += ZTD_FREE_SIZE - size % ZTD_FREE_SIZE;
ndbrequire(desc + size <= cnoOfTabDescrRec);
{ Uint32 index = desc + ZTD_FL_HEADER;
ndbrequire(tableDescriptor[index].tabDescr == ZTD_TYPE_NORMAL);
}
{ Uint32 index = desc + ZTD_FL_SIZE;
ndbrequire(tableDescriptor[index].tabDescr == size);
}
{ Uint32 index = desc + size - ZTD_TR_TYPE;
ndbrequire(tableDescriptor[index].tabDescr == ZTD_TYPE_NORMAL);
}
{ Uint32 index = desc + size - ZTD_TR_SIZE;
ndbrequire(tableDescriptor[index].tabDescr == size);
}
for (uint j = 0; j < size; j++) {
ndbrequire(wt[desc + j].ti == -1);
wt[desc + j].ti = i;
}
}
}
}
// all words
{
for (uint i = 0; i < cnoOfTabDescrRec; i++) {
bool is_fl = wt[i].fl != -1;
bool is_ti = wt[i].ti != -1;
ndbrequire(is_fl != is_ti);
}
}
delete [] wt;
ndbout << "verifytabdes: frags=" << free_frags << endl;
}
#endif
...@@ -592,6 +592,13 @@ Ndbcntr::execCNTR_START_REP(Signal* signal){ ...@@ -592,6 +592,13 @@ Ndbcntr::execCNTR_START_REP(Signal* signal){
c_startedNodes.set(nodeId); c_startedNodes.set(nodeId);
c_start.m_starting.clear(nodeId); c_start.m_starting.clear(nodeId);
/**
* Inform all interested blocks that node has started
*/
for(Uint32 i = 0; i<ALL_BLOCKS_SZ; i++){
sendSignal(ALL_BLOCKS[i].Ref, GSN_NODE_START_REP, signal, 1, JBB);
}
if(!c_start.m_starting.isclear()){ if(!c_start.m_starting.isclear()){
jam(); jam();
return; return;
......
...@@ -148,6 +148,7 @@ SimulatedBlock::installSimulatedBlockFunctions(){ ...@@ -148,6 +148,7 @@ SimulatedBlock::installSimulatedBlockFunctions(){
a[GSN_FSREMOVEREF] = &SimulatedBlock::execFSREMOVEREF; a[GSN_FSREMOVEREF] = &SimulatedBlock::execFSREMOVEREF;
a[GSN_FSSYNCREF] = &SimulatedBlock::execFSSYNCREF; a[GSN_FSSYNCREF] = &SimulatedBlock::execFSSYNCREF;
a[GSN_FSAPPENDREF] = &SimulatedBlock::execFSAPPENDREF; a[GSN_FSAPPENDREF] = &SimulatedBlock::execFSAPPENDREF;
a[GSN_NODE_START_REP] = &SimulatedBlock::execNODE_START_REP;
} }
void void
...@@ -913,6 +914,20 @@ SimulatedBlock::execCONTINUE_FRAGMENTED(Signal * signal){ ...@@ -913,6 +914,20 @@ SimulatedBlock::execCONTINUE_FRAGMENTED(Signal * signal){
sendSignal(reference(), GSN_CONTINUE_FRAGMENTED, signal, 1, JBB); sendSignal(reference(), GSN_CONTINUE_FRAGMENTED, signal, 1, JBB);
} }
void
SimulatedBlock::execNODE_START_REP(Signal* signal)
{
// common stuff for all blocks
// block specific stuff by virtual method override (default empty)
exec_node_start_rep(signal);
}
void
SimulatedBlock::exec_node_start_rep(Signal* signal)
{
}
#ifdef VM_TRACE_TIME #ifdef VM_TRACE_TIME
void void
SimulatedBlock::clearTimes() { SimulatedBlock::clearTimes() {
......
...@@ -423,6 +423,8 @@ private: ...@@ -423,6 +423,8 @@ private:
void execSIGNAL_DROPPED_REP(Signal* signal); void execSIGNAL_DROPPED_REP(Signal* signal);
void execCONTINUE_FRAGMENTED(Signal* signal); void execCONTINUE_FRAGMENTED(Signal* signal);
void execNODE_START_REP(Signal* signal);
virtual void exec_node_start_rep(Signal* signal);
Uint32 c_fragmentIdCounter; Uint32 c_fragmentIdCounter;
ArrayPool<FragmentInfo> c_fragmentInfoPool; ArrayPool<FragmentInfo> c_fragmentInfoPool;
......
...@@ -233,6 +233,101 @@ int runCreateAndDrop(NDBT_Context* ctx, NDBT_Step* step){ ...@@ -233,6 +233,101 @@ int runCreateAndDrop(NDBT_Context* ctx, NDBT_Step* step){
return NDBT_OK; return NDBT_OK;
} }
int runCreateAndDropAtRandom(NDBT_Context* ctx, NDBT_Step* step)
{
myRandom48Init(NdbTick_CurrentMillisecond());
Ndb* pNdb = GETNDB(step);
NdbDictionary::Dictionary* pDic = pNdb->getDictionary();
int loops = ctx->getNumLoops();
int numTables = NDBT_Tables::getNumTables();
bool* tabList = new bool [ numTables ];
int tabCount;
{
for (int num = 0; num < numTables; num++) {
(void)pDic->dropTable(NDBT_Tables::getTable(num)->getName());
tabList[num] = false;
}
tabCount = 0;
}
NdbRestarter restarter;
int result = NDBT_OK;
int bias = 1; // 0-less 1-more
int i = 0;
while (i < loops) {
g_info << "loop " << i << " tabs " << tabCount << "/" << numTables << endl;
int num = myRandom48(numTables);
const NdbDictionary::Table* pTab = NDBT_Tables::getTable(num);
char tabName[200];
strcpy(tabName, pTab->getName());
if (tabList[num] == false) {
if (bias == 0 && myRandom48(100) < 80)
continue;
g_info << tabName << ": create" << endl;
if (pDic->createTable(*pTab) != 0) {
const NdbError err = pDic->getNdbError();
g_err << tabName << ": create failed: " << err << endl;
result = NDBT_FAILED;
break;
}
const NdbDictionary::Table* pTab2 = pDic->getTable(tabName);
if (pTab2 == NULL) {
const NdbError err = pDic->getNdbError();
g_err << tabName << ": verify create: " << err << endl;
result = NDBT_FAILED;
break;
}
tabList[num] = true;
assert(tabCount < numTables);
tabCount++;
if (tabCount == numTables)
bias = 0;
}
else {
if (bias == 1 && myRandom48(100) < 80)
continue;
g_info << tabName << ": drop" << endl;
if (restarter.insertErrorInAllNodes(4013) != 0) {
g_err << "error insert failed" << endl;
result = NDBT_FAILED;
break;
}
if (pDic->dropTable(tabName) != 0) {
const NdbError err = pDic->getNdbError();
g_err << tabName << ": drop failed: " << err << endl;
result = NDBT_FAILED;
break;
}
const NdbDictionary::Table* pTab2 = pDic->getTable(tabName);
if (pTab2 != NULL) {
g_err << tabName << ": verify drop: table exists" << endl;
result = NDBT_FAILED;
break;
}
if (pDic->getNdbError().code != 709 &&
pDic->getNdbError().code != 723) {
const NdbError err = pDic->getNdbError();
g_err << tabName << ": verify drop: " << err << endl;
result = NDBT_FAILED;
break;
}
tabList[num] = false;
assert(tabCount > 0);
tabCount--;
if (tabCount == 0)
bias = 1;
}
i++;
}
delete [] tabList;
return result;
}
int runCreateAndDropWithData(NDBT_Context* ctx, NDBT_Step* step){ int runCreateAndDropWithData(NDBT_Context* ctx, NDBT_Step* step){
Ndb* pNdb = GETNDB(step); Ndb* pNdb = GETNDB(step);
int loops = ctx->getNumLoops(); int loops = ctx->getNumLoops();
...@@ -1849,6 +1944,12 @@ TESTCASE("CreateAndDrop", ...@@ -1849,6 +1944,12 @@ TESTCASE("CreateAndDrop",
"Try to create and drop the table loop number of times\n"){ "Try to create and drop the table loop number of times\n"){
INITIALIZER(runCreateAndDrop); INITIALIZER(runCreateAndDrop);
} }
TESTCASE("CreateAndDropAtRandom",
"Try to create and drop table at random loop number of times\n"
"Uses all available tables\n"
"Uses error insert 4013 to make TUP verify table descriptor"){
INITIALIZER(runCreateAndDropAtRandom);
}
TESTCASE("CreateAndDropWithData", TESTCASE("CreateAndDropWithData",
"Try to create and drop the table when it's filled with data\n" "Try to create and drop the table when it's filled with data\n"
"do this loop number of times\n"){ "do this loop number of times\n"){
......
...@@ -464,6 +464,10 @@ max-time: 1500 ...@@ -464,6 +464,10 @@ max-time: 1500
cmd: testDict cmd: testDict
args: -n CreateAndDrop args: -n CreateAndDrop
max-time: 1500
cmd: testDict
args: -n CreateAndDropAtRandom -l 200 T1
max-time: 1500 max-time: 1500
cmd: testDict cmd: testDict
args: -n CreateAndDropWithData args: -n CreateAndDropWithData
...@@ -500,6 +504,10 @@ max-time: 1500 ...@@ -500,6 +504,10 @@ max-time: 1500
cmd: testDict cmd: testDict
args: -n TemporaryTables T1 T6 T7 T8 args: -n TemporaryTables T1 T6 T7 T8
max-time: 1500
cmd: testDict
args: -n Restart_NR2 T1
# #
# TEST NDBAPI # TEST NDBAPI
# #
......
...@@ -342,7 +342,7 @@ then ...@@ -342,7 +342,7 @@ then
cp -fp config.log "$MYSQL_MAXCONFLOG_DEST" cp -fp config.log "$MYSQL_MAXCONFLOG_DEST"
fi fi
make -i test-force || true make -i test-force-pl || true
# Save mysqld-max # Save mysqld-max
./libtool --mode=execute cp sql/mysqld sql/mysqld-max ./libtool --mode=execute cp sql/mysqld sql/mysqld-max
...@@ -401,7 +401,7 @@ then ...@@ -401,7 +401,7 @@ then
cp -fp config.log "$MYSQL_CONFLOG_DEST" cp -fp config.log "$MYSQL_CONFLOG_DEST"
fi fi
make -i test-force || true make -i test-force-pl || true
%install %install
RBR=$RPM_BUILD_ROOT RBR=$RPM_BUILD_ROOT
...@@ -740,6 +740,15 @@ fi ...@@ -740,6 +740,15 @@ fi
# itself - note that they must be ordered by date (important when # itself - note that they must be ordered by date (important when
# merging BK trees) # merging BK trees)
%changelog %changelog
* Mon Jul 10 2006 Joerg Bruehe <joerg@mysql.com>
- Fix a typing error in the "make" target for the Perl script to run the tests.
* Tue Jul 04 2006 Joerg Bruehe <joerg@mysql.com>
- Use the Perl script to run the tests, because it will automatically check
whether the server is configured with SSL.
* Tue Jun 27 2006 Joerg Bruehe <joerg@mysql.com> * Tue Jun 27 2006 Joerg Bruehe <joerg@mysql.com>
- move "mysqldumpslow" from the client RPM to the server RPM (bug#20216) - move "mysqldumpslow" from the client RPM to the server RPM (bug#20216)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment