📄 services.cpp
字号:
Uint32 *buffer = new Uint32[size/4+1]; reply->pack(buffer); delete reply; const int uurows = (size + 44)/45; char * uubuf = new char[uurows * 62+5]; const int uusz = uuencode_mem(uubuf, (char *)buffer, size); delete[] buffer; m_output->println("GET CONFIG %d %d %d %d %d", 0, version, node, size, uusz); m_output->println("begin 664 Ndb_cfg.bin"); /* XXX Need to write directly to the socket, because the uubuf is not * NUL-terminated. This could/should probably be done in a nicer way. */ write_socket(m_socket, MAX_WRITE_TIMEOUT, uubuf, uusz); delete[] uubuf; m_output->println("end"); m_output->println(""); return; } if(compat){ m_output->println("GET CONFIG %d %d %d %d %d",1, version, 0, 0, 0); return; } if(node != 0){ bool compatible; switch (m_mgmsrv.getNodeType(node)) { case NDB_MGM_NODE_TYPE_NDB: compatible = ndbCompatible_mgmt_ndb(NDB_VERSION, version); break; case NDB_MGM_NODE_TYPE_API: case NDB_MGM_NODE_TYPE_MGM: compatible = ndbCompatible_mgmt_api(NDB_VERSION, version); break; default: m_output->println("get config"); m_output->println("result: unrecognignized node type"); m_output->println(""); return; } if (!compatible){ m_output->println("get config"); m_output->println("result: incompatible version mgmt 0x%x and node 0x%x", NDB_VERSION, version); m_output->println(""); return; } } NdbMutex_Lock(m_mgmsrv.m_configMutex); const ConfigValues * cfg = &conf->m_configValues->m_config; const Uint32 size = cfg->getPackedSize(); UtilBuffer src; cfg->pack(src); NdbMutex_Unlock(m_mgmsrv.m_configMutex); char *tmp_str = (char *) malloc(base64_needed_encoded_length(src.length())); int res = base64_encode(src.get_data(), src.length(), tmp_str); m_output->println("get config reply"); m_output->println("result: Ok"); m_output->println("Content-Length: %d", strlen(tmp_str)); m_output->println("Content-Type: ndbconfig/octet-stream"); m_output->println("Content-Transfer-Encoding: base64"); m_output->println(""); m_output->println(tmp_str); free(tmp_str); return;}voidMgmApiSession::getStatPort(Parser_t::Context &, const class Properties &) { m_output->println("get statport reply"); m_output->println("tcpport: %d", 0); m_output->println("");}voidMgmApiSession::insertError(Parser<MgmApiSession>::Context &, Properties const &args) { Uint32 node = 0, error = 0; args.get("node", &node); args.get("error", &error); int result = m_mgmsrv.insertError(node, error); m_output->println("insert error reply"); if(result != 0) m_output->println("result: %s", get_error_text(result)); else m_output->println("result: Ok"); m_output->println("");}voidMgmApiSession::setTrace(Parser<MgmApiSession>::Context &, Properties const &args) { Uint32 node = 0, trace = 0; args.get("node", &node); args.get("trace", &trace); int result = m_mgmsrv.setTraceNo(node, trace); m_output->println("set trace reply"); if(result != 0) m_output->println("result: %s", get_error_text(result)); else m_output->println("result: Ok"); m_output->println("");}voidMgmApiSession::getVersion(Parser<MgmApiSession>::Context &, Properties const &) { m_output->println("version"); m_output->println("id: %d", NDB_VERSION); m_output->println("major: %d", getMajor(NDB_VERSION)); m_output->println("minor: %d", getMinor(NDB_VERSION)); m_output->println("string: %s", NDB_VERSION_STRING); m_output->println("");}voidMgmApiSession::startBackup(Parser<MgmApiSession>::Context &, Properties const &args) { DBUG_ENTER("MgmApiSession::startBackup"); unsigned backupId; Uint32 completed= 2; int result; args.get("completed", &completed); result = m_mgmsrv.startBackup(backupId, completed); m_output->println("start backup reply"); if(result != 0) { m_output->println("result: %s", get_error_text(result)); } else{ m_output->println("result: Ok"); if (completed) m_output->println("id: %d", backupId); } m_output->println(""); DBUG_VOID_RETURN;}voidMgmApiSession::abortBackup(Parser<MgmApiSession>::Context &, Properties const &args) { Uint32 id = 0; args.get("id", &id); int result = m_mgmsrv.abortBackup(id); m_output->println("abort backup reply"); if(result != 0) m_output->println("result: %s", get_error_text(result)); else m_output->println("result: Ok"); m_output->println("");}/*****************************************************************************/voidMgmApiSession::dumpState(Parser<MgmApiSession>::Context &, Properties const &args) { Uint32 node; BaseString args_str; args.get("node", &node); args.get("args", args_str); int result = m_mgmsrv.dumpState(node, args_str.c_str()); m_output->println("dump state reply"); if(result != 0) m_output->println("result: %s", get_error_text(result)); else m_output->println("result: Ok"); m_output->println("");}voidMgmApiSession::bye(Parser<MgmApiSession>::Context &, Properties const &) { m_stop = true;}voidMgmApiSession::endSession(Parser<MgmApiSession>::Context &, Properties const &) { if(m_allocated_resources) delete m_allocated_resources; m_allocated_resources= new MgmtSrvr::Allocated_resources(m_mgmsrv); m_output->println("end session reply");}voidMgmApiSession::setClusterLogLevel(Parser<MgmApiSession>::Context &, Properties const &args) { const char *reply= "set cluster loglevel reply"; Uint32 node, level, cat; BaseString errorString; SetLogLevelOrd logLevel; int result; DBUG_ENTER("MgmApiSession::setClusterLogLevel"); args.get("node", &node); args.get("category", &cat); args.get("level", &level); DBUG_PRINT("enter",("node=%d, category=%d, level=%d", node, cat, level)); /* XXX should use constants for this value */ if(level > 15) { m_output->println(reply); m_output->println("result: Invalid loglevel %d", level); m_output->println(""); DBUG_VOID_RETURN; } LogLevel::EventCategory category= (LogLevel::EventCategory)(cat-(int)CFG_MIN_LOGLEVEL); m_mgmsrv.m_event_listner.lock(); if (m_mgmsrv.m_event_listner[0].m_logLevel.setLogLevel(category,level)) { m_output->println(reply); m_output->println("result: Invalid category %d", category); m_output->println(""); m_mgmsrv.m_event_listner.unlock(); DBUG_VOID_RETURN; } m_mgmsrv.m_event_listner.unlock(); { LogLevel ll; ll.setLogLevel(category,level); m_mgmsrv.m_event_listner.update_max_log_level(ll); } m_output->println(reply); m_output->println("result: Ok"); m_output->println(""); DBUG_VOID_RETURN;}voidMgmApiSession::setLogLevel(Parser<MgmApiSession>::Context &, Properties const &args) { Uint32 node = 0, level = 0, cat; BaseString errorString; SetLogLevelOrd logLevel; int result; logLevel.clear(); args.get("node", &node); args.get("category", &cat); args.get("level", &level); /* XXX should use constants for this value */ if(level > 15) { m_output->println("set loglevel reply"); m_output->println("result: Invalid loglevel", errorString.c_str()); m_output->println(""); return; } LogLevel::EventCategory category= (LogLevel::EventCategory)(cat-(int)CFG_MIN_LOGLEVEL); { LogLevel ll; ll.setLogLevel(category,level); m_mgmsrv.m_event_listner.update_max_log_level(ll); } m_output->println("set loglevel reply"); m_output->println("result: Ok"); m_output->println("");}voidMgmApiSession::stopSignalLog(Parser<MgmApiSession>::Context &, Properties const &args) { Uint32 node; args.get("node", &node); int result = m_mgmsrv.stopSignalTracing(node); m_output->println("stop signallog"); if(result != 0) m_output->println("result: %s", get_error_text(result)); else m_output->println("result: Ok"); m_output->println("");}voidMgmApiSession::restart(Parser<MgmApiSession>::Context &, Properties const &args) { Uint32 nostart = 0, initialstart = 0, abort = 0; char *nodes_str; Vector<NodeId> nodes; args.get("initialstart", &initialstart); args.get("nostart", &nostart); args.get("abort", &abort); args.get("node", (const char **)&nodes_str); char *p, *last; for((p = strtok_r(nodes_str, " ", &last)); p; (p = strtok_r(NULL, " ", &last))) { nodes.push_back(atoi(p)); } int restarted = 0; int result= m_mgmsrv.restartNodes(nodes, &restarted, nostart != 0, initialstart != 0, abort != 0); m_output->println("restart reply"); if(result != 0){ m_output->println("result: %d-%s", result, get_error_text(result)); } else m_output->println("result: Ok"); m_output->println("restarted: %d", restarted); m_output->println("");}voidMgmApiSession::restartAll(Parser<MgmApiSession>::Context &, Properties const &args){ Uint32 nostart = 0; Uint32 initialstart = 0; Uint32 abort = 0; args.get("initialstart", &initialstart); args.get("abort", &abort); args.get("nostart", &nostart); int count = 0; int result = m_mgmsrv.restart(nostart, initialstart, abort, &count); m_output->println("restart reply"); if(result != 0) m_output->println("result: %s", get_error_text(result)); else m_output->println("result: Ok"); m_output->println("restarted: %d", count); m_output->println("");}static voidprintNodeStatus(OutputStream *output, MgmtSrvr &mgmsrv, enum ndb_mgm_node_type type) { NodeId nodeId = 0; while(mgmsrv.getNextNodeId(&nodeId, type)) { enum ndb_mgm_node_status status; Uint32 startPhase = 0, version = 0, dynamicId = 0, nodeGroup = 0, connectCount = 0; bool system; const char *address= NULL; mgmsrv.status(nodeId, &status, &version, &startPhase, &system, &dynamicId, &nodeGroup, &connectCount, &address); output->println("node.%d.type: %s", nodeId, ndb_mgm_get_node_type_string(type)); output->println("node.%d.status: %s", nodeId, ndb_mgm_get_node_status_string(status)); output->println("node.%d.version: %d", nodeId, version); output->println("node.%d.startphase: %d", nodeId, startPhase); output->println("node.%d.dynamic_id: %d", nodeId, dynamicId); output->println("node.%d.node_group: %d", nodeId, nodeGroup); output->println("node.%d.connect_count: %d", nodeId, connectCount); output->println("node.%d.address: %s", nodeId, address ? address : ""); }}voidMgmApiSession::getStatus(Parser<MgmApiSession>::Context &, Properties const &) { int noOfNodes = 0; NodeId nodeId = 0; while(m_mgmsrv.getNextNodeId(&nodeId, NDB_MGM_NODE_TYPE_NDB)){ noOfNodes++; } nodeId = 0; while(m_mgmsrv.getNextNodeId(&nodeId, NDB_MGM_NODE_TYPE_API)){ noOfNodes++; } nodeId = 0; while(m_mgmsrv.getNextNodeId(&nodeId, NDB_MGM_NODE_TYPE_MGM)){ noOfNodes++; } m_output->println("node status"); m_output->println("nodes: %d", noOfNodes); printNodeStatus(m_output, m_mgmsrv, NDB_MGM_NODE_TYPE_NDB); printNodeStatus(m_output, m_mgmsrv, NDB_MGM_NODE_TYPE_MGM); printNodeStatus(m_output, m_mgmsrv, NDB_MGM_NODE_TYPE_API); nodeId = 0; m_output->println("");}voidMgmApiSession::getInfoClusterLog(Parser<MgmApiSession>::Context &, Properties const &) { const char* names[] = { "enabled", "debug", "info", "warning", "error", "critical", "alert" }; m_output->println("clusterlog"); for(int i = 0; i < 7; i++) { m_output->println("%s: %d", names[i], m_mgmsrv.isEventLogFilterEnabled(i)); } m_output->println("");}voidMgmApiSession::stop(Parser<MgmApiSession>::Context &, Properties const &args) { Uint32 abort; char *nodes_str; Vector<NodeId> nodes; args.get("node", (const char **)&nodes_str); if(nodes_str == NULL) { m_output->println("stop reply"); m_output->println("result: empty node list"); m_output->println(""); return; } args.get("abort", &abort); char *p, *last; for((p = strtok_r(nodes_str, " ", &last)); p; (p = strtok_r(NULL, " ", &last))) { nodes.push_back(atoi(p)); } int stopped= 0; int result= 0; if (nodes.size()) result= m_mgmsrv.stopNodes(nodes, &stopped, abort != 0); m_output->println("stop reply"); if(result != 0) m_output->println("result: %s", get_error_text(result)); else m_output->println("result: Ok"); m_output->println("stopped: %d", stopped); m_output->println("");}voidMgmApiSession::stopAll(Parser<MgmApiSession>::Context &, Properties const &args) { int stopped = 0; Uint32 abort; args.get("abort", &abort); int result = m_mgmsrv.stop(&stopped, abort != 0); m_output->println("stop reply"); if(result != 0) m_output->println("result: %s", get_error_text(result)); else m_output->println("result: Ok"); m_output->println("stopped: %d", stopped); m_output->println("");}voidMgmApiSession::enterSingleUser(Parser<MgmApiSession>::Context &, Properties const &args) { int stopped = 0; Uint32 nodeId = 0; args.get("nodeId", &nodeId); int result = m_mgmsrv.enterSingleUser(&stopped, nodeId); m_output->println("enter single user reply"); if(result != 0) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -