diff --git a/storage/ndb/src/mgmsrv/MgmtSrvr.cpp b/storage/ndb/src/mgmsrv/MgmtSrvr.cpp index 53bd93395bb515c8f4d48aa366363b7c59253728..e836ef8d32aed8770834b2638f5004d75cbcd343 100644 --- a/storage/ndb/src/mgmsrv/MgmtSrvr.cpp +++ b/storage/ndb/src/mgmsrv/MgmtSrvr.cpp @@ -66,6 +66,9 @@ #define DEBUG(x) #endif +int g_errorInsert; +#define ERROR_INSERTED(x) (g_errorInsert == x) + #define INIT_SIGNAL_SENDER(ss,nodeId) \ SignalSender ss(theFacade); \ ss.lock(); /* lock will be released on exit */ \ @@ -177,6 +180,7 @@ MgmtSrvr::logLevelThreadRun() m_log_level_requests.lock(); } m_log_level_requests.unlock(); + NdbSleep_MilliSleep(_logLevelThreadSleep); } } @@ -1730,14 +1734,29 @@ MgmtSrvr::setNodeLogLevelImpl(int nodeId, const SetLogLevelOrd & ll) int MgmtSrvr::insertError(int nodeId, int errorNo) { + int block; + if (errorNo < 0) { return INVALID_ERROR_NUMBER; } - INIT_SIGNAL_SENDER(ss,nodeId); - + SignalSender ss(theFacade); + ss.lock(); /* lock will be released on exit */ + + if(getNodeType(nodeId) == NDB_MGM_NODE_TYPE_NDB) + { + block= CMVMI; + if(!theFacade->theClusterMgr->getNodeInfo(nodeId).connected + || !theFacade->get_node_alive(nodeId)) + return NO_CONTACT_WITH_PROCESS; + } + else if(getNodeType(nodeId) == NDB_MGM_NODE_TYPE_MGM) + block= _blockNumber; + else + return WRONG_PROCESS_TYPE; + SimpleSignal ssig; - ssig.set(ss,TestOrd::TraceAPI, CMVMI, GSN_TAMPER_ORD, + ssig.set(ss,TestOrd::TraceAPI, block, GSN_TAMPER_ORD, TamperOrd::SignalLength); TamperOrd* const tamperOrd = CAST_PTR(TamperOrd, ssig.getDataPtrSend()); tamperOrd->errorNo = errorNo; @@ -1972,6 +1991,10 @@ MgmtSrvr::handleReceivedSignal(NdbApiSignal* signal) case GSN_NODE_FAILREP: break; + case GSN_TAMPER_ORD: + ndbout << "TAMPER ORD" << endl; + break; + default: g_eventLogger.error("Unknown signal received. SignalNumber: " "%i from (%d, %x)", diff --git a/storage/ndb/src/mgmsrv/MgmtSrvr.hpp b/storage/ndb/src/mgmsrv/MgmtSrvr.hpp index 19804f735b4fd43428808222655d4af4c93b5dcf..a54b78660915f10ec754b62f298004003a9b5a35 100644 --- a/storage/ndb/src/mgmsrv/MgmtSrvr.hpp +++ b/storage/ndb/src/mgmsrv/MgmtSrvr.hpp @@ -38,6 +38,10 @@ */ #define MGMSRV 1 +#define MGM_ERROR_MAX_INJECT_SESSION_ONLY 10000 + +extern int g_errorInsert; + class ConfigInfoServer; class NdbApiSignal; class Config; diff --git a/storage/ndb/src/mgmsrv/Services.cpp b/storage/ndb/src/mgmsrv/Services.cpp index dc865c594c07ab6f57f39cc3af05cea8e2120aeb..e55c4ec63495ef847cdf84abadeed9bc4db3f2d9 100644 --- a/storage/ndb/src/mgmsrv/Services.cpp +++ b/storage/ndb/src/mgmsrv/Services.cpp @@ -288,6 +288,8 @@ struct PurgeStruct NDB_TICKS tick; }; +#define ERROR_INSERTED(x) (g_errorInsert == x || m_errorInsert == x) + MgmApiSession::MgmApiSession(class MgmtSrvr & mgm, NDB_SOCKET_TYPE sock, Uint64 session_id) : SocketServer::Session(sock), m_mgmsrv(mgm) { @@ -300,6 +302,7 @@ MgmApiSession::MgmApiSession(class MgmtSrvr & mgm, NDB_SOCKET_TYPE sock, Uint64 m_ctx= NULL; m_session_id= session_id; m_mutex= NdbMutex_Create(); + m_errorInsert= 0; DBUG_VOID_RETURN; } @@ -613,11 +616,22 @@ void MgmApiSession::insertError(Parser<MgmApiSession>::Context &, Properties const &args) { Uint32 node = 0, error = 0; + int result= 0; args.get("node", &node); args.get("error", &error); - int result = m_mgmsrv.insertError(node, error); + if(node==m_mgmsrv.getOwnNodeId() + && error < MGM_ERROR_MAX_INJECT_SESSION_ONLY) + { + m_errorInsert= error; + if(error==0) + g_errorInsert= error; + } + else + { + result= m_mgmsrv.insertError(node, error); + } m_output->println("insert error reply"); if(result != 0) @@ -1602,6 +1616,10 @@ void MgmApiSession::check_connection(Parser_t::Context &ctx, const class Properties &args) { + if(ERROR_INSERTED(1)) + { + NdbSleep_SecSleep(10); + } m_output->println("check connection reply"); m_output->println("result: Ok"); m_output->println(""); diff --git a/storage/ndb/src/mgmsrv/Services.hpp b/storage/ndb/src/mgmsrv/Services.hpp index c112c66da366a11765ae90d4398e858f95be620a..76f839e3aab82b9d87450d9b764183d8fd55397b 100644 --- a/storage/ndb/src/mgmsrv/Services.hpp +++ b/storage/ndb/src/mgmsrv/Services.hpp @@ -46,6 +46,8 @@ private: Parser_t::Context *m_ctx; Uint64 m_session_id; + int m_errorInsert; + const char *get_error_text(int err_no) { return m_mgmsrv.getErrorText(err_no, m_err_str, sizeof(m_err_str)); } diff --git a/storage/ndb/test/ndbapi/testMgm.cpp b/storage/ndb/test/ndbapi/testMgm.cpp index c43011654970e102c9668d7fe90d2aaf6e194c97..0c6c05a0594f0d96b499dfe77569b204ff2d668a 100644 --- a/storage/ndb/test/ndbapi/testMgm.cpp +++ b/storage/ndb/test/ndbapi/testMgm.cpp @@ -207,6 +207,53 @@ int runTestApiSession(NDBT_Context* ctx, NDBT_Step* step) } } +int runTestApiTimeout1(NDBT_Context* ctx, NDBT_Step* step) +{ + char *mgm= ctx->getRemoteMgm(); + int result= NDBT_FAILED; + int cc= 0; + + NdbMgmHandle h; + h= ndb_mgm_create_handle(); + ndb_mgm_set_connectstring(h, mgm); + ndb_mgm_connect(h,0,0,0); + + ndbout << "Connected" << endl; + + if(ndb_mgm_check_connection(h) < 0) + { + result= NDBT_FAILED; + goto done; + } + + ndbout << "Checked Connection" << endl; + + ndb_mgm_reply reply; + reply.return_code= 0; + + if(ndb_mgm_insert_error(h, 3, 1, &reply)< 0) + { + ndbout << "failed to insert error " << endl; + result= NDBT_FAILED; + goto done; + } + + ndbout << "Inserted session error" << endl; + + cc= ndb_mgm_check_connection(h); + if(cc < 0) + result= NDBT_OK; + else + result= NDBT_FAILED; + + ndbout << "Tried check connection with result: " << cc << endl; +done: + ndb_mgm_disconnect(h); + ndb_mgm_destroy_handle(&h); + + return result; +} + NDBT_TESTSUITE(testMgm); TESTCASE("SingleUserMode", @@ -218,6 +265,11 @@ TESTCASE("ApiSessionFailure", "Test failures in MGMAPI session"){ INITIALIZER(runTestApiSession); +} +TESTCASE("ApiTimeout1", + "Test timeout for MGMAPI"){ + INITIALIZER(runTestApiTimeout1); + } NDBT_TESTSUITE_END(testMgm);