diff options
author | jonas@mc01.ndb.mysql.com <> | 2006-06-08 12:41:06 +0200 |
---|---|---|
committer | jonas@mc01.ndb.mysql.com <> | 2006-06-08 12:41:06 +0200 |
commit | 340e5ce138e551850eccc65550fad7f473093361 (patch) | |
tree | fdc6000d7f5987a7d38225592a8b2590caa32f21 /storage | |
parent | 2b82420a6c2e048db0be8dfd4996df4db9dcd6c2 (diff) | |
download | mariadb-git-340e5ce138e551850eccc65550fad7f473093361.tar.gz |
ndb - bug#20334
fix bug in tup scan wrt LCP
Diffstat (limited to 'storage')
-rw-r--r-- | storage/ndb/include/kernel/signaldata/AccScan.hpp | 18 | ||||
-rw-r--r-- | storage/ndb/include/kernel/signaldata/ScanFrag.hpp | 21 | ||||
-rw-r--r-- | storage/ndb/src/kernel/blocks/backup/Backup.cpp | 30 | ||||
-rw-r--r-- | storage/ndb/src/kernel/blocks/dblqh/Dblqh.hpp | 1 | ||||
-rw-r--r-- | storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp | 3 | ||||
-rw-r--r-- | storage/ndb/src/kernel/blocks/dbtup/DbtupScan.cpp | 21 |
6 files changed, 71 insertions, 23 deletions
diff --git a/storage/ndb/include/kernel/signaldata/AccScan.hpp b/storage/ndb/include/kernel/signaldata/AccScan.hpp index fd1982c77af..3f6bc7f7d4d 100644 --- a/storage/ndb/include/kernel/signaldata/AccScan.hpp +++ b/storage/ndb/include/kernel/signaldata/AccScan.hpp @@ -67,6 +67,9 @@ private: static Uint32 getNRScanFlag(const Uint32 & requestInfo); static void setNRScanFlag(Uint32 & requestInfo, Uint32 nr); + + static Uint32 getLcpScanFlag(const Uint32 & requestInfo); + static void setLcpScanFlag(Uint32 & requestInfo, Uint32 nr); }; /** @@ -77,6 +80,7 @@ private: * z = Descending (TUX) - 1 Bit 6 * d = No disk scan - 1 Bit 7 * n = Node recovery scan - 1 Bit 8 + * c = LCP scan - 1 Bit 9 * * 1111111111222222222233 * 01234567890123456789012345678901 @@ -88,6 +92,7 @@ private: #define AS_DESCENDING_SHIFT (6) #define AS_NO_DISK_SCAN (7) #define AS_NR_SCAN (8) +#define AS_LCP_SCAN (9) inline Uint32 @@ -154,6 +159,19 @@ AccScanReq::setNRScanFlag(UintR & requestInfo, UintR val){ requestInfo |= (val << AS_NR_SCAN); } +inline +Uint32 +AccScanReq::getLcpScanFlag(const Uint32 & requestInfo){ + return (requestInfo >> AS_LCP_SCAN) & 1; +} + +inline +void +AccScanReq::setLcpScanFlag(UintR & requestInfo, UintR val){ + ASSERT_BOOL(val, "AccScanReq::setNoDiskScanFlag"); + requestInfo |= (val << AS_LCP_SCAN); +} + class AccScanConf { /** * Sender(s) diff --git a/storage/ndb/include/kernel/signaldata/ScanFrag.hpp b/storage/ndb/include/kernel/signaldata/ScanFrag.hpp index 3c767c7f69c..b5700addb15 100644 --- a/storage/ndb/include/kernel/signaldata/ScanFrag.hpp +++ b/storage/ndb/include/kernel/signaldata/ScanFrag.hpp @@ -61,7 +61,8 @@ public: static Uint32 getAttrLen(const Uint32 & requestInfo); static Uint32 getScanPrio(const Uint32 & requestInfo); static Uint32 getNoDiskFlag(const Uint32 & requestInfo); - + static Uint32 getLcpScanFlag(const Uint32 & requestInfo); + static void setLockMode(Uint32 & requestInfo, Uint32 lockMode); static void setHoldLockFlag(Uint32 & requestInfo, Uint32 holdLock); static void setKeyinfoFlag(Uint32 & requestInfo, Uint32 keyinfo); @@ -72,6 +73,7 @@ public: static void setAttrLen(Uint32 & requestInfo, Uint32 attrLen); static void setScanPrio(Uint32& requestInfo, Uint32 prio); static void setNoDiskFlag(Uint32& requestInfo, Uint32 val); + static void setLcpScanFlag(Uint32 & requestInfo, Uint32 val); }; class KeyInfo20 { @@ -198,6 +200,7 @@ public: * Request Info * * a = Length of attrinfo - 16 Bits (16-31) + * c = LCP scan - 1 Bit 3 * d = No disk - 1 Bit 4 * l = Lock Mode - 1 Bit 5 * h = Hold lock - 1 Bit 7 @@ -205,7 +208,7 @@ public: * r = read committed - 1 Bit 9 * x = range scan - 1 Bit 6 * z = descending - 1 Bit 10 - * t = tup scan -1 Bit 11 (implies x=z=0) + * t = tup scan - 1 Bit 11 (implies x=z=0) * p = Scan prio - 4 Bits (12-15) -> max 15 * * 1111111111222222222233 @@ -222,6 +225,7 @@ public: #define SF_RANGE_SCAN_SHIFT (6) #define SF_DESCENDING_SHIFT (10) #define SF_TUP_SCAN_SHIFT (11) +#define SF_LCP_SCAN_SHIFT (3) #define SF_ATTR_LEN_SHIFT (16) #define SF_ATTR_LEN_MASK (65535) @@ -361,6 +365,19 @@ ScanFragReq::setNoDiskFlag(UintR & requestInfo, UintR val){ inline Uint32 +ScanFragReq::getLcpScanFlag(const Uint32 & requestInfo){ + return (requestInfo >> SF_LCP_SCAN_SHIFT) & 1; +} + +inline +void +ScanFragReq::setLcpScanFlag(UintR & requestInfo, UintR val){ + ASSERT_BOOL(val, "ScanFragReq::setLcpScanFlag"); + requestInfo |= (val << SF_LCP_SCAN_SHIFT); +} + +inline +Uint32 KeyInfo20::setScanInfo(Uint32 opNo, Uint32 scanNo){ ASSERT_MAX(opNo, 1023, "KeyInfo20::setScanInfo"); ASSERT_MAX(scanNo, 255, "KeyInfo20::setScanInfo"); diff --git a/storage/ndb/src/kernel/blocks/backup/Backup.cpp b/storage/ndb/src/kernel/blocks/backup/Backup.cpp index 620fac9eb05..07df1db862b 100644 --- a/storage/ndb/src/kernel/blocks/backup/Backup.cpp +++ b/storage/ndb/src/kernel/blocks/backup/Backup.cpp @@ -2985,22 +2985,25 @@ Backup::parseTableDescription(Signal* signal, if (disk) { /** - * Remove all disk attributes, but add DISK_REF (8 bytes) + * Remove all disk attributes */ - tabPtr.p->noOfAttributes -= (disk - 1); + tabPtr.p->noOfAttributes -= disk; - AttributePtr attrPtr; - ndbrequire(tabPtr.p->attributes.seize(attrPtr)); - - Uint32 sz32 = 2; - attrPtr.p->data.attrId = AttributeHeader::DISK_REF; - attrPtr.p->data.m_flags = Attribute::COL_FIXED; - attrPtr.p->data.sz32 = 2; - - attrPtr.p->data.offset = tabPtr.p->sz_FixedAttributes; - tabPtr.p->sz_FixedAttributes += sz32; + { + AttributePtr attrPtr; + ndbrequire(tabPtr.p->attributes.seize(attrPtr)); + + Uint32 sz32 = 2; + attrPtr.p->data.attrId = AttributeHeader::DISK_REF; + attrPtr.p->data.m_flags = Attribute::COL_FIXED; + attrPtr.p->data.sz32 = 2; + + attrPtr.p->data.offset = tabPtr.p->sz_FixedAttributes; + tabPtr.p->sz_FixedAttributes += sz32; + tabPtr.p->noOfAttributes ++; + } } - + { AttributePtr attrPtr; ndbrequire(tabPtr.p->attributes.seize(attrPtr)); @@ -3309,6 +3312,7 @@ Backup::execBACKUP_FRAGMENT_REQ(Signal* signal) ScanFragReq::setScanPrio(req->requestInfo, 1); ScanFragReq::setTupScanFlag(req->requestInfo, 1); ScanFragReq::setNoDiskFlag(req->requestInfo, 1); + ScanFragReq::setLcpScanFlag(req->requestInfo, 1); } req->transId1 = 0; req->transId2 = (BACKUP << 20) + (getOwnNodeId() << 8); diff --git a/storage/ndb/src/kernel/blocks/dblqh/Dblqh.hpp b/storage/ndb/src/kernel/blocks/dblqh/Dblqh.hpp index 5caa823dbc3..f1d1fdbf000 100644 --- a/storage/ndb/src/kernel/blocks/dblqh/Dblqh.hpp +++ b/storage/ndb/src/kernel/blocks/dblqh/Dblqh.hpp @@ -572,6 +572,7 @@ public: Uint8 rangeScan; Uint8 descending; Uint8 tupScan; + Uint8 lcpScan; Uint8 scanTcWaiting; Uint8 scanKeyinfoFlag; Uint8 m_last_row; diff --git a/storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp b/storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp index 0ddb32efded..53cf5c06fe4 100644 --- a/storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp +++ b/storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp @@ -8362,6 +8362,8 @@ void Dblqh::continueAfterReceivingAllAiLab(Signal* signal) AccScanReq::setDescendingFlag(req->requestInfo, scanptr.p->descending); AccScanReq::setNoDiskScanFlag(req->requestInfo, !tcConnectptr.p->m_disk_table); + AccScanReq::setLcpScanFlag(req->requestInfo, scanptr.p->lcpScan); + req->transId1 = tcConnectptr.p->transid[0]; req->transId2 = tcConnectptr.p->transid[1]; req->savePointId = tcConnectptr.p->savePointId; @@ -9453,6 +9455,7 @@ Uint32 Dblqh::initScanrec(const ScanFragReq* scanFragReq) scanptr.p->rangeScan = rangeScan; scanptr.p->descending = descending; scanptr.p->tupScan = tupScan; + scanptr.p->lcpScan = ScanFragReq::getLcpScanFlag(reqinfo); scanptr.p->scanState = ScanRecord::SCAN_FREE; scanptr.p->scanFlag = ZFALSE; scanptr.p->m_row_id.setNull(); diff --git a/storage/ndb/src/kernel/blocks/dbtup/DbtupScan.cpp b/storage/ndb/src/kernel/blocks/dbtup/DbtupScan.cpp index d9e94e63726..3ebfbd4aaa9 100644 --- a/storage/ndb/src/kernel/blocks/dbtup/DbtupScan.cpp +++ b/storage/ndb/src/kernel/blocks/dbtup/DbtupScan.cpp @@ -53,7 +53,10 @@ Dbtup::execACC_SCANREQ(Signal* signal) Fragrecord& frag = *fragPtr.p; // flags Uint32 bits = 0; - if (frag.m_lcp_scan_op == RNIL) { + + if (!AccScanReq::getLcpScanFlag(req->requestInfo) || + tablePtr.p->m_no_of_disk_attributes == 0) + { // seize from pool and link to per-fragment list LocalDLList<ScanOp> list(c_scanOpPool, frag.m_scanList); if (! list.seize(scanPtr)) { @@ -63,23 +66,25 @@ Dbtup::execACC_SCANREQ(Signal* signal) if (!AccScanReq::getNoDiskScanFlag(req->requestInfo) && tablePtr.p->m_no_of_disk_attributes) { - bits |= ScanOp::SCAN_DD; + bits |= ScanOp::SCAN_DD; } bool mm = (bits & ScanOp::SCAN_DD); if (tablePtr.p->m_attributes[mm].m_no_of_varsize > 0) { bits |= ScanOp::SCAN_VS; - // disk pages have fixed page format - ndbrequire(! (bits & ScanOp::SCAN_DD)); + // disk pages have fixed page format + ndbrequire(! (bits & ScanOp::SCAN_DD)); } if (! AccScanReq::getReadCommittedFlag(req->requestInfo)) { - if (AccScanReq::getLockMode(req->requestInfo) == 0) - bits |= ScanOp::SCAN_LOCK_SH; - else - bits |= ScanOp::SCAN_LOCK_EX; + if (AccScanReq::getLockMode(req->requestInfo) == 0) + bits |= ScanOp::SCAN_LOCK_SH; + else + bits |= ScanOp::SCAN_LOCK_EX; } } else { jam(); + // LCP scan and disk + ndbrequire(frag.m_lcp_scan_op == c_lcp_scan_op); c_scanOpPool.getPtr(scanPtr, frag.m_lcp_scan_op); bits |= ScanOp::SCAN_LCP; |