18 #include <ndb_global.h>
20 #include "MgmtSrvr.hpp"
21 #include "ndb_mgmd_error.h"
22 #include "Services.hpp"
23 #include "ConfigManager.hpp"
24 #include "Defragger.hpp"
27 #include <NdbApiSignal.hpp>
28 #include <kernel_types.h>
29 #include <GlobalSignalNumbers.h>
30 #include <signaldata/TestOrd.hpp>
31 #include <signaldata/TamperOrd.hpp>
32 #include <signaldata/StartOrd.hpp>
33 #include <signaldata/ApiVersion.hpp>
34 #include <signaldata/ResumeReq.hpp>
35 #include <signaldata/SetLogLevelOrd.hpp>
36 #include <signaldata/EventSubscribeReq.hpp>
37 #include <signaldata/EventReport.hpp>
38 #include <signaldata/DumpStateOrd.hpp>
39 #include <signaldata/BackupSignalData.hpp>
40 #include <signaldata/NFCompleteRep.hpp>
41 #include <signaldata/NodeFailRep.hpp>
42 #include <signaldata/AllocNodeId.hpp>
43 #include <signaldata/SchemaTrans.hpp>
44 #include <signaldata/CreateNodegroup.hpp>
45 #include <signaldata/DropNodegroup.hpp>
46 #include <signaldata/Sync.hpp>
47 #include <signaldata/GetConfig.hpp>
49 #include <portlib/NdbDir.hpp>
50 #include <EventLogger.hpp>
51 #include <DebuggerNames.hpp>
52 #include <ndb_version.h>
54 #include <SocketServer.hpp>
55 #include <NdbConfig.h>
57 #include <NdbAutoPtr.hpp>
62 #include <mgmapi_configuration.hpp>
63 #include <mgmapi_config_parameters.h>
65 #include <SignalSender.hpp>
68 #define ERROR_INSERTED(x) (g_errorInsert == x)
70 #define INIT_SIGNAL_SENDER(ss,nodeId) \
71 SignalSender ss(theFacade); \
74 int result = okToSendTo(nodeId, true);\
80 extern "C" my_bool opt_core;
83 MgmtSrvr::logLevelThread_C(
void* m)
86 mgm->logLevelThreadRun();
94 operator<<(NdbOut& out,
const LogLevel & ll)
97 for(
size_t i = 0;
i<LogLevel::LOGLEVEL_CATEGORIES;
i++)
98 out << ll.
getLogLevel((LogLevel::EventCategory)
i) <<
" ";
105 MgmtSrvr::logLevelThreadRun()
107 while (!_isStopThread)
115 m_started_nodes.lock();
116 if (m_started_nodes.size() > 0)
122 m_event_listner.lock();
123 for(
int i = m_event_listner.m_clients.size() - 1;
i >= 0;
i--)
124 tmp.
set_max(m_event_listner[
i].m_logLevel);
125 m_event_listner.unlock();
129 while (m_started_nodes.size() > 0)
131 Uint32 node = m_started_nodes[0];
132 m_started_nodes.erase(0,
false);
133 m_started_nodes.unlock();
135 if (setEventReportingLevelImpl(node, req))
137 failed_started_nodes.push_back(node);
142 ord.assign(m_nodeLogLevel[node]);
143 setNodeLogLevelImpl(node, ord);
145 m_started_nodes.lock();
148 m_started_nodes.unlock();
150 m_log_level_requests.lock();
151 while (m_log_level_requests.size() > 0)
154 m_log_level_requests.erase(0,
false);
155 m_log_level_requests.unlock();
160 if (setEventReportingLevelImpl(0, req))
162 failed_log_level_requests.push_back(req);
169 if (setNodeLogLevelImpl(req.
blockRef, ord))
171 failed_log_level_requests.push_back(req);
174 m_log_level_requests.lock();
176 m_log_level_requests.unlock();
178 if(!ERROR_INSERTED(10000))
179 m_event_listner.check_listeners();
181 Uint32 sleeptime = _logLevelThreadSleep;
182 if (failed_started_nodes.size())
184 m_started_nodes.lock();
185 for (Uint32 i = 0; i<failed_started_nodes.size(); i++)
186 m_started_nodes.push_back(failed_started_nodes[i],
false);
187 m_started_nodes.unlock();
188 failed_started_nodes.clear();
192 if (failed_log_level_requests.size())
194 m_log_level_requests.lock();
195 for (Uint32 i = 0; i<failed_log_level_requests.size(); i++)
196 m_log_level_requests.push_back(failed_log_level_requests[i],
false);
197 m_log_level_requests.unlock();
198 failed_log_level_requests.clear();
202 NdbSleep_MilliSleep(sleeptime);
208 translateStopRef(Uint32 errCode)
211 case StopRef::NodeShutdownInProgress:
212 return NODE_SHUTDOWN_IN_PROGESS;
214 case StopRef::SystemShutdownInProgress:
215 return SYSTEM_SHUTDOWN_IN_PROGRESS;
217 case StopRef::NodeShutdownWouldCauseSystemCrash:
218 return NODE_SHUTDOWN_WOULD_CAUSE_SYSTEM_CRASH;
220 case StopRef::UnsupportedNodeShutdown:
221 return UNSUPPORTED_NODE_SHUTDOWN;
228 MgmtSrvr::MgmtSrvr(
const MgmtOpts& opts) :
233 m_local_config(NULL),
235 m_config_manager(NULL),
236 m_need_restart(false),
238 _isStopThread(false),
239 _logLevelThreadSleep(500),
240 m_event_listner(this),
242 _logLevelThread(NULL),
243 m_version_string(ndbGetOwnVersionString())
245 DBUG_ENTER(
"MgmtSrvr::MgmtSrvr");
247 m_local_config_mutex= NdbMutex_Create();
248 m_node_id_mutex = NdbMutex_Create();
249 if (!m_local_config_mutex || !m_node_id_mutex)
251 g_eventLogger->
error(
"Failed to create MgmtSrvr mutexes");
256 for(Uint32 i = 0; i<MAX_NODES; i++) {
258 m_connect_address[
i].s_addr= 0;
264 my_socket_invalidate(&(se.m_socket));
265 for(
size_t t = 0; t<LogLevel::LOGLEVEL_CATEGORIES; t++){
271 m_event_listner.m_clients.push_back(se);
287 MgmtSrvr::check_configdir()
const
289 if (m_opts.configdir &&
290 strcmp(m_opts.configdir, MYSQLCLUSTERDIR) != 0)
293 if (access(m_opts.configdir, F_OK))
295 g_eventLogger->
error(
"Directory '%s' specified with --configdir " \
296 "does not exist. Either create it or pass " \
297 "the path to an already existing directory.",
301 return m_opts.configdir;
306 if (access(MYSQLCLUSTERDIR, F_OK))
308 g_eventLogger->
info(
"The default config directory '%s' " \
309 "does not exist. Trying to create it...",
312 if (!NdbDir::create(MYSQLCLUSTERDIR) ||
313 access(MYSQLCLUSTERDIR, F_OK))
315 g_eventLogger->
error(
"Could not create directory '%s'. " \
316 "Either create it manually or " \
317 "specify a different directory with " \
318 "--configdir=<path>",
323 g_eventLogger->
info(
"Sucessfully created config directory");
325 return MYSQLCLUSTERDIR;
333 DBUG_ENTER(
"MgmtSrvr::init");
335 const char* configdir;
336 if (!(configdir= check_configdir()))
339 if (!(m_config_manager=
new ConfigManager(m_opts, configdir)))
341 g_eventLogger->
error(
"Failed to create ConfigManager");
345 if (m_config_manager->add_config_change_subscriber(
this) < 0)
347 g_eventLogger->
error(
"Failed to add MgmtSrvr as config change subscriber");
351 if (!m_config_manager->init())
357 require(m_local_config != 0);
359 if (m_opts.print_full_config)
368 NodeId nodeId= _ownNodeId;
373 error_code, error_string,
376 g_eventLogger->
error(
"INTERNAL ERROR: Could not allocate nodeid: %d, " \
378 _ownNodeId, error_code, error_string.
c_str());
382 if (nodeId != _ownNodeId)
384 g_eventLogger->
error(
"INTERNAL ERROR: Nodeid %d allocated " \
385 "when %d was requested",
397 DBUG_ENTER(
"MgmtSrvr::start_transporter");
402 g_eventLogger->
error(
"Could not create TransporterFacade.");
406 assert(_blockNumber == -1);
413 if ((res = open(theFacade)) == 0)
415 g_eventLogger->
error(
"Failed to open block in TransporterFacade");
416 theFacade->stop_instance();
421 _blockNumber = refToBlock(res);
426 m_config_manager->set_facade(theFacade);
428 if (theFacade->start_instance(_ownNodeId,
429 config->m_configValues) < 0)
431 g_eventLogger->
error(
"Failed to start transporter");
437 _ownReference = numberToRef(_blockNumber, _ownNodeId);
447 theFacade->ext_set_max_api_reg_req_interval(100);
454 MgmtSrvr::start_mgm_service(
const Config* config)
456 DBUG_ENTER(
"MgmtSrvr::start_mgm_service");
463 if(iter.find(CFG_NODE_ID, _ownNodeId) != 0){
464 g_eventLogger->
error(
"Could not find node %d in config", _ownNodeId);
469 if(iter.get(CFG_TYPE_OF_SECTION, &type) != 0 ||
470 type != NODE_TYPE_MGM){
471 g_eventLogger->
error(
"Node %d is not defined as management server",
476 if(iter.get(CFG_MGM_PORT, &m_port) != 0){
477 g_eventLogger->
error(
"PortNumber not defined for node %d", _ownNodeId);
482 unsigned short port= m_port;
483 DBUG_PRINT(
"info", (
"Using port %d", port));
486 g_eventLogger->
error(
"Could not find out which port to use"\
487 " for management service");
493 while(!m_socket_server.tryBind(port, m_opts.bind_address))
497 NdbSleep_SecSleep(1);
500 g_eventLogger->
error(
"Unable to bind management service port: %s:%d!\n"
501 "Please check if the port is already used,\n"
502 "(perhaps a ndb_mgmd is already running),\n"
503 "and if you are executing on the correct computer",
504 (m_opts.bind_address ? m_opts.bind_address :
"*"),
514 g_eventLogger->
error(
"Could not allocate MgmApiService");
518 if(!m_socket_server.setup(mapi, &port, m_opts.bind_address))
521 g_eventLogger->
error(
"Unable to setup management service port: %s:%d!\n"
522 "Please check if the port is already used,\n"
523 "(perhaps a ndb_mgmd is already running),\n"
524 "and if you are executing on the correct computer",
525 (m_opts.bind_address ? m_opts.bind_address :
"*"),
532 g_eventLogger->
error(
"Couldn't start management service on the "\
533 "requested port: %d. Got port: %d instead",
539 m_socket_server.startServer();
541 g_eventLogger->
info(
"Id: %d, Command port: %s:%d",
543 m_opts.bind_address ? m_opts.bind_address :
"*",
552 DBUG_ENTER(
"MgmtSrvr::start");
554 Guard g(m_local_config_mutex);
557 if(!start_transporter(m_local_config))
559 g_eventLogger->
error(
"Failed to start transporter!");
564 if (!start_mgm_service(m_local_config))
566 g_eventLogger->
error(
"Failed to start mangement service!");
571 if(!connect_to_self())
573 g_eventLogger->
error(
"Failed to connect to ourself!");
578 if (!m_config_manager->start())
580 g_eventLogger->
error(
"Failed to start ConfigManager");
585 assert(_isStopThread ==
false);
586 _logLevelThread = NdbThread_Create(logLevelThread_C,
590 NDB_THREAD_PRIO_LOW);
597 MgmtSrvr::setClusterLog(
const Config* config)
599 DBUG_ASSERT(_ownNodeId);
602 require(iter.find(CFG_NODE_ID, _ownNodeId) == 0);
606 require(iter.get(CFG_NODE_DATADIR, &datadir) == 0);
607 NdbConfig_SetPath(datadir);
609 if (NdbDir::chdir(NdbConfig_get_path(NULL)) != 0)
611 g_eventLogger->
warning(
"Cannot change directory to '%s', error: %d",
612 NdbConfig_get_path(NULL), errno);
619 if(iter.get(CFG_LOG_DESTINATION, &value) == 0){
623 bool logdest_configured =
true;
624 if(logdest.
length() == 0 || logdest ==
"") {
626 char *clusterLog= NdbConfig_ClusterLogFileName(_ownNodeId);
627 logdest.
assfmt(
"FILE:filename=%s,maxsize=1000000,maxfiles=6",
630 logdest_configured =
false;
633 g_eventLogger->
close();
636 char errStr[100]= {0};
637 if(!g_eventLogger->
addHandler(logdest, &err,
sizeof(errStr), errStr)) {
638 ndbout <<
"Warning: could not add log destination '"
639 << logdest.
c_str() <<
"'. Reason: ";
641 ndbout << strerror(err);
642 if(err && errStr[0]!=
'\0')
649 if (logdest_configured ==
false &&
650 m_opts.non_interactive)
661 g_eventLogger->
enable(Logger::LL_DEBUG);
666 MgmtSrvr::config_changed(NodeId node_id,
const Config* new_config)
668 DBUG_ENTER(
"MgmtSrvr::config_changed");
670 Guard g(m_local_config_mutex);
673 require(_ownNodeId == 0 || _ownNodeId == node_id);
678 delete m_local_config;
680 m_local_config=
new Config(new_config);
681 require(m_local_config != 0);
684 ConfigIter iter(m_local_config, CFG_SECTION_NODE);
685 for(Uint32 i = 0; i<MAX_NODES; i++) {
687 m_connect_address[
i].s_addr= 0;
692 if (iter.find(CFG_NODE_ID, i) == 0){
694 require(iter.get(CFG_TYPE_OF_SECTION, &type) == 0);
718 setClusterLog(m_local_config);
722 if (!theFacade->configure(_ownNodeId,
723 m_local_config->m_configValues))
725 g_eventLogger->
warning(
"Could not reconfigure everything online, "
726 "this node need a restart");
727 m_need_restart=
true;
739 return m_config_manager->get_packed_config(node_type, &buf64, error);
743 MgmtSrvr::get_packed_config_from_node(NodeId nodeId,
746 DBUG_ENTER(
"get_packed_config_from_node");
748 if (nodeId >= MAX_NODES_ID)
750 error.
assfmt(
"Nodeid %d is greater than max nodeid %d. ",
751 nodeId, MAX_NODES_ID);
755 if (getNodeType(nodeId) == NDB_MGM_NODE_TYPE_UNKNOWN)
757 error.
assfmt(
"Nodeid %d does not exist. ", nodeId);
763 error.
assfmt(
"Node %d is not a data node. ", nodeId);
767 trp_node node = getNodeInfo(nodeId);
771 error.
assfmt(
"Data node %d is not alive. ", nodeId);
775 const Uint32 version = node.m_info.
m_version;
777 if (!ndbd_get_config_supported(version))
779 error.
assfmt(
"Data node %d (version %d.%d.%d) does not support getting config. ",
780 nodeId, ndbGetMajor(version),
781 ndbGetMinor(version), ndbGetBuild(version));
785 INIT_SIGNAL_SENDER(ss,nodeId);
789 req->senderRef = ss.getOwnRef();
790 req->nodeId = nodeId;
792 g_eventLogger->
debug(
"Sending GET_CONFIG_REQ to %d", nodeId);
794 ssig.set(ss, TestOrd::TraceAPI, CMVMI, GSN_GET_CONFIG_REQ,
795 GetConfigReq::SignalLength);
796 if ((ss.sendSignal(nodeId, &ssig)) != SEND_OK)
805 int gsn = signal->readSignalNumber();
809 case GSN_GET_CONFIG_CONF:
811 if (refToNode(signal->header.theSendersBlockRef) != nodeId)
813 error.
assfmt(
"Internal Error: Reply from wrong node %d, expected from %d. ",
814 refToNode(signal->header.theSendersBlockRef),
822 if (signal->header.m_noOfSections != 1)
824 error.
assfmt(
"Internal Error: Wrong number of sections %d received, expected %d. ",
825 signal->header.m_noOfSections, 1);
829 if (defragger.defragment(signal))
832 require(cf.unpack(signal->ptr[0].p, conf->configLength));
834 Config received_config(cf.getConfigValues());
835 if (!received_config.pack64(buf64))
837 error.
assign(
"Failed to pack64");
846 case GSN_GET_CONFIG_REF:
848 if (refToNode(ssig.header.theSendersBlockRef) != nodeId)
850 error.
assfmt(
"Internal Error: Reply from wrong node %d, expected from %d. ",
851 refToNode(signal->header.theSendersBlockRef),
857 error.
assfmt(
"Error in retrieving config from node %d: Internal error: %d",
863 case GSN_NF_COMPLETEREP:
866 signal->getDataPtr());
869 error.
assfmt(
"Node %d is not available", nodeId);
875 case GSN_NODE_FAILREP:
881 case GSN_API_REGCONF:
882 case GSN_TAKE_OVERTCCONF:
883 case GSN_CONNECT_REP:
888 report_unknown_signal(signal);
897 MgmtSrvr::~MgmtSrvr()
901 _isStopThread =
true;
903 if (_logLevelThread != NULL) {
904 NdbThread_WaitFor(_logLevelThread, &res);
905 NdbThread_Destroy(&_logLevelThread);
909 m_socket_server.stopServer();
912 if (!m_socket_server.stopSessions(
true,
913 2 * MgmApiSession::SOCKET_TIMEOUT))
915 g_eventLogger->
error(
"Failed to wait for all sessions to stop, "
916 "continuing with shutdown anyway.");
920 if (m_config_manager != 0)
922 m_config_manager->stop();
923 delete m_config_manager;
931 theFacade->stop_instance();
936 delete m_local_config;
938 NdbMutex_Destroy(m_local_config_mutex);
939 NdbMutex_Destroy(m_node_id_mutex);
946 int MgmtSrvr::okToSendTo(NodeId nodeId,
bool unCond)
949 return WRONG_PROCESS_TYPE;
952 if (getNodeInfo(nodeId).is_confirmed())
955 else if (getNodeInfo(nodeId).m_alive ==
true)
957 return NO_CONTACT_WITH_PROCESS;
964 g_eventLogger->
error(
"Unknown signal received. SignalNumber: "
965 "%i from (%d, 0x%x)",
966 signal->readSignalNumber(),
967 refToNode(signal->header.theSendersBlockRef),
968 refToBlock(signal->header.theSendersBlockRef));
977 MgmtSrvr::start(
int nodeId)
979 INIT_SIGNAL_SENDER(ss,nodeId);
983 ssig.set(ss,TestOrd::TraceAPI, CMVMI, GSN_START_ORD, StartOrd::SignalLength);
986 return ss.sendSignal(nodeId, &ssig) == SEND_OK ? 0 : SEND_OR_RECEIVE_FAILED;
994 MgmtSrvr::status_api(
int nodeId,
996 Uint32& version, Uint32& mysql_version,
997 const char **address)
1000 assert(version == 0 && mysql_version == 0);
1002 if (sendVersionReq(nodeId, version, mysql_version, address) != 0)
1005 assert(version == 0);
1012 assert(mysql_version);
1017 assert(mysql_version == 0);
1025 MgmtSrvr::sendVersionReq(
int v_nodeId,
1027 Uint32& mysql_version,
1028 const char **address)
1035 req->senderRef = ss.getOwnRef();
1036 req->nodeId = v_nodeId;
1037 ssig.set(ss, TestOrd::TraceAPI, QMGR,
1038 GSN_API_VERSION_REQ, ApiVersionReq::SignalLength);
1041 bool do_send =
true;
1046 nodeId = ss.get_an_alive_node();
1049 return NO_CONTACT_WITH_DB_NODES;
1052 if (ss.sendSignal(nodeId, &ssig) != SEND_OK)
1054 return SEND_OR_RECEIVE_FAILED;
1062 switch (signal->readSignalNumber()) {
1063 case GSN_API_VERSION_CONF: {
1067 assert((
int) conf->nodeId == v_nodeId);
1069 version = conf->version;
1070 mysql_version = conf->mysql_version;
1071 if (version < NDBD_SPLIT_VERSION)
1074 in.s_addr= conf->inet_addr;
1075 *address= inet_ntoa(in);
1080 case GSN_NF_COMPLETEREP:{
1088 case GSN_NODE_FAILREP:{
1095 case GSN_API_REGCONF:
1096 case GSN_TAKE_OVERTCCONF:
1097 case GSN_CONNECT_REP:
1101 report_unknown_signal(signal);
1102 return SEND_OR_RECEIVE_FAILED;
1112 int MgmtSrvr::sendStopMgmd(NodeId nodeId,
1119 const char* hostname;
1124 Guard g(m_local_config_mutex);
1126 ConfigIter iter(m_local_config, CFG_SECTION_NODE);
1128 if(iter.first())
return SEND_OR_RECEIVE_FAILED;
1129 if(iter.find(CFG_NODE_ID, nodeId))
return SEND_OR_RECEIVE_FAILED;
1130 if(iter.get(CFG_NODE_HOST, &hostname))
return SEND_OR_RECEIVE_FAILED;
1133 ConfigIter iter(m_local_config, CFG_SECTION_NODE);
1135 if(iter.first())
return SEND_OR_RECEIVE_FAILED;
1136 if(iter.find(CFG_NODE_ID, nodeId))
return SEND_OR_RECEIVE_FAILED;
1137 if(iter.get(CFG_MGM_PORT, &port))
return SEND_OR_RECEIVE_FAILED;
1139 if( strlen(hostname) == 0 )
1140 return SEND_OR_RECEIVE_FAILED;
1143 connect_string.
assfmt(
"%s:%u",hostname,port);
1145 DBUG_PRINT(
"info",(
"connect string: %s",connect_string.
c_str()));
1148 if ( h && connect_string.
length() > 0 )
1153 DBUG_PRINT(
"info",(
"failed ndb_mgm_connect"));
1155 return SEND_OR_RECEIVE_FAILED;
1160 nodes[0]= (int)nodeId;
1164 return SEND_OR_RECEIVE_FAILED;
1170 nodes[0]= (int)nodeId;
1174 return SEND_OR_RECEIVE_FAILED;
1189 MgmtSrvr::sendall_STOP_REQ(
NodeBitmask &stoppedNodes,
1197 DBUG_ENTER(
"MgmtSrvr::sendall_STOP_REQ");
1198 DBUG_PRINT(
"enter", (
"abort: %d stop: %d restart: %d "
1199 "nostart: %d initialStart: %d",
1200 abort, stop, restart, nostart, initialStart));
1202 stoppedNodes.
clear();
1208 StopReq*
const stopReq = CAST_PTR(
StopReq, ssig.getDataPtrSend());
1209 ssig.set(ss, TestOrd::TraceAPI, NDBCNTR, GSN_STOP_REQ, StopReq::SignalLength);
1211 stopReq->requestInfo = 0;
1212 stopReq->apiTimeout = 5000;
1213 stopReq->transactionTimeout = 1000;
1214 stopReq->readOperationTimeout = 1000;
1215 stopReq->operationTimeout = 1000;
1216 stopReq->senderData = 12;
1217 stopReq->senderRef = ss.getOwnRef();
1218 stopReq->singleuser = 0;
1219 StopReq::setSystemStop(stopReq->requestInfo, stop);
1220 StopReq::setPerformRestart(stopReq->requestInfo, restart);
1222 StopReq::setNoStart(stopReq->requestInfo, nostart);
1223 StopReq::setInitialStart(stopReq->requestInfo, initialStart);
1232 if (okToSendTo(nodeId,
true) == 0)
1234 SendStatus result = ss.sendSignal(nodeId, &ssig);
1235 if (result == SEND_OK)
1243 if (nodes.
isclear() && failed > 0)
1245 DBUG_RETURN(SEND_OR_RECEIVE_FAILED);
1252 int gsn = signal->readSignalNumber();
1256 const StopRef *
const ref = CAST_CONSTPTR(
StopRef, signal->getDataPtr());
1257 const NodeId nodeId = refToNode(signal->header.theSendersBlockRef);
1259 ndbout_c(
"Node %d refused stop", nodeId);
1261 assert(nodes.
get(nodeId));
1262 nodes.
clear(nodeId);
1263 error = translateStopRef(ref->errorCode);
1268 const NodeId nodeId = refToNode(signal->header.theSendersBlockRef);
1269 assert(nodes.
get(nodeId));
1270 nodes.
clear(nodeId);
1273 case GSN_NF_COMPLETEREP:
1276 signal->getDataPtr());
1281 case GSN_NODE_FAILREP:
1284 signal->getDataPtr());
1286 mask.
assign(NdbNodeBitmask::Size, rep->theNodes);
1288 stoppedNodes.
bitOR(mask);
1291 case GSN_API_REGCONF:
1292 case GSN_TAKE_OVERTCCONF:
1293 case GSN_CONNECT_REP:
1296 report_unknown_signal(signal);
1297 DBUG_RETURN(SEND_OR_RECEIVE_FAILED);
1310 NodeId guess = m_master_node;
1313 trp_node node = ss.getNodeInfo(guess);
1324 trp_node node = ss.getNodeInfo(guess);
1337 trp_node node = ss.getNodeInfo(guess);
1338 if (node.is_confirmed())
1350 trp_node node = ss.getNodeInfo(guess);
1351 if (node.is_connected())
1387 DBUG_ENTER(
"MgmtSrvr::sendSTOP_REQ");
1388 DBUG_PRINT(
"enter", (
"no of nodes: %d "
1389 "abort: %d stop: %d restart: %d "
1390 "nostart: %d initialStart: %d",
1392 abort, stop, restart, nostart, initialStart));
1394 stoppedNodes.
clear();
1406 for (
unsigned i = 0; i < node_ids.size(); i++)
1408 switch(getNodeType(node_ids[i])){
1410 mgm_nodes_to_stop.
set(node_ids[i]);
1413 ndb_nodes_to_stop.
set(node_ids[i]);
1416 DBUG_RETURN(WRONG_PROCESS_TYPE);
1423 for (Uint32 i = mgm_nodes_to_stop.
find(0);
1424 i != mgm_nodes_to_stop.NotFound;
1425 i = mgm_nodes_to_stop.
find(i + 1))
1427 if (i != getOwnNodeId())
1429 error= sendStopMgmd(i, abort, stop, restart,
1430 nostart, initialStart);
1433 stoppedNodes.
set(i);
1438 g_eventLogger->
info(
"Stopping this node");
1439 * stopSelf = (restart)? -1 : 1;
1440 stoppedNodes.
set(i);
1448 StopReq*
const stopReq = CAST_PTR(
StopReq, ssig.getDataPtrSend());
1449 ssig.set(ss, TestOrd::TraceAPI, NDBCNTR, GSN_STOP_REQ, StopReq::SignalLength);
1451 stopReq->requestInfo = 0;
1452 stopReq->apiTimeout = 5000;
1453 stopReq->transactionTimeout = 1000;
1454 stopReq->readOperationTimeout = 1000;
1455 stopReq->operationTimeout = 1000;
1456 stopReq->senderData = 12;
1457 stopReq->senderRef = ss.getOwnRef();
1458 stopReq->singleuser = 0;
1459 StopReq::setSystemStop(stopReq->requestInfo, stop);
1460 StopReq::setPerformRestart(stopReq->requestInfo, restart);
1462 StopReq::setNoStart(stopReq->requestInfo, nostart);
1463 StopReq::setInitialStart(stopReq->requestInfo, initialStart);
1465 int use_master_node = 0;
1467 if (ndb_nodes_to_stop.
count() > 1)
1470 use_master_node = 1;
1471 ndb_nodes_to_stop.
copyto(NdbNodeBitmask::Size, stopReq->nodes);
1472 StopReq::setStopNodes(stopReq->requestInfo, 1);
1474 else if (ndb_nodes_to_stop.
count() == 1)
1476 Uint32 nodeId = ndb_nodes_to_stop.
find(0);
1477 if (okToSendTo(nodeId,
true) == 0)
1479 SendStatus result = ss.sendSignal(nodeId, &ssig);
1480 if (result != SEND_OK)
1482 DBUG_RETURN(SEND_OR_RECEIVE_FAILED);
1487 DBUG_RETURN(SEND_OR_RECEIVE_FAILED);
1493 Uint32 sendNodeId = ndb_nodes_to_stop.
find(0);
1494 while (!stoppedNodes.
contains(ndb_nodes_to_stop))
1498 assert(use_master_node);
1499 sendNodeId = guess_master_node(ss);
1500 if (okToSendTo(sendNodeId,
true) != 0)
1502 DBUG_RETURN(SEND_OR_RECEIVE_FAILED);
1505 if (ss.sendSignal(sendNodeId, &ssig) != SEND_OK)
1507 DBUG_RETURN(SEND_OR_RECEIVE_FAILED);
1513 int gsn = signal->readSignalNumber();
1516 const StopRef *
const ref = CAST_CONSTPTR(
StopRef, signal->getDataPtr());
1517 const NodeId nodeId = refToNode(signal->header.theSendersBlockRef);
1518 assert(nodeId == sendNodeId);
1519 if (ref->errorCode == StopRef::MultiNodeShutdownNotMaster)
1521 assert(use_master_node);
1522 m_master_node= ref->masterNodeId;
1526 DBUG_RETURN(translateStopRef(ref->errorCode));
1529 case GSN_STOP_CONF:{
1531 const StopConf *
const ref = CAST_CONSTPTR(
StopConf, signal->getDataPtr());
1533 const NodeId nodeId = refToNode(signal->header.theSendersBlockRef);
1534 assert(nodeId == sendNodeId);
1535 stoppedNodes.
bitOR(ndb_nodes_to_stop);
1538 case GSN_NF_COMPLETEREP:{
1544 case GSN_NODE_FAILREP:{
1548 mask.
assign(NdbNodeBitmask::Size, rep->theNodes);
1549 stoppedNodes.
bitOR(mask);
1552 case GSN_API_REGCONF:
1553 case GSN_TAKE_OVERTCCONF:
1554 case GSN_CONNECT_REP:
1557 report_unknown_signal(signal);
1558 DBUG_RETURN(SEND_OR_RECEIVE_FAILED);
1561 if (error && *stopSelf)
1573 int *stopCount,
bool abort,
bool force,
1578 else if (is_any_node_starting())
1581 return OPERATION_NOT_ALLOWED_START_STOP;
1586 if (node_ids.size() > 0)
1588 ret = sendSTOP_REQ(node_ids, nodes,
1589 abort,
false,
false,
false,
false,
1594 ret = sendall_STOP_REQ(nodes,
1595 abort,
false,
false,
false,
false);
1599 *stopCount= nodes.
count();
1603 int MgmtSrvr::shutdownMGM(
int *stopCount,
bool abort,
int *stopSelf)
1610 if(nodeId==getOwnNodeId())
1612 error= sendStopMgmd(nodeId, abort,
true,
false,
1633 int ret = sendall_STOP_REQ(nodes,
1641 *stopCount = nodes.
count();
1652 return NODE_NOT_API_NODE;
1664 StopReq*
const stopReq = CAST_PTR(
StopReq, ssig.getDataPtrSend());
1665 ssig.set(ss, TestOrd::TraceAPI, NDBCNTR, GSN_STOP_REQ, StopReq::SignalLength);
1667 stopReq->requestInfo = 0;
1668 stopReq->apiTimeout = 5000;
1669 stopReq->transactionTimeout = 1000;
1670 stopReq->readOperationTimeout = 1000;
1671 stopReq->operationTimeout = 1000;
1672 stopReq->senderData = 12;
1673 stopReq->senderRef = ss.getOwnRef();
1674 stopReq->singleuser = 1;
1675 stopReq->singleUserApi = apiNodeId;
1676 StopReq::setSystemStop(stopReq->requestInfo,
false);
1677 StopReq::setPerformRestart(stopReq->requestInfo,
false);
1686 if (okToSendTo(nodeId,
true) == 0)
1688 SendStatus result = ss.sendSignal(nodeId, &ssig);
1689 if (result == SEND_OK)
1703 return SEND_OR_RECEIVE_FAILED;
1705 return NO_CONTACT_WITH_DB_NODES;
1714 int gsn = signal->readSignalNumber();
1718 const StopRef *
const ref = CAST_CONSTPTR(
StopRef, signal->getDataPtr());
1719 nodes.
clear(refToNode(signal->header.theSendersBlockRef));
1720 error = translateStopRef(ref->errorCode);
1726 nodes.
clear(refToNode(signal->header.theSendersBlockRef));
1729 case GSN_NF_COMPLETEREP:
1732 signal->getDataPtr());
1737 case GSN_NODE_FAILREP:
1740 signal->getDataPtr());
1742 mask.
assign(NdbNodeBitmask::Size, rep->theNodes);
1746 case GSN_API_REGCONF:
1747 case GSN_TAKE_OVERTCCONF:
1748 case GSN_CONNECT_REP:
1752 report_unknown_signal(signal);
1753 return SEND_OR_RECEIVE_FAILED;
1769 bool MgmtSrvr::is_any_node_stopping()
1775 node = getNodeInfo(nodeId);
1785 bool MgmtSrvr::is_any_node_starting()
1791 node = getNodeInfo(nodeId);
1798 bool MgmtSrvr::is_cluster_single_user()
1804 node = getNodeInfo(nodeId);
1805 if((node.m_state.
startLevel == NodeState::SL_SINGLEUSER))
1812 int * stopCount,
bool nostart,
1813 bool initialStart,
bool abort,
1817 if (is_cluster_single_user())
1824 return OPERATION_NOT_ALLOWED_START_STOP;
1829 else if (is_any_node_starting())
1832 return OPERATION_NOT_ALLOWED_START_STOP;
1837 if (node_ids.size() > 0)
1839 ret = sendSTOP_REQ(node_ids, nodes,
1840 abort,
false,
true,
true, initialStart,
1845 ret = sendall_STOP_REQ(nodes,
1846 abort,
false,
true,
true, initialStart);
1853 *stopCount = nodes.
count();
1856 const NDB_TICKS waitTime = 12000;
1857 const NDB_TICKS startTime = NdbTick_CurrentMillisecond();
1858 for (
unsigned i = 0; i < node_ids.size(); i++)
1860 NodeId nodeId= node_ids[
i];
1864 ndbout_c(
"Waiting for %d not started", nodeId);
1867 (NdbTick_CurrentMillisecond() - startTime) < waitTime)
1869 Uint32 startPhase = 0, version = 0, dynamicId = 0, nodeGroup = 0;
1870 Uint32 mysql_version = 0;
1871 Uint32 connectCount = 0;
1873 const char *address= NULL;
1874 status(nodeId, &s, &version, &mysql_version, &startPhase,
1875 &system, &dynamicId, &nodeGroup, &connectCount, &address);
1876 NdbSleep_MilliSleep(100);
1888 for (;is_any_node_stopping();)
1892 NdbSleep_MilliSleep(100);
1898 for (
unsigned i = 0; i < node_ids.size(); i++)
1900 (void) start(node_ids[i]);
1910 bool abort,
int * stopCount)
1914 int ret = sendall_STOP_REQ(nodes,
1925 *stopCount = nodes.
count();
1928 ndbout_c(
"Stopped %d nodes", nodes.
count());
1935 const NDB_TICKS waitTime = 12000;
1936 const NDB_TICKS startTime = NdbTick_CurrentMillisecond();
1939 if (!nodes.
get(nodeId))
1944 ndbout_c(
"Waiting for %d not started", nodeId);
1947 (NdbTick_CurrentMillisecond() - startTime) < waitTime)
1949 Uint32 startPhase = 0, version = 0, dynamicId = 0, nodeGroup = 0;
1950 Uint32 mysql_version = 0;
1951 Uint32 connectCount = 0;
1953 const char *address;
1954 status(nodeId, &s, &version, &mysql_version, &startPhase,
1955 &system, &dynamicId, &nodeGroup, &connectCount, &address);
1956 NdbSleep_MilliSleep(100);
1969 if (!nodes.
get(nodeId))
1972 result = start(nodeId);
1973 g_eventLogger->
debug(
"Started node %d with result %d", nodeId, result);
1996 CAST_PTR(
ResumeReq, ssig.getDataPtrSend());
1998 ssig.set(ss,TestOrd::TraceAPI, NDBCNTR, GSN_RESUME_REQ,
1999 ResumeReq::SignalLength);
2000 resumeReq->senderData = 12;
2001 resumeReq->senderRef = ss.getOwnRef();
2004 if(okToSendTo(nodeId,
true) == 0){
2005 SendStatus result = ss.sendSignal(nodeId, &ssig);
2006 if (result == SEND_OK)
2012 * stopCount = count;
2022 MgmtSrvr::updateStatus()
2024 theFacade->ext_forceHB();
2029 MgmtSrvr::status_mgmd(NodeId node_id,
2031 Uint32& version, Uint32& mysql_version,
2032 const char **address)
2036 if (node_id == getOwnNodeId())
2044 Uint32 tmp_version = 0, tmp_mysql_version = 0;
2045 sendVersionReq(node_id, tmp_version, tmp_mysql_version, address);
2047 assert(tmp_version == 0 ||
2048 (tmp_version == NDB_VERSION &&
2049 tmp_mysql_version == NDB_MYSQL_VERSION_D));
2051 version = NDB_VERSION;
2052 mysql_version = NDB_MYSQL_VERSION_D;
2056 Guard g(m_local_config_mutex);
2057 ConfigIter iter(m_local_config, CFG_SECTION_NODE);
2058 require(iter.find(CFG_NODE_ID, node_id) == 0);
2059 require(iter.get(CFG_NODE_HOST, address) == 0);
2065 struct in_addr addr;
2066 if (Ndb_getInAddr(&addr, *address) == 0)
2067 *address = inet_ntoa(addr);
2078 const trp_node node = getNodeInfo(node_id);
2079 if(node.is_connected())
2084 *address= get_connect_address(node_id);
2100 Uint32 * mysql_version,
2105 Uint32 * connectCount,
2106 const char **address)
2108 switch(getNodeType(nodeId)){
2110 status_api(nodeId, *_status, *version, *mysql_version, address);
2115 status_mgmd(nodeId, *_status, *version, *mysql_version, address);
2127 const trp_node node = getNodeInfo(nodeId);
2131 if(!node.is_connected()){
2139 *address= get_connect_address(nodeId);
2141 * dynamic = node.m_state.dynamicId;
2153 * _phase = node.m_state.starting.startPhase;
2164 * _system = node.m_state.stopping.systemShutdown != 0;
2170 * _system = node.m_state.stopping.systemShutdown != 0;
2176 * _system = node.m_state.stopping.systemShutdown != 0;
2182 * _system = node.m_state.stopping.systemShutdown != 0;
2185 case NodeState::SL_SINGLEUSER:
2200 MgmtSrvr::setEventReportingLevelImpl(
int nodeId_arg,
2213 ssig.set(ss,TestOrd::TraceAPI, CMVMI, GSN_EVENT_SUBSCRIBE_REQ,
2214 EventSubscribeReq::SignalLength);
2217 if (nodeId_arg == 0)
2221 max = MAX_NDB_NODES;
2226 max = nodeId = nodeId_arg;
2229 for(; nodeId <= max; nodeId++)
2231 if (nodeTypes[nodeId] != NODE_TYPE_DB)
2233 if (okToSendTo(nodeId,
true))
2235 if (getNodeInfo(nodeId).is_connected() ==
false)
2241 return SEND_OR_RECEIVE_FAILED;
2245 if (nodeId_arg == 0)
2249 max = MAX_NDB_NODES;
2254 max = nodeId = nodeId_arg;
2258 for(; (Uint32) nodeId <= max; nodeId++)
2260 if (nodeTypes[nodeId] != NODE_TYPE_DB)
2262 if (getNodeInfo(nodeId).is_connected() ==
false)
2264 if (ss.sendSignal(nodeId, &ssig) == SEND_OK)
2266 else if (max == nodeId)
2268 return SEND_OR_RECEIVE_FAILED;
2276 return SEND_OR_RECEIVE_FAILED;
2284 int gsn = signal->readSignalNumber();
2285 nodeId = refToNode(signal->header.theSendersBlockRef);
2287 case GSN_EVENT_SUBSCRIBE_CONF:{
2288 nodes.
clear(nodeId);
2291 case GSN_EVENT_SUBSCRIBE_REF:{
2292 nodes.
clear(nodeId);
2299 case GSN_NODE_FAILREP: {
2303 mask.
assign(NdbNodeBitmask::Size, rep->theNodes);
2308 case GSN_NF_COMPLETEREP:{
2314 case GSN_API_REGCONF:
2315 case GSN_TAKE_OVERTCCONF:
2316 case GSN_CONNECT_REP:
2319 report_unknown_signal(signal);
2320 return SEND_OR_RECEIVE_FAILED;
2324 return SEND_OR_RECEIVE_FAILED;
2331 MgmtSrvr::setNodeLogLevelImpl(
int nodeId,
const SetLogLevelOrd & ll)
2333 INIT_SIGNAL_SENDER(ss,nodeId);
2336 ssig.set(ss,TestOrd::TraceAPI, CMVMI, GSN_SET_LOGLEVELORD,
2337 SetLogLevelOrd::SignalLength);
2341 return ss.sendSignal(nodeId, &ssig) == SEND_OK ? 0 : SEND_OR_RECEIVE_FAILED;
2353 return INVALID_ERROR_NUMBER;
2363 else if(nodeId == _ownNodeId)
2365 g_errorInsert= errorNo;
2369 block= _blockNumber;
2371 return WRONG_PROCESS_TYPE;
2374 ssig.set(ss,TestOrd::TraceAPI, block, GSN_TAMPER_ORD,
2375 TamperOrd::SignalLength);
2377 tamperOrd->errorNo = errorNo;
2379 int res = ss.sendSignal(nodeId, &ssig) == SEND_OK ? 0 :SEND_OR_RECEIVE_FAILED;
2387 make_sync_req(ss, Uint32(nodeId));
2395 MgmtSrvr::startSchemaTrans(
SignalSender& ss, NodeId & out_nodeId,
2396 Uint32 transId, Uint32 & out_transKey)
2400 ssig.set(ss, 0, DBDICT, GSN_SCHEMA_TRANS_BEGIN_REQ,
2401 SchemaTransBeginReq::SignalLength);
2406 req->clientRef = ss.getOwnRef();
2407 req->transId = transId;
2408 req->requestInfo = 0;
2410 NodeId nodeId = ss.get_an_alive_node();
2413 if (ss.get_node_alive(nodeId) ==
false)
2415 nodeId = ss.get_an_alive_node();
2418 if (ss.sendSignal(nodeId, &ssig) != SEND_OK)
2420 return SEND_OR_RECEIVE_FAILED;
2426 int gsn = signal->readSignalNumber();
2428 case GSN_SCHEMA_TRANS_BEGIN_CONF: {
2431 out_transKey = conf->transKey;
2432 out_nodeId = nodeId;
2435 case GSN_SCHEMA_TRANS_BEGIN_REF: {
2439 switch(ref->errorCode){
2440 case SchemaTransBeginRef::NotMaster:
2441 nodeId = ref->masterNodeId;
2443 case SchemaTransBeginRef::Busy:
2444 case SchemaTransBeginRef::BusyWithNR:
2447 return ref->errorCode;
2450 case GSN_NF_COMPLETEREP:
2453 case GSN_NODE_FAILREP:{
2463 case GSN_API_REGCONF:
2464 case GSN_TAKE_OVERTCCONF:
2465 case GSN_CONNECT_REP:
2468 report_unknown_signal(signal);
2469 return SEND_OR_RECEIVE_FAILED;
2475 MgmtSrvr::endSchemaTrans(
SignalSender& ss, NodeId nodeId,
2476 Uint32 transId, Uint32 transKey,
2481 ssig.set(ss, 0, DBDICT, GSN_SCHEMA_TRANS_END_REQ,
2482 SchemaTransEndReq::SignalLength);
2487 req->clientRef = ss.getOwnRef();
2488 req->transId = transId;
2489 req->requestInfo = 0;
2490 req->transKey = transKey;
2493 if (ss.sendSignal(nodeId, &ssig) != SEND_OK)
2495 return SEND_OR_RECEIVE_FAILED;
2501 int gsn = signal->readSignalNumber();
2503 case GSN_SCHEMA_TRANS_END_CONF: {
2506 case GSN_SCHEMA_TRANS_END_REF: {
2509 return ref->errorCode;
2511 case GSN_NF_COMPLETEREP:
2514 case GSN_NODE_FAILREP:{
2523 case GSN_API_REGCONF:
2524 case GSN_TAKE_OVERTCCONF:
2525 case GSN_CONNECT_REP:
2528 report_unknown_signal(signal);
2529 return SEND_OR_RECEIVE_FAILED;
2535 MgmtSrvr::createNodegroup(
int *nodes,
int count,
int *ng)
2541 Uint32 transId = rand();
2545 if ((res = startSchemaTrans(ss, nodeId, transId, transKey)))
2551 ssig.set(ss, 0, DBDICT, GSN_CREATE_NODEGROUP_REQ,
2552 CreateNodegroupReq::SignalLength);
2557 req->transId = transId;
2558 req->transKey = transKey;
2559 req->nodegroupId = RNIL;
2560 req->senderData = 77;
2561 req->senderRef = ss.getOwnRef();
2562 bzero(req->nodes,
sizeof(req->nodes));
2568 req->nodegroupId = * ng;
2571 for (
int i = 0; i<count && i<(int)NDB_ARRAY_SIZE(req->nodes); i++)
2573 req->nodes[
i] = nodes[
i];
2576 if (ss.sendSignal(nodeId, &ssig) != SEND_OK)
2578 return SEND_OR_RECEIVE_FAILED;
2585 int gsn = signal->readSignalNumber();
2587 case GSN_CREATE_NODEGROUP_CONF: {
2593 * ng = conf->nodegroupId;
2599 case GSN_CREATE_NODEGROUP_REF:{
2602 Uint32 err = ref->errorCode;
2603 endSchemaTrans(ss, nodeId, transId, transKey,
2604 SchemaTransEndReq::SchemaTransAbort);
2607 case GSN_NF_COMPLETEREP:
2610 case GSN_NODE_FAILREP:{
2615 return SchemaTransBeginRef::Nodefailure;
2619 case GSN_API_REGCONF:
2620 case GSN_TAKE_OVERTCCONF:
2621 case GSN_CONNECT_REP:
2624 report_unknown_signal(signal);
2625 return SEND_OR_RECEIVE_FAILED;
2629 return endSchemaTrans(ss, nodeId, transId, transKey, 0);
2633 MgmtSrvr::dropNodegroup(
int ng)
2639 Uint32 transId = rand();
2643 if ((res = startSchemaTrans(ss, nodeId, transId, transKey)))
2649 ssig.set(ss, 0, DBDICT, GSN_DROP_NODEGROUP_REQ, DropNodegroupReq::SignalLength);
2654 req->transId = transId;
2655 req->transKey = transKey;
2656 req->nodegroupId = ng;
2657 req->senderData = 77;
2658 req->senderRef = ss.getOwnRef();
2660 if (ss.sendSignal(nodeId, &ssig) != SEND_OK)
2662 return SEND_OR_RECEIVE_FAILED;
2669 int gsn = signal->readSignalNumber();
2671 case GSN_DROP_NODEGROUP_CONF: {
2675 case GSN_DROP_NODEGROUP_REF:
2679 endSchemaTrans(ss, nodeId, transId, transKey,
2680 SchemaTransEndReq::SchemaTransAbort);
2681 return ref->errorCode;
2683 case GSN_NF_COMPLETEREP:
2686 case GSN_NODE_FAILREP:{
2691 return SchemaTransBeginRef::Nodefailure;
2695 case GSN_API_REGCONF:
2696 case GSN_TAKE_OVERTCCONF:
2697 case GSN_CONNECT_REP:
2700 report_unknown_signal(signal);
2701 return SEND_OR_RECEIVE_FAILED;
2705 return endSchemaTrans(ss, nodeId, transId, transKey, 0);
2713 MgmtSrvr::setTraceNo(
int nodeId,
int traceNo)
2716 return INVALID_TRACE_NUMBER;
2719 INIT_SIGNAL_SENDER(ss,nodeId);
2722 ssig.set(ss,TestOrd::TraceAPI, CMVMI, GSN_TEST_ORD, TestOrd::SignalLength);
2723 TestOrd*
const testOrd = CAST_PTR(
TestOrd, ssig.getDataPtrSend());
2726 testOrd->setTraceCommand(TestOrd::Toggle,
2727 (TestOrd::TraceSpecification)traceNo);
2729 return ss.sendSignal(nodeId, &ssig) == SEND_OK ? 0 : SEND_OR_RECEIVE_FAILED;
2736 MgmtSrvr::getBlockNumber(
const BaseString &blockName)
2738 short bno = getBlockNo(blockName.
c_str());
2748 MgmtSrvr::setSignalLoggingMode(
int nodeId, LogMode
mode,
2751 INIT_SIGNAL_SENDER(ss,nodeId);
2755 TestOrd::Command command;
2757 command = TestOrd::Off;
2760 command = TestOrd::On;
2763 TestOrd::SignalLoggerSpecification logSpec;
2766 logSpec = TestOrd::InputSignals;
2769 logSpec = TestOrd::OutputSignals;
2772 logSpec = TestOrd::InputOutputSignals;
2777 logSpec = TestOrd::InputOutputSignals;
2780 ndbout_c(
"Unexpected value %d, MgmtSrvr::setSignalLoggingMode, line %d",
2781 (
unsigned)mode, __LINE__);
2787 ssig.set(ss,TestOrd::TraceAPI, CMVMI, GSN_TEST_ORD, TestOrd::SignalLength);
2789 TestOrd*
const testOrd = CAST_PTR(
TestOrd, ssig.getDataPtrSend());
2792 if (blocks.size() == 0 || blocks[0] ==
"ALL") {
2794 testOrd->addSignalLoggerCommand(command, logSpec);
2796 for(
unsigned i = 0; i < blocks.size(); i++){
2797 int blockNumber = getBlockNumber(blocks[i]);
2798 if (blockNumber == -1) {
2799 return INVALID_BLOCK_NAME;
2801 testOrd->addSignalLoggerCommand(blockNumber, command, logSpec);
2805 return ss.sendSignal(nodeId, &ssig) == SEND_OK ? 0 : SEND_OR_RECEIVE_FAILED;
2811 int MgmtSrvr::startSignalTracing(
int nodeId)
2813 INIT_SIGNAL_SENDER(ss,nodeId);
2816 ssig.set(ss,TestOrd::TraceAPI, CMVMI, GSN_TEST_ORD, TestOrd::SignalLength);
2818 TestOrd*
const testOrd = CAST_PTR(
TestOrd, ssig.getDataPtrSend());
2820 testOrd->setTestCommand(TestOrd::On);
2822 return ss.sendSignal(nodeId, &ssig) == SEND_OK ? 0 : SEND_OR_RECEIVE_FAILED;
2826 MgmtSrvr::stopSignalTracing(
int nodeId)
2828 INIT_SIGNAL_SENDER(ss,nodeId);
2831 ssig.set(ss,TestOrd::TraceAPI, CMVMI, GSN_TEST_ORD, TestOrd::SignalLength);
2832 TestOrd*
const testOrd = CAST_PTR(
TestOrd, ssig.getDataPtrSend());
2834 testOrd->setTestCommand(TestOrd::Off);
2836 return ss.sendSignal(nodeId, &ssig) == SEND_OK ? 0 : SEND_OR_RECEIVE_FAILED;
2849 Uint32 args_array[25];
2855 for (
size_t i = 0; i <= strlen(args); i++){
2856 if (args[i] ==
' ' || args[i] == 0){
2857 args_array[numArgs] = atoi(buf);
2867 return dumpState(nodeId, args_array, numArgs);
2873 INIT_SIGNAL_SENDER(ss,nodeId);
2875 const Uint32 len = no > 25 ? 25 : no;
2880 ssig.set(ss,TestOrd::TraceAPI, CMVMI, GSN_DUMP_STATE_ORD, len);
2881 for(Uint32 i = 0; i<25; i++){
2883 dumpOrd->args[
i] = args[
i];
2885 dumpOrd->args[
i] = 0;
2888 int res = ss.sendSignal(nodeId, &ssig) == SEND_OK ? 0 :SEND_OR_RECEIVE_FAILED;
2896 make_sync_req(ss, Uint32(nodeId));
2909 ndb_error_string(errorCode, buf, buf_sz);
2916 MgmtSrvr::trp_deliver_signal(
const NdbApiSignal* signal,
2919 int gsn = signal->readSignalNumber();
2924 eventReport(signal->
getDataPtr(), signal->getLength());
2928 case GSN_NF_COMPLETEREP:
2930 case GSN_TAMPER_ORD:
2931 ndbout <<
"TAMPER ORD" << endl;
2933 case GSN_API_REGCONF:
2934 case GSN_TAKE_OVERTCCONF:
2936 case GSN_CONNECT_REP:{
2944 theData[1] = nodeId;
2947 if (nodeTypes[nodeId] == NODE_TYPE_DB)
2949 m_started_nodes.push_back(nodeId);
2952 rep->setNodeId(_ownNodeId);
2953 eventReport(theData, 1);
2956 case GSN_NODE_FAILREP:
2962 bzero(theData,
sizeof(theData));
2965 event->setNodeId(_ownNodeId);
2969 for (Uint32 i = NdbNodeBitmask::find_first(rep->theNodes);
2970 i != NdbNodeBitmask::NotFound;
2974 eventReport(theData, 1);
2979 g_eventLogger->
error(
"Unknown signal received. SignalNumber: "
2980 "%i from (%d, 0x%x)",
2982 refToNode(signal->theSendersBlockRef),
2983 refToBlock(signal->theSendersBlockRef));
2990 MgmtSrvr::trp_node_status(Uint32 nodeId, Uint32 _event)
2995 MgmtSrvr::getNodeType(NodeId nodeId)
const
2997 if(nodeId >= MAX_NODES)
3000 return nodeTypes[nodeId];
3003 const char *MgmtSrvr::get_connect_address(Uint32 node_id)
3006 m_connect_address[node_id].s_addr == 0 &&
3010 const trp_node &node= getNodeInfo(node_id);
3011 if (node.is_connected())
3013 m_connect_address[node_id] = theFacade->ext_get_connect_address(node_id);
3016 return inet_ntoa(m_connect_address[node_id]);
3020 MgmtSrvr::get_connected_nodes(
NodeBitmask &connected_nodes)
const
3024 for(Uint32 i = 0; i < MAX_NDB_NODES; i++)
3028 const trp_node &node= getNodeInfo(i);
3029 connected_nodes.
bitOR(node.m_state.m_connected_nodes);
3036 MgmtSrvr::alloc_node_id_req(NodeId free_node_id,
3045 ssig.set(ss, TestOrd::TraceAPI, QMGR, GSN_ALLOC_NODEID_REQ,
3046 AllocNodeIdReq::SignalLength);
3048 req->senderRef = ss.getOwnRef();
3049 req->senderData = 19;
3050 req->nodeId = free_node_id;
3051 req->nodeType =
type;
3052 req->timeout = timeout_ms;
3062 getNodeInfo(nodeId).m_alive ==
false);
3064 return NO_CONTACT_WITH_DB_NODES;
3069 if (ss.sendSignal(nodeId, &ssig) != SEND_OK) {
3070 return SEND_OR_RECEIVE_FAILED;
3077 int gsn = signal->readSignalNumber();
3079 case GSN_ALLOC_NODEID_CONF:
3087 case GSN_ALLOC_NODEID_REF:
3091 if (ref->errorCode == AllocNodeIdRef::NotMaster ||
3092 ref->errorCode == AllocNodeIdRef::Busy ||
3093 ref->errorCode == AllocNodeIdRef::NodeFailureHandlingNotCompleted)
3096 nodeId = refToNode(ref->masterRef);
3097 if (!getNodeInfo(nodeId).m_alive)
3099 if (ref->errorCode != AllocNodeIdRef::NotMaster)
3103 NdbSleep_MilliSleep(100);
3108 return ref->errorCode;
3110 case GSN_NF_COMPLETEREP:
3114 case GSN_NODE_FAILREP:{
3128 case GSN_API_REGCONF:
3129 case GSN_TAKE_OVERTCCONF:
3130 case GSN_CONNECT_REP:
3133 report_unknown_signal(signal);
3134 return SEND_OR_RECEIVE_FAILED;
3141 match_hostname(
const struct sockaddr *clnt_addr,
3142 const char *config_hostname)
3144 struct in_addr config_addr= {0};
3147 const struct in_addr *clnt_in_addr = &((sockaddr_in*)clnt_addr)->sin_addr;
3149 if (Ndb_getInAddr(&config_addr, config_hostname) != 0
3150 || memcmp(&config_addr, clnt_in_addr,
sizeof(config_addr)) != 0)
3152 struct in_addr tmp_addr;
3153 if (Ndb_getInAddr(&tmp_addr,
"localhost") != 0
3154 || memcmp(&tmp_addr, clnt_in_addr,
sizeof(config_addr)) != 0)
3176 const struct sockaddr *client_addr,
3182 const char *found_config_hostname= 0;
3183 unsigned type_c= (unsigned)type;
3185 Guard g(m_local_config_mutex);
3187 ConfigIter iter(m_local_config, CFG_SECTION_NODE);
3188 for(iter.first(); iter.valid(); iter.next())
3191 if (iter.get(CFG_NODE_ID, &
id))
3193 if (node_id && node_id !=
id)
3195 if (iter.get(CFG_TYPE_OF_SECTION, &type_c))
3197 if (type_c != (
unsigned)
type)
3203 const char *config_hostname= 0;
3204 if (iter.get(CFG_NODE_HOST, &config_hostname))
3206 if (config_hostname == 0 || config_hostname[0] == 0)
3208 config_hostname=
"";
3212 found_config_hostname= config_hostname;
3213 if (match_hostname(client_addr, config_hostname))
3219 exact_nodes.
set(
id);
3222 struct nodeid_and_host a= {
id, config_hostname};
3223 nodes_info.push_back(a);
3227 if (nodes_info.size() != 0)
3237 error_code= NDB_MGM_ALLOCID_CONFIG_MISMATCH;
3240 if (type_c != (
unsigned)
type)
3243 const char *alias, *str;
3245 type_string.
assfmt(
"%s(%s)", alias, str);
3248 type_c_string.
assfmt(
"%s(%s)", alias, str);
3249 error_string.
appfmt(
"Id %d configured as %s, connect attempted as %s.",
3250 node_id, type_c_string.
c_str(),
3251 type_string.
c_str());
3254 if (found_config_hostname)
3256 struct in_addr config_addr= {0};
3257 int r_config_addr= Ndb_getInAddr(&config_addr, found_config_hostname);
3258 error_string.
appfmt(
"Connection with id %d done from wrong host ip %s,",
3259 node_id, inet_ntoa(((
struct sockaddr_in *)
3260 (client_addr))->sin_addr));
3261 error_string.
appfmt(
" expected %s(%s).", found_config_hostname,
3263 "lookup failed" : inet_ntoa(config_addr));
3266 error_string.
appfmt(
"No node defined with id=%d in config file.", node_id);
3271 if (found_config_hostname)
3273 error_string.
appfmt(
"Connection done from wrong host ip %s.",
3275 inet_ntoa(((
struct sockaddr_in *)
3276 (client_addr))->sin_addr):
"");
3280 error_string.
append(
"No nodes defined in config file.");
3287 const struct sockaddr *client_addr,
3290 if (theFacade && theFacade->ext_isConnected(
id))
3294 if (client_addr != 0)
3296 int res = alloc_node_id_req(
id, type, timeout_ms);
3302 case NO_CONTACT_WITH_DB_NODES:
3311 DBUG_PRINT(
"info", (
"allocating node id %d",
id));
3316 m_connect_address[
id]= ((
struct sockaddr_in *)client_addr)->sin_addr;
3318 else if (config_hostname)
3320 r= Ndb_getInAddr(&(m_connect_address[
id]), config_hostname);
3325 r= gethostname(name,
sizeof(name));
3328 name[
sizeof(
name)-1]= 0;
3329 r= Ndb_getInAddr(&(m_connect_address[
id]), name);
3334 m_connect_address[
id].s_addr= 0;
3337 if (theFacade &&
id != theFacade->ownId())
3342 theFacade->ext_doConnect(
id);
3345 g_eventLogger->
info(
"Mgmt server state: nodeid %d reserved for ip %s, "
3346 "m_reserved_nodes %s.",
3347 id, get_connect_address(
id),
3348 BaseString::getPrettyText(m_reserved_nodes).c_str());
3356 const struct sockaddr *client_addr,
3357 SOCKET_SIZE_TYPE *client_addr_len,
3362 DBUG_ENTER(
"MgmtSrvr::alloc_node_id");
3363 DBUG_PRINT(
"enter", (
"nodeid: %d type: %d client_addr: 0x%ld",
3364 *nodeId, type, (
long) client_addr));
3365 if (m_opts.no_nodeid_checks) {
3367 error_string.
appfmt(
"no-nodeid-checks set in management server. "
3368 "node id must be set explicitly in connectstring");
3369 error_code = NDB_MGM_ALLOCID_CONFIG_MISMATCH;
3375 Uint32 timeout_ms = Uint32(1000 * timeout_s);
3376 Uint64 stop = NdbTick_CurrentMillisecond() + timeout_ms;
3378 while (!m_config_manager->get_packed_config(type, 0, getconfig_message))
3383 if (NdbTick_CurrentMillisecond() > stop)
3385 error_code = NDB_MGM_ALLOCID_ERROR;
3386 error_string.
append(
"Unable to allocate nodeid as configuration"
3387 " not yet confirmed");
3391 NdbSleep_MilliSleep(20);
3394 Guard g(m_node_id_mutex);
3397 get_connected_nodes(connected_nodes);
3403 if (find_node_type(*nodeId, type, client_addr, nodes, exact_nodes, nodes_info,
3404 error_code, error_string))
3408 DBUG_ASSERT(nodes_info.size() != 0);
3413 error_string.
appfmt(
"Ambiguous node id's %d and %d. "
3414 "Suggest specifying node id in connectstring, "
3415 "or specifying unique host names in config file.",
3416 nodes_info[0].
id, nodes_info[1].
id);
3417 error_code= NDB_MGM_ALLOCID_CONFIG_MISMATCH;
3422 nodes.
bitANDC(connected_nodes);
3423 nodes.
bitANDC(m_reserved_nodes);
3426 for (Uint32 i = 0; i < nodes_info.size(); i++)
3428 unsigned id= nodes_info[
i].id;
3432 if (!exact_nodes.
get(
id))
3435 const char *config_hostname= nodes_info[
i].host.c_str();
3440 m_reserved_nodes.set(
id);
3441 NdbMutex_Unlock(m_node_id_mutex);
3442 if (!try_alloc(
id, config_hostname, type, client_addr, timeout_ms))
3444 NdbMutex_Lock(m_node_id_mutex);
3449 NdbMutex_Lock(m_node_id_mutex);
3450 m_reserved_nodes.clear(
id);
3454 for (Uint32 i = 0; i < nodes_info.size(); i++)
3456 unsigned id= nodes_info[
i].id;
3463 if (exact_nodes.
get(
id))
3470 m_reserved_nodes.set(
id);
3471 NdbMutex_Unlock(m_node_id_mutex);
3472 if (!try_alloc(
id, NULL, type, client_addr, timeout_ms))
3474 NdbMutex_Lock(m_node_id_mutex);
3479 NdbMutex_Lock(m_node_id_mutex);
3480 m_reserved_nodes.clear(
id);
3489 error_string.
appfmt(
"Id %d already allocated by another node.",
3494 const char *alias, *str;
3496 error_string.
appfmt(
"No free node id found for %s(%s).",
3499 error_code = NDB_MGM_ALLOCID_ERROR;
3502 if (error_code != NDB_MGM_ALLOCID_CONFIG_MISMATCH)
3509 if (log_event || error_code == NDB_MGM_ALLOCID_CONFIG_MISMATCH)
3511 g_eventLogger->
warning(
"Allocate nodeid (%d) failed. Connection from ip %s."
3512 " Returned error string \"%s\"",
3515 ? inet_ntoa(((
struct sockaddr_in *)
3516 (client_addr))->sin_addr)
3518 error_string.
c_str());
3521 for(Uint32 i = 0; i < MAX_NODES; i++)
3523 if (connected_nodes.
get(i))
3525 if (!m_reserved_nodes.get(i))
3527 tmp_connected.
appfmt(
"%d ", i);
3530 else if (m_reserved_nodes.get(i))
3532 tmp_not_connected.
appfmt(
"%d ", i);
3536 if (tmp_connected.
length() > 0)
3539 (
"Mgmt server state: node id's %sconnected but not reserved",
3540 tmp_connected.
c_str());
3543 if (tmp_not_connected.
length() > 0)
3546 (
"Mgmt server state: node id's %snot connected but reserved",
3547 tmp_not_connected.
c_str());
3557 NodeId tmp = * nodeId;
3560 while(nodeTypes[tmp] != type && tmp < MAX_NODES)
3563 if(tmp == MAX_NODES){
3571 #include "Services.hpp"
3574 MgmtSrvr::eventReport(
const Uint32 * theData, Uint32 len)
3578 NodeId nodeId = eventReport->getNodeId();
3581 g_eventLogger->
log(type, theData, len, nodeId,
3582 &m_event_listner[0].m_logLevel);
3583 m_event_listner.log(type, theData, len, nodeId);
3596 NodeId nodeId = m_master_node;
3597 if (okToSendTo(nodeId,
false) != 0)
3600 nodeId = m_master_node = 0;
3602 okToSendTo(nodeId,
false) != 0);
3604 return NO_CONTACT_WITH_DB_NODES;
3613 BlockNumber backupBlockNo = numberToBlock(BACKUP, 1);
3614 if(input_backupId > 0)
3616 ssig.set(ss, TestOrd::TraceAPI, backupBlockNo, GSN_BACKUP_REQ,
3617 BackupReq::SignalLength);
3618 req->inputBackupId = input_backupId;
3621 ssig.set(ss, TestOrd::TraceAPI, backupBlockNo, GSN_BACKUP_REQ,
3622 BackupReq::SignalLength - 1);
3624 req->senderData = 19;
3625 req->backupDataLen = 0;
3626 assert(waitCompleted < 3);
3627 req->flags = waitCompleted & 0x3;
3628 if(backuppoint == 1)
3629 req->flags |= BackupReq::USE_UNDO_LOG;
3635 if (ss.sendSignal(nodeId, &ssig) != SEND_OK) {
3636 return SEND_OR_RECEIVE_FAILED;
3638 if (waitCompleted == 0)
3644 int gsn = signal->readSignalNumber();
3646 case GSN_BACKUP_CONF:{
3648 CAST_CONSTPTR(
BackupConf, signal->getDataPtr());
3650 ndbout_c(
"Backup(%d) master is %d", conf->backupId,
3651 refToNode(signal->header.theSendersBlockRef));
3653 backupId = conf->backupId;
3654 if (waitCompleted == 1)
3659 case GSN_BACKUP_COMPLETE_REP:{
3663 ndbout_c(
"Backup(%d) completed", rep->backupId);
3665 backupId = rep->backupId;
3668 case GSN_BACKUP_REF:{
3670 CAST_CONSTPTR(
BackupRef, signal->getDataPtr());
3671 if(ref->errorCode == BackupRef::IAmNotMaster){
3672 m_master_node = nodeId = refToNode(ref->masterRef);
3674 ndbout_c(
"I'm not master resending to %d", nodeId);
3677 if (!getNodeInfo(nodeId).m_alive)
3678 m_master_node = nodeId = 0;
3681 return ref->errorCode;
3683 case GSN_BACKUP_ABORT_REP:{
3687 ndbout_c(
"Backup %d aborted", rep->backupId);
3691 case GSN_NF_COMPLETEREP:{
3704 case GSN_NODE_FAILREP:{
3714 case GSN_API_REGCONF:
3715 case GSN_TAKE_OVERTCCONF:
3716 case GSN_CONNECT_REP:
3719 report_unknown_signal(signal);
3720 return SEND_OR_RECEIVE_FAILED;
3726 MgmtSrvr::abortBackup(Uint32 backupId)
3734 getNodeInfo(nodeId).m_alive ==
false);
3737 return NO_CONTACT_WITH_DB_NODES;
3747 BlockNumber backupBlockNo = numberToBlock(BACKUP, 1);
3748 ssig.set(ss, TestOrd::TraceAPI, backupBlockNo, GSN_ABORT_BACKUP_ORD,
3749 AbortBackupOrd::SignalLength);
3751 ord->requestType = AbortBackupOrd::ClientAbort;
3752 ord->senderData = 19;
3753 ord->backupId = backupId;
3755 return ss.sendSignal(nodeId, &ssig) == SEND_OK ? 0 : SEND_OR_RECEIVE_FAILED;
3759 MgmtSrvr::Allocated_resources::Allocated_resources(
MgmtSrvr &m)
3762 m_reserved_nodes.
clear();
3768 if (m_reserved_nodes.
isclear())
3777 Guard g(m_mgmsrv.m_node_id_mutex);
3778 m_mgmsrv.m_reserved_nodes.
bitANDC(m_reserved_nodes);
3781 m_mgmsrv.updateStatus();
3784 info(
"Mgmt server state: nodeid %d freed, m_reserved_nodes %s.",
3786 BaseString::getPrettyText(m_mgmsrv.m_reserved_nodes).
c_str());
3790 MgmtSrvr::Allocated_resources::reserve_node(NodeId
id, NDB_TICKS timeout)
3792 m_reserved_nodes.
set(
id);
3793 m_alloc_timeout= NdbTick_CurrentMillisecond() + timeout;
3797 MgmtSrvr::Allocated_resources::is_timed_out(NDB_TICKS tick)
3799 if (m_alloc_timeout && tick > m_alloc_timeout)
3801 g_eventLogger->
info(
"Mgmt server state: nodeid %d timed out.",
3809 MgmtSrvr::Allocated_resources::get_nodeid()
const
3811 for(Uint32 i = 0; i < MAX_NODES; i++)
3813 if (m_reserved_nodes.
get(i))
3824 Guard g(m_local_config_mutex);
3829 ConfigIter iter(m_local_config, CFG_SECTION_NODE);
3830 if(iter.first() != 0){
3831 msg.
assign(
"Unable to find node section (iter.first())");
3835 Uint32 type = NODE_TYPE_DB + 1;
3838 if(iter.find(CFG_NODE_ID, node) != 0){
3839 msg.
assign(
"Unable to find node (iter.find())");
3842 if(iter.get(CFG_TYPE_OF_SECTION, &type) != 0){
3843 msg.
assign(
"Unable to get node type(iter.get(CFG_TYPE_OF_SECTION))");
3849 if(iter.get(CFG_TYPE_OF_SECTION, &type) != 0){
3850 msg.
assign(
"Unable to get node type(iter.get(CFG_TYPE_OF_SECTION))");
3853 if(type == NODE_TYPE_DB)
3855 }
while(iter.next() == 0);
3858 if(type != NODE_TYPE_DB){
3859 msg.
assfmt(
"Invalid node type or no such node (%d %d)",
3860 type, NODE_TYPE_DB);
3867 const char * val_char;
3870 if(iter.get(param, &val_32) == 0){
3871 val_32 = atoi(value);
3876 if(iter.get(param, &val_64) == 0){
3877 val_64 = strtoll(value, 0, 10);
3881 if(iter.get(param, &val_char) == 0){
3885 msg.
assign(
"Could not get parameter");
3891 int ret = iter.get(CFG_TYPE_OF_SECTION, &type);
3894 if(type != NODE_TYPE_DB)
3898 ret = iter.get(CFG_NODE_ID, &node);
3905 res = i2.set(param, val_32);
3906 ndbout_c(
"Updating node %d param: %d to %d", node, param, val_32);
3909 res = i2.set(param, val_64);
3910 ndbout_c(
"Updating node %d param: %d to %u", node, param, val_32);
3913 res = i2.set(param, val_char);
3914 ndbout_c(
"Updating node %d param: %d to %s", node, param, val_char);
3920 }
while(node == 0 && iter.next() == 0);
3928 MgmtSrvr::setConnectionDbParameter(
int node1,
int node2,
3929 int param,
int value,
3932 DBUG_ENTER(
"MgmtSrvr::setConnectionDbParameter");
3933 DBUG_PRINT(
"enter", (
"node1: %d, node2: %d, param: %d, value: %d",
3934 node1, node2, param, value));
3937 if (param != CFG_CONNECTION_SERVER_PORT)
3939 msg.
assign(
"Only param CFG_CONNECTION_SERVER_PORT can be set");
3943 if (!m_config_manager->set_dynamic_port(node1, node2, value, msg))
3946 DBUG_PRINT(
"exit", (
"Set parameter(%d) to %d for %d -> %d",
3947 param, value, node1, node2));
3953 MgmtSrvr::getConnectionDbParameter(
int node1,
int node2,
3954 int param,
int *value,
3957 DBUG_ENTER(
"MgmtSrvr::getConnectionDbParameter");
3958 DBUG_PRINT(
"enter", (
"node1: %d, node2: %d, param: %d",
3959 node1, node2, param));
3962 if (param != CFG_CONNECTION_SERVER_PORT)
3964 msg.
assign(
"Only param CFG_CONNECTION_SERVER_PORT can be retrieved");
3968 if (!m_config_manager->get_dynamic_port(node1, node2, value, msg))
3971 DBUG_PRINT(
"exit", (
"Return parameter(%d): %u for %d -> %d, msg: %s",
3972 param, *value, node1, node2, msg.
c_str()));
3978 MgmtSrvr::transporter_connect(NDB_SOCKET_TYPE sockfd,
BaseString& msg)
3980 DBUG_ENTER(
"MgmtSrvr::transporter_connect");
3991 theFacade->ext_update_connections();
3997 bool MgmtSrvr::connect_to_self()
4003 m_opts.bind_address ? m_opts.bind_address :
"localhost",
4009 g_eventLogger->
warning(
"%d %s",
4030 new_config.pack(buf);
4031 ssig.ptr[0].p = (Uint32*)buf.get_data();
4032 ssig.ptr[0].sz = (buf.length() + 3) / 4;
4033 ssig.header.m_noOfSections = 1;
4036 req->length = buf.length();
4041 NodeId nodeId= ss.find_confirmed_node(mgm_nodes);
4044 msg =
"INTERNAL ERROR Could not find any mgmd!";
4048 if (ss.sendFragmentedSignal(nodeId, ssig,
4049 MGM_CONFIG_MAN, GSN_CONFIG_CHANGE_REQ,
4050 ConfigChangeReq::SignalLength) != 0)
4052 msg.
assfmt(
"Could not start configuration change, send to "
4053 "node %d failed", nodeId);
4056 mgm_nodes.
clear(nodeId);
4063 switch(signal->readSignalNumber()){
4064 case GSN_CONFIG_CHANGE_CONF:
4067 case GSN_CONFIG_CHANGE_REF:
4071 g_eventLogger->
debug(
"Got CONFIG_CHANGE_REF, error: %d", ref->errorCode);
4072 switch(ref->errorCode)
4074 case ConfigChangeRef::NotMaster:{
4076 NodeId nodeId= ss.find_confirmed_node(mgm_nodes);
4079 msg =
"INTERNAL ERROR Could not find any mgmd!";
4083 if (ss.sendFragmentedSignal(nodeId, ssig,
4084 MGM_CONFIG_MAN, GSN_CONFIG_CHANGE_REQ,
4085 ConfigChangeReq::SignalLength) != 0)
4087 msg.
assfmt(
"Could not start configuration change, send to "
4088 "node %d failed", nodeId);
4091 mgm_nodes.
clear(nodeId);
4096 msg = ConfigChangeRef::errorMessage(ref->errorCode);
4103 case GSN_API_REGCONF:
4104 case GSN_TAKE_OVERTCCONF:
4105 case GSN_CONNECT_REP:
4110 case GSN_NODE_FAILREP:
4114 case GSN_NF_COMPLETEREP:
4116 NodeId nodeId = refToNode(signal->header.theSendersBlockRef);
4117 msg.
assign(
"Node %d failed during configuration change", nodeId);
4123 report_unknown_signal(signal);
4129 g_eventLogger->
info(
"Config change completed");
4136 MgmtSrvr::print_config(
const char* section_filter, NodeId nodeid_filter,
4137 const char* param_filter,
4140 Guard g(m_local_config_mutex);
4141 m_local_config->print(section_filter, nodeid_filter,
4147 MgmtSrvr::reload_config(
const char* config_filename,
bool mycnf,
4150 if (config_filename && mycnf)
4152 msg =
"ERROR: Both mycnf and config_filename is not supported";
4156 if (config_filename)
4160 msg.
assfmt(
"ERROR: Can't switch to use config.ini '%s' when "
4161 "node was started from my.cnf", config_filename);
4172 if (m_opts.config_filename)
4174 msg.
assfmt(
"ERROR: Can't switch to use my.cnf when "
4175 "node was started from '%s'", m_opts.config_filename);
4183 if (m_opts.config_filename)
4185 g_eventLogger->
info(
"No config file name supplied, using '%s'",
4186 m_opts.config_filename);
4187 config_filename = m_opts.config_filename;
4191 msg =
"ERROR: Neither config file name or mycnf available";
4198 if ((new_conf_ptr= ConfigManager::load_config(config_filename,
4199 mycnf, msg)) == NULL)
4201 Config new_conf(new_conf_ptr);
4204 Guard g(m_local_config_mutex);
4207 if (!new_conf.setGeneration(m_local_config->getGeneration()) ||
4208 !new_conf.setName(m_local_config->getName()) ||
4209 !new_conf.setPrimaryMgmNode(m_local_config->getPrimaryMgmNode()))
4211 msg =
"Failed to initialize reloaded config";
4216 if (!change_config(new_conf, msg))
4222 MgmtSrvr::show_variables(NdbOut& out)
4224 out <<
"daemon: " << yes_no(m_opts.daemon) << endl;
4225 out <<
"non_interactive: " << yes_no(m_opts.non_interactive) << endl;
4226 out <<
"interactive: " << yes_no(m_opts.interactive) << endl;
4227 out <<
"config_filename: " << str_null(m_opts.config_filename) << endl;
4228 out <<
"mycnf: " << yes_no(m_opts.mycnf) << endl;
4229 out <<
"bind_address: " << str_null(m_opts.bind_address) << endl;
4230 out <<
"no_nodeid_checks: " << yes_no(m_opts.no_nodeid_checks) << endl;
4231 out <<
"print_full_config: " << yes_no(m_opts.print_full_config) << endl;
4232 out <<
"configdir: " << str_null(m_opts.configdir) << endl;
4233 out <<
"verbose: " << yes_no(m_opts.verbose) << endl;
4234 out <<
"reload: " << yes_no(m_opts.reload) << endl;
4236 out <<
"nodeid: " << _ownNodeId << endl;
4237 out <<
"blocknumber: " << hex <<_blockNumber << endl;
4238 out <<
"own_reference: " << hex << _ownReference << endl;
4239 out <<
"port: " << m_port << endl;
4240 out <<
"need_restart: " << m_need_restart << endl;
4241 out <<
"is_stop_thread: " << _isStopThread << endl;
4242 out <<
"log_level_thread_sleep: " << _logLevelThreadSleep << endl;
4243 out <<
"master_node: " << m_master_node << endl;
4247 MgmtSrvr::make_sync_req(
SignalSender& ss, Uint32 nodeId)
4249 const trp_node node = ss.getNodeInfo(nodeId);
4250 if (!ndbd_sync_req_support(node.m_info.
m_version))
4267 req->senderRef = ss.getOwnRef();
4268 req->senderData = 12;
4270 ssig.set(ss,TestOrd::TraceAPI, CMVMI, GSN_SYNC_REQ, SyncReq::SignalLength);
4272 if (ss.sendSignal(nodeId, &ssig) != SEND_OK)
4281 int gsn = signal->readSignalNumber();
4287 case GSN_NF_COMPLETEREP:{
4295 case GSN_NODE_FAILREP:{
4302 case GSN_API_REGCONF:
4303 case GSN_TAKE_OVERTCCONF:
4304 case GSN_CONNECT_REP:
4314 MgmtSrvr::request_events(
NdbNodeBitmask nodes, Uint32 reports_per_node,
4318 int nodes_counter[MAX_NDB_NODES];
4323 const bool all = nodes.
isclear();
4324 for (
int i = 1; i < MAX_NDB_NODES; i++)
4327 if (!all && !nodes.
get(i))
4331 const trp_node node = ss.getNodeInfo(i);
4333 !node.is_confirmed())
4342 dumpOrd->args[0] = dump_type;
4343 dumpOrd->args[1] = ss.getOwnRef();
4345 if (ss.sendSignal(i, ssig, CMVMI, GSN_DUMP_STATE_ORD, 2) == SEND_OK)
4348 nodes_counter[
i] = (int)reports_per_node;
4360 switch (signal->readSignalNumber()) {
4361 case GSN_EVENT_REP:{
4362 const NodeId nodeid = refToNode(signal->header.theSendersBlockRef);
4366 if (!nodes.
get(nodeid))
4373 if (
event->getEventType() == NDB_LE_SavedEvent &&
4374 signal->getDataPtr()[1] == 0)
4376 nodes_counter[nodeid] = 1;
4385 nodes_counter[nodeid]--;
4386 if (nodes_counter[nodeid] == 0)
4387 nodes.
clear(nodeid);
4392 case GSN_NODE_FAILREP:{
4395 for (NodeId i = 1; i < MAX_NDB_NODES; i++)
4403 for (
unsigned j = 0; j < events.size(); j++)
4406 const NodeId nodeid = refToNode(ssig.header.theSendersBlockRef);