📄 ndbgrep.cpp
字号:
/* Copyright (C) 2003 MySQL AB This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */#include <signaldata/DumpStateOrd.hpp>#include <NdbGrep.hpp>#include <NdbOut.hpp>#include <NDBT_Output.hpp>#include <NdbConfig.h>#include <ConfigRetriever.hpp>#include <ndb_version.h>#include <NDBT.hpp>#include <NdbSleep.h>#include <random.h>#include <NdbTick.h>#define CHECK(b, m) { int _xx = b; if (!(_xx)) { \ ndbout << "ERR: "<< m \ << " " << "File: " << __FILE__ \ << " (Line: " << __LINE__ << ")" << "- " << _xx << endl; \ return NDBT_FAILED; } }int NdbGrep::start(){ return 1;}int NdbGrep::stop(){ return 1;}int NdbGrep::query(){ return 1;}int NdbGrep::verify(NDBT_Context * ctx){ if (!isConnected()) return -1; char cheat_table[255]; BaseString::snprintf(cheat_table, 255, "TEST_DB/def/%s",ctx->getTab()->getName()); char buf[255]; BaseString::snprintf(buf, 255, "testGrepVerify -c \"nodeid=%d;host=%s\" -t %s -r %d", 4, //cheat. Hardcoded nodeid.... ctx->getRemoteMgm(), cheat_table, ctx->getNumRecords()); ndbout << "buf: "<< buf <<endl; int res = system(buf); ndbout << "res: " << res << endl; return res; }// Master failureintNFDuringGrepM_codes[] = { 10003, 10004, 10005, 10007, 10008, 10009, 10010, 10012, 10013};// Slave failureintNFDuringGrepS_codes[] = { 10014, 10015, 10016, 10017, 10018, 10020};// Master takeover etc...intNFDuringGrepSL_codes[] = { 10001, 10002, 10021};int NdbGrep::NFMaster(NdbRestarter& _restarter){ const int sz = sizeof(NFDuringGrepM_codes)/sizeof(NFDuringGrepM_codes[0]); return NF(_restarter, NFDuringGrepM_codes, sz, true);}int NdbGrep::NFMasterAsSlave(NdbRestarter& _restarter){ const int sz = sizeof(NFDuringGrepS_codes)/sizeof(NFDuringGrepS_codes[0]); return NF(_restarter, NFDuringGrepS_codes, sz, true);}int NdbGrep::NFSlave(NdbRestarter& _restarter){ const int sz = sizeof(NFDuringGrepS_codes)/sizeof(NFDuringGrepS_codes[0]); return NF(_restarter, NFDuringGrepS_codes, sz, false);}int NdbGrep::NF(NdbRestarter& _restarter, int *NFDuringGrep_codes, const int sz, bool onMaster){ { int nodeId = _restarter.getMasterNodeId(); CHECK(_restarter.restartOneDbNode(nodeId, false, true, true) == 0, "Could not restart node "<< nodeId); CHECK(_restarter.waitNodesNoStart(&nodeId, 1) == 0, "waitNodesNoStart failed"); CHECK(_restarter.startNodes(&nodeId, 1) == 0, "failed to start node"); NdbSleep_SecSleep(10); } CHECK(_restarter.waitClusterStarted() == 0, "waitClusterStarted failed"); int nNodes = _restarter.getNumDbNodes(); myRandom48Init(NdbTick_CurrentMillisecond()); for(int i = 0; i<sz; i++){ int error = NFDuringGrep_codes[i]; unsigned int backupId; const int masterNodeId = _restarter.getMasterNodeId(); CHECK(masterNodeId > 0, "getMasterNodeId failed"); int nodeId; nodeId = masterNodeId; if (!onMaster) { int randomId; while (nodeId == masterNodeId) { randomId = myRandom48(nNodes); nodeId = _restarter.getDbNodeId(randomId); } } g_err << "NdbGrep::NF node = " << nodeId << " error code = " << error << " masterNodeId = " << masterNodeId << endl; int val = DumpStateOrd::CmvmiSetRestartOnErrorInsert; CHECK(_restarter.dumpStateOneNode(nodeId, &val, 1) == 0, "failed to set RestartOnErrorInsert"); CHECK(_restarter.insertErrorInNode(nodeId, error) == 0, "failed to set error insert"); g_info << "error inserted" << endl; g_info << "starting backup" << endl; int r = start(); g_info << "r = " << r << " (which should fail) started with id = " << backupId << endl; if (r == 0) { g_err << "Grep should have failed on error_insertion " << error << endl << "Master = " << masterNodeId << "Node = " << nodeId << endl; } CHECK(_restarter.waitNodesNoStart(&nodeId, 1) == 0, "waitNodesNoStart failed"); g_info << "number of nodes running " << _restarter.getNumDbNodes() << endl; if (_restarter.getNumDbNodes() != nNodes) { g_err << "Failure: cluster not up" << endl; return NDBT_FAILED; } NdbSleep_SecSleep(1); g_info << "starting new backup" << endl; CHECK(start() == 0, "failed to start backup"); g_info << "(which should succeed) started with id = " << backupId << endl; g_info << "starting node" << endl; CHECK(_restarter.startNodes(&nodeId, 1) == 0, "failed to start node"); CHECK(_restarter.waitClusterStarted() == 0, "waitClusterStarted failed"); g_info << "node started" << endl; CHECK(_restarter.insertErrorInNode(nodeId, 10099) == 0, "failed to set error insert"); } return NDBT_OK;}intFailS_codes[] = { 10023, 10024, 10025, 10026, 10027, 10028, 10029, 10030, 10031};intFailM_codes[] = { 10023, 10024, 10025, 10026, 10027, 10028, 10029, 10030, 10031};int NdbGrep::FailMaster(NdbRestarter& _restarter){ const int sz = sizeof(FailM_codes)/sizeof(FailM_codes[0]); return Fail(_restarter, FailM_codes, sz, true);}int NdbGrep::FailMasterAsSlave(NdbRestarter& _restarter){ const int sz = sizeof(FailS_codes)/sizeof(FailS_codes[0]); return Fail(_restarter, FailS_codes, sz, true);}int NdbGrep::FailSlave(NdbRestarter& _restarter){ const int sz = sizeof(FailS_codes)/sizeof(FailS_codes[0]); return Fail(_restarter, FailS_codes, sz, false);}int NdbGrep::Fail(NdbRestarter& _restarter, int *Fail_codes, const int sz, bool onMaster){ CHECK(_restarter.waitClusterStarted() == 0, "waitClusterStarted failed"); int nNodes = _restarter.getNumDbNodes(); myRandom48Init(NdbTick_CurrentMillisecond()); for(int i = 0; i<sz; i++){ int error = Fail_codes[i]; unsigned int backupId; const int masterNodeId = _restarter.getMasterNodeId(); CHECK(masterNodeId > 0, "getMasterNodeId failed"); int nodeId; nodeId = masterNodeId; if (!onMaster) { int randomId; while (nodeId == masterNodeId) { randomId = myRandom48(nNodes); nodeId = _restarter.getDbNodeId(randomId); } } g_err << "NdbGrep::Fail node = " << nodeId << " error code = " << error << " masterNodeId = " << masterNodeId << endl; CHECK(_restarter.insertErrorInNode(nodeId, error) == 0, "failed to set error insert"); g_info << "error inserted" << endl; g_info << "waiting some before starting backup" << endl; g_info << "starting backup" << endl; int r = start(); g_info << "r = " << r << " (which should fail) started with id = " << backupId << endl; if (r == 0) { g_err << "Grep should have failed on error_insertion " << error << endl << "Master = " << masterNodeId << "Node = " << nodeId << endl; } CHECK(_restarter.waitClusterStarted() == 0, "waitClusterStarted failed"); CHECK(_restarter.insertErrorInNode(nodeId, 10099) == 0, "failed to set error insert"); } return NDBT_OK;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -