From 540c90e40743ab4fd9967523b12290bc21151a0d Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 31 Aug 2004 22:12:08 +0200 Subject: [PATCH] Added some more options to TC timers, such as: 1) explicit start/stop timer (instead of perodical reports) 2) scan & range scan reporting --- .../kernel/signaldata/DumpStateOrd.hpp | 3 + ndb/src/kernel/blocks/dbtc/Dbtc.hpp | 43 ++++++-- ndb/src/kernel/blocks/dbtc/DbtcMain.cpp | 101 ++++++++++-------- 3 files changed, 93 insertions(+), 54 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/kernel/blocks/dbtc/Dbtc.hpp b/ndb/src/kernel/blocks/dbtc/Dbtc.hpp index d80dee5ceb9..71b5b1880e8 100644 --- a/ndb/src/kernel/blocks/dbtc/Dbtc.hpp +++ b/ndb/src/kernel/blocks/dbtc/Dbtc.hpp @@ -33,6 +33,7 @@ #include #include #include +#include #include #include @@ -1671,16 +1672,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 f765ea11823..a63491551eb 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; @@ -2688,17 +2675,17 @@ void Dbtc::execTCKEYREQ(Signal* signal) regCachePtr->attrinfo15[3] = Tdata5; if (TOperationType == ZREAD) { - Uint8 TreadCount = creadCount; + Uint8 TreadCount = c_counters.creadCount; jam(); regCachePtr->opLock = 0; - creadCount = TreadCount + 1; + c_counters.creadCount = TreadCount + 1; } else if(TOperationType == ZREAD_EX){ - Uint8 TreadCount = creadCount; + Uint8 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(); @@ -2719,7 +2706,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. @@ -2729,7 +2716,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(); @@ -3311,10 +3298,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; /** @@ -3372,7 +3359,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; @@ -3381,7 +3368,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) @@ -4465,7 +4452,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; @@ -4473,7 +4460,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); @@ -8619,6 +8606,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) @@ -9236,6 +9227,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; @@ -9902,7 +9894,7 @@ void Dbtc::initialiseTcConnect(Signal* signal) ptrAss(tcConnectptr, tcConnectRecord); tcConnectptr.p->nextTcConnect = RNIL; cfirstfreeTcConnect = titcTmp; - cconcurrentOp = 0; + c_counters.cconcurrentOp = 0; }//Dbtc::initialiseTcConnect() /* ------------------------------------------------------------------------- */ @@ -9973,7 +9965,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); @@ -10147,7 +10139,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() @@ -10559,6 +10551,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)