Commit c2468249 authored by joreland@mysql.com's avatar joreland@mysql.com

Added some more options to TC timers, such as:

1) explicit start/stop timer (instead of perodical reports)
2) scan & range scan reporting
parent 36482c37
......@@ -95,6 +95,9 @@ public:
TcDumpAllApiConnectRec = 2506,
TcSetTransactionTimeout = 2507,
TcSetApplTransactionTimeout = 2508,
StartTcTimer = 2509,
StopTcTimer = 2510,
StartPeriodicTcTimer = 2511,
CmvmiDumpConnections = 2600,
CmvmiDumpLongSignalMemory = 2601,
CmvmiSetRestartOnErrorInsert = 2602,
......
......@@ -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>
......@@ -1671,16 +1672,40 @@ private:
ApiConnectRecordPtr tmpApiConnectptr;
UintR tcheckGcpId;
UintR cconcurrentOp;
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;
......
......@@ -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;
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;
signal->theData[1] = 0;
sendSignalWithDelay(cownref, GSN_CONTINUEB, signal, 5000, 2);
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)
......
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