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