summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <jonas@perch.ndb.mysql.com>2006-06-01 08:50:58 +0200
committerunknown <jonas@perch.ndb.mysql.com>2006-06-01 08:50:58 +0200
commitdbbc4c7636ba604681bf6d5d4e700fd92a4210d9 (patch)
tree044af3fe849c8af5efe52038728e799d12921443
parent71c05cf93b36e27f8034be8b5dbc872124ba954a (diff)
parentdd47289b0e757527d164bb10f775f8d218a8a5a2 (diff)
downloadmariadb-git-dbbc4c7636ba604681bf6d5d4e700fd92a4210d9.tar.gz
Merge perch.ndb.mysql.com:/home/jonas/src/50-work
into perch.ndb.mysql.com:/home/jonas/src/mysql-5.0
-rw-r--r--ndb/src/kernel/blocks/ERROR_codes.txt3
-rw-r--r--ndb/src/kernel/blocks/dbdih/DbdihMain.cpp24
-rw-r--r--ndb/src/kernel/blocks/dbtc/DbtcMain.cpp8
-rw-r--r--ndb/test/ndbapi/testNodeRestart.cpp56
-rw-r--r--ndb/test/run-test/daily-basic-tests.txt4
5 files changed, 92 insertions, 3 deletions
diff --git a/ndb/src/kernel/blocks/ERROR_codes.txt b/ndb/src/kernel/blocks/ERROR_codes.txt
index 985ae933a75..f8e3d11f222 100644
--- a/ndb/src/kernel/blocks/ERROR_codes.txt
+++ b/ndb/src/kernel/blocks/ERROR_codes.txt
@@ -63,6 +63,9 @@ Delay GCP_SAVEREQ by 10 secs
7165: Delay INCL_NODE_REQ in starting node yeilding error in GCP_PREPARE
+7030: Delay in GCP_PREPARE until node has completed a node failure
+7031: Delay in GCP_PREPARE and die 3s later
+
ERROR CODES FOR TESTING NODE FAILURE, LOCAL CHECKPOINT HANDLING:
-----------------------------------------------------------------
diff --git a/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp b/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp
index c8254052a56..3ebad7f0cd2 100644
--- a/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp
+++ b/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp
@@ -5425,6 +5425,12 @@ Dbdih::checkLocalNodefailComplete(Signal* signal, Uint32 failedNodeId,
return;
}
+ if (ERROR_INSERTED(7030))
+ {
+ ndbout_c("Reenable GCP_PREPARE");
+ CLEAR_ERROR_INSERT_VALUE;
+ }
+
NFCompleteRep * const nf = (NFCompleteRep *)&signal->theData[0];
nf->blockNo = DBDIH;
nf->nodeId = cownNodeId;
@@ -7484,6 +7490,16 @@ void Dbdih::execGCP_PREPARE(Signal* signal)
{
jamEntry();
CRASH_INSERTION(7005);
+
+ if (ERROR_INSERTED(7030))
+ {
+ cgckptflag = true;
+ ndbout_c("Delayed GCP_PREPARE 5s");
+ sendSignalWithDelay(reference(), GSN_GCP_PREPARE, signal, 5000,
+ signal->getLength());
+ return;
+ }
+
Uint32 masterNodeId = signal->theData[0];
Uint32 gci = signal->theData[1];
BlockReference retRef = calcDihBlockRef(masterNodeId);
@@ -7496,6 +7512,14 @@ void Dbdih::execGCP_PREPARE(Signal* signal)
cgcpParticipantState = GCP_PARTICIPANT_PREPARE_RECEIVED;
cnewgcp = gci;
+ if (ERROR_INSERTED(7031))
+ {
+ ndbout_c("Crashing delayed in GCP_PREPARE 3s");
+ signal->theData[0] = 9999;
+ sendSignalWithDelay(CMVMI_REF, GSN_NDB_TAMPER, signal, 3000, 1);
+ return;
+ }
+
signal->theData[0] = cownNodeId;
signal->theData[1] = gci;
sendSignal(retRef, GSN_GCP_PREPARECONF, signal, 2, JBA);
diff --git a/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp b/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp
index c1475ec44cf..193e1fea08b 100644
--- a/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp
+++ b/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp
@@ -7071,18 +7071,20 @@ Dbtc::nodeFailCheckTransactions(Signal* signal,
{
jam();
Ptr<ApiConnectRecord> transPtr;
+ Uint32 TtcTimer = ctcTimer;
+ Uint32 TapplTimeout = c_appl_timeout_value;
for (transPtr.i = transPtrI; transPtr.i < capiConnectFilesize; transPtr.i++)
{
ptrCheckGuard(transPtr, capiConnectFilesize, apiConnectRecord);
if (transPtr.p->m_transaction_nodes.get(failedNodeId))
{
jam();
+
// Force timeout regardless of state
- Uint32 save = c_appl_timeout_value;
c_appl_timeout_value = 1;
- setApiConTimer(transPtr.i, 0, __LINE__);
+ setApiConTimer(transPtr.i, TtcTimer - 2, __LINE__);
timeOutFoundLab(signal, transPtr.i, ZNODEFAIL_BEFORE_COMMIT);
- c_appl_timeout_value = save;
+ c_appl_timeout_value = TapplTimeout;
}
// Send CONTINUEB to continue later
diff --git a/ndb/test/ndbapi/testNodeRestart.cpp b/ndb/test/ndbapi/testNodeRestart.cpp
index aed0b39f196..754b3edc269 100644
--- a/ndb/test/ndbapi/testNodeRestart.cpp
+++ b/ndb/test/ndbapi/testNodeRestart.cpp
@@ -868,6 +868,56 @@ runBug18612SR(NDBT_Context* ctx, NDBT_Step* step){
return NDBT_OK;
}
+int runBug20185(NDBT_Context* ctx, NDBT_Step* step){
+ int result = NDBT_OK;
+ int loops = ctx->getNumLoops();
+ int records = ctx->getNumRecords();
+ NdbRestarter restarter;
+ HugoOperations hugoOps(*ctx->getTab());
+ Ndb* pNdb = GETNDB(step);
+
+ int dump[] = { 7090, 20 } ;
+ if (restarter.dumpStateAllNodes(dump, 2))
+ return NDBT_FAILED;
+
+ NdbSleep_MilliSleep(3000);
+
+ if(hugoOps.startTransaction(pNdb) != 0)
+ return NDBT_FAILED;
+
+ if(hugoOps.pkUpdateRecord(pNdb, 1, 1) != 0)
+ return NDBT_FAILED;
+
+ if (hugoOps.execute_NoCommit(pNdb) != 0)
+ return NDBT_FAILED;
+
+ int nodeId;
+ const int node = hugoOps.getTransaction()->getConnectedNodeId();
+ do {
+ nodeId = restarter.getDbNodeId(rand() % restarter.getNumDbNodes());
+ } while (nodeId == node);
+
+ if (restarter.insertErrorInAllNodes(7030))
+ return NDBT_FAILED;
+
+ if (restarter.insertErrorInNode(nodeId, 7031))
+ return NDBT_FAILED;
+
+ NdbSleep_MilliSleep(500);
+
+ if (hugoOps.execute_Commit(pNdb) == 0)
+ return NDBT_FAILED;
+
+ NdbSleep_MilliSleep(3000);
+
+ restarter.waitClusterStarted();
+
+ if (restarter.dumpStateAllNodes(dump, 1))
+ return NDBT_FAILED;
+
+ return NDBT_OK;
+}
+
NDBT_TESTSUITE(testNodeRestart);
TESTCASE("NoLoad",
@@ -1175,6 +1225,12 @@ TESTCASE("Bug18612SR",
STEP(runBug18612SR);
FINALIZER(runClearTable);
}
+TESTCASE("Bug20185",
+ ""){
+ INITIALIZER(runLoadTable);
+ STEP(runBug20185);
+ FINALIZER(runClearTable);
+}
NDBT_TESTSUITE_END(testNodeRestart);
int main(int argc, const char** argv){
diff --git a/ndb/test/run-test/daily-basic-tests.txt b/ndb/test/run-test/daily-basic-tests.txt
index e845413c008..6077c9fb536 100644
--- a/ndb/test/run-test/daily-basic-tests.txt
+++ b/ndb/test/run-test/daily-basic-tests.txt
@@ -445,6 +445,10 @@ max-time: 1000
cmd: testNodeRestart
args: -n Bug18612SR T1
+max-time: 1000
+cmd: testNodeRestart
+args: -n Bug20185 T1
+
# OLD FLEX
max-time: 500
cmd: flexBench