Below is the list of changes that have just been committed into a local
5.1 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.1980 05/12/06 09:24:58 jonas@stripped +7 -0
ndb -
Fix init of GCI on page init
Make COPY_FRAG use scanBlockRef
Add GCI to copy_frag_req
Add NR flag to AccScanReq
storage/ndb/src/kernel/blocks/dbtup/DbtupScan.cpp
1.12 05/12/06 09:24:56 jonas@stripped +101 -21
Fix init of page wrt to ROW_GCI
storage/ndb/src/kernel/blocks/dbtup/DbtupFixAlloc.cpp
1.7 05/12/06 09:24:56 jonas@stripped +15 -7
Fix init of page wrt to ROW_GCI
storage/ndb/src/kernel/blocks/dbtup/DbtupDiskAlloc.cpp
1.5 05/12/06 09:24:56 jonas@stripped +1 -2
Fix init of page wrt to ROW_GCI
storage/ndb/src/kernel/blocks/dbtup/Dbtup.hpp
1.35 05/12/06 09:24:55 jonas@stripped +6 -3
Fix init of page wrt to ROW_GCI
storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp
1.91 05/12/06 09:24:55 jonas@stripped +12 -8
Make COPY_FRAG use scanBlockRef
storage/ndb/include/kernel/signaldata/CopyFrag.hpp
1.3 05/12/06 09:24:55 jonas@stripped +2 -1
Add GCI to copy_frag_req
storage/ndb/include/kernel/signaldata/AccScan.hpp
1.8 05/12/06 09:24:55 jonas@stripped +23 -2
Add NR flag to AccScanReq
# 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: jonas
# Host: perch.ndb.mysql.com
# Root: /home/jonas/src/51-ndb
--- 1.4/storage/ndb/src/kernel/blocks/dbtup/DbtupDiskAlloc.cpp 2005-11-24 16:11:31 +01:00
+++ 1.5/storage/ndb/src/kernel/blocks/dbtup/DbtupDiskAlloc.cpp 2005-12-06 09:24:56 +01:00
@@ -530,8 +530,7 @@
if (tabPtr.p->m_attributes[DD].m_no_of_varsize == 0)
{
- convertThPage(tabPtr.p->m_offsets[DD].m_fix_header_size,
- (Fix_page*)gpage.p);
+ convertThPage((Fix_page*)gpage.p, tabPtr.p, DD);
}
else
{
--- 1.7/storage/ndb/include/kernel/signaldata/AccScan.hpp 2005-11-24 16:11:31 +01:00
+++ 1.8/storage/ndb/include/kernel/signaldata/AccScan.hpp 2005-12-06 09:24:55 +01:00
@@ -46,7 +46,10 @@
Uint32 requestInfo;
Uint32 transId1;
Uint32 transId2;
- Uint32 savePointId;
+ union {
+ Uint32 savePointId;
+ Uint32 gci;
+ };
/**
* Previously there where also a scan type
@@ -61,6 +64,9 @@
static Uint32 getNoDiskScanFlag(const Uint32 & requestInfo);
static void setNoDiskScanFlag(Uint32 & requestInfo, Uint32 nodisk);
+
+ static Uint32 getNRScanFlag(const Uint32 & requestInfo);
+ static void setNRScanFlag(Uint32 & requestInfo, Uint32 nr);
};
/**
@@ -70,16 +76,18 @@
* h = Read Committed - 1 Bit 5
* z = Descending (TUX) - 1 Bit 6
* d = No disk scan - 1 Bit 7
+ * n = Node recovery scan - 1 Bit 8
*
* 1111111111222222222233
* 01234567890123456789012345678901
- * l hzd
+ * l hzdn
*/
#define AS_LOCK_MODE_SHIFT (2)
#define AS_LOCK_MODE_MASK (1)
#define AS_READ_COMMITTED_SHIFT (5)
#define AS_DESCENDING_SHIFT (6)
#define AS_NO_DISK_SCAN (7)
+#define AS_NR_SCAN (8)
inline
Uint32
@@ -131,6 +139,19 @@
AccScanReq::setNoDiskScanFlag(UintR & requestInfo, UintR val){
ASSERT_BOOL(val, "AccScanReq::setNoDiskScanFlag");
requestInfo |= (val << AS_NO_DISK_SCAN);
+}
+
+inline
+Uint32
+AccScanReq::getNRScanFlag(const Uint32 & requestInfo){
+ return (requestInfo >> AS_NR_SCAN) & 1;
+}
+
+inline
+void
+AccScanReq::setNRScanFlag(UintR & requestInfo, UintR val){
+ ASSERT_BOOL(val, "AccScanReq::setNoDiskScanFlag");
+ requestInfo |= (val << AS_NR_SCAN);
}
class AccScanConf {
--- 1.2/storage/ndb/include/kernel/signaldata/CopyFrag.hpp 2005-04-08 02:43:50 +02:00
+++ 1.3/storage/ndb/include/kernel/signaldata/CopyFrag.hpp 2005-12-06 09:24:55 +01:00
@@ -30,7 +30,7 @@
*/
friend class Dblqh;
public:
- STATIC_CONST( SignalLength = 7 );
+ STATIC_CONST( SignalLength = 8 );
private:
Uint32 userPtr;
@@ -40,6 +40,7 @@
Uint32 nodeId;
Uint32 schemaVersion;
Uint32 distributionKey;
+ Uint32 gci;
};
class CopyFragConf {
--- 1.90/storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp 2005-12-05 16:54:20 +01:00
+++ 1.91/storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp 2005-12-06 09:24:55 +01:00
@@ -9249,7 +9249,8 @@
const Uint32 copyPtr = copyFragReq->userPtr;
const Uint32 userRef = copyFragReq->userRef;
const Uint32 nodeId = copyFragReq->nodeId;
-
+ const Uint32 gci = 0; //copyFragReq->gci = cnewestGci;
+
ndbrequire(cnoActiveCopy < 3);
ndbrequire(getFragmentrec(signal, fragId));
ndbrequire(fragptr.p->copyFragState == ZIDLE);
@@ -9306,7 +9307,7 @@
scanptr.p->scanApiOpPtr = tcConnectptr.i;
scanptr.p->scanApiBlockref = reference();
fragptr.p->m_scanNumberMask.clear(NR_ScanNo);
- scanptr.p->scanBlockref = DBACC_REF;
+ scanptr.p->scanBlockref = DBTUP_REF;
scanptr.p->scanLockHold = ZFALSE;
initScanTc(0,
@@ -9320,6 +9321,7 @@
tcConnectptr.p->copyCountWords = 0;
tcConnectptr.p->tcOprec = tcConnectptr.i;
tcConnectptr.p->schemaVersion = scanptr.p->scanSchemaVersion;
+ tcConnectptr.p->savePointId = gci;
scanptr.p->scanState = ScanRecord::WAIT_ACC_COPY;
AccScanReq * req = (AccScanReq*)&signal->theData[0];
req->senderData = scanptr.i;
@@ -9329,10 +9331,12 @@
req->requestInfo = 0;
AccScanReq::setLockMode(req->requestInfo, 0);
AccScanReq::setReadCommittedFlag(req->requestInfo, 0);
+ AccScanReq::setNRScanFlag(req->requestInfo, gci ? 1 : 0);
+
req->transId1 = tcConnectptr.p->transid[0];
req->transId2 = tcConnectptr.p->transid[1];
req->savePointId = tcConnectptr.p->savePointId;
- sendSignal(tcConnectptr.p->tcAccBlockref, GSN_ACC_SCANREQ, signal,
+ sendSignal(scanptr.p->scanBlockref, GSN_ACC_SCANREQ, signal,
AccScanReq::SignalLength, JBB);
return;
}//Dblqh::execCOPY_FRAGREQ()
@@ -9361,7 +9365,7 @@
signal->theData[2] = scanptr.p->scanSchemaVersion;
signal->theData[3] = ZSTORED_PROC_COPY;
// theData[4] is not used in TUP with ZSTORED_PROC_COPY
- sendSignal(tcConnectptr.p->tcTupBlockref, GSN_STORED_PROCREQ, signal, 5, JBB);
+ sendSignal(scanptr.p->scanBlockref, GSN_STORED_PROCREQ, signal, 5, JBB);
return;
}//Dblqh::accScanConfCopyLab()
@@ -9425,7 +9429,7 @@
signal->theData[0] = scanptr.p->scanAccPtr;
signal->theData[1] = RNIL;
signal->theData[2] = NextScanReq::ZSCAN_NEXT;
- sendSignal(tcConnectptr.p->tcAccBlockref, GSN_NEXT_SCANREQ, signal, 3, JBB);
+ sendSignal(scanptr.p->scanBlockref, GSN_NEXT_SCANREQ, signal, 3, JBB);
return;
}//Dblqh::continueFirstCopyAfterBlockedLab()
@@ -9472,7 +9476,7 @@
jam();
signal->theData[0] = scanptr.p->scanAccPtr;
signal->theData[1] = AccCheckScan::ZCHECK_LCP_STOP;
- sendSignal(tcConnectptr.p->tcAccBlockref, GSN_ACC_CHECK_SCAN, signal, 2, JBB);
+ sendSignal(scanptr.p->scanBlockref, GSN_ACC_CHECK_SCAN, signal, 2, JBB);
return;
}
@@ -9738,7 +9742,7 @@
signal->theData[0] = scanptr.p->scanAccPtr;
signal->theData[1] = acc_op_ptr;
signal->theData[2] = NextScanReq::ZSCAN_NEXT_COMMIT;
- sendSignal(tcConnectptr.p->tcAccBlockref, GSN_NEXT_SCANREQ, signal, 3, JBB);
+ sendSignal(scanptr.p->scanBlockref, GSN_NEXT_SCANREQ, signal, 3, JBB);
return;
}//Dblqh::continueCopyAfterBlockedLab()
@@ -9809,7 +9813,7 @@
signal->theData[0] = scanptr.p->scanAccPtr;
signal->theData[1] = RNIL;
signal->theData[2] = ZCOPY_CLOSE;
- sendSignal(tcConnectptr.p->tcAccBlockref, GSN_NEXT_SCANREQ, signal, 3, JBB);
+ sendSignal(scanptr.p->scanBlockref, GSN_NEXT_SCANREQ, signal, 3, JBB);
return;
}//Dblqh::continueCloseCopyAfterBlockedLab()
--- 1.34/storage/ndb/src/kernel/blocks/dbtup/Dbtup.hpp 2005-12-05 10:38:32 +01:00
+++ 1.35/storage/ndb/src/kernel/blocks/dbtup/Dbtup.hpp 2005-12-06 09:24:55 +01:00
@@ -401,7 +401,9 @@
Next = 5, // looking for next extry
Last = 6, // after last entry
Aborting = 7, // lock wait at scan close
- Invalid = 9 // cannot return REF to LQH currently
+ Invalid = 9, // cannot return REF to LQH currently
+
+ CurrentDeleted = 10 // Found deleted ROWID (used for NR)
};
Uint16 m_state;
@@ -2451,8 +2453,9 @@
Uint32* alloc_fix_rowid(Fragrecord*, Tablerec*, Local_key*, Uint32 *);
Uint32* alloc_var_rowid(Fragrecord*, Tablerec*, Uint32, Local_key*, Uint32*);
// Private methods
- void convertThPage(Uint32 Tupheadsize,
- Fix_page* regPagePtr);
+ void convertThPage(Fix_page* regPagePtr,
+ Tablerec*,
+ Uint32 mm);
/**
* Return offset
--- 1.6/storage/ndb/src/kernel/blocks/dbtup/DbtupFixAlloc.cpp 2005-11-30 14:58:56 +01:00
+++ 1.7/storage/ndb/src/kernel/blocks/dbtup/DbtupFixAlloc.cpp 2005-12-06 09:24:56 +01:00
@@ -89,8 +89,7 @@
ndbassert(pagePtr.p->page_state == ZEMPTY_MM);
- convertThPage(regTabPtr->m_offsets[MM].m_fix_header_size,
- (Fix_page*)pagePtr.p);
+ convertThPage((Fix_page*)pagePtr.p, regTabPtr, MM);
pagePtr.p->page_state = ZTH_MM_FREE;
@@ -120,10 +119,11 @@
return pagePtr.p->m_data + page_offset;
}
-void Dbtup::convertThPage(Uint32 Tupheadsize,
- Fix_page* const regPagePtr)
+void Dbtup::convertThPage(Fix_page* regPagePtr,
+ Tablerec* regTabPtr,
+ Uint32 mm)
{
- Uint32 nextTuple = Tupheadsize;
+ Uint32 nextTuple = regTabPtr->m_offsets[mm].m_fix_header_size;
Uint32 endOfList;
/*
ASSUMES AT LEAST ONE TUPLE HEADER FITS AND THEREFORE NO HANDLING
@@ -135,10 +135,19 @@
#ifdef VM_TRACE
memset(regPagePtr->m_data, 0xF1, 4*Fix_page::DATA_WORDS);
#endif
+ Uint32 gci_pos = 2;
+ Uint32 gci_val = 0xF1F1F1F1;
+ if (regTabPtr->m_bits & Tablerec::TR_RowGCI)
+ {
+ Tuple_header* ptr = 0;
+ gci_pos = ptr->get_mm_gci(regTabPtr) - (Uint32*)ptr;
+ gci_val = 0;
+ }
while (pos + nextTuple <= Fix_page::DATA_WORDS)
{
regPagePtr->m_data[pos] = (prev << 16) | (pos + nextTuple);
regPagePtr->m_data[pos + 1] = Tuple_header::FREE;
+ regPagePtr->m_data[pos + gci_pos] = gci_val;
prev = pos;
pos += nextTuple;
cnt ++;
@@ -227,8 +236,7 @@
LocalDLList<Page> alloc_pages(c_page_pool, regFragPtr->emptyPrimPage);
switch(state){
case ZEMPTY_MM:
- convertThPage(regTabPtr->m_offsets[MM].m_fix_header_size,
- (Fix_page*)pagePtr.p);
+ convertThPage((Fix_page*)pagePtr.p, regTabPtr, MM);
pagePtr.p->page_state = ZTH_MM_FREE;
alloc_pages.remove(pagePtr);
--- 1.11/storage/ndb/src/kernel/blocks/dbtup/DbtupScan.cpp 2005-11-24 16:11:31 +01:00
+++ 1.12/storage/ndb/src/kernel/blocks/dbtup/DbtupScan.cpp 2005-12-06 09:24:56 +01:00
@@ -87,6 +87,9 @@
bits |= ScanOp::SCAN_VS;
}
}
+
+ bits |= AccScanReq::getNRScanFlag(req->requestInfo) ? ScanOp::SCAN_NR : 0;
+
// set up scan op
new (scanPtr.p) ScanOp();
ScanOp& scan = *scanPtr.p;
@@ -100,6 +103,7 @@
scan.m_transId1 = req->transId1;
scan.m_transId2 = req->transId2;
scan.m_savePointId = req->savePointId;
+
// conf
AccScanConf* const conf = (AccScanConf*)signal->getDataPtrSend();
conf->scanPtr = req->senderData;
@@ -348,6 +352,10 @@
} else {
scan.m_state = ScanOp::Locked;
}
+ }
+ else if (scan.m_state == ScanOp::CurrentDeleted)
+ {
+
}
if (scan.m_state == ScanOp::Locked) {
// we have lock or do not need one
@@ -566,6 +574,8 @@
// tuple found
Tuple_header* th = 0;
Uint32 loop_count = 0;
+ Uint32 scanGCI = scanPtr.p->m_scanGCI;
+ Uint32 foundGCI;
bool mm = (bits & ScanOp::SCAN_DD);
Uint32 size = table.m_offsets[mm].m_fix_header_size +
@@ -669,17 +679,22 @@
jam();
{
// check if page is un-allocated or empty
- Tablespace_client tsman(signal, c_tsman,
- frag.fragTableId, frag.fragmentId, frag.m_tablespace_id);
- unsigned bits = ~(unsigned)0;
- int ret = tsman.get_page_free_bits(&key, &bits);
- ndbrequire(ret == 0);
- if (bits == 0) {
- // skip empty page
- jam();
- pos.m_get = ScanPos::Get_next_page_dd;
- break; // incr loop count
- }
+ if (likely(! (bits & ScanOp::SCAN_NR)))
+ {
+ Tablespace_client tsman(signal, c_tsman,
+ frag.fragTableId,
+ frag.fragmentId,
+ frag.m_tablespace_id);
+ unsigned bits = ~(unsigned)0;
+ int ret = tsman.get_page_free_bits(&key, &bits);
+ ndbrequire(ret == 0);
+ if (bits == 0) {
+ // skip empty page
+ jam();
+ pos.m_get = ScanPos::Get_next_page_dd;
+ break; // incr loop count
+ }
+ }
// page request to PGMAN
Page_cache_client::Request preq;
preq.m_page = pos.m_key;
@@ -716,16 +731,46 @@
jam();
{
Fix_page* page = (Fix_page*)pos.m_page;
- if (key.m_page_idx + size <= Fix_page::DATA_WORDS) {
+ if (key.m_page_idx + size <= Fix_page::DATA_WORDS)
+ {
+ pos.m_get = ScanPos::Get_next_tuple_fs;
th = (Tuple_header*)&page->m_data[key.m_page_idx];
- if (! (th->m_header_bits & Tuple_header::FREE)) {
- pos.m_get = ScanPos::Get_next_tuple_fs;
- goto found_tuple;
- } else {
- jam();
- // skip free tuple
- pos.m_get = ScanPos::Get_next_tuple_fs;
- }
+ if (likely(! (bits & ScanOp::SCAN_NR)))
+ {
+ if (! (th->m_header_bits & Tuple_header::FREE)) {
+ goto found_tuple;
+ }
+ else
+ {
+ jam();
+ // skip free tuple
+ }
+ }
+ else
+ {
+ if ((foundGCI = *th->get_mm_gci(tablePtr.p)) > scanGCI)
+ {
+ if (! (th->m_header_bits & Tuple_header::FREE))
+ {
+ jam();
+ goto found_tuple;
+ }
+ else
+ {
+ ndbout << "found deleted tuple" << pos.m_key
+ << " " << foundGCI << endl;
+ goto found_deleted_rowid;
+ }
+ }
+ else
+ {
+ jam();
+ // skip free tuple
+ ndbout << "Skipping " << pos.m_key << " gci: "
+ << *th->get_mm_gci(tablePtr.p)
+ << " scanGCI: " << scanGCI << endl;
+ }
+ }
} else {
jam();
// no more tuples on this page
@@ -733,7 +778,7 @@
}
}
break; // incr loop count
- found_tuple:
+ found_tuple:
// found possible tuple to return
jam();
{
@@ -757,6 +802,41 @@
// clear it so that it will show up in next LCP
th->m_header_bits &= ~(Uint32)Tuple_header::LCP_SKIP;
}
+ }
+ break;
+ found_deleted_rowid:
+ jam();
+ {
+ ndbassert(bits & ScanOp::SCAN_NR);
+ Local_key& key_mm = pos.m_key_mm;
+ Fix_page* page = (Fix_page*)pos.m_page;
+ if (! (bits & ScanOp::SCAN_DD)) {
+ key_mm = pos.m_key;
+ ndbrequire(page->alloc_record(key.m_page_idx)==key.m_page_idx);
+ th->m_header_bits |= Tuple_header::FREE; // Not foundable...
+
+ // caller has already set pos.m_get to next tuple
+ // real page id is already set
+ } else {
+ key_mm.assref(th->m_base_record_ref);
+ // recompute for each disk tuple
+ pos.m_realpid_mm = getRealpid(fragPtr.p, key_mm.m_page_no);
+
+ Fix_page *mmpage = (Fix_page*)c_page_pool.getPtr(pos.m_realpid_mm);
+ th = (Tuple_header*)(mmpage->m_data + key_mm.m_page_idx);
+ if ((foundGCI = *th->get_mm_gci(tablePtr.p)) > scanGCI)
+ {
+ if (! (th->m_header_bits & Tuple_header::FREE))
+ break;
+
+ ndbrequire(mmpage->alloc_record(key_mm.m_page_idx) ==
+ key_mm.m_page_idx);
+ th->m_header_bits |= Tuple_header::FREE; // Not foundable...
+ }
+ }
+ // TUPKEYREQ handles savepoint stuff
+ scan.m_state = ScanOp::CurrentDeleted;
+ return true;
}
break; // incr loop count
default:
| Thread |
|---|
| • bk commit into 5.1 tree (jonas:1.1980) | jonas | 6 Dec |