ndb - bug#34033

  remove LCP-snapshot from MM-tables,
  removing possibility of spurious 899 on MM-tables
parent 664cc992
...@@ -53,7 +53,14 @@ Dbtup::execACC_SCANREQ(Signal* signal) ...@@ -53,7 +53,14 @@ Dbtup::execACC_SCANREQ(Signal* signal)
// flags // flags
Uint32 bits = 0; Uint32 bits = 0;
if (!AccScanReq::getLcpScanFlag(req->requestInfo))
if (AccScanReq::getLcpScanFlag(req->requestInfo))
{
jam();
bits |= ScanOp::SCAN_LCP;
c_scanOpPool.getPtr(scanPtr, c_lcp_scan_op);
}
else
{ {
// seize from pool and link to per-fragment list // seize from pool and link to per-fragment list
LocalDLList<ScanOp> list(c_scanOpPool, frag.m_scanList); LocalDLList<ScanOp> list(c_scanOpPool, frag.m_scanList);
...@@ -61,39 +68,35 @@ Dbtup::execACC_SCANREQ(Signal* signal) ...@@ -61,39 +68,35 @@ Dbtup::execACC_SCANREQ(Signal* signal)
jam(); jam();
break; break;
} }
}
if (!AccScanReq::getNoDiskScanFlag(req->requestInfo)
&& tablePtr.p->m_no_of_disk_attributes) 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) { bool mm = (bits & ScanOp::SCAN_DD);
bits |= ScanOp::SCAN_VS; 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));
}
if (! AccScanReq::getReadCommittedFlag(req->requestInfo)) {
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); // disk pages have fixed page format
c_scanOpPool.getPtr(scanPtr, frag.m_lcp_scan_op); ndbrequire(! (bits & ScanOp::SCAN_DD));
ndbrequire(scanPtr.p->m_fragPtrI == fragPtr.i); }
bits |= ScanOp::SCAN_LCP; if (! AccScanReq::getReadCommittedFlag(req->requestInfo)) {
if (tablePtr.p->m_attributes[MM].m_no_of_varsize > 0) { if (AccScanReq::getLockMode(req->requestInfo) == 0)
bits |= ScanOp::SCAN_VS; bits |= ScanOp::SCAN_LOCK_SH;
} else
bits |= ScanOp::SCAN_LOCK_EX;
} }
if (AccScanReq::getLcpScanFlag(req->requestInfo))
{
jam();
ndbrequire((bits & ScanOp::SCAN_DD) == 0);
ndbrequire((bits & ScanOp::SCAN_LOCK) == 0);
}
bits |= AccScanReq::getNRScanFlag(req->requestInfo) ? ScanOp::SCAN_NR : 0; bits |= AccScanReq::getNRScanFlag(req->requestInfo) ? ScanOp::SCAN_NR : 0;
// set up scan op // set up scan op
...@@ -1107,16 +1110,17 @@ Dbtup::releaseScanOp(ScanOpPtr& scanPtr) ...@@ -1107,16 +1110,17 @@ Dbtup::releaseScanOp(ScanOpPtr& scanPtr)
fragPtr.i = scanPtr.p->m_fragPtrI; fragPtr.i = scanPtr.p->m_fragPtrI;
ptrCheckGuard(fragPtr, cnoOfFragrec, fragrecord); ptrCheckGuard(fragPtr, cnoOfFragrec, fragrecord);
if(! (scanPtr.p->m_bits & ScanOp::SCAN_LCP)) if(scanPtr.p->m_bits & ScanOp::SCAN_LCP)
{ {
LocalDLList<ScanOp> list(c_scanOpPool, fragPtr.p->m_scanList); jam();
list.release(scanPtr); fragPtr.p->m_lcp_scan_op = RNIL;
scanPtr.p->m_fragPtrI = RNIL;
} }
else else
{ {
ndbrequire(fragPtr.p->m_lcp_scan_op == scanPtr.i); jam();
fragPtr.p->m_lcp_scan_op = RNIL; LocalDLList<ScanOp> list(c_scanOpPool, fragPtr.p->m_scanList);
scanPtr.p->m_fragPtrI = RNIL; list.release(scanPtr);
} }
} }
...@@ -1129,21 +1133,24 @@ Dbtup::execLCP_FRAG_ORD(Signal* signal) ...@@ -1129,21 +1133,24 @@ Dbtup::execLCP_FRAG_ORD(Signal* signal)
tablePtr.i = req->tableId; tablePtr.i = req->tableId;
ptrCheckGuard(tablePtr, cnoOfTablerec, tablerec); ptrCheckGuard(tablePtr, cnoOfTablerec, tablerec);
jam(); if (tablePtr.p->m_no_of_disk_attributes)
FragrecordPtr fragPtr; {
Uint32 fragId = req->fragmentId; jam();
fragPtr.i = RNIL; FragrecordPtr fragPtr;
getFragmentrec(fragPtr, fragId, tablePtr.p); Uint32 fragId = req->fragmentId;
ndbrequire(fragPtr.i != RNIL); fragPtr.i = RNIL;
Fragrecord& frag = *fragPtr.p; getFragmentrec(fragPtr, fragId, tablePtr.p);
ndbrequire(fragPtr.i != RNIL);
ndbrequire(frag.m_lcp_scan_op == RNIL && c_lcp_scan_op != RNIL); Fragrecord& frag = *fragPtr.p;
frag.m_lcp_scan_op = c_lcp_scan_op;
ScanOpPtr scanPtr; ndbrequire(frag.m_lcp_scan_op == RNIL && c_lcp_scan_op != RNIL);
c_scanOpPool.getPtr(scanPtr, frag.m_lcp_scan_op); frag.m_lcp_scan_op = c_lcp_scan_op;
ndbrequire(scanPtr.p->m_fragPtrI == RNIL); ScanOpPtr scanPtr;
scanPtr.p->m_fragPtrI = fragPtr.i; c_scanOpPool.getPtr(scanPtr, frag.m_lcp_scan_op);
ndbrequire(scanPtr.p->m_fragPtrI == RNIL);
scanFirst(signal, scanPtr); scanPtr.p->m_fragPtrI = fragPtr.i;
scanPtr.p->m_state = ScanOp::First;
scanFirst(signal, scanPtr);
scanPtr.p->m_state = ScanOp::First;
}
} }
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