Bug #17325 HA Testing: Node failed takeover for failed node (Array index out of range)

wrong arrGuard, see MAX_REPLICAS+1 0n row 6457
+ changed all 4 constants to MAX_REPLICAS
+ moved some arrGuards out of loops for optim reasons
parent ce04588c
...@@ -3045,7 +3045,7 @@ void Dbtc::tckeyreq050Lab(Signal* signal) ...@@ -3045,7 +3045,7 @@ void Dbtc::tckeyreq050Lab(Signal* signal)
/* NODE IF POSSIBLE TO AVOID UNNECESSARY COMMUNICATION */ /* NODE IF POSSIBLE TO AVOID UNNECESSARY COMMUNICATION */
/* WITH SIMPLE READS. */ /* WITH SIMPLE READS. */
/*-------------------------------------------------------------*/ /*-------------------------------------------------------------*/
arrGuard(tnoOfBackup, 4); arrGuard(tnoOfBackup, MAX_REPLICAS);
UintR Tindex; UintR Tindex;
UintR TownNode = cownNodeid; UintR TownNode = cownNodeid;
for (Tindex = 1; Tindex <= tnoOfBackup; Tindex++) { for (Tindex = 1; Tindex <= tnoOfBackup; Tindex++) {
...@@ -6302,7 +6302,7 @@ void Dbtc::timeOutFoundLab(Signal* signal, Uint32 TapiConPtr) ...@@ -6302,7 +6302,7 @@ void Dbtc::timeOutFoundLab(Signal* signal, Uint32 TapiConPtr)
jam(); jam();
tcConnectptr.i = apiConnectptr.p->currentTcConnect; tcConnectptr.i = apiConnectptr.p->currentTcConnect;
ptrCheckGuard(tcConnectptr, ctcConnectFilesize, tcConnectRecord); ptrCheckGuard(tcConnectptr, ctcConnectFilesize, tcConnectRecord);
arrGuard(apiConnectptr.p->currentReplicaNo, 4); arrGuard(apiConnectptr.p->currentReplicaNo, MAX_REPLICAS);
hostptr.i = tcConnectptr.p->tcNodedata[apiConnectptr.p->currentReplicaNo]; hostptr.i = tcConnectptr.p->tcNodedata[apiConnectptr.p->currentReplicaNo];
ptrCheckGuard(hostptr, chostFilesize, hostRecord); ptrCheckGuard(hostptr, chostFilesize, hostRecord);
if (hostptr.p->hostStatus == HS_ALIVE) { if (hostptr.p->hostStatus == HS_ALIVE) {
...@@ -6328,7 +6328,7 @@ void Dbtc::timeOutFoundLab(Signal* signal, Uint32 TapiConPtr) ...@@ -6328,7 +6328,7 @@ void Dbtc::timeOutFoundLab(Signal* signal, Uint32 TapiConPtr)
jam(); jam();
tcConnectptr.i = apiConnectptr.p->currentTcConnect; tcConnectptr.i = apiConnectptr.p->currentTcConnect;
ptrCheckGuard(tcConnectptr, ctcConnectFilesize, tcConnectRecord); ptrCheckGuard(tcConnectptr, ctcConnectFilesize, tcConnectRecord);
arrGuard(apiConnectptr.p->currentReplicaNo, 4); arrGuard(apiConnectptr.p->currentReplicaNo, MAX_REPLICAS);
hostptr.i = tcConnectptr.p->tcNodedata[apiConnectptr.p->currentReplicaNo]; hostptr.i = tcConnectptr.p->tcNodedata[apiConnectptr.p->currentReplicaNo];
ptrCheckGuard(hostptr, chostFilesize, hostRecord); ptrCheckGuard(hostptr, chostFilesize, hostRecord);
if (hostptr.p->hostStatus == HS_ALIVE) { if (hostptr.p->hostStatus == HS_ALIVE) {
...@@ -6354,7 +6354,7 @@ void Dbtc::timeOutFoundLab(Signal* signal, Uint32 TapiConPtr) ...@@ -6354,7 +6354,7 @@ void Dbtc::timeOutFoundLab(Signal* signal, Uint32 TapiConPtr)
jam(); jam();
tcConnectptr.i = apiConnectptr.p->currentTcConnect; tcConnectptr.i = apiConnectptr.p->currentTcConnect;
ptrCheckGuard(tcConnectptr, ctcConnectFilesize, tcConnectRecord); ptrCheckGuard(tcConnectptr, ctcConnectFilesize, tcConnectRecord);
arrGuard(apiConnectptr.p->currentReplicaNo, 4); arrGuard(apiConnectptr.p->currentReplicaNo, MAX_REPLICAS);
hostptr.i = tcConnectptr.p->tcNodedata[apiConnectptr.p->currentReplicaNo]; hostptr.i = tcConnectptr.p->tcNodedata[apiConnectptr.p->currentReplicaNo];
ptrCheckGuard(hostptr, chostFilesize, hostRecord); ptrCheckGuard(hostptr, chostFilesize, hostRecord);
if (hostptr.p->hostStatus == HS_ALIVE) { if (hostptr.p->hostStatus == HS_ALIVE) {
...@@ -6491,7 +6491,7 @@ void Dbtc::sendAbortedAfterTimeout(Signal* signal, int Tcheck) ...@@ -6491,7 +6491,7 @@ void Dbtc::sendAbortedAfterTimeout(Signal* signal, int Tcheck)
// in time to the ABORT signal we will declare it as dead. // in time to the ABORT signal we will declare it as dead.
/*------------------------------------------------------------------*/ /*------------------------------------------------------------------*/
UintR Ti = 0; UintR Ti = 0;
arrGuard(tcConnectptr.p->noOfNodes, 4); arrGuard(tcConnectptr.p->noOfNodes, MAX_REPLICAS+1);
for (Ti = 0; Ti < tcConnectptr.p->noOfNodes; Ti++) { for (Ti = 0; Ti < tcConnectptr.p->noOfNodes; Ti++) {
jam(); jam();
if (tcConnectptr.p->tcNodedata[Ti] != 0) { if (tcConnectptr.p->tcNodedata[Ti] != 0) {
...@@ -7548,7 +7548,7 @@ void Dbtc::execABORTCONF(Signal* signal) ...@@ -7548,7 +7548,7 @@ void Dbtc::execABORTCONF(Signal* signal)
warningReport(signal, 18); warningReport(signal, 18);
return; return;
}//if }//if
arrGuard(apiConnectptr.p->currentReplicaNo, 4); arrGuard(apiConnectptr.p->currentReplicaNo, MAX_REPLICAS);
if (tcConnectptr.p->tcNodedata[apiConnectptr.p->currentReplicaNo] != if (tcConnectptr.p->tcNodedata[apiConnectptr.p->currentReplicaNo] !=
tnodeid) { tnodeid) {
warningReport(signal, 19); warningReport(signal, 19);
...@@ -7564,7 +7564,7 @@ void Dbtc::toAbortHandlingLab(Signal* signal) ...@@ -7564,7 +7564,7 @@ void Dbtc::toAbortHandlingLab(Signal* signal)
do { do {
if (tcurrentReplicaNo != (Uint8)Z8NIL) { if (tcurrentReplicaNo != (Uint8)Z8NIL) {
jam(); jam();
arrGuard(tcurrentReplicaNo, 4); arrGuard(tcurrentReplicaNo, MAX_REPLICAS);
const LqhTransConf::OperationStatus stat = const LqhTransConf::OperationStatus stat =
(LqhTransConf::OperationStatus) (LqhTransConf::OperationStatus)
tcConnectptr.p->failData[tcurrentReplicaNo]; tcConnectptr.p->failData[tcurrentReplicaNo];
...@@ -7698,7 +7698,7 @@ void Dbtc::execCOMMITCONF(Signal* signal) ...@@ -7698,7 +7698,7 @@ void Dbtc::execCOMMITCONF(Signal* signal)
warningReport(signal, 10); warningReport(signal, 10);
return; return;
}//if }//if
arrGuard(apiConnectptr.p->currentReplicaNo, 4); arrGuard(apiConnectptr.p->currentReplicaNo, MAX_REPLICAS);
if (tcConnectptr.p->tcNodedata[apiConnectptr.p->currentReplicaNo] != if (tcConnectptr.p->tcNodedata[apiConnectptr.p->currentReplicaNo] !=
tnodeid) { tnodeid) {
warningReport(signal, 11); warningReport(signal, 11);
...@@ -7718,7 +7718,7 @@ void Dbtc::toCommitHandlingLab(Signal* signal) ...@@ -7718,7 +7718,7 @@ void Dbtc::toCommitHandlingLab(Signal* signal)
do { do {
if (tcurrentReplicaNo != (Uint8)Z8NIL) { if (tcurrentReplicaNo != (Uint8)Z8NIL) {
jam(); jam();
arrGuard(tcurrentReplicaNo, 4); arrGuard(tcurrentReplicaNo, MAX_REPLICAS);
switch (tcConnectptr.p->failData[tcurrentReplicaNo]) { switch (tcConnectptr.p->failData[tcurrentReplicaNo]) {
case LqhTransConf::InvalidStatus: case LqhTransConf::InvalidStatus:
jam(); jam();
...@@ -7843,7 +7843,7 @@ void Dbtc::execCOMPLETECONF(Signal* signal) ...@@ -7843,7 +7843,7 @@ void Dbtc::execCOMPLETECONF(Signal* signal)
warningReport(signal, 14); warningReport(signal, 14);
return; return;
}//if }//if
arrGuard(apiConnectptr.p->currentReplicaNo, 4); arrGuard(apiConnectptr.p->currentReplicaNo, MAX_REPLICAS);
if (tcConnectptr.p->tcNodedata[apiConnectptr.p->currentReplicaNo] != if (tcConnectptr.p->tcNodedata[apiConnectptr.p->currentReplicaNo] !=
tnodeid) { tnodeid) {
warningReport(signal, 15); warningReport(signal, 15);
...@@ -7863,7 +7863,7 @@ void Dbtc::toCompleteHandlingLab(Signal* signal) ...@@ -7863,7 +7863,7 @@ void Dbtc::toCompleteHandlingLab(Signal* signal)
do { do {
if (tcurrentReplicaNo != (Uint8)Z8NIL) { if (tcurrentReplicaNo != (Uint8)Z8NIL) {
jam(); jam();
arrGuard(tcurrentReplicaNo, 4); arrGuard(tcurrentReplicaNo, MAX_REPLICAS);
switch (tcConnectptr.p->failData[tcurrentReplicaNo]) { switch (tcConnectptr.p->failData[tcurrentReplicaNo]) {
case LqhTransConf::InvalidStatus: case LqhTransConf::InvalidStatus:
jam(); jam();
...@@ -8152,6 +8152,7 @@ void Dbtc::setupFailData(Signal* signal) ...@@ -8152,6 +8152,7 @@ void Dbtc::setupFailData(Signal* signal)
case OS_PREPARED: case OS_PREPARED:
case OS_COMMITTING: case OS_COMMITTING:
jam(); jam();
arrGuard(tcConnectptr.p->lastReplicaNo, MAX_REPLICAS);
for (tindex = 0; tindex <= tcConnectptr.p->lastReplicaNo; tindex++) { for (tindex = 0; tindex <= tcConnectptr.p->lastReplicaNo; tindex++) {
jam(); jam();
/*------------------------------------------------------------------- /*-------------------------------------------------------------------
...@@ -8159,13 +8160,13 @@ void Dbtc::setupFailData(Signal* signal) ...@@ -8159,13 +8160,13 @@ void Dbtc::setupFailData(Signal* signal)
* IN THIS CASE ALL LQH'S ARE PREPARED AND WAITING FOR * IN THIS CASE ALL LQH'S ARE PREPARED AND WAITING FOR
* COMMIT/ABORT DECISION. * COMMIT/ABORT DECISION.
*------------------------------------------------------------------*/ *------------------------------------------------------------------*/
arrGuard(tindex, 4);
tcConnectptr.p->failData[tindex] = LqhTransConf::Prepared; tcConnectptr.p->failData[tindex] = LqhTransConf::Prepared;
}//for }//for
break; break;
case OS_COMMITTED: case OS_COMMITTED:
case OS_COMPLETING: case OS_COMPLETING:
jam(); jam();
arrGuard(tcConnectptr.p->lastReplicaNo, MAX_REPLICAS);
for (tindex = 0; tindex <= tcConnectptr.p->lastReplicaNo; tindex++) { for (tindex = 0; tindex <= tcConnectptr.p->lastReplicaNo; tindex++) {
jam(); jam();
/*------------------------------------------------------------------- /*-------------------------------------------------------------------
...@@ -8173,19 +8174,18 @@ void Dbtc::setupFailData(Signal* signal) ...@@ -8173,19 +8174,18 @@ void Dbtc::setupFailData(Signal* signal)
* IN THIS CASE ALL LQH'S ARE COMMITTED AND WAITING FOR * IN THIS CASE ALL LQH'S ARE COMMITTED AND WAITING FOR
* COMPLETE MESSAGE. * COMPLETE MESSAGE.
*------------------------------------------------------------------*/ *------------------------------------------------------------------*/
arrGuard(tindex, 4);
tcConnectptr.p->failData[tindex] = LqhTransConf::Committed; tcConnectptr.p->failData[tindex] = LqhTransConf::Committed;
}//for }//for
break; break;
case OS_COMPLETED: case OS_COMPLETED:
jam(); jam();
arrGuard(tcConnectptr.p->lastReplicaNo, MAX_REPLICAS);
for (tindex = 0; tindex <= tcConnectptr.p->lastReplicaNo; tindex++) { for (tindex = 0; tindex <= tcConnectptr.p->lastReplicaNo; tindex++) {
jam(); jam();
/*------------------------------------------------------------------- /*-------------------------------------------------------------------
* KEYDATA IS USED TO KEEP AN INDICATION OF STATE IN LQH. * KEYDATA IS USED TO KEEP AN INDICATION OF STATE IN LQH.
* IN THIS CASE ALL LQH'S ARE COMPLETED. * IN THIS CASE ALL LQH'S ARE COMPLETED.
*-------------------------------------------------------------------*/ *-------------------------------------------------------------------*/
arrGuard(tindex, 4);
tcConnectptr.p->failData[tindex] = LqhTransConf::InvalidStatus; tcConnectptr.p->failData[tindex] = LqhTransConf::InvalidStatus;
}//for }//for
break; break;
......
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