Commit cd0ae996 authored by mronstrom@mysql.com's avatar mronstrom@mysql.com

Merge mikael@ndb.mysql.com:/home/mikael/bug12594

into  mysql.com:/Users/mikron/mysql-4.1
parents 98a52fa9 43c2bc2f
...@@ -86,6 +86,17 @@ ...@@ -86,6 +86,17 @@
#define ZCURR_PAGE_INDEX 8 #define ZCURR_PAGE_INDEX 8
#define ZLAST_LOG_PREP_REF 10 #define ZLAST_LOG_PREP_REF 10
#define ZPOS_DIRTY 11 #define ZPOS_DIRTY 11
/* A number of debug items written in the page header of all log files */
#define ZPOS_LOG_TIMER 12
#define ZPOS_PAGE_I 13
#define ZPOS_PLACE_WRITTEN_FROM 14
#define ZPOS_PAGE_NO 15
#define ZPOS_PAGE_FILE_NO 16
#define ZPOS_WORD_WRITTEN 17
#define ZPOS_IN_WRITING 18
#define ZPOS_PREV_PAGE_NO 19
#define ZPOS_IN_FREE_LIST 20
/* ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */
/* CONSTANTS FOR THE VARIOUS REPLICA AND NODE TYPES. */ /* CONSTANTS FOR THE VARIOUS REPLICA AND NODE TYPES. */
/* ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */
...@@ -2278,7 +2289,7 @@ private: ...@@ -2278,7 +2289,7 @@ private:
const LogPartRecordPtr &sltLogPartPtr); const LogPartRecordPtr &sltLogPartPtr);
void checkGcpCompleted(Signal* signal, Uint32 pageWritten, Uint32 wordWritten); void checkGcpCompleted(Signal* signal, Uint32 pageWritten, Uint32 wordWritten);
void initFsopenconf(Signal* signal); void initFsopenconf(Signal* signal);
void initFsrwconf(Signal* signal); void initFsrwconf(Signal* signal, bool write);
void initLfo(Signal* signal); void initLfo(Signal* signal);
void initLogfile(Signal* signal, Uint32 fileNo); void initLogfile(Signal* signal, Uint32 fileNo);
void initLogpage(Signal* signal); void initLogpage(Signal* signal);
...@@ -2294,7 +2305,8 @@ private: ...@@ -2294,7 +2305,8 @@ private:
void writeFileDescriptor(Signal* signal); void writeFileDescriptor(Signal* signal);
void writeFileHeaderOpen(Signal* signal, Uint32 type); void writeFileHeaderOpen(Signal* signal, Uint32 type);
void writeInitMbyte(Signal* signal); void writeInitMbyte(Signal* signal);
void writeSinglePage(Signal* signal, Uint32 pageNo, Uint32 wordWritten); void writeSinglePage(Signal* signal, Uint32 pageNo,
Uint32 wordWritten, Uint32 place);
void buildLinkedLogPageList(Signal* signal); void buildLinkedLogPageList(Signal* signal);
void changeMbyte(Signal* signal); void changeMbyte(Signal* signal);
Uint32 checkIfExecLog(Signal* signal); Uint32 checkIfExecLog(Signal* signal);
...@@ -2303,7 +2315,7 @@ private: ...@@ -2303,7 +2315,7 @@ private:
void checkScanTcCompleted(Signal* signal); void checkScanTcCompleted(Signal* signal);
void checkSrCompleted(Signal* signal); void checkSrCompleted(Signal* signal);
void closeFile(Signal* signal, LogFileRecordPtr logFilePtr); void closeFile(Signal* signal, LogFileRecordPtr logFilePtr);
void completedLogPage(Signal* signal, Uint32 clpType); void completedLogPage(Signal* signal, Uint32 clpType, Uint32 place);
void deleteFragrec(Uint32 fragId); void deleteFragrec(Uint32 fragId);
void deleteTransidHash(Signal* signal); void deleteTransidHash(Signal* signal);
void findLogfile(Signal* signal, void findLogfile(Signal* signal,
...@@ -2399,7 +2411,9 @@ private: ...@@ -2399,7 +2411,9 @@ private:
void writeAbortLog(Signal* signal); void writeAbortLog(Signal* signal);
void writeCommitLog(Signal* signal, LogPartRecordPtr regLogPartPtr); void writeCommitLog(Signal* signal, LogPartRecordPtr regLogPartPtr);
void writeCompletedGciLog(Signal* signal); void writeCompletedGciLog(Signal* signal);
void writeDirty(Signal* signal); void writeDbgInfoPageHeader(LogPageRecordPtr logPagePtr, Uint32 place,
Uint32 pageNo, Uint32 wordWritten);
void writeDirty(Signal* signal, Uint32 place);
void writeKey(Signal* signal); void writeKey(Signal* signal);
void writeLogHeader(Signal* signal); void writeLogHeader(Signal* signal);
void writeLogWord(Signal* signal, Uint32 data); void writeLogWord(Signal* signal, Uint32 data);
......
...@@ -11749,42 +11749,34 @@ void Dblqh::execFSCLOSECONF(Signal* signal) ...@@ -11749,42 +11749,34 @@ void Dblqh::execFSCLOSECONF(Signal* signal)
ptrCheckGuard(logFilePtr, clogFileFileSize, logFileRecord); ptrCheckGuard(logFilePtr, clogFileFileSize, logFileRecord);
exitFromInvalidate(signal); exitFromInvalidate(signal);
return; return;
break;
case LogFileRecord::CLOSING_INIT: case LogFileRecord::CLOSING_INIT:
jam(); jam();
closingInitLab(signal); closingInitLab(signal);
return; return;
break;
case LogFileRecord::CLOSING_SR: case LogFileRecord::CLOSING_SR:
jam(); jam();
closingSrLab(signal); closingSrLab(signal);
return; return;
break;
case LogFileRecord::CLOSING_EXEC_SR: case LogFileRecord::CLOSING_EXEC_SR:
jam(); jam();
closeExecSrLab(signal); closeExecSrLab(signal);
return; return;
break;
case LogFileRecord::CLOSING_EXEC_SR_COMPLETED: case LogFileRecord::CLOSING_EXEC_SR_COMPLETED:
jam(); jam();
closeExecSrCompletedLab(signal); closeExecSrCompletedLab(signal);
return; return;
break;
case LogFileRecord::CLOSING_WRITE_LOG: case LogFileRecord::CLOSING_WRITE_LOG:
jam(); jam();
closeWriteLogLab(signal); closeWriteLogLab(signal);
return; return;
break;
case LogFileRecord::CLOSING_EXEC_LOG: case LogFileRecord::CLOSING_EXEC_LOG:
jam(); jam();
closeExecLogLab(signal); closeExecLogLab(signal);
return; return;
break;
default: default:
jam(); jam();
systemErrorLab(signal); systemErrorLab(signal);
return; return;
break;
}//switch }//switch
}//Dblqh::execFSCLOSECONF() }//Dblqh::execFSCLOSECONF()
...@@ -11802,77 +11794,64 @@ void Dblqh::execFSOPENCONF(Signal* signal) ...@@ -11802,77 +11794,64 @@ void Dblqh::execFSOPENCONF(Signal* signal)
logFilePtr.p->logFileStatus = LogFileRecord::OPEN; logFilePtr.p->logFileStatus = LogFileRecord::OPEN;
readFileInInvalidate(signal); readFileInInvalidate(signal);
return; return;
break;
case LogFileRecord::OPENING_INIT: case LogFileRecord::OPENING_INIT:
jam(); jam();
logFilePtr.p->logFileStatus = LogFileRecord::OPEN; logFilePtr.p->logFileStatus = LogFileRecord::OPEN;
openFileInitLab(signal); openFileInitLab(signal);
return; return;
break;
case LogFileRecord::OPEN_SR_FRONTPAGE: case LogFileRecord::OPEN_SR_FRONTPAGE:
jam(); jam();
logFilePtr.p->logFileStatus = LogFileRecord::OPEN; logFilePtr.p->logFileStatus = LogFileRecord::OPEN;
openSrFrontpageLab(signal); openSrFrontpageLab(signal);
return; return;
break;
case LogFileRecord::OPEN_SR_LAST_FILE: case LogFileRecord::OPEN_SR_LAST_FILE:
jam(); jam();
logFilePtr.p->logFileStatus = LogFileRecord::OPEN; logFilePtr.p->logFileStatus = LogFileRecord::OPEN;
openSrLastFileLab(signal); openSrLastFileLab(signal);
return; return;
break;
case LogFileRecord::OPEN_SR_NEXT_FILE: case LogFileRecord::OPEN_SR_NEXT_FILE:
jam(); jam();
logFilePtr.p->logFileStatus = LogFileRecord::OPEN; logFilePtr.p->logFileStatus = LogFileRecord::OPEN;
openSrNextFileLab(signal); openSrNextFileLab(signal);
return; return;
break;
case LogFileRecord::OPEN_EXEC_SR_START: case LogFileRecord::OPEN_EXEC_SR_START:
jam(); jam();
logFilePtr.p->logFileStatus = LogFileRecord::OPEN; logFilePtr.p->logFileStatus = LogFileRecord::OPEN;
openExecSrStartLab(signal); openExecSrStartLab(signal);
return; return;
break;
case LogFileRecord::OPEN_EXEC_SR_NEW_MBYTE: case LogFileRecord::OPEN_EXEC_SR_NEW_MBYTE:
jam(); jam();
logFilePtr.p->logFileStatus = LogFileRecord::OPEN; logFilePtr.p->logFileStatus = LogFileRecord::OPEN;
openExecSrNewMbyteLab(signal); openExecSrNewMbyteLab(signal);
return; return;
break;
case LogFileRecord::OPEN_SR_FOURTH_PHASE: case LogFileRecord::OPEN_SR_FOURTH_PHASE:
jam(); jam();
logFilePtr.p->logFileStatus = LogFileRecord::OPEN; logFilePtr.p->logFileStatus = LogFileRecord::OPEN;
openSrFourthPhaseLab(signal); openSrFourthPhaseLab(signal);
return; return;
break;
case LogFileRecord::OPEN_SR_FOURTH_NEXT: case LogFileRecord::OPEN_SR_FOURTH_NEXT:
jam(); jam();
logFilePtr.p->logFileStatus = LogFileRecord::OPEN; logFilePtr.p->logFileStatus = LogFileRecord::OPEN;
openSrFourthNextLab(signal); openSrFourthNextLab(signal);
return; return;
break;
case LogFileRecord::OPEN_SR_FOURTH_ZERO: case LogFileRecord::OPEN_SR_FOURTH_ZERO:
jam(); jam();
logFilePtr.p->logFileStatus = LogFileRecord::OPEN; logFilePtr.p->logFileStatus = LogFileRecord::OPEN;
openSrFourthZeroLab(signal); openSrFourthZeroLab(signal);
return; return;
break;
case LogFileRecord::OPENING_WRITE_LOG: case LogFileRecord::OPENING_WRITE_LOG:
jam(); jam();
logFilePtr.p->logFileStatus = LogFileRecord::OPEN; logFilePtr.p->logFileStatus = LogFileRecord::OPEN;
return; return;
break;
case LogFileRecord::OPEN_EXEC_LOG: case LogFileRecord::OPEN_EXEC_LOG:
jam(); jam();
logFilePtr.p->logFileStatus = LogFileRecord::OPEN; logFilePtr.p->logFileStatus = LogFileRecord::OPEN;
openExecLogLab(signal); openExecLogLab(signal);
return; return;
break;
default: default:
jam(); jam();
systemErrorLab(signal); systemErrorLab(signal);
return; return;
break;
}//switch }//switch
}//Dblqh::execFSOPENCONF() }//Dblqh::execFSOPENCONF()
...@@ -11883,7 +11862,7 @@ void Dblqh::execFSOPENCONF(Signal* signal) ...@@ -11883,7 +11862,7 @@ void Dblqh::execFSOPENCONF(Signal* signal)
void Dblqh::execFSREADCONF(Signal* signal) void Dblqh::execFSREADCONF(Signal* signal)
{ {
jamEntry(); jamEntry();
initFsrwconf(signal); initFsrwconf(signal, false);
switch (lfoPtr.p->lfoState) { switch (lfoPtr.p->lfoState) {
case LogFileOperationRecord::READ_SR_LAST_MBYTE: case LogFileOperationRecord::READ_SR_LAST_MBYTE:
...@@ -11891,57 +11870,47 @@ void Dblqh::execFSREADCONF(Signal* signal) ...@@ -11891,57 +11870,47 @@ void Dblqh::execFSREADCONF(Signal* signal)
releaseLfo(signal); releaseLfo(signal);
readSrLastMbyteLab(signal); readSrLastMbyteLab(signal);
return; return;
break;
case LogFileOperationRecord::READ_SR_FRONTPAGE: case LogFileOperationRecord::READ_SR_FRONTPAGE:
jam(); jam();
releaseLfo(signal); releaseLfo(signal);
readSrFrontpageLab(signal); readSrFrontpageLab(signal);
return; return;
break;
case LogFileOperationRecord::READ_SR_LAST_FILE: case LogFileOperationRecord::READ_SR_LAST_FILE:
jam(); jam();
releaseLfo(signal); releaseLfo(signal);
readSrLastFileLab(signal); readSrLastFileLab(signal);
return; return;
break;
case LogFileOperationRecord::READ_SR_NEXT_FILE: case LogFileOperationRecord::READ_SR_NEXT_FILE:
jam(); jam();
releaseLfo(signal); releaseLfo(signal);
readSrNextFileLab(signal); readSrNextFileLab(signal);
return; return;
break;
case LogFileOperationRecord::READ_EXEC_SR: case LogFileOperationRecord::READ_EXEC_SR:
jam(); jam();
readExecSrLab(signal); readExecSrLab(signal);
return; return;
break;
case LogFileOperationRecord::READ_EXEC_LOG: case LogFileOperationRecord::READ_EXEC_LOG:
jam(); jam();
readExecLogLab(signal); readExecLogLab(signal);
return; return;
break;
case LogFileOperationRecord::READ_SR_INVALIDATE_PAGES: case LogFileOperationRecord::READ_SR_INVALIDATE_PAGES:
jam(); jam();
invalidateLogAfterLastGCI(signal); invalidateLogAfterLastGCI(signal);
return; return;
break;
case LogFileOperationRecord::READ_SR_FOURTH_PHASE: case LogFileOperationRecord::READ_SR_FOURTH_PHASE:
jam(); jam();
releaseLfo(signal); releaseLfo(signal);
readSrFourthPhaseLab(signal); readSrFourthPhaseLab(signal);
return; return;
break;
case LogFileOperationRecord::READ_SR_FOURTH_ZERO: case LogFileOperationRecord::READ_SR_FOURTH_ZERO:
jam(); jam();
releaseLfo(signal); releaseLfo(signal);
readSrFourthZeroLab(signal); readSrFourthZeroLab(signal);
return; return;
break;
default: default:
jam(); jam();
systemErrorLab(signal); systemErrorLab(signal);
return; return;
break;
}//switch }//switch
}//Dblqh::execFSREADCONF() }//Dblqh::execFSREADCONF()
...@@ -11998,63 +11967,52 @@ void Dblqh::execFSREADREF(Signal* signal) ...@@ -11998,63 +11967,52 @@ void Dblqh::execFSREADREF(Signal* signal)
void Dblqh::execFSWRITECONF(Signal* signal) void Dblqh::execFSWRITECONF(Signal* signal)
{ {
jamEntry(); jamEntry();
initFsrwconf(signal); initFsrwconf(signal, true);
switch (lfoPtr.p->lfoState) { switch (lfoPtr.p->lfoState) {
case LogFileOperationRecord::WRITE_SR_INVALIDATE_PAGES: case LogFileOperationRecord::WRITE_SR_INVALIDATE_PAGES:
jam(); jam();
invalidateLogAfterLastGCI(signal); invalidateLogAfterLastGCI(signal);
return; return;
break;
case LogFileOperationRecord::WRITE_PAGE_ZERO: case LogFileOperationRecord::WRITE_PAGE_ZERO:
jam(); jam();
writePageZeroLab(signal); writePageZeroLab(signal);
return; return;
break;
case LogFileOperationRecord::LAST_WRITE_IN_FILE: case LogFileOperationRecord::LAST_WRITE_IN_FILE:
jam(); jam();
lastWriteInFileLab(signal); lastWriteInFileLab(signal);
return; return;
break;
case LogFileOperationRecord::INIT_WRITE_AT_END: case LogFileOperationRecord::INIT_WRITE_AT_END:
jam(); jam();
initWriteEndLab(signal); initWriteEndLab(signal);
return; return;
break;
case LogFileOperationRecord::INIT_FIRST_PAGE: case LogFileOperationRecord::INIT_FIRST_PAGE:
jam(); jam();
initFirstPageLab(signal); initFirstPageLab(signal);
return; return;
break;
case LogFileOperationRecord::WRITE_GCI_ZERO: case LogFileOperationRecord::WRITE_GCI_ZERO:
jam(); jam();
writeGciZeroLab(signal); writeGciZeroLab(signal);
return; return;
break;
case LogFileOperationRecord::WRITE_DIRTY: case LogFileOperationRecord::WRITE_DIRTY:
jam(); jam();
writeDirtyLab(signal); writeDirtyLab(signal);
return; return;
break;
case LogFileOperationRecord::WRITE_INIT_MBYTE: case LogFileOperationRecord::WRITE_INIT_MBYTE:
jam(); jam();
writeInitMbyteLab(signal); writeInitMbyteLab(signal);
return; return;
break;
case LogFileOperationRecord::ACTIVE_WRITE_LOG: case LogFileOperationRecord::ACTIVE_WRITE_LOG:
jam(); jam();
writeLogfileLab(signal); writeLogfileLab(signal);
return; return;
break;
case LogFileOperationRecord::FIRST_PAGE_WRITE_IN_LOGFILE: case LogFileOperationRecord::FIRST_PAGE_WRITE_IN_LOGFILE:
jam(); jam();
firstPageWriteLab(signal); firstPageWriteLab(signal);
return; return;
break;
default: default:
jam(); jam();
systemErrorLab(signal); systemErrorLab(signal);
return; return;
break;
}//switch }//switch
}//Dblqh::execFSWRITECONF() }//Dblqh::execFSWRITECONF()
...@@ -12130,16 +12088,35 @@ void Dblqh::initFsopenconf(Signal* signal) ...@@ -12130,16 +12088,35 @@ void Dblqh::initFsopenconf(Signal* signal)
/* ======= INITIATE WHEN RECEIVING FSREADCONF AND FSWRITECONF ======= */ /* ======= INITIATE WHEN RECEIVING FSREADCONF AND FSWRITECONF ======= */
/* */ /* */
/* ========================================================================= */ /* ========================================================================= */
void Dblqh::initFsrwconf(Signal* signal) void Dblqh::initFsrwconf(Signal* signal, bool write)
{ {
LogPageRecordPtr logP;
Uint32 noPages, totPages;
lfoPtr.i = signal->theData[0]; lfoPtr.i = signal->theData[0];
ptrCheckGuard(lfoPtr, clfoFileSize, logFileOperationRecord); ptrCheckGuard(lfoPtr, clfoFileSize, logFileOperationRecord);
totPages= lfoPtr.p->noPagesRw;
logFilePtr.i = lfoPtr.p->logFileRec; logFilePtr.i = lfoPtr.p->logFileRec;
ptrCheckGuard(logFilePtr, clogFileFileSize, logFileRecord); ptrCheckGuard(logFilePtr, clogFileFileSize, logFileRecord);
logPartPtr.i = logFilePtr.p->logPartRec; logPartPtr.i = logFilePtr.p->logPartRec;
ptrCheckGuard(logPartPtr, clogPartFileSize, logPartRecord); ptrCheckGuard(logPartPtr, clogPartFileSize, logPartRecord);
logPagePtr.i = lfoPtr.p->firstLfoPage; logPagePtr.i = lfoPtr.p->firstLfoPage;
ptrCheckGuard(logPagePtr, clogPageFileSize, logPageRecord); ptrCheckGuard(logPagePtr, clogPageFileSize, logPageRecord);
logP= logPagePtr;
noPages= 1;
ndbassert(totPages > 0);
for (;;)
{
logP.p->logPageWord[ZPOS_IN_WRITING]= 0;
logP.p->logPageWord[ZPOS_IN_FREE_LIST]= 0;
if (noPages == totPages)
return;
if (write)
logP.i= logP.p->logPageWord[ZNEXT_PAGE];
else
logP.i= lfoPtr.p->logPageArray[noPages];
ptrCheckGuard(logP, clogPageFileSize, logPageRecord);
noPages++;
}
}//Dblqh::initFsrwconf() }//Dblqh::initFsrwconf()
/* ######################################################################### */ /* ######################################################################### */
...@@ -12227,7 +12204,7 @@ void Dblqh::timeSup(Signal* signal) ...@@ -12227,7 +12204,7 @@ void Dblqh::timeSup(Signal* signal)
ndbrequire(wordWritten < ZPAGE_SIZE); ndbrequire(wordWritten < ZPAGE_SIZE);
if (logFilePtr.p->noLogpagesInBuffer > 0) { if (logFilePtr.p->noLogpagesInBuffer > 0) {
jam(); jam();
completedLogPage(signal, ZENFORCE_WRITE); completedLogPage(signal, ZENFORCE_WRITE, __LINE__);
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
/*SINCE WE ARE ONLY WRITING PART OF THE LAST PAGE WE HAVE TO UPDATE THE WORD */ /*SINCE WE ARE ONLY WRITING PART OF THE LAST PAGE WE HAVE TO UPDATE THE WORD */
/*WRITTEN TO REFLECT THE REAL LAST WORD WRITTEN. WE ALSO HAVE TO MOVE THE */ /*WRITTEN TO REFLECT THE REAL LAST WORD WRITTEN. WE ALSO HAVE TO MOVE THE */
...@@ -12249,7 +12226,8 @@ void Dblqh::timeSup(Signal* signal) ...@@ -12249,7 +12226,8 @@ void Dblqh::timeSup(Signal* signal)
releaseLogpage(signal); releaseLogpage(signal);
} else { } else {
jam(); jam();
writeSinglePage(signal, logFilePtr.p->currentFilepage, wordWritten); writeSinglePage(signal, logFilePtr.p->currentFilepage,
wordWritten, __LINE__);
lfoPtr.p->lfoState = LogFileOperationRecord::ACTIVE_WRITE_LOG; lfoPtr.p->lfoState = LogFileOperationRecord::ACTIVE_WRITE_LOG;
}//if }//if
}//if }//if
...@@ -12385,7 +12363,7 @@ void Dblqh::firstPageWriteLab(Signal* signal) ...@@ -12385,7 +12363,7 @@ void Dblqh::firstPageWriteLab(Signal* signal)
logPagePtr.i = logFilePtr.p->logPageZero; logPagePtr.i = logFilePtr.p->logPageZero;
ptrCheckGuard(logPagePtr, clogPageFileSize, logPageRecord); ptrCheckGuard(logPagePtr, clogPageFileSize, logPageRecord);
logPagePtr.p->logPageWord[ZPAGE_HEADER_SIZE + ZPOS_FILE_NO] = fileNo; logPagePtr.p->logPageWord[ZPAGE_HEADER_SIZE + ZPOS_FILE_NO] = fileNo;
writeSinglePage(signal, 0, ZPAGE_SIZE - 1); writeSinglePage(signal, 0, ZPAGE_SIZE - 1, __LINE__);
lfoPtr.p->logFileRec = currLogFile; lfoPtr.p->logFileRec = currLogFile;
lfoPtr.p->lfoState = LogFileOperationRecord::WRITE_PAGE_ZERO; lfoPtr.p->lfoState = LogFileOperationRecord::WRITE_PAGE_ZERO;
return; return;
...@@ -12474,7 +12452,7 @@ void Dblqh::lastWriteInFileLab(Signal* signal) ...@@ -12474,7 +12452,7 @@ void Dblqh::lastWriteInFileLab(Signal* signal)
logPagePtr.i = logFilePtr.p->logPageZero; logPagePtr.i = logFilePtr.p->logPageZero;
ptrCheckGuard(logPagePtr, clogPageFileSize, logPageRecord); ptrCheckGuard(logPagePtr, clogPageFileSize, logPageRecord);
logPagePtr.p->logPageWord[ZPAGE_HEADER_SIZE + ZPOS_FILE_NO] = fileNo; logPagePtr.p->logPageWord[ZPAGE_HEADER_SIZE + ZPOS_FILE_NO] = fileNo;
writeSinglePage(signal, 0, ZPAGE_SIZE - 1); writeSinglePage(signal, 0, ZPAGE_SIZE - 1, __LINE__);
lfoPtr.p->logFileRec = currLogFile; lfoPtr.p->logFileRec = currLogFile;
lfoPtr.p->lfoState = LogFileOperationRecord::WRITE_PAGE_ZERO; lfoPtr.p->lfoState = LogFileOperationRecord::WRITE_PAGE_ZERO;
return; return;
...@@ -12509,7 +12487,8 @@ void Dblqh::openFileInitLab(Signal* signal) ...@@ -12509,7 +12487,8 @@ void Dblqh::openFileInitLab(Signal* signal)
{ {
logFilePtr.p->logFileStatus = LogFileRecord::OPEN_INIT; logFilePtr.p->logFileStatus = LogFileRecord::OPEN_INIT;
seizeLogpage(signal); seizeLogpage(signal);
writeSinglePage(signal, (ZNO_MBYTES_IN_FILE * ZPAGES_IN_MBYTE) - 1, ZPAGE_SIZE - 1); writeSinglePage(signal, (ZNO_MBYTES_IN_FILE * ZPAGES_IN_MBYTE) - 1,
ZPAGE_SIZE - 1, __LINE__);
lfoPtr.p->lfoState = LogFileOperationRecord::INIT_WRITE_AT_END; lfoPtr.p->lfoState = LogFileOperationRecord::INIT_WRITE_AT_END;
return; return;
}//Dblqh::openFileInitLab() }//Dblqh::openFileInitLab()
...@@ -12550,7 +12529,7 @@ void Dblqh::initFirstPageLab(Signal* signal) ...@@ -12550,7 +12529,7 @@ void Dblqh::initFirstPageLab(Signal* signal)
logPagePtr.p->logPageWord[ZPOS_LOG_LAP] = 1; logPagePtr.p->logPageWord[ZPOS_LOG_LAP] = 1;
logPagePtr.p->logPageWord[ZPAGE_HEADER_SIZE] = ZCOMPLETED_GCI_TYPE; logPagePtr.p->logPageWord[ZPAGE_HEADER_SIZE] = ZCOMPLETED_GCI_TYPE;
logPagePtr.p->logPageWord[ZPAGE_HEADER_SIZE + 1] = 1; logPagePtr.p->logPageWord[ZPAGE_HEADER_SIZE + 1] = 1;
writeSinglePage(signal, 1, ZPAGE_SIZE - 1); writeSinglePage(signal, 1, ZPAGE_SIZE - 1, __LINE__);
lfoPtr.p->lfoState = LogFileOperationRecord::WRITE_GCI_ZERO; lfoPtr.p->lfoState = LogFileOperationRecord::WRITE_GCI_ZERO;
return; return;
}//if }//if
...@@ -12852,17 +12831,13 @@ void Dblqh::releaseLogpage(Signal* signal) ...@@ -12852,17 +12831,13 @@ void Dblqh::releaseLogpage(Signal* signal)
{ {
#ifdef VM_TRACE #ifdef VM_TRACE
// Check that log page isn't already in free list // Check that log page isn't already in free list
LogPageRecordPtr TlogPagePtr; ndbrequire(logPagePtr.p->logPageWord[ZPOS_IN_FREE_LIST] == 0);
TlogPagePtr.i = cfirstfreeLogPage;
while (TlogPagePtr.i != RNIL){
ptrCheckGuard(TlogPagePtr, clogPageFileSize, logPageRecord);
ndbrequire(TlogPagePtr.i != logPagePtr.i);
TlogPagePtr.i = TlogPagePtr.p->logPageWord[ZNEXT_PAGE];
}
#endif #endif
cnoOfLogPages++; cnoOfLogPages++;
logPagePtr.p->logPageWord[ZNEXT_PAGE] = cfirstfreeLogPage; logPagePtr.p->logPageWord[ZNEXT_PAGE] = cfirstfreeLogPage;
logPagePtr.p->logPageWord[ZPOS_IN_WRITING]= 0;
logPagePtr.p->logPageWord[ZPOS_IN_FREE_LIST]= 1;
cfirstfreeLogPage = logPagePtr.i; cfirstfreeLogPage = logPagePtr.i;
}//Dblqh::releaseLogpage() }//Dblqh::releaseLogpage()
...@@ -12908,6 +12883,7 @@ void Dblqh::seizeLogpage(Signal* signal) ...@@ -12908,6 +12883,7 @@ void Dblqh::seizeLogpage(Signal* signal)
/* ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */
cfirstfreeLogPage = logPagePtr.p->logPageWord[ZNEXT_PAGE]; cfirstfreeLogPage = logPagePtr.p->logPageWord[ZNEXT_PAGE];
logPagePtr.p->logPageWord[ZNEXT_PAGE] = RNIL; logPagePtr.p->logPageWord[ZNEXT_PAGE] = RNIL;
logPagePtr.p->logPageWord[ZPOS_IN_FREE_LIST] = 0;
}//Dblqh::seizeLogpage() }//Dblqh::seizeLogpage()
/* ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */
...@@ -13015,7 +12991,7 @@ void Dblqh::writeFileHeaderOpen(Signal* signal, Uint32 wmoType) ...@@ -13015,7 +12991,7 @@ void Dblqh::writeFileHeaderOpen(Signal* signal, Uint32 wmoType)
/* LOG FILE. THIS HAS SPECIAL SIGNIFANCE TO FIND */ /* LOG FILE. THIS HAS SPECIAL SIGNIFANCE TO FIND */
/* THE END OF THE LOG AT SYSTEM RESTART. */ /* THE END OF THE LOG AT SYSTEM RESTART. */
/* ------------------------------------------------------- */ /* ------------------------------------------------------- */
writeSinglePage(signal, 0, ZPAGE_SIZE - 1); writeSinglePage(signal, 0, ZPAGE_SIZE - 1, __LINE__);
if (wmoType == ZINIT) { if (wmoType == ZINIT) {
jam(); jam();
lfoPtr.p->lfoState = LogFileOperationRecord::INIT_FIRST_PAGE; lfoPtr.p->lfoState = LogFileOperationRecord::INIT_FIRST_PAGE;
...@@ -13049,7 +13025,8 @@ void Dblqh::writeFileHeaderOpen(Signal* signal, Uint32 wmoType) ...@@ -13049,7 +13025,8 @@ void Dblqh::writeFileHeaderOpen(Signal* signal, Uint32 wmoType)
void Dblqh::writeInitMbyte(Signal* signal) void Dblqh::writeInitMbyte(Signal* signal)
{ {
initLogpage(signal); initLogpage(signal);
writeSinglePage(signal, logFilePtr.p->currentMbyte * ZPAGES_IN_MBYTE, ZPAGE_SIZE - 1); writeSinglePage(signal, logFilePtr.p->currentMbyte * ZPAGES_IN_MBYTE,
ZPAGE_SIZE - 1, __LINE__);
lfoPtr.p->lfoState = LogFileOperationRecord::WRITE_INIT_MBYTE; lfoPtr.p->lfoState = LogFileOperationRecord::WRITE_INIT_MBYTE;
}//Dblqh::writeInitMbyte() }//Dblqh::writeInitMbyte()
...@@ -13059,13 +13036,15 @@ void Dblqh::writeInitMbyte(Signal* signal) ...@@ -13059,13 +13036,15 @@ void Dblqh::writeInitMbyte(Signal* signal)
/* INPUT: TWSP_PAGE_NO THE PAGE NUMBER WRITTEN */ /* INPUT: TWSP_PAGE_NO THE PAGE NUMBER WRITTEN */
/* SUBROUTINE SHORT NAME: WSP */ /* SUBROUTINE SHORT NAME: WSP */
/* ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */
void Dblqh::writeSinglePage(Signal* signal, Uint32 pageNo, Uint32 wordWritten) void Dblqh::writeSinglePage(Signal* signal, Uint32 pageNo,
Uint32 wordWritten, Uint32 place)
{ {
seizeLfo(signal); seizeLfo(signal);
initLfo(signal); initLfo(signal);
lfoPtr.p->firstLfoPage = logPagePtr.i; lfoPtr.p->firstLfoPage = logPagePtr.i;
logPagePtr.p->logPageWord[ZNEXT_PAGE] = RNIL; logPagePtr.p->logPageWord[ZNEXT_PAGE] = RNIL;
writeDbgInfoPageHeader(logPagePtr, place, pageNo, wordWritten);
// Calculate checksum for page // Calculate checksum for page
logPagePtr.p->logPageWord[ZPOS_CHECKSUM] = calcPageCheckSum(logPagePtr); logPagePtr.p->logPageWord[ZPOS_CHECKSUM] = calcPageCheckSum(logPagePtr);
...@@ -14534,7 +14513,7 @@ void Dblqh::execSr(Signal* signal) ...@@ -14534,7 +14513,7 @@ void Dblqh::execSr(Signal* signal)
* IN THIS WE HAVE COMPLETED EXECUTION OF THE CURRENT LOG PAGE * IN THIS WE HAVE COMPLETED EXECUTION OF THE CURRENT LOG PAGE
* AND CAN WRITE IT TO DISK SINCE IT IS DIRTY. * AND CAN WRITE IT TO DISK SINCE IT IS DIRTY.
* ----------------------------------------------------------------- */ * ----------------------------------------------------------------- */
writeDirty(signal); writeDirty(signal, __LINE__);
return; return;
break; break;
case LogPartRecord::LES_EXEC_LOG: case LogPartRecord::LES_EXEC_LOG:
...@@ -14545,7 +14524,7 @@ void Dblqh::execSr(Signal* signal) ...@@ -14545,7 +14524,7 @@ void Dblqh::execSr(Signal* signal)
* ------------------------------------------------------------------- */ * ------------------------------------------------------------------- */
if (logFilePtr.p->currentLogpage != logPartPtr.p->prevLogpage) { if (logFilePtr.p->currentLogpage != logPartPtr.p->prevLogpage) {
jam(); jam();
writeDirty(signal); writeDirty(signal, __LINE__);
return; return;
}//if }//if
break; break;
...@@ -14989,7 +14968,8 @@ void Dblqh::invalidateLogAfterLastGCI(Signal* signal) { ...@@ -14989,7 +14968,8 @@ void Dblqh::invalidateLogAfterLastGCI(Signal* signal) {
// This page must be invalidated. // This page must be invalidated.
logPagePtr.p->logPageWord[ZPOS_LOG_LAP] = 0; logPagePtr.p->logPageWord[ZPOS_LOG_LAP] = 0;
// Contact NDBFS. Real time break. // Contact NDBFS. Real time break.
writeSinglePage(signal, logPartPtr.p->invalidatePageNo, ZPAGE_SIZE - 1); writeSinglePage(signal, logPartPtr.p->invalidatePageNo,
ZPAGE_SIZE - 1, __LINE__);
lfoPtr.p->lfoState = LogFileOperationRecord::WRITE_SR_INVALIDATE_PAGES; lfoPtr.p->lfoState = LogFileOperationRecord::WRITE_SR_INVALIDATE_PAGES;
} else { } else {
// We are done with invalidating. Finish start phase 3.4. // We are done with invalidating. Finish start phase 3.4.
...@@ -15937,7 +15917,7 @@ void Dblqh::closeFile(Signal* signal, LogFileRecordPtr clfLogFilePtr) ...@@ -15937,7 +15917,7 @@ void Dblqh::closeFile(Signal* signal, LogFileRecordPtr clfLogFilePtr)
// logPartPtr // logPartPtr
// Defines lfoPtr // Defines lfoPtr
/* ---------------------------------------------------------------- */ /* ---------------------------------------------------------------- */
void Dblqh::completedLogPage(Signal* signal, Uint32 clpType) void Dblqh::completedLogPage(Signal* signal, Uint32 clpType, Uint32 place)
{ {
LogPageRecordPtr clpLogPagePtr; LogPageRecordPtr clpLogPagePtr;
LogPageRecordPtr wlpLogPagePtr; LogPageRecordPtr wlpLogPagePtr;
...@@ -15980,6 +15960,9 @@ void Dblqh::completedLogPage(Signal* signal, Uint32 clpType) ...@@ -15980,6 +15960,9 @@ void Dblqh::completedLogPage(Signal* signal, Uint32 clpType)
twlpNoPages++; twlpNoPages++;
ptrCheckGuard(wlpLogPagePtr, clogPageFileSize, logPageRecord); ptrCheckGuard(wlpLogPagePtr, clogPageFileSize, logPageRecord);
writeDbgInfoPageHeader(wlpLogPagePtr, place,
logFilePtr.p->filePosition + twlpNoPages - 1,
ZPAGE_SIZE);
// Calculate checksum for page // Calculate checksum for page
wlpLogPagePtr.p->logPageWord[ZPOS_CHECKSUM] = calcPageCheckSum(wlpLogPagePtr); wlpLogPagePtr.p->logPageWord[ZPOS_CHECKSUM] = calcPageCheckSum(wlpLogPagePtr);
wlpLogPagePtr.i = wlpLogPagePtr.p->logPageWord[ZNEXT_PAGE]; wlpLogPagePtr.i = wlpLogPagePtr.p->logPageWord[ZNEXT_PAGE];
...@@ -16382,6 +16365,8 @@ void Dblqh::initialiseLogPage(Signal* signal) ...@@ -16382,6 +16365,8 @@ void Dblqh::initialiseLogPage(Signal* signal)
refresh_watch_dog(); refresh_watch_dog();
ptrAss(logPagePtr, logPageRecord); ptrAss(logPagePtr, logPageRecord);
logPagePtr.p->logPageWord[ZNEXT_PAGE] = logPagePtr.i + 1; logPagePtr.p->logPageWord[ZNEXT_PAGE] = logPagePtr.i + 1;
logPagePtr.p->logPageWord[ZPOS_IN_FREE_LIST]= 1;
logPagePtr.p->logPageWord[ZPOS_IN_WRITING]= 0;
}//for }//for
logPagePtr.i = clogPageFileSize - 1; logPagePtr.i = clogPageFileSize - 1;
ptrAss(logPagePtr, logPageRecord); ptrAss(logPagePtr, logPageRecord);
...@@ -18038,10 +18023,14 @@ void Dblqh::writeCompletedGciLog(Signal* signal) ...@@ -18038,10 +18023,14 @@ void Dblqh::writeCompletedGciLog(Signal* signal)
* *
* SUBROUTINE SHORT NAME: WD * SUBROUTINE SHORT NAME: WD
* ------------------------------------------------------------------------- */ * ------------------------------------------------------------------------- */
void Dblqh::writeDirty(Signal* signal) void Dblqh::writeDirty(Signal* signal, Uint32 place)
{ {
logPagePtr.p->logPageWord[ZPOS_DIRTY] = ZNOT_DIRTY; logPagePtr.p->logPageWord[ZPOS_DIRTY] = ZNOT_DIRTY;
ndbassert(logPartPtr.p->prevFilepage ==
logPagePtr.p->logPageWord[ZPOS_PAGE_NO]);
writeDbgInfoPageHeader(logPagePtr, place, logPartPtr.p->prevFilepage,
ZPAGE_SIZE);
// Calculate checksum for page // Calculate checksum for page
logPagePtr.p->logPageWord[ZPOS_CHECKSUM] = calcPageCheckSum(logPagePtr); logPagePtr.p->logPageWord[ZPOS_CHECKSUM] = calcPageCheckSum(logPagePtr);
...@@ -18075,7 +18064,7 @@ void Dblqh::writeLogWord(Signal* signal, Uint32 data) ...@@ -18075,7 +18064,7 @@ void Dblqh::writeLogWord(Signal* signal, Uint32 data)
logPagePtr.p->logPageWord[ZCURR_PAGE_INDEX] = logPos + 1; logPagePtr.p->logPageWord[ZCURR_PAGE_INDEX] = logPos + 1;
if ((logPos + 1) == ZPAGE_SIZE) { if ((logPos + 1) == ZPAGE_SIZE) {
jam(); jam();
completedLogPage(signal, ZNORMAL); completedLogPage(signal, ZNORMAL, __LINE__);
seizeLogpage(signal); seizeLogpage(signal);
initLogpage(signal); initLogpage(signal);
logFilePtr.p->currentLogpage = logPagePtr.i; logFilePtr.p->currentLogpage = logPagePtr.i;
...@@ -18133,7 +18122,7 @@ void Dblqh::writeNextLog(Signal* signal) ...@@ -18133,7 +18122,7 @@ void Dblqh::writeNextLog(Signal* signal)
/* -------------------------------------------------- */ /* -------------------------------------------------- */
/* WE HAVE TO CHANGE LOG FILE */ /* WE HAVE TO CHANGE LOG FILE */
/* -------------------------------------------------- */ /* -------------------------------------------------- */
completedLogPage(signal, ZLAST_WRITE_IN_FILE); completedLogPage(signal, ZLAST_WRITE_IN_FILE, __LINE__);
if (wnlNextLogFilePtr.p->fileNo == 0) { if (wnlNextLogFilePtr.p->fileNo == 0) {
jam(); jam();
/* -------------------------------------------------- */ /* -------------------------------------------------- */
...@@ -18152,7 +18141,7 @@ void Dblqh::writeNextLog(Signal* signal) ...@@ -18152,7 +18141,7 @@ void Dblqh::writeNextLog(Signal* signal)
/* INCREMENT THE CURRENT MBYTE */ /* INCREMENT THE CURRENT MBYTE */
/* SET PAGE INDEX TO PAGE HEADER SIZE */ /* SET PAGE INDEX TO PAGE HEADER SIZE */
/* -------------------------------------------------- */ /* -------------------------------------------------- */
completedLogPage(signal, ZENFORCE_WRITE); completedLogPage(signal, ZENFORCE_WRITE, __LINE__);
twnlNewMbyte = logFilePtr.p->currentMbyte + 1; twnlNewMbyte = logFilePtr.p->currentMbyte + 1;
}//if }//if
/* -------------------------------------------------- */ /* -------------------------------------------------- */
...@@ -18520,3 +18509,16 @@ Uint32 Dblqh::calcPageCheckSum(LogPageRecordPtr logP){ ...@@ -18520,3 +18509,16 @@ Uint32 Dblqh::calcPageCheckSum(LogPageRecordPtr logP){
return checkSum; return checkSum;
} }
void Dblqh::writeDbgInfoPageHeader(LogPageRecordPtr logP, Uint32 place,
Uint32 pageNo, Uint32 wordWritten)
{
logP.p->logPageWord[ZPOS_LOG_TIMER]= logPartPtr.p->logTimer;
logP.p->logPageWord[ZPOS_PREV_PAGE_NO]= logP.p->logPageWord[ZPOS_PAGE_NO];
logP.p->logPageWord[ZPOS_PAGE_I]= logP.i;
logP.p->logPageWord[ZPOS_PLACE_WRITTEN_FROM]= place;
logP.p->logPageWord[ZPOS_PAGE_NO]= pageNo;
logP.p->logPageWord[ZPOS_PAGE_FILE_NO]= logFilePtr.p->fileNo;
logP.p->logPageWord[ZPOS_WORD_WRITTEN]= wordWritten;
logP.p->logPageWord[ZPOS_IN_WRITING]= 1;
}
...@@ -267,6 +267,15 @@ NdbOut& operator<<(NdbOut& no, const PageHeader& ph) { ...@@ -267,6 +267,15 @@ NdbOut& operator<<(NdbOut& no, const PageHeader& ph) {
printOut("Oldest prepare op. file No.:", ph.m_old_prepare_file_number); printOut("Oldest prepare op. file No.:", ph.m_old_prepare_file_number);
printOut("Oldest prepare op. page ref.:", ph.m_old_prepare_page_reference); printOut("Oldest prepare op. page ref.:", ph.m_old_prepare_page_reference);
printOut("Dirty flag:", ph.m_dirty_flag); printOut("Dirty flag:", ph.m_dirty_flag);
printOut("Write Timer:", ph.m_log_timer);
printOut("Page i-val:", ph.m_page_i_value);
printOut("Place written:", ph.m_place_written_from);
printOut("Page No in File:", ph.m_page_no);
printOut("File No:", ph.m_file_no);
printOut("Word Written:", ph.m_word_written);
printOut("In Writing (should be 1)", ph.m_in_writing_flag);
printOut("Prev Page No (can be garbage)", ph.m_prev_page_no);
printOut("In Free List (should be 0):", ph.m_in_free_list);
no << endl; no << endl;
return no; return no;
} }
......
...@@ -147,6 +147,17 @@ protected: ...@@ -147,6 +147,17 @@ protected:
Uint32 m_old_prepare_file_number; Uint32 m_old_prepare_file_number;
Uint32 m_old_prepare_page_reference; Uint32 m_old_prepare_page_reference;
Uint32 m_dirty_flag; Uint32 m_dirty_flag;
/* Debug info Start */
Uint32 m_log_timer;
Uint32 m_page_i_value;
Uint32 m_place_written_from;
Uint32 m_page_no;
Uint32 m_file_no;
Uint32 m_word_written;
Uint32 m_in_writing_flag;
Uint32 m_prev_page_no;
Uint32 m_in_free_list;
/* Debug info End */
}; };
//---------------------------------------------------------------- //----------------------------------------------------------------
......
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