Commit 25086da5 authored by unknown's avatar unknown

Merge mysql.com:/home/jonas/src/mysql-4.1-ndb

into mysql.com:/home/jonas/src/wl2025


ndb/src/kernel/blocks/dbtc/Dbtc.hpp:
  Auto merged
ndb/src/kernel/blocks/dbtc/DbtcMain.cpp:
  Auto merged
parents dfad106c 15135482
...@@ -95,6 +95,9 @@ public: ...@@ -95,6 +95,9 @@ public:
TcDumpAllApiConnectRec = 2506, TcDumpAllApiConnectRec = 2506,
TcSetTransactionTimeout = 2507, TcSetTransactionTimeout = 2507,
TcSetApplTransactionTimeout = 2508, TcSetApplTransactionTimeout = 2508,
StartTcTimer = 2509,
StopTcTimer = 2510,
StartPeriodicTcTimer = 2511,
CmvmiDumpConnections = 2600, CmvmiDumpConnections = 2600,
CmvmiDumpLongSignalMemory = 2601, CmvmiDumpLongSignalMemory = 2601,
CmvmiSetRestartOnErrorInsert = 2602, CmvmiSetRestartOnErrorInsert = 2602,
......
...@@ -624,7 +624,8 @@ EventLogger::getText(int type, ...@@ -624,7 +624,8 @@ EventLogger::getText(int type,
"%sTrans. Count = %u, Commit Count = %u, " "%sTrans. Count = %u, Commit Count = %u, "
"Read Count = %u, Simple Read Count = %u,\n" "Read Count = %u, Simple Read Count = %u,\n"
"Write Count = %u, AttrInfo Count = %u, " "Write Count = %u, AttrInfo Count = %u, "
"Concurrent Operations = %u, Abort Count = %u", "Concurrent Operations = %u, Abort Count = %u\n"
" Scans: %u Range scans: %u",
theNodeId, theNodeId,
theData[1], theData[1],
theData[2], theData[2],
...@@ -633,7 +634,9 @@ EventLogger::getText(int type, ...@@ -633,7 +634,9 @@ EventLogger::getText(int type,
theData[5], theData[5],
theData[6], theData[6],
theData[7], theData[7],
theData[8]); theData[8],
theData[9],
theData[10]);
break; break;
case EventReport::OperationReportCounters: case EventReport::OperationReportCounters:
::snprintf(m_text, sizeof(m_text), ::snprintf(m_text, sizeof(m_text),
......
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
#include <signaldata/TrigAttrInfo.hpp> #include <signaldata/TrigAttrInfo.hpp>
#include <signaldata/TcIndx.hpp> #include <signaldata/TcIndx.hpp>
#include <signaldata/TransIdAI.hpp> #include <signaldata/TransIdAI.hpp>
#include <signaldata/EventReport.hpp>
#include <trigger_definitions.h> #include <trigger_definitions.h>
#include <SignalCounter.hpp> #include <SignalCounter.hpp>
...@@ -1676,16 +1677,40 @@ private: ...@@ -1676,16 +1677,40 @@ private:
ApiConnectRecordPtr tmpApiConnectptr; ApiConnectRecordPtr tmpApiConnectptr;
UintR tcheckGcpId; UintR tcheckGcpId;
UintR cconcurrentOp;
UintR cattrinfoCount; struct TransCounters {
UintR ctransCount; enum { Off, Timer, Started } c_trans_status;
UintR ccommitCount; UintR cattrinfoCount;
UintR creadCount; UintR ctransCount;
UintR ccommitCount;
UintR csimpleReadCount; UintR creadCount;
UintR cwriteCount; UintR csimpleReadCount;
UintR cabortCount; UintR cwriteCount;
UintR cabortCount;
UintR cconcurrentOp;
Uint32 c_scan_count;
Uint32 c_range_scan_count;
void reset () {
cattrinfoCount = ctransCount = ccommitCount = creadCount =
csimpleReadCount = cwriteCount = cabortCount =
c_scan_count = c_range_scan_count = 0;
}
Uint32 report(Signal* signal){
signal->theData[0] = EventReport::TransReportCounters;
signal->theData[1] = ctransCount;
signal->theData[2] = ccommitCount;
signal->theData[3] = creadCount;
signal->theData[4] = csimpleReadCount;
signal->theData[5] = cwriteCount;
signal->theData[6] = cattrinfoCount;
signal->theData[7] = cconcurrentOp;
signal->theData[8] = cabortCount;
signal->theData[9] = c_scan_count;
signal->theData[10] = c_range_scan_count;
return 11;
}
} c_counters;
Uint16 cownNodeid; Uint16 cownNodeid;
Uint16 terrorCode; Uint16 terrorCode;
......
...@@ -221,28 +221,14 @@ void Dbtc::execCONTINUEB(Signal* signal) ...@@ -221,28 +221,14 @@ void Dbtc::execCONTINUEB(Signal* signal)
/* -------------------------------------------------------------------- */ /* -------------------------------------------------------------------- */
// Report information about transaction activity once per second. // Report information about transaction activity once per second.
/* -------------------------------------------------------------------- */ /* -------------------------------------------------------------------- */
if (signal->theData[1] == 0) { if (c_counters.c_trans_status == TransCounters::Timer){
signal->theData[0] = EventReport::TransReportCounters; Uint32 len = c_counters.report(signal);
signal->theData[1] = ctransCount; sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, len, JBB);
signal->theData[2] = ccommitCount;
signal->theData[3] = creadCount; c_counters.reset();
signal->theData[4] = csimpleReadCount; signal->theData[0] = TcContinueB::ZTRANS_EVENT_REP;
signal->theData[5] = cwriteCount; sendSignalWithDelay(cownref, GSN_CONTINUEB, signal, 5000, 1);
signal->theData[6] = cattrinfoCount; }
signal->theData[7] = cconcurrentOp;
signal->theData[8] = cabortCount;
sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 9, JBB);
}//if
ctransCount = 0;
ccommitCount = 0;
creadCount = 0;
csimpleReadCount = 0;
cwriteCount = 0;
cattrinfoCount = 0;
cabortCount = 0;
signal->theData[0] = TcContinueB::ZTRANS_EVENT_REP;
signal->theData[1] = 0;
sendSignalWithDelay(cownref, GSN_CONTINUEB, signal, 5000, 2);
return; return;
case TcContinueB::ZCONTINUE_TIME_OUT_FRAG_CONTROL: case TcContinueB::ZCONTINUE_TIME_OUT_FRAG_CONTROL:
jam(); jam();
...@@ -693,9 +679,10 @@ void Dbtc::execNDB_STTOR(Signal* signal) ...@@ -693,9 +679,10 @@ void Dbtc::execNDB_STTOR(Signal* signal)
jam(); jam();
intstartphase3x010Lab(signal); /* SEIZE CONNECT RECORD IN EACH LQH*/ intstartphase3x010Lab(signal); /* SEIZE CONNECT RECORD IN EACH LQH*/
// Start transaction event reporting. // Start transaction event reporting.
c_counters.c_trans_status = TransCounters::Timer;
c_counters.reset();
signal->theData[0] = TcContinueB::ZTRANS_EVENT_REP; signal->theData[0] = TcContinueB::ZTRANS_EVENT_REP;
signal->theData[1] = 1; sendSignalWithDelay(cownref, GSN_CONTINUEB, signal, 10, 1);
sendSignalWithDelay(cownref, GSN_CONTINUEB, signal, 10, 2);
return; return;
case ZINTSPH6: case ZINTSPH6:
jam(); jam();
...@@ -2245,7 +2232,7 @@ void Dbtc::initApiConnectRec(Signal* signal, ...@@ -2245,7 +2232,7 @@ void Dbtc::initApiConnectRec(Signal* signal,
{ {
const TcKeyReq * const tcKeyReq = (TcKeyReq *)&signal->theData[0]; const TcKeyReq * const tcKeyReq = (TcKeyReq *)&signal->theData[0];
UintR TfailureNr = cfailure_nr; UintR TfailureNr = cfailure_nr;
UintR TtransCount = ctransCount; UintR TtransCount = c_counters.ctransCount;
UintR Ttransid0 = tcKeyReq->transId1; UintR Ttransid0 = tcKeyReq->transId1;
UintR Ttransid1 = tcKeyReq->transId2; UintR Ttransid1 = tcKeyReq->transId2;
...@@ -2273,7 +2260,7 @@ void Dbtc::initApiConnectRec(Signal* signal, ...@@ -2273,7 +2260,7 @@ void Dbtc::initApiConnectRec(Signal* signal,
if(releaseIndexOperations) if(releaseIndexOperations)
releaseAllSeizedIndexOperations(regApiPtr); releaseAllSeizedIndexOperations(regApiPtr);
ctransCount = TtransCount + 1; c_counters.ctransCount = TtransCount + 1;
}//Dbtc::initApiConnectRec() }//Dbtc::initApiConnectRec()
int int
...@@ -2298,7 +2285,7 @@ Dbtc::seizeTcRecord(Signal* signal) ...@@ -2298,7 +2285,7 @@ Dbtc::seizeTcRecord(Signal* signal)
TcConnectRecord * const regTcPtr = TcConnectRecord * const regTcPtr =
&localTcConnectRecord[TfirstfreeTcConnect]; &localTcConnectRecord[TfirstfreeTcConnect];
UintR TconcurrentOp = cconcurrentOp; UintR TconcurrentOp = c_counters.cconcurrentOp;
UintR TlastTcConnect = regApiPtr->lastTcConnect; UintR TlastTcConnect = regApiPtr->lastTcConnect;
UintR TtcConnectptrIndex = tcConnectptr.i; UintR TtcConnectptrIndex = tcConnectptr.i;
TcConnectRecordPtr tmpTcConnectptr; TcConnectRecordPtr tmpTcConnectptr;
...@@ -2306,7 +2293,7 @@ Dbtc::seizeTcRecord(Signal* signal) ...@@ -2306,7 +2293,7 @@ Dbtc::seizeTcRecord(Signal* signal)
cfirstfreeTcConnect = regTcPtr->nextTcConnect; cfirstfreeTcConnect = regTcPtr->nextTcConnect;
tcConnectptr.p = regTcPtr; tcConnectptr.p = regTcPtr;
cconcurrentOp = TconcurrentOp + 1; c_counters.cconcurrentOp = TconcurrentOp + 1;
regTcPtr->prevTcConnect = TlastTcConnect; regTcPtr->prevTcConnect = TlastTcConnect;
regTcPtr->nextTcConnect = RNIL; regTcPtr->nextTcConnect = RNIL;
regTcPtr->accumulatingTriggerData.i = RNIL; regTcPtr->accumulatingTriggerData.i = RNIL;
...@@ -2576,7 +2563,7 @@ void Dbtc::execTCKEYREQ(Signal* signal) ...@@ -2576,7 +2563,7 @@ void Dbtc::execTCKEYREQ(Signal* signal)
UintR TapiConnectptrIndex = apiConnectptr.i; UintR TapiConnectptrIndex = apiConnectptr.i;
UintR TsenderData = tcKeyReq->senderData; UintR TsenderData = tcKeyReq->senderData;
UintR TattrLen = tcKeyReq->getAttrinfoLen(tcKeyReq->attrLen); UintR TattrLen = tcKeyReq->getAttrinfoLen(tcKeyReq->attrLen);
UintR TattrinfoCount = cattrinfoCount; UintR TattrinfoCount = c_counters.cattrinfoCount;
regTcPtr->apiConnect = TapiConnectptrIndex; regTcPtr->apiConnect = TapiConnectptrIndex;
regTcPtr->clientData = TsenderData; regTcPtr->clientData = TsenderData;
...@@ -2597,7 +2584,7 @@ void Dbtc::execTCKEYREQ(Signal* signal) ...@@ -2597,7 +2584,7 @@ void Dbtc::execTCKEYREQ(Signal* signal)
} }
regCachePtr->attrlength = TattrLen; regCachePtr->attrlength = TattrLen;
cattrinfoCount = TattrinfoCount + TattrLen; c_counters.cattrinfoCount = TattrinfoCount + TattrLen;
UintR TtabptrIndex = localTabptr.i; UintR TtabptrIndex = localTabptr.i;
UintR TtableSchemaVersion = tcKeyReq->tableSchemaVersion; UintR TtableSchemaVersion = tcKeyReq->tableSchemaVersion;
...@@ -2689,17 +2676,17 @@ void Dbtc::execTCKEYREQ(Signal* signal) ...@@ -2689,17 +2676,17 @@ void Dbtc::execTCKEYREQ(Signal* signal)
regCachePtr->attrinfo15[3] = Tdata5; regCachePtr->attrinfo15[3] = Tdata5;
if (TOperationType == ZREAD) { if (TOperationType == ZREAD) {
Uint8 TreadCount = creadCount; Uint32 TreadCount = c_counters.creadCount;
jam(); jam();
regCachePtr->opLock = 0; regCachePtr->opLock = 0;
creadCount = TreadCount + 1; c_counters.creadCount = TreadCount + 1;
} else if(TOperationType == ZREAD_EX){ } else if(TOperationType == ZREAD_EX){
Uint8 TreadCount = creadCount; Uint32 TreadCount = c_counters.creadCount;
jam(); jam();
TOperationType = ZREAD; TOperationType = ZREAD;
regTcPtr->operation = ZREAD; regTcPtr->operation = ZREAD;
regCachePtr->opLock = ZUPDATE; regCachePtr->opLock = ZUPDATE;
creadCount = TreadCount + 1; c_counters.creadCount = TreadCount + 1;
} else { } else {
if(regApiPtr->commitAckMarker == RNIL){ if(regApiPtr->commitAckMarker == RNIL){
jam(); jam();
...@@ -2720,7 +2707,7 @@ void Dbtc::execTCKEYREQ(Signal* signal) ...@@ -2720,7 +2707,7 @@ void Dbtc::execTCKEYREQ(Signal* signal)
} }
UintR Tattrlength = regCachePtr->attrlength; UintR Tattrlength = regCachePtr->attrlength;
UintR TwriteCount = cwriteCount; UintR TwriteCount = c_counters.cwriteCount;
UintR Toperationsize = coperationsize; UintR Toperationsize = coperationsize;
/* -------------------------------------------------------------------- /* --------------------------------------------------------------------
* THIS IS A TEMPORARY TABLE, DON'T UPDATE coperationsize. * THIS IS A TEMPORARY TABLE, DON'T UPDATE coperationsize.
...@@ -2730,7 +2717,7 @@ void Dbtc::execTCKEYREQ(Signal* signal) ...@@ -2730,7 +2717,7 @@ void Dbtc::execTCKEYREQ(Signal* signal)
if (localTabptr.p->storedTable) { if (localTabptr.p->storedTable) {
coperationsize = ((Toperationsize + Tattrlength) + TkeyLength) + 17; coperationsize = ((Toperationsize + Tattrlength) + TkeyLength) + 17;
} }
cwriteCount = TwriteCount + 1; c_counters.cwriteCount = TwriteCount + 1;
switch (TOperationType) { switch (TOperationType) {
case ZUPDATE: case ZUPDATE:
jam(); jam();
...@@ -3312,10 +3299,10 @@ void Dbtc::releaseSimpleRead(Signal* signal) ...@@ -3312,10 +3299,10 @@ void Dbtc::releaseSimpleRead(Signal* signal)
* Therefore decrese no LQHKEYCONF(REF) we are waiting for * Therefore decrese no LQHKEYCONF(REF) we are waiting for
*/ */
ApiConnectRecord * const regApiPtr = apiConnectptr.p; ApiConnectRecord * const regApiPtr = apiConnectptr.p;
UintR TsimpleReadCount = csimpleReadCount; UintR TsimpleReadCount = c_counters.csimpleReadCount;
UintR Tlqhkeyreqrec = regApiPtr->lqhkeyreqrec; UintR Tlqhkeyreqrec = regApiPtr->lqhkeyreqrec;
csimpleReadCount = TsimpleReadCount + 1; c_counters.csimpleReadCount = TsimpleReadCount + 1;
regApiPtr->lqhkeyreqrec = Tlqhkeyreqrec - 1; regApiPtr->lqhkeyreqrec = Tlqhkeyreqrec - 1;
/** /**
...@@ -3373,7 +3360,7 @@ void Dbtc::releaseTcCon() ...@@ -3373,7 +3360,7 @@ void Dbtc::releaseTcCon()
{ {
TcConnectRecord * const regTcPtr = tcConnectptr.p; TcConnectRecord * const regTcPtr = tcConnectptr.p;
UintR TfirstfreeTcConnect = cfirstfreeTcConnect; UintR TfirstfreeTcConnect = cfirstfreeTcConnect;
UintR TconcurrentOp = cconcurrentOp; UintR TconcurrentOp = c_counters.cconcurrentOp;
UintR TtcConnectptrIndex = tcConnectptr.i; UintR TtcConnectptrIndex = tcConnectptr.i;
regTcPtr->tcConnectstate = OS_CONNECTED; regTcPtr->tcConnectstate = OS_CONNECTED;
...@@ -3382,7 +3369,7 @@ void Dbtc::releaseTcCon() ...@@ -3382,7 +3369,7 @@ void Dbtc::releaseTcCon()
regTcPtr->isIndexOp = false; regTcPtr->isIndexOp = false;
regTcPtr->indexOp = RNIL; regTcPtr->indexOp = RNIL;
cfirstfreeTcConnect = TtcConnectptrIndex; cfirstfreeTcConnect = TtcConnectptrIndex;
cconcurrentOp = TconcurrentOp - 1; c_counters.cconcurrentOp = TconcurrentOp - 1;
}//Dbtc::releaseTcCon() }//Dbtc::releaseTcCon()
void Dbtc::execPACKED_SIGNAL(Signal* signal) void Dbtc::execPACKED_SIGNAL(Signal* signal)
...@@ -4466,7 +4453,7 @@ void Dbtc::sendApiCommit(Signal* signal) ...@@ -4466,7 +4453,7 @@ void Dbtc::sendApiCommit(Signal* signal)
return; return;
}//if }//if
UintR TapiConnectFilesize = capiConnectFilesize; UintR TapiConnectFilesize = capiConnectFilesize;
UintR TcommitCount = ccommitCount; UintR TcommitCount = c_counters.ccommitCount;
UintR TapiIndex = apiConnectptr.i; UintR TapiIndex = apiConnectptr.i;
UintR TnewApiIndex = regApiPtr->apiCopyRecord; UintR TnewApiIndex = regApiPtr->apiCopyRecord;
UintR TapiFailState = regApiPtr->apiFailState; UintR TapiFailState = regApiPtr->apiFailState;
...@@ -4474,7 +4461,7 @@ void Dbtc::sendApiCommit(Signal* signal) ...@@ -4474,7 +4461,7 @@ void Dbtc::sendApiCommit(Signal* signal)
tmpApiConnectptr.p = apiConnectptr.p; tmpApiConnectptr.p = apiConnectptr.p;
tmpApiConnectptr.i = TapiIndex; tmpApiConnectptr.i = TapiIndex;
ccommitCount = TcommitCount + 1; c_counters.ccommitCount = TcommitCount + 1;
apiConnectptr.i = TnewApiIndex; apiConnectptr.i = TnewApiIndex;
ptrCheckGuard(apiConnectptr, TapiConnectFilesize, localApiConnectRecord); ptrCheckGuard(apiConnectptr, TapiConnectFilesize, localApiConnectRecord);
copyApi(signal); copyApi(signal);
...@@ -8597,6 +8584,10 @@ void Dbtc::initScanrec(ScanRecordPtr scanptr, ...@@ -8597,6 +8584,10 @@ void Dbtc::initScanrec(ScanRecordPtr scanptr,
ptr.p->scanFragConcurrency = noOprecPerFrag; ptr.p->scanFragConcurrency = noOprecPerFrag;
ptr.p->m_apiPtr = cdata[i]; ptr.p->m_apiPtr = cdata[i];
}//for }//for
(* (scanptr.p->rangeScan ?
&c_counters.c_range_scan_count :
&c_counters.c_scan_count))++;
}//Dbtc::initScanrec() }//Dbtc::initScanrec()
void Dbtc::scanTabRefLab(Signal* signal, Uint32 errCode) void Dbtc::scanTabRefLab(Signal* signal, Uint32 errCode)
...@@ -9213,6 +9204,7 @@ void Dbtc::execSCAN_NEXTREQ(Signal* signal) ...@@ -9213,6 +9204,7 @@ void Dbtc::execSCAN_NEXTREQ(Signal* signal)
* We will send a SCAN_TABREF to indicate a time-out occurred. * We will send a SCAN_TABREF to indicate a time-out occurred.
*********************************************************************/ *********************************************************************/
DEBUG("scanTabRefLab: ZSCANTIME_OUT_ERROR2"); DEBUG("scanTabRefLab: ZSCANTIME_OUT_ERROR2");
ndbout_c("apiConnectptr(%d) -> abort", apiConnectptr.i);
ndbrequire(false); //B2 indication of strange things going on ndbrequire(false); //B2 indication of strange things going on
scanTabRefLab(signal, ZSCANTIME_OUT_ERROR2); scanTabRefLab(signal, ZSCANTIME_OUT_ERROR2);
return; return;
...@@ -9882,7 +9874,7 @@ void Dbtc::initialiseTcConnect(Signal* signal) ...@@ -9882,7 +9874,7 @@ void Dbtc::initialiseTcConnect(Signal* signal)
ptrAss(tcConnectptr, tcConnectRecord); ptrAss(tcConnectptr, tcConnectRecord);
tcConnectptr.p->nextTcConnect = RNIL; tcConnectptr.p->nextTcConnect = RNIL;
cfirstfreeTcConnect = titcTmp; cfirstfreeTcConnect = titcTmp;
cconcurrentOp = 0; c_counters.cconcurrentOp = 0;
}//Dbtc::initialiseTcConnect() }//Dbtc::initialiseTcConnect()
/* ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */
...@@ -9953,7 +9945,7 @@ void Dbtc::releaseAbortResources(Signal* signal) ...@@ -9953,7 +9945,7 @@ void Dbtc::releaseAbortResources(Signal* signal)
{ {
TcConnectRecordPtr rarTcConnectptr; TcConnectRecordPtr rarTcConnectptr;
cabortCount++; c_counters.cabortCount++;
if (apiConnectptr.p->cachePtr != RNIL) { if (apiConnectptr.p->cachePtr != RNIL) {
cachePtr.i = apiConnectptr.p->cachePtr; cachePtr.i = apiConnectptr.p->cachePtr;
ptrCheckGuard(cachePtr, ccacheFilesize, cacheRecord); ptrCheckGuard(cachePtr, ccacheFilesize, cacheRecord);
...@@ -10127,7 +10119,7 @@ void Dbtc::seizeTcConnect(Signal* signal) ...@@ -10127,7 +10119,7 @@ void Dbtc::seizeTcConnect(Signal* signal)
tcConnectptr.i = cfirstfreeTcConnect; tcConnectptr.i = cfirstfreeTcConnect;
ptrCheckGuard(tcConnectptr, ctcConnectFilesize, tcConnectRecord); ptrCheckGuard(tcConnectptr, ctcConnectFilesize, tcConnectRecord);
cfirstfreeTcConnect = tcConnectptr.p->nextTcConnect; cfirstfreeTcConnect = tcConnectptr.p->nextTcConnect;
cconcurrentOp++; c_counters.cconcurrentOp++;
tcConnectptr.p->isIndexOp = false; tcConnectptr.p->isIndexOp = false;
}//Dbtc::seizeTcConnect() }//Dbtc::seizeTcConnect()
...@@ -10539,6 +10531,25 @@ Dbtc::execDUMP_STATE_ORD(Signal* signal) ...@@ -10539,6 +10531,25 @@ Dbtc::execDUMP_STATE_ORD(Signal* signal)
set_appl_timeout_value(signal->theData[1]); set_appl_timeout_value(signal->theData[1]);
} }
} }
if (dumpState->args[0] == DumpStateOrd::StartTcTimer){
c_counters.c_trans_status = TransCounters::Started;
c_counters.reset();
}
if (dumpState->args[0] == DumpStateOrd::StopTcTimer){
c_counters.c_trans_status = TransCounters::Off;
Uint32 len = c_counters.report(signal);
sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, len, JBB);
c_counters.reset();
}
if (dumpState->args[0] == DumpStateOrd::StartPeriodicTcTimer){
c_counters.c_trans_status = TransCounters::Timer;
c_counters.reset();
signal->theData[0] = TcContinueB::ZTRANS_EVENT_REP;
sendSignalWithDelay(cownref, GSN_CONTINUEB, signal, 5000, 1);
}
}//Dbtc::execDUMP_STATE_ORD() }//Dbtc::execDUMP_STATE_ORD()
void Dbtc::execSET_VAR_REQ(Signal* signal) void Dbtc::execSET_VAR_REQ(Signal* signal)
......
...@@ -957,7 +957,7 @@ MgmtSrvr::restart(bool nostart, bool initalStart, bool abort, ...@@ -957,7 +957,7 @@ MgmtSrvr::restart(bool nostart, bool initalStart, bool abort,
while(getNextNodeId(&nodeId, NDB_MGM_NODE_TYPE_NDB) && nodes.get(nodeId)) { while(getNextNodeId(&nodeId, NDB_MGM_NODE_TYPE_NDB) && nodes.get(nodeId)) {
enum ndb_mgm_node_status s; enum ndb_mgm_node_status s;
s = NDB_MGM_NODE_STATUS_NO_CONTACT; s = NDB_MGM_NODE_STATUS_NO_CONTACT;
while (s == NDB_MGM_NODE_STATUS_NO_CONTACT && waitTime > 0) { while (s != NDB_MGM_NODE_STATUS_NOT_STARTED && waitTime > 0) {
Uint32 startPhase = 0, version = 0, dynamicId = 0, nodeGroup = 0; Uint32 startPhase = 0, version = 0, dynamicId = 0, nodeGroup = 0;
Uint32 connectCount = 0; Uint32 connectCount = 0;
bool system; bool system;
......
...@@ -41,152 +41,155 @@ main(void){ ...@@ -41,152 +41,155 @@ main(void){
require(g_ndb.waitUntilReady() == 0); require(g_ndb.waitUntilReady() == 0);
g_trans = g_ndb.startTransaction(); while(true){
require(g_trans); g_trans = g_ndb.startTransaction();
require(g_trans);
size_t i, j; size_t i, j;
const size_t cnt = sizeof(g_scans)/sizeof(g_scans[0]); const size_t cnt = sizeof(g_scans)/sizeof(g_scans[0]);
start = NdbTick_CurrentMillisecond(); start = NdbTick_CurrentMillisecond();
for(i = 0; i<cnt; i++){ for(i = 0; i<cnt; i++){
ndbout_c("starting scan on: %s %s", ndbout_c("starting scan on: %s %s",
g_scans[i].m_table, g_scans[i].m_index); g_scans[i].m_table, g_scans[i].m_index);
g_scans[i].m_scan = g_trans->getNdbIndexScanOperation(g_scans[i].m_index, g_scans[i].m_scan = g_trans->getNdbIndexScanOperation(g_scans[i].m_index,
g_scans[i].m_table); g_scans[i].m_table);
NdbIndexScanOperation* scan = g_scans[i].m_scan; NdbIndexScanOperation* scan = g_scans[i].m_scan;
require(scan); require(scan);
g_scans[i].m_result = scan->readTuples(NdbScanOperation::LM_CommittedRead, g_scans[i].m_result = scan->readTuples(NdbScanOperation::LM_CommittedRead,
0, 0, true); 0, 0, true);
require(g_scans[i].m_result); require(g_scans[i].m_result);
} }
require(!g_scans[0].m_scan->setBound((Uint32)0, require(!g_scans[0].m_scan->setBound((Uint32)0,
NdbIndexScanOperation::BoundEQ, NdbIndexScanOperation::BoundEQ,
&g_affiliateid, &g_affiliateid,
sizeof(g_affiliateid))); sizeof(g_affiliateid)));
#if 0 #if 0
require(!g_scans[1].m_scan->setBound((Uint32)0, require(!g_scans[1].m_scan->setBound((Uint32)0,
NdbIndexScanOperation::BoundLE, NdbIndexScanOperation::BoundLE,
&g_formatids[0], &g_formatids[0],
sizeof(g_formatids[0]))); sizeof(g_formatids[0])));
#endif #endif
NdbScanFilter sf(g_scans[1].m_scan); NdbScanFilter sf(g_scans[1].m_scan);
sf.begin(NdbScanFilter::OR); sf.begin(NdbScanFilter::OR);
sf.eq(2, g_formatids[0]); sf.eq(2, g_formatids[0]);
sf.eq(2, g_formatids[1]); sf.eq(2, g_formatids[1]);
sf.eq(2, g_formatids[2]); sf.eq(2, g_formatids[2]);
sf.end(); sf.end();
// affiliatestometa // affiliatestometa
require(g_scans[0].m_scan->getValue("uniquekey")); require(g_scans[0].m_scan->getValue("uniquekey"));
require(g_scans[0].m_scan->getValue("xml")); require(g_scans[0].m_scan->getValue("xml"));
// media // media
require(g_scans[1].m_scan->getValue("path")); require(g_scans[1].m_scan->getValue("path"));
require(g_scans[1].m_scan->getValue("mediaid")); require(g_scans[1].m_scan->getValue("mediaid"));
require(g_scans[1].m_scan->getValue("formatid")); require(g_scans[1].m_scan->getValue("formatid"));
// meta // meta
require(g_scans[2].m_scan->getValue("name")); require(g_scans[2].m_scan->getValue("name"));
require(g_scans[2].m_scan->getValue("xml")); require(g_scans[2].m_scan->getValue("xml"));
// artiststometamap // artiststometamap
require(g_scans[3].m_scan->getValue("artistid", (char*)&g_artistid)); require(g_scans[3].m_scan->getValue("artistid", (char*)&g_artistid));
// subgenrestometamap // subgenrestometamap
require(g_scans[4].m_scan->getValue("subgenreid", (char*)&g_subgenreid)); require(g_scans[4].m_scan->getValue("subgenreid", (char*)&g_subgenreid));
for(i = 0; i<cnt; i++){ for(i = 0; i<cnt; i++){
g_scans[i].m_scan->getValue("metaid", (char*)&g_scans[i].metaid); g_scans[i].m_scan->getValue("metaid", (char*)&g_scans[i].metaid);
} }
g_trans->execute(NoCommit, AbortOnError, 1); g_trans->execute(NoCommit, AbortOnError, 1);
Uint32 max_val = 0; Uint32 max_val = 0;
Uint32 match_val = 0; Uint32 match_val = 0;
S_Scan * F [5], * Q [5], * nextF [5]; S_Scan * F [5], * Q [5], * nextF [5];
Uint32 F_sz = 0, Q_sz = 0; Uint32 F_sz = 0, Q_sz = 0;
for(i = 0; i<cnt; i++){ for(i = 0; i<cnt; i++){
F_sz++; F_sz++;
F[i] = &g_scans[i]; F[i] = &g_scans[i];
} }
Uint32 match_count = 0; Uint32 match_count = 0;
while(F_sz > 0){ while(F_sz > 0){
Uint32 prev_F_sz = F_sz; Uint32 prev_F_sz = F_sz;
F_sz = 0; F_sz = 0;
bool found = false; bool found = false;
//for(i = 0; i<cnt; i++) //for(i = 0; i<cnt; i++)
//ndbout_c("%s - %d", g_scans[i].m_table, g_scans[i].metaid); //ndbout_c("%s - %d", g_scans[i].m_table, g_scans[i].metaid);
for(i = 0; i<prev_F_sz; i++){ for(i = 0; i<prev_F_sz; i++){
int res = F[i]->m_result->nextResult(); int res = F[i]->m_result->nextResult();
if(res == -1) if(res == -1)
abort(); abort();
if(res == 1){ if(res == 1){
continue; continue;
} }
Uint32 metaid = F[i]->metaid; Uint32 metaid = F[i]->metaid;
F[i]->row_count++; F[i]->row_count++;
if(metaid == match_val){ if(metaid == match_val){
//ndbout_c("flera"); //ndbout_c("flera");
nextF[F_sz++] = F[i]; nextF[F_sz++] = F[i];
require(F_sz >= 0 && F_sz <= cnt); require(F_sz >= 0 && F_sz <= cnt);
F[i]->match_count++; F[i]->match_count++;
Uint32 comb = 1; Uint32 comb = 1;
for(j = 0; j<cnt; j++){ for(j = 0; j<cnt; j++){
comb *= (&g_scans[j] == F[i] ? 1 : g_scans[j].match_count); comb *= (&g_scans[j] == F[i] ? 1 : g_scans[j].match_count);
}
match_count += comb;
found = true;
continue;
} }
match_count += comb; if(metaid < max_val){
found = true; nextF[F_sz++] = F[i];
continue; require(F_sz >= 0 && F_sz <= cnt);
} continue;
if(metaid < max_val){ }
nextF[F_sz++] = F[i]; if(metaid > max_val){
require(F_sz >= 0 && F_sz <= cnt); for(j = 0; j<Q_sz; j++)
continue; nextF[F_sz++] = Q[j];
require(F_sz >= 0 && F_sz <= cnt);
Q_sz = 0;
max_val = metaid;
}
Q[Q_sz++] = F[i];
require(Q_sz >= 0 && Q_sz <= cnt);
} }
if(metaid > max_val){ if(F_sz == 0 && Q_sz > 0){
for(j = 0; j<Q_sz; j++) match_val = max_val;
for(j = 0; j<Q_sz; j++){
nextF[F_sz++] = Q[j]; nextF[F_sz++] = Q[j];
Q[j]->match_count = 1;
}
require(F_sz >= 0 && F_sz <= cnt); require(F_sz >= 0 && F_sz <= cnt);
require(Q_sz >= 0 && Q_sz <= cnt);
Q_sz = 0; Q_sz = 0;
max_val = metaid; match_count++;
} lookup();
Q[Q_sz++] = F[i]; } else if(!found && F_sz + Q_sz < cnt){
require(Q_sz >= 0 && Q_sz <= cnt); F_sz = 0;
}
if(F_sz == 0 && Q_sz > 0){
match_val = max_val;
for(j = 0; j<Q_sz; j++){
nextF[F_sz++] = Q[j];
Q[j]->match_count = 1;
} }
require(F_sz >= 0 && F_sz <= cnt); require(F_sz >= 0 && F_sz <= cnt);
require(Q_sz >= 0 && Q_sz <= cnt); for(i = 0; i<F_sz; i++)
Q_sz = 0; F[i] = nextF[i];
match_count++;
lookup();
} else if(!found && F_sz + Q_sz < cnt){
F_sz = 0;
} }
require(F_sz >= 0 && F_sz <= cnt);
for(i = 0; i<F_sz; i++)
F[i] = nextF[i];
}
start = NdbTick_CurrentMillisecond() - start; start = NdbTick_CurrentMillisecond() - start;
ndbout_c("Elapsed: %lldms", start); ndbout_c("Elapsed: %lldms", start);
ndbout_c("rows: %d", match_count); ndbout_c("rows: %d", match_count);
for(i = 0; i<cnt; i++){ for(i = 0; i<cnt; i++){
ndbout_c("%s : %d", g_scans[i].m_table, g_scans[i].row_count); ndbout_c("%s : %d", g_scans[i].m_table, g_scans[i].row_count);
}
g_trans->close();
} }
} }
......
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