Below is the list of changes that have just been committed into a local
5.1-ndb repository of jonas. When jonas does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html
ChangeSet
1.1845 05/04/13 13:42:55 joreland@stripped +10 -0
wl1870 - ndb diskdata
start SR undo handling
ndb/src/kernel/blocks/tsman.hpp
1.20 05/04/13 13:42:51 joreland@stripped +2 -0
Add scanning of extent header during SR
ndb/src/kernel/blocks/tsman.cpp
1.30 05/04/13 13:42:51 joreland@stripped +70 -0
Add scanning of extent header during SR
ndb/src/kernel/blocks/pgman.hpp
1.17 05/04/13 13:42:51 joreland@stripped +2 -0
Incorperate LCP into pgman :-(
ndb/src/kernel/blocks/pgman.cpp
1.15 05/04/13 13:42:51 joreland@stripped +21 -0
Incorperate LCP into pgman :-(
ndb/src/kernel/blocks/lgman.hpp
1.22 05/04/13 13:42:51 joreland@stripped +1 -0
Let Lgman run undo-log
ndb/src/kernel/blocks/lgman.cpp
1.28 05/04/13 13:42:51 joreland@stripped +19 -5
Let Lgman run undo-log
ndb/src/kernel/blocks/dblqh/DblqhMain.cpp
1.64 05/04/13 13:42:51 joreland@stripped +55 -34
1) let Lgman run undo-log during SR
2) let Pgman be part of LCP
ndb/src/kernel/blocks/dblqh/Dblqh.hpp
1.43 05/04/13 13:42:51 joreland@stripped +3 -3
Let Lgman run undo-log
ndb/src/kernel/blocks/dbdict/Dbdict.cpp
1.71 05/04/13 13:42:51 joreland@stripped +2 -0
Recreate data/undo files during NR
(until we fixed a better NR for DD)
ndb/include/kernel/GlobalSignalNumbers.h
1.12 05/04/13 13:42:51 joreland@stripped +6 -4
removed some unused signals
# This is a BitKeeper patch. What follows are the unified diffs for the
# set of deltas contained in the patch. The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User: joreland
# Host: eel.ndb.mysql.com.ndb.mysql.com.ndb.mysql.com.ndb.mysql.com
# Root: /home/jonas/src/mysql-5.1-ndb-dd
--- 1.27/ndb/src/kernel/blocks/lgman.cpp Mon Apr 11 11:20:25 2005
+++ 1.28/ndb/src/kernel/blocks/lgman.cpp Wed Apr 13 13:42:51 2005
@@ -67,6 +67,7 @@
addRecSignal(GSN_LCP_FRAG_ORD, &Lgman::execLCP_FRAG_ORD);
addRecSignal(GSN_SUB_GCP_COMPLETE_REP, &Lgman::execSUB_GCP_COMPLETE_REP);
+ addRecSignal(GSN_START_RECREQ, &Lgman::execSTART_RECREQ);
m_logfile_group_pool.setSize(10);
m_logfile_group_hash.setSize(10);
@@ -96,12 +97,17 @@
}//Lgman::execNDB_STTOR()
void
-Lgman::sendSTTORRY(Signal* signal){
+Lgman::sendSTTORRY(Signal* signal)
+{
signal->theData[0] = 0;
signal->theData[3] = 1;
- signal->theData[4] = 3;
- signal->theData[5] = 255; // No more start phases from missra
- sendSignal(NDBCNTR_REF, GSN_STTORRY, signal, 6, JBB);
+ signal->theData[4] = 2;
+ signal->theData[5] = 3;
+ signal->theData[6] = 4;
+ signal->theData[7] = 5;
+ signal->theData[8] = 6;
+ signal->theData[9] = 255; // No more start phases from missra
+ sendSignal(NDBCNTR_REF, GSN_STTORRY, signal, 10, JBB);
}
void
@@ -278,7 +284,7 @@
FsOpenReq::setVersion(req->fileNumber, 4); // Version 4 = specified filename
req->fileFlags = 0;
- req->fileFlags |= FsOpenReq::OM_READWRITE;
+ req->fileFlags |= FsOpenReq::OM_READWRITE;
switch(requestInfo){
case CreateFileImplReq::Create:
req->fileFlags |= FsOpenReq::OM_CREATE_IF_NONE;
@@ -1201,3 +1207,11 @@
}
template Uint64 Logfile_client::add_entry<3>(const Change*);
+
+void
+Lgman::execSTART_RECREQ(Signal* signal)
+{
+ Uint32 lcpId= signal->theData[0];
+ ndbout_c("Lgman::execSTART_RECREQ %d", lcpId);
+ sendSignal(DBLQH_REF, GSN_START_RECCONF, signal, 1, JBB);
+}
--- 1.21/ndb/src/kernel/blocks/lgman.hpp Mon Apr 11 11:20:25 2005
+++ 1.22/ndb/src/kernel/blocks/lgman.hpp Wed Apr 13 13:42:51 2005
@@ -56,6 +56,7 @@
void execLCP_FRAG_ORD(Signal*);
void execSUB_GCP_COMPLETE_REP(Signal*);
+ void execSTART_RECREQ(Signal*);
public:
struct Log_buffer_waiter
{
--- 1.14/ndb/src/kernel/blocks/pgman.cpp Tue Mar 22 15:53:38 2005
+++ 1.15/ndb/src/kernel/blocks/pgman.cpp Wed Apr 13 13:42:51 2005
@@ -19,6 +19,7 @@
#include <signaldata/FsConf.hpp>
#include <signaldata/FsReadWriteReq.hpp>
#include <signaldata/PgmanContinueB.hpp>
+#include <signaldata/LCP.hpp>
Pgman::Pgman(const Configuration & conf) :
SimulatedBlock(PGMAN, conf),
@@ -34,6 +35,9 @@
addRecSignal(GSN_FSREADREF, &Pgman::execFSREADREF);
addRecSignal(GSN_FSREADCONF, &Pgman::execFSREADCONF);
+ addRecSignal(GSN_LCP_FRAG_ORD, &Pgman::execLCP_FRAG_ORD);
+ addRecSignal(GSN_END_LCP_REQ, &Pgman::execEND_LCP_REQ);
+
m_page_entry_pool.setSize(256);
m_page_entry_hash.setSize(64);
m_page_request_pool.setSize(10000);
@@ -159,6 +163,23 @@
m_page_entry_pool.getPtr(ptr, conf->userPointer);
process_callbacks(signal, ptr);
+}
+
+void
+Pgman::execLCP_FRAG_ORD(Signal* signal)
+{
+ ndbout_c("Pgman::execLCP_FRAG_ORD");
+}
+
+void
+Pgman::execEND_LCP_REQ(Signal* signal)
+{
+ ndbout_c("Pgman::execEND_LCP_REQ");
+ EndLcpReq* req= (EndLcpReq*)signal->getDataPtr();
+ Uint32 ref = req->senderRef;
+ Uint32 data= req->senderData;
+ signal->theData[0] = data;
+ sendSignal(ref, GSN_END_LCP_CONF, signal, 1, JBB);
}
void
--- 1.16/ndb/src/kernel/blocks/pgman.hpp Tue Mar 22 15:53:38 2005
+++ 1.17/ndb/src/kernel/blocks/pgman.hpp Wed Apr 13 13:42:51 2005
@@ -40,6 +40,8 @@
void execFSREADREF(Signal*);
void execFSREADCONF(Signal*);
+ void execLCP_FRAG_ORD(Signal*);
+ void execEND_LCP_REQ(Signal*);
private:
friend class Page_cache_client;
--- 1.29/ndb/src/kernel/blocks/tsman.cpp Wed Apr 6 15:42:07 2005
+++ 1.30/ndb/src/kernel/blocks/tsman.cpp Wed Apr 13 13:42:51 2005
@@ -757,6 +757,7 @@
Uint32 senderData = ptr.p->m_create.m_senderData;
Uint32 extent_pages = ptr.p->m_create.m_extent_pages;
Uint32 requestInfo = ptr.p->m_create.m_requestInfo;
+ Uint32 data_pages = ptr.p->m_create.m_data_pages;
Uint32 eh= File_formats::Datafile::extent_header_words(ptr.p->m_extent_size);
Uint32 per_page = File_formats::Datafile::EXTENT_PAGE_WORDS/eh;
@@ -772,6 +773,7 @@
* first free is unknown, need to scan extent headers
*/
ptr.p->m_online.m_first_free_free_extent = RNIL;
+ scan_extent_headers(signal, ptr, data_pages);
break;
default:
ndbrequire(false);
@@ -782,6 +784,74 @@
conf->senderRef = reference();
sendSignal(senderRef, GSN_CREATE_FILE_CONF, signal,
CreateFileImplConf::SignalLength, JBB);
+}
+
+void
+Tsman::scan_extent_headers(Signal* signal, Ptr<Datafile> ptr, Uint32 datapages)
+{
+ Ptr<Tablespace> lg_ptr;
+ m_tablespace_pool.getPtr(lg_ptr, ptr.p->m_tablespace_ptr_i);
+
+ Uint32 firstFree= RNIL;
+ Uint32 size = lg_ptr.p->m_extent_size;
+ Uint32 eh_words = File_formats::Datafile::extent_header_words(size);
+ Uint32 per_page = File_formats::Datafile::EXTENT_PAGE_WORDS/eh_words;
+
+ Uint32 pages= ptr.p->m_online.m_offset_data_pages - 1;
+ for(Uint32 i = 0; i < pages; i++)
+ {
+ Uint32 page_no = pages - i;
+ Page_cache_client::Request preq;
+ preq.m_page.m_page_no = page_no;
+ preq.m_page.m_file_no = ptr.p->m_file_no;
+
+ int flags = 0;
+ int real_page_id = m_page_cache_client.get_page(signal, preq, flags);
+ ndbrequire(real_page_id > 0);
+
+ File_formats::Datafile::Extent_page* page =
+ (File_formats::Datafile::Extent_page*)m_page_cache_client.m_ptr.p;
+
+ Uint32 extents= per_page;
+ if(page_no == pages)
+ {
+ /**
+ * Last extent header page...
+ * set correct no of extent headers
+ */
+ extents= datapages % per_page;
+ }
+ for(Uint32 j = 0; j<extents; j++)
+ {
+ Uint32 extent_no = extents - j - 1;
+ File_formats::Datafile::Extent_header* header=
+ page->get_header(extent_no, size);
+ if(header->m_table == RNIL)
+ {
+ header->m_next_free_extent = firstFree;
+ firstFree = page_no * per_page + extent_no;
+ }
+ else
+ {
+ ndbrequire(false);
+ }
+ }
+ }
+ ptr.p->m_online.m_first_free_free_extent= firstFree;
+
+ LocalDLList<Datafile> meta(m_file_pool, lg_ptr.p->m_meta_files);
+ if(firstFree != RNIL)
+ {
+ LocalDLList<Datafile> free(m_file_pool, lg_ptr.p->m_free_files);
+ meta.remove(ptr);
+ free.add(ptr);
+ }
+ else
+ {
+ LocalDLList<Datafile> full(m_file_pool, lg_ptr.p->m_full_files);
+ meta.remove(ptr);
+ full.add(ptr);
+ }
}
void
--- 1.19/ndb/src/kernel/blocks/tsman.hpp Fri Mar 11 08:30:27 2005
+++ 1.20/ndb/src/kernel/blocks/tsman.hpp Wed Apr 13 13:42:51 2005
@@ -164,6 +164,8 @@
int alloc_extent(Signal* signal, Uint32 tablespace, Local_key* key);
int alloc_page_from_extent(Signal*, Uint32, Local_key*, Uint32 bits);
+
+ void scan_extent_headers(Signal*, Ptr<Datafile>, Uint32 datapages);
};
class Tablespace_client
--- 1.11/ndb/include/kernel/GlobalSignalNumbers.h Tue Jan 18 15:29:46 2005
+++ 1.12/ndb/include/kernel/GlobalSignalNumbers.h Wed Apr 13 13:42:51 2005
@@ -134,14 +134,14 @@
/* 75 unused */
/* 76 unused */
-#define GSN_ACC_LCPREQ 79
-#define GSN_ACC_LCPREF 78
-#define GSN_ACC_LCPCONF 77
+/* 79 unused */
+/* 78 unused */
+/* 77 unused */
/* 80 unused */
#define GSN_ACC_OVER_REC 81
-#define GSN_ACC_SAVE_PAGES 83
+/* 83 unused */
#define GSN_ACC_SCAN_INFO 84
#define GSN_ACC_SCAN_INFO24 85
#define GSN_ACC_SCANCONF 86
@@ -334,7 +334,9 @@
#define GSN_DIVERIFYREQ 241
#define GSN_ENABLE_COMORD 242
#define GSN_END_LCPCONF 243
+#define GSN_END_LCP_CONF 243
#define GSN_END_LCPREQ 244
+#define GSN_END_LCP_REQ 244
#define GSN_END_TOCONF 245
#define GSN_END_TOREQ 246
#define GSN_EVENT_REP 247
--- 1.70/ndb/src/kernel/blocks/dbdict/Dbdict.cpp Mon Apr 11 14:37:57 2005
+++ 1.71/ndb/src/kernel/blocks/dbdict/Dbdict.cpp Wed Apr 13 13:42:51 2005
@@ -13501,6 +13501,8 @@
break;
case 1:
req->requestInfo = CreateFileImplReq::Open;
+ if(getNodeState().getNodeRestartInProgress())
+ req->requestInfo = CreateFileImplReq::CreateForce;
break;
case 2:
req->requestInfo = CreateFileImplReq::CreateForce;
--- 1.42/ndb/src/kernel/blocks/dblqh/Dblqh.hpp Mon Apr 11 14:37:57 2005
+++ 1.43/ndb/src/kernel/blocks/dblqh/Dblqh.hpp Wed Apr 13 13:42:51 2005
@@ -408,9 +408,7 @@
enum ExecUndoLogState {
EULS_IDLE = 0,
EULS_STARTED = 1,
- EULS_COMPLETED = 2,
- EULS_ACC_COMPLETED = 3,
- EULS_TUP_COMPLETED = 4
+ EULS_COMPLETED = 2
};
struct AddFragRecord {
@@ -1016,6 +1014,8 @@
bool reportEmpty;
NdbNodeBitmask m_EMPTY_LCP_REQ;
+
+ Uint32 m_outstanding;
}; // Size 76 bytes
typedef Ptr<LcpRecord> LcpRecordPtr;
--- 1.63/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp Mon Apr 11 14:37:58 2005
+++ 1.64/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp Wed Apr 13 13:42:51 2005
@@ -10212,6 +10212,10 @@
jamEntry();
*lcpFragOrd= save;
+ EXECUTE_DIRECT(PGMAN, GSN_LCP_FRAG_ORD, signal, signal->length());
+ jamEntry();
+ *lcpFragOrd= save;
+
c_lcpId = lcpFragOrd->lcpId;
ndbrequire(lcpPtr.p->lcpState == LcpRecord::LCP_IDLE);
setLogTail(signal, lcpFragOrd->keepGci);
@@ -10525,19 +10529,34 @@
req->senderRef= reference();
req->backupPtr= m_backup_ptr;
req->backupId= lcpId;
- sendSignal(BACKUP_REF, GSN_END_LCPREQ, signal,
+ sendSignal(BACKUP_REF, GSN_END_LCP_REQ, signal,
+ EndLcpReq::SignalLength, JBB);
+
+ sendSignal(PGMAN_REF, GSN_END_LCP_REQ, signal,
EndLcpReq::SignalLength, JBB);
+
+ lcpPtr.i = 0;
+ ptrAss(lcpPtr, lcpRecord);
+ lcpPtr.p->m_outstanding = 2;
return;
}//Dblqh::completeLcpRoundLab()
void Dblqh::execEND_LCPCONF(Signal* signal)
{
jamEntry();
- clcpCompletedState = LCP_IDLE;
-
lcpPtr.i = 0;
ptrAss(lcpPtr, lcpRecord);
- sendLCP_COMPLETE_REP(signal, lcpPtr.p->currentFragment.lcpFragOrd.lcpId);
+
+ ndbrequire(clcpCompletedState == LCP_CLOSE_STARTED);
+ ndbrequire(lcpPtr.p->m_outstanding);
+
+ lcpPtr.p->m_outstanding--;
+ if(lcpPtr.p->m_outstanding == 0)
+ {
+ jam();
+ clcpCompletedState = LCP_IDLE;
+ sendLCP_COMPLETE_REP(signal, lcpPtr.p->currentFragment.lcpFragOrd.lcpId);
+ }
}//Dblqh::execEND_LCPCONF()
void Dblqh::sendLCP_COMPLETE_REP(Signal* signal, Uint32 lcpId)
@@ -12839,7 +12858,9 @@
c_lcp_complete_fragments.add(fragptr);
return;
}//if
-
+
+ ndbrequire(c_lcpId == 0 || c_lcpId == lcpId);
+ c_lcpId = lcpId;
c_lcp_waiting_fragments.add(fragptr);
if(c_lcp_restoring_fragments.isEmpty())
send_restore_lcp(signal);
@@ -12911,8 +12932,12 @@
* FRAGMENT LOGS CAN BE EXECUTED.
* ---------------------------------------------------------------- */
csrExecUndoLogState = EULS_STARTED;
- signal->theData[0] = caccBlockref;
- sendSignal(reference(), GSN_START_RECCONF, signal, 1, JBB);
+ lcpPtr.i = 0;
+ ptrAss(lcpPtr, lcpRecord);
+ lcpPtr.p->m_outstanding = 2;
+
+ signal->theData[0] = c_lcpId;
+ sendSignal(LGMAN_REF, GSN_START_RECREQ, signal, 1, JBB);
signal->theData[0] = ctupBlockref;
sendSignal(reference(), GSN_START_RECCONF, signal, 1, JBB);
return;
@@ -12969,8 +12994,13 @@
{
jam();
csrExecUndoLogState = EULS_STARTED;
- signal->theData[0] = caccBlockref;
- sendSignal(reference(), GSN_START_RECCONF, signal, 1, JBB);
+
+ lcpPtr.i = 0;
+ ptrAss(lcpPtr, lcpRecord);
+ lcpPtr.p->m_outstanding = 2;
+
+ signal->theData[0] = c_lcpId;
+ sendSignal(LGMAN_REF, GSN_START_RECREQ, signal, 1, JBB);
signal->theData[0] = ctupBlockref;
sendSignal(reference(), GSN_START_RECCONF, signal, 1, JBB);
}//if
@@ -12982,31 +13012,19 @@
void Dblqh::execSTART_RECCONF(Signal* signal)
{
jamEntry();
- BlockReference userRef = signal->theData[0];
- if (userRef == caccBlockref) {
- if (csrExecUndoLogState == EULS_STARTED) {
- jam();
- csrExecUndoLogState = EULS_ACC_COMPLETED;
- return;
- } else {
- ndbrequire(csrExecUndoLogState == EULS_TUP_COMPLETED);
- jam();
- csrExecUndoLogState = EULS_COMPLETED;
- }//if
- } else {
- ndbrequire(userRef == ctupBlockref);
- if (csrExecUndoLogState == EULS_STARTED) {
- jam();
- csrExecUndoLogState = EULS_TUP_COMPLETED;
- return;
- } else {
- ndbrequire(csrExecUndoLogState == EULS_ACC_COMPLETED);
- jam();
- csrExecUndoLogState = EULS_COMPLETED;
- }//if
- }//if
- c_lcp_complete_fragments.first(fragptr);
- build_acc(signal, fragptr.i);
+ lcpPtr.i = 0;
+ ptrAss(lcpPtr, lcpRecord);
+ ndbrequire(csrExecUndoLogState == EULS_STARTED);
+ ndbrequire(lcpPtr.p->m_outstanding);
+
+ lcpPtr.p->m_outstanding--;
+ if(lcpPtr.p->m_outstanding == 0)
+ {
+ jam();
+ csrExecUndoLogState = EULS_COMPLETED;
+ c_lcp_complete_fragments.first(fragptr);
+ build_acc(signal, fragptr.i);
+ }
return;
}//Dblqh::execSTART_RECCONF()
@@ -14752,6 +14770,9 @@
} else if ((cstartType == NodeState::ST_NODE_RESTART) ||
(cstartType == NodeState::ST_SYSTEM_RESTART)) {
jam();
+
+
+
StartRecConf * conf = (StartRecConf*)signal->getDataPtrSend();
conf->startingNodeId = getOwnNodeId();
sendSignal(cmasterDihBlockref, GSN_START_RECCONF, signal,
| Thread |
|---|
| • bk commit into 5.1-ndb tree (joreland:1.1845) | jonas.oreland | 13 Apr |