Below is the list of changes that have just been committed into a local
5.1 repository of pekka. When pekka 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@stripped, 2006-10-09 16:40:57+02:00, pekka@stripped +6 -0
Merge orca.ndb.mysql.com:/export/home/space/pekka/ndb/version/my50-bug20446
into orca.ndb.mysql.com:/export/home/space/pekka/ndb/version/my51-bug20446
MERGE: 1.1810.2104.2
storage/ndb/src/kernel/blocks/dbtux/Dbtux.hpp@stripped, 2006-10-09 16:39:30+02:00,
pekka@stripped +0 -5
merge: manual
MERGE: 1.39.3.2
storage/ndb/src/kernel/blocks/dbtux/Dbtux.hpp@stripped, 2006-10-09 16:19:12+02:00,
pekka@stripped +0 -0
Merge rename: ndb/src/kernel/blocks/dbtux/Dbtux.hpp ->
storage/ndb/src/kernel/blocks/dbtux/Dbtux.hpp
storage/ndb/src/kernel/blocks/dbtux/DbtuxDebug.cpp@stripped, 2006-10-09 16:39:49+02:00,
pekka@stripped +0 -0
SCCS merged
MERGE: 1.20.1.2
storage/ndb/src/kernel/blocks/dbtux/DbtuxDebug.cpp@stripped, 2006-10-09 16:19:12+02:00,
pekka@stripped +0 -0
Merge rename: ndb/src/kernel/blocks/dbtux/DbtuxDebug.cpp ->
storage/ndb/src/kernel/blocks/dbtux/DbtuxDebug.cpp
storage/ndb/src/kernel/blocks/dbtux/DbtuxGen.cpp@stripped, 2006-10-09 16:39:59+02:00,
pekka@stripped +0 -0
SCCS merged
MERGE: 1.18.2.2
storage/ndb/src/kernel/blocks/dbtux/DbtuxGen.cpp@stripped, 2006-10-09 16:19:12+02:00,
pekka@stripped +0 -0
Merge rename: ndb/src/kernel/blocks/dbtux/DbtuxGen.cpp ->
storage/ndb/src/kernel/blocks/dbtux/DbtuxGen.cpp
storage/ndb/src/kernel/blocks/dbtux/DbtuxMaint.cpp@stripped, 2006-10-09 16:40:10+02:00,
pekka@stripped +0 -0
SCCS merged
MERGE: 1.16.1.2
storage/ndb/src/kernel/blocks/dbtux/DbtuxMaint.cpp@stripped, 2006-10-09 16:19:12+02:00,
pekka@stripped +0 -0
Merge rename: ndb/src/kernel/blocks/dbtux/DbtuxMaint.cpp ->
storage/ndb/src/kernel/blocks/dbtux/DbtuxMaint.cpp
storage/ndb/src/kernel/blocks/dbtux/DbtuxScan.cpp@stripped, 2006-10-09 16:40:37+02:00,
pekka@stripped +0 -0
SCCS merged
MERGE: 1.27.1.2
storage/ndb/src/kernel/blocks/dbtux/DbtuxScan.cpp@stripped, 2006-10-09 16:19:12+02:00,
pekka@stripped +0 -0
Merge rename: ndb/src/kernel/blocks/dbtux/DbtuxScan.cpp ->
storage/ndb/src/kernel/blocks/dbtux/DbtuxScan.cpp
storage/ndb/src/kernel/blocks/dbtux/DbtuxSearch.cpp@stripped, 2006-10-09 16:40:46+02:00,
pekka@stripped +0 -0
SCCS merged
MERGE: 1.9.1.2
storage/ndb/src/kernel/blocks/dbtux/DbtuxSearch.cpp@stripped, 2006-10-09 16:19:12+02:00,
pekka@stripped +0 -0
Merge rename: ndb/src/kernel/blocks/dbtux/DbtuxSearch.cpp ->
storage/ndb/src/kernel/blocks/dbtux/DbtuxSearch.cpp
# 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: pekka
# Host: orca.ndb.mysql.com
# Root: /export/home/space/pekka/ndb/version/my51-bug20446/RESYNC
--- 1.39.3.1/ndb/src/kernel/blocks/dbtux/Dbtux.hpp 2006-10-09 16:41:16 +02:00
+++ 1.47/storage/ndb/src/kernel/blocks/dbtux/Dbtux.hpp 2006-10-09 16:41:16 +02:00
@@ -26,7 +26,7 @@
#include <md5_hash.hpp>
// big brother
-#include <Dbtup.hpp>
+#include <dbtup/Dbtup.hpp>
// signal classes
#include <signaldata/DictTabInfo.hpp>
@@ -82,10 +82,14 @@
#define jam() jamLine(80000 + __LINE__)
#define jamEntry() jamEntryLine(80000 + __LINE__)
#endif
-#ifdef DBTUX_DEBUG_CPP
+#ifdef DBTUX_STAT_CPP
#define jam() jamLine(90000 + __LINE__)
#define jamEntry() jamEntryLine(90000 + __LINE__)
#endif
+#ifdef DBTUX_DEBUG_CPP
+#define jam() jamLine(100000 + __LINE__)
+#define jamEntry() jamEntryLine(100000 + __LINE__)
+#endif
#ifndef jam
#define jam() jamLine(__LINE__)
#define jamEntry() jamEntryLine(__LINE__)
@@ -98,7 +102,7 @@
class Dbtux : public SimulatedBlock {
public:
- Dbtux(const Configuration& conf);
+ Dbtux(Block_context& ctx);
virtual ~Dbtux();
// pointer to TUP instance in this thread
@@ -106,7 +110,7 @@
private:
// sizes are in words (Uint32)
- STATIC_CONST( MaxIndexFragments = 2 * MAX_FRAG_PER_NODE );
+ STATIC_CONST( MaxIndexFragments = MAX_FRAG_PER_NODE );
STATIC_CONST( MaxIndexAttributes = MAX_ATTRIBUTES_IN_INDEX );
STATIC_CONST( MaxAttrDataSize = 2048 );
public:
@@ -116,6 +120,7 @@
STATIC_CONST( MaxPrefSize = MAX_TTREE_PREF_SIZE );
STATIC_CONST( ScanBoundSegmentSize = 7 );
STATIC_CONST( MaxAccLockOps = MAX_PARALLEL_OP_PER_SCAN );
+ STATIC_CONST( MaxTreeDepth = 32 ); // strict
BLOCK_DEFINES(Dbtux);
// forward declarations
@@ -185,7 +190,6 @@
struct TreeEnt {
TupLoc m_tupLoc; // address of original tuple
unsigned m_tupVersion : 15; // version
- unsigned m_fragBit : 1; // which duplicated table fragment
TreeEnt();
// methods
bool eqtuple(const TreeEnt ent) const;
@@ -246,6 +250,7 @@
Uint8 m_prefSize; // words in min prefix
Uint8 m_minOccup; // min entries in internal node
Uint8 m_maxOccup; // max entries in node
+ Uint32 m_entryCount; // stat: current entries
TupLoc m_root; // root node
TreeHead();
// methods
@@ -460,8 +465,8 @@
TupLoc m_freeLoc; // list of free index nodes
DLList<ScanOp> m_scanList; // current scans on this fragment
Uint32 m_tupIndexFragPtrI;
- Uint32 m_tupTableFragPtrI[2];
- Uint32 m_accTableFragPtrI[2];
+ Uint32 m_tupTableFragPtrI;
+ Uint32 m_accTableFragPtrI;
union {
Uint32 nextPool;
};
@@ -640,6 +645,14 @@
int cmpScanBound(const Frag& frag, unsigned dir, ConstData boundInfo, unsigned
boundCount, ConstData entryData, unsigned maxlen = MaxAttrDataSize);
/*
+ * DbtuxStat.cpp
+ */
+ void execREAD_PSEUDO_REQ(Signal* signal);
+ void statRecordsInRange(ScanOpPtr scanPtr, Uint32* out);
+ Uint32 getEntriesBeforeOrAfter(Frag& frag, TreePos pos, unsigned idir);
+ unsigned getPathToNode(NodeHandle node, Uint16* path);
+
+ /*
* DbtuxDebug.cpp
*/
void execDUMP_STATE_ORD(Signal* signal);
@@ -780,8 +793,7 @@
inline
Dbtux::TreeEnt::TreeEnt() :
m_tupLoc(),
- m_tupVersion(0),
- m_fragBit(0)
+ m_tupVersion(0)
{
}
@@ -798,18 +810,12 @@
{
return
m_tupLoc == ent.m_tupLoc &&
- m_tupVersion == ent.m_tupVersion &&
- m_fragBit == ent.m_fragBit;
+ m_tupVersion == ent.m_tupVersion;
}
inline int
Dbtux::TreeEnt::cmp(const TreeEnt ent) const
{
- // compare frag first to improve cacheing in 5.0
- if (m_fragBit < ent.m_fragBit)
- return -1;
- if (m_fragBit > ent.m_fragBit)
- return +1;
if (m_tupLoc.getPageId() < ent.m_tupLoc.getPageId())
return -1;
if (m_tupLoc.getPageId() > ent.m_tupLoc.getPageId())
@@ -863,6 +869,7 @@
m_prefSize(0),
m_minOccup(0),
m_maxOccup(0),
+ m_entryCount(0),
m_root()
{
}
@@ -994,10 +1001,8 @@
m_scanList(scanOpPool),
m_tupIndexFragPtrI(RNIL)
{
- m_tupTableFragPtrI[0] = RNIL;
- m_tupTableFragPtrI[1] = RNIL;
- m_accTableFragPtrI[0] = RNIL;
- m_accTableFragPtrI[1] = RNIL;
+ m_tupTableFragPtrI = RNIL;
+ m_accTableFragPtrI = RNIL;
}
// Dbtux::FragOp
@@ -1177,7 +1182,7 @@
inline Uint32
Dbtux::getTupAddr(const Frag& frag, TreeEnt ent)
{
- const Uint32 tableFragPtrI = frag.m_tupTableFragPtrI[ent.m_fragBit];
+ const Uint32 tableFragPtrI = frag.m_tupTableFragPtrI;
const TupLoc tupLoc = ent.m_tupLoc;
Uint32 tupAddr = NullTupAddr;
c_tup->tuxGetTupAddr(tableFragPtrI, tupLoc.getPageId(), tupLoc.getPageOffset(),
tupAddr);
--- 1.20.1.1/ndb/src/kernel/blocks/dbtux/DbtuxDebug.cpp 2006-10-09 16:41:16 +02:00
+++ 1.23/storage/ndb/src/kernel/blocks/dbtux/DbtuxDebug.cpp 2006-10-09 16:41:16 +02:00
@@ -53,37 +53,7 @@
return;
}
if (signal->theData[0] == DumpStateOrd::TuxMetaDataJunk) {
- // read table definition
- Uint32 tableId = signal->theData[1];
- Uint32 tableVersion = signal->theData[2];
- int ret;
- MetaData md(this);
- MetaData::Table table;
- MetaData::Attribute attribute;
- infoEvent("md: read table %u %u", tableId, tableVersion);
- if ((ret = md.lock(false)) < 0) {
- infoEvent("md.lock error %d", ret);
- return;
- }
- if ((ret = md.getTable(table, tableId, tableVersion)) < 0) {
- infoEvent("md.getTable error %d", ret);
- // lock is released by destructor
- return;
- }
- infoEvent("md: %s type=%d attrs=%u", table.tableName, table.tableType,
table.noOfAttributes);
- for (Uint32 i = 0; i < table.noOfAttributes; i++) {
- if ((ret = md.getAttribute(attribute, table, i)) < 0) {
- infoEvent("mg.getAttribute %u error %d", i, ret);
- // lock is released by destructor
- return;
- }
- infoEvent("md: %d %s", attribute.attributeId, attribute.attributeName);
- }
- if ((ret = md.unlock(false)) < 0) {
- infoEvent("md.unlock error %d", ret);
- return;
- }
- return;
+ abort();
}
#endif
}
@@ -268,8 +238,7 @@
NdbOut&
operator<<(NdbOut& out, const Dbtux::TreeEnt& ent)
{
- out << dec << ent.m_fragBit;
- out << "-" << ent.m_tupLoc;
+ out << ent.m_tupLoc;
out << "-" << dec << ent.m_tupVersion;
return out;
}
--- 1.18.2.1/ndb/src/kernel/blocks/dbtux/DbtuxGen.cpp 2006-10-09 16:41:16 +02:00
+++ 1.24/storage/ndb/src/kernel/blocks/dbtux/DbtuxGen.cpp 2006-10-09 16:41:16 +02:00
@@ -17,8 +17,8 @@
#define DBTUX_GEN_CPP
#include "Dbtux.hpp"
-Dbtux::Dbtux(const Configuration& conf) :
- SimulatedBlock(DBTUX, conf),
+Dbtux::Dbtux(Block_context& ctx) :
+ SimulatedBlock(DBTUX, ctx),
c_tup(0),
c_descPageList(RNIL),
#ifdef VM_TRACE
@@ -66,6 +66,10 @@
addRecSignal(GSN_ACCKEYREF, &Dbtux::execACCKEYREF);
addRecSignal(GSN_ACC_ABORTCONF, &Dbtux::execACC_ABORTCONF);
/*
+ * DbtuxStat.cpp
+ */
+ addRecSignal(GSN_READ_PSEUDO_REQ, &Dbtux::execREAD_PSEUDO_REQ);
+ /*
* DbtuxDebug.cpp
*/
addRecSignal(GSN_DUMP_STATE_ORD, &Dbtux::execDUMP_STATE_ORD);
@@ -161,7 +165,7 @@
Uint32 nScanOp;
const ndb_mgm_configuration_iterator * p =
- theConfiguration.getOwnConfigIterator();
+ m_ctx.m_config.getOwnConfigIterator();
ndbrequire(p != 0);
ndbrequire(!ndb_mgm_get_int_parameter(p, CFG_TUX_INDEX, &nIndex));
@@ -234,7 +238,7 @@
Dbtux::readKeyAttrs(const Frag& frag, TreeEnt ent, unsigned start, Data keyData)
{
ConstData keyAttrs = c_keyAttrs; // global
- const Uint32 tableFragPtrI = frag.m_tupTableFragPtrI[ent.m_fragBit];
+ const Uint32 tableFragPtrI = frag.m_tupTableFragPtrI;
const TupLoc tupLoc = ent.m_tupLoc;
const Uint32 tupVersion = ent.m_tupVersion;
ndbrequire(start < frag.m_numAttrs);
@@ -270,7 +274,7 @@
void
Dbtux::readTablePk(const Frag& frag, TreeEnt ent, Data pkData, unsigned& pkSize)
{
- const Uint32 tableFragPtrI = frag.m_tupTableFragPtrI[ent.m_fragBit];
+ const Uint32 tableFragPtrI = frag.m_tupTableFragPtrI;
const TupLoc tupLoc = ent.m_tupLoc;
int ret = c_tup->tuxReadPk(tableFragPtrI, tupLoc.getPageId(),
tupLoc.getPageOffset(), pkData, true);
jamEntry();
--- 1.16.1.1/ndb/src/kernel/blocks/dbtux/DbtuxMaint.cpp 2006-10-09 16:41:16 +02:00
+++ 1.19/storage/ndb/src/kernel/blocks/dbtux/DbtuxMaint.cpp 2006-10-09 16:41:16 +02:00
@@ -33,7 +33,7 @@
jam();
#ifdef VM_TRACE
if (debugFlags & DebugMaint) {
- TupLoc tupLoc(sig->pageId, sig->pageOffset);
+ TupLoc tupLoc(sig->pageId, sig->pageIndex);
debugOut << "opInfo=" << hex << sig->opInfo;
debugOut << " tableId=" << dec << sig->tableId;
debugOut << " indexId=" << dec << sig->indexId;
@@ -57,8 +57,7 @@
c_indexPool.getPtr(indexPtr, req->indexId);
ndbrequire(indexPtr.p->m_tableId == req->tableId);
// get base fragment id and extra bits
- const Uint32 fragId = req->fragId & ~1;
- const Uint32 fragBit = req->fragId & 1;
+ const Uint32 fragId = req->fragId;
// get the fragment
FragPtr fragPtr;
fragPtr.i = RNIL;
@@ -76,9 +75,8 @@
setKeyAttrs(frag);
// set up search entry
TreeEnt ent;
- ent.m_tupLoc = TupLoc(req->pageId, req->pageOffset);
+ ent.m_tupLoc = TupLoc(req->pageId, req->pageIndex);
ent.m_tupVersion = req->tupVersion;
- ent.m_fragBit = fragBit;
// read search key
readKeyAttrs(frag, ent, 0, c_searchKey);
if (! frag.m_storeNullKey) {
--- 1.27.1.1/ndb/src/kernel/blocks/dbtux/DbtuxScan.cpp 2006-10-09 16:41:16 +02:00
+++ 1.31/storage/ndb/src/kernel/blocks/dbtux/DbtuxScan.cpp 2006-10-09 16:41:16 +02:00
@@ -35,7 +35,7 @@
fragPtr.i = RNIL;
for (unsigned i = 0; i < indexPtr.p->m_numFrags; i++) {
jam();
- if (indexPtr.p->m_fragId[i] == req->fragmentNo << 1) {
+ if (indexPtr.p->m_fragId[i] == req->fragmentNo) {
jam();
c_fragPool.getPtr(fragPtr, indexPtr.p->m_fragPtrI[i]);
break;
@@ -161,8 +161,19 @@
Uint32 dstWords = 0;
if (! ah->isNULL()) {
jam();
+ const uchar* srcPtr = (const uchar*)&data[offset + 2];
const DescAttr& descAttr = descEnt.m_descAttr[attrId];
- Uint32 srcBytes = AttributeDescriptor::getSizeInBytes(descAttr.m_attrDesc);
+ Uint32 typeId = descAttr.m_typeId;
+ Uint32 maxBytes = AttributeDescriptor::getSizeInBytes(descAttr.m_attrDesc);
+ Uint32 lb, len;
+ bool ok = NdbSqlUtil::get_var_length(typeId, srcPtr, maxBytes, lb, len);
+ if (! ok) {
+ jam();
+ scan.m_state = ScanOp::Invalid;
+ sig->errorCode = TuxBoundInfo::InvalidCharFormat;
+ return;
+ }
+ Uint32 srcBytes = lb + len;
Uint32 srcWords = (srcBytes + 3) / 4;
if (srcWords != dataSize) {
jam();
@@ -171,27 +182,17 @@
return;
}
uchar* dstPtr = (uchar*)&xfrmData[dstPos + 2];
- const uchar* srcPtr = (const uchar*)&data[offset + 2];
if (descAttr.m_charset == 0) {
memcpy(dstPtr, srcPtr, srcWords << 2);
dstWords = srcWords;
} else {
jam();
- Uint32 typeId = descAttr.m_typeId;
- Uint32 lb, len;
- bool ok = NdbSqlUtil::get_var_length(typeId, srcPtr, srcBytes, lb, len);
- if (! ok) {
- jam();
- scan.m_state = ScanOp::Invalid;
- sig->errorCode = TuxBoundInfo::InvalidCharFormat;
- return;
- }
CHARSET_INFO* cs = all_charsets[descAttr.m_charset];
Uint32 xmul = cs->strxfrm_multiply;
if (xmul == 0)
xmul = 1;
// see comment in DbtcMain.cpp
- Uint32 dstLen = xmul * (srcBytes - lb);
+ Uint32 dstLen = xmul * (maxBytes - lb);
if (dstLen > ((dstSize - dstPos) << 2)) {
jam();
scan.m_state = ScanOp::Invalid;
@@ -320,7 +321,7 @@
conf->scanPtr = scan.m_userPtr;
unsigned signalLength = 1;
sendSignal(scanPtr.p->m_userRef, GSN_NEXT_SCANCONF,
- signal, signalLength, JBB);
+ signal, signalLength, JBB);
return;
}
break;
@@ -343,7 +344,8 @@
lockReq->returnCode = RNIL;
lockReq->requestInfo = AccLockReq::AbortWithConf;
lockReq->accOpPtr = scan.m_accLockOp;
- EXECUTE_DIRECT(DBACC, GSN_ACC_LOCKREQ, signal, AccLockReq::UndoSignalLength);
+ EXECUTE_DIRECT(DBACC, GSN_ACC_LOCKREQ, signal,
+ AccLockReq::UndoSignalLength);
jamEntry();
ndbrequire(lockReq->returnCode == AccLockReq::Success);
scan.m_state = ScanOp::Aborting;
@@ -354,9 +356,10 @@
ndbrequire(scan.m_accLockOp != RNIL);
AccLockReq* const lockReq = (AccLockReq*)signal->getDataPtrSend();
lockReq->returnCode = RNIL;
- lockReq->requestInfo = AccLockReq::Unlock;
+ lockReq->requestInfo = AccLockReq::Abort;
lockReq->accOpPtr = scan.m_accLockOp;
- EXECUTE_DIRECT(DBACC, GSN_ACC_LOCKREQ, signal, AccLockReq::UndoSignalLength);
+ EXECUTE_DIRECT(DBACC, GSN_ACC_LOCKREQ, signal,
+ AccLockReq::UndoSignalLength);
jamEntry();
ndbrequire(lockReq->returnCode == AccLockReq::Success);
scan.m_accLockOp = RNIL;
@@ -410,7 +413,7 @@
NextScanConf* const conf = (NextScanConf*)signal->getDataPtrSend();
conf->scanPtr = scan.m_userPtr;
conf->accOperationPtr = RNIL; // no tuple returned
- conf->fragId = frag.m_fragId | ent.m_fragBit;
+ conf->fragId = frag.m_fragId;
unsigned signalLength = 3;
// if TC has ordered scan close, it will be detected here
sendSignal(scan.m_userRef, GSN_NEXT_SCANCONF,
@@ -449,8 +452,8 @@
lockReq->userPtr = scanPtr.i;
lockReq->userRef = reference();
lockReq->tableId = scan.m_tableId;
- lockReq->fragId = frag.m_fragId | ent.m_fragBit;
- lockReq->fragPtrI = frag.m_accTableFragPtrI[ent.m_fragBit];
+ lockReq->fragId = frag.m_fragId;
+ lockReq->fragPtrI = frag.m_accTableFragPtrI;
const Uint32* const buf32 = static_cast<Uint32*>(pkData);
const Uint64* const buf64 = reinterpret_cast<const Uint64*>(buf32);
lockReq->hashValue = md5_hash(buf64, pkSize);
@@ -541,7 +544,7 @@
accLockOp = (Uint32)-1;
}
conf->accOperationPtr = accLockOp;
- conf->fragId = frag.m_fragId | ent.m_fragBit;
+ conf->fragId = frag.m_fragId;
conf->localKey[0] = getTupAddr(frag, ent);
conf->localKey[1] = 0;
conf->localKeyLength = 1;
@@ -607,7 +610,7 @@
jam();
AccLockReq* const lockReq = (AccLockReq*)signal->getDataPtrSend();
lockReq->returnCode = RNIL;
- lockReq->requestInfo = AccLockReq::Unlock;
+ lockReq->requestInfo = AccLockReq::Abort;
lockReq->accOpPtr = scan.m_accLockOp;
EXECUTE_DIRECT(DBACC, GSN_ACC_LOCKREQ, signal, AccLockReq::UndoSignalLength);
jamEntry();
@@ -985,14 +988,13 @@
{
const ScanOp& scan = *scanPtr.p;
const Frag& frag = *c_fragPool.getPtr(scan.m_fragPtrI);
- Uint32 fragBit = ent.m_fragBit;
- Uint32 tableFragPtrI = frag.m_tupTableFragPtrI[fragBit];
- Uint32 fragId = frag.m_fragId | fragBit;
+ Uint32 tableFragPtrI = frag.m_tupTableFragPtrI;
+ Uint32 fragId = frag.m_fragId;
Uint32 tupAddr = getTupAddr(frag, ent);
Uint32 tupVersion = ent.m_tupVersion;
// check for same tuple twice in row
- if (scan.m_scanEnt.m_tupLoc == ent.m_tupLoc &&
- scan.m_scanEnt.m_fragBit == fragBit) {
+ if (scan.m_scanEnt.m_tupLoc == ent.m_tupLoc)
+ {
jam();
return false;
}
| Thread |
|---|
| • bk commit into 5.1 tree (pekka:1.2305) | pekka | 9 Oct |