📄 services.cpp
字号:
m_output->println("result: %s", get_error_text(result)); } else { m_output->println("result: Ok"); } m_output->println("");}voidMgmApiSession::exitSingleUser(Parser<MgmApiSession>::Context &, Properties const &args) { int stopped = 0; int result = m_mgmsrv.exitSingleUser(&stopped, false); m_output->println("exit single user reply"); if(result != 0) m_output->println("result: %s", get_error_text(result)); else m_output->println("result: Ok"); m_output->println("");}voidMgmApiSession::startSignalLog(Parser<MgmApiSession>::Context &, Properties const &args) { Uint32 node; args.get("node", &node); int result = m_mgmsrv.startSignalTracing(node); m_output->println("start signallog reply"); if(result != 0) m_output->println("result: %s", get_error_text(result)); else m_output->println("result: Ok"); m_output->println("");}voidMgmApiSession::logSignals(Parser<MgmApiSession>::Context &, Properties const &args) { Uint32 node = 0, in = 0, out = 0; // BaseString blocks; BaseString blockList; char * blockName; args.get("node", &node); args.get("in", &in); args.get("out", &out); args.get("blocks", blockList); // fast fix - pekka char buf[200]; BaseString::snprintf(buf, 200, "%s", blockList.c_str()); Vector<BaseString> blocks; blockName=strtok(buf,"|"); while( blockName != NULL) { blocks.push_back(blockName); blockName=strtok(NULL,"|"); } if(in > 1 || out > 1) return; /* Invalid arguments */ const MgmtSrvr::LogMode modes[] = { MgmtSrvr::Off, MgmtSrvr::Out, MgmtSrvr::In, MgmtSrvr::InOut, }; MgmtSrvr::LogMode mode = modes[in<<1 | out]; int result = m_mgmsrv.setSignalLoggingMode(node, mode, blocks); m_output->println("log signals reply"); if(result != 0) m_output->println("result: %s", get_error_text(result)); else m_output->println("result: Ok"); m_output->println("");}voidMgmApiSession::start(Parser<MgmApiSession>::Context &, Properties const &args) { Uint32 node; args.get("node", &node); int result = m_mgmsrv.start(node); m_output->println("start reply"); if(result != 0) m_output->println("result: %s", get_error_text(result)); else m_output->println("result: Ok"); m_output->println("");}voidMgmApiSession::startAll(Parser<MgmApiSession>::Context &, Properties const &) { NodeId node = 0; int started = 0; while(m_mgmsrv.getNextNodeId(&node, NDB_MGM_NODE_TYPE_NDB)) if(m_mgmsrv.start(node) == 0) started++; m_output->println("start reply"); m_output->println("result: Ok"); m_output->println("started: %d", started); m_output->println("");}voidMgmApiSession::setLogFilter(Parser_t::Context &ctx, const class Properties &args) { Uint32 severity; Uint32 enable; args.get("level", &severity); args.get("enable", &enable); int result = m_mgmsrv.setEventLogFilter(severity, enable); m_output->println("set logfilter reply"); m_output->println("result: %d", result); m_output->println("");}static NdbOut&operator<<(NdbOut& out, const LogLevel & ll){ out << "[LogLevel: "; for(size_t i = 0; i<LogLevel::LOGLEVEL_CATEGORIES; i++) out << ll.getLogLevel((LogLevel::EventCategory)i) << " "; out << "]"; return out;}voidNdb_mgmd_event_service::log(int eventType, const Uint32* theData, NodeId nodeId){ Uint32 threshold; LogLevel::EventCategory cat; Logger::LoggerLevel severity; EventLoggerBase::EventTextFunction textF; int i, n; DBUG_ENTER("Ndb_mgmd_event_service::log"); DBUG_PRINT("enter",("eventType=%d, nodeid=%d", eventType, nodeId)); if (EventLoggerBase::event_lookup(eventType,cat,threshold,severity,textF)) DBUG_VOID_RETURN; char m_text[256]; EventLogger::getText(m_text, sizeof(m_text), textF, theData, nodeId); BaseString str("log event reply\n"); str.appfmt("type=%d\n", eventType); str.appfmt("time=%d\n", 0); str.appfmt("source_nodeid=%d\n", nodeId); for (i= 0; ndb_logevent_body[i].token; i++) { if ( ndb_logevent_body[i].type != eventType) continue; int val= theData[ndb_logevent_body[i].index]; if (ndb_logevent_body[i].index_fn) val= (*(ndb_logevent_body[i].index_fn))(val); str.appfmt("%s=%d\n",ndb_logevent_body[i].token, val); } Vector<NDB_SOCKET_TYPE> copy; m_clients.lock(); for(i = m_clients.size() - 1; i >= 0; i--) { if(threshold <= m_clients[i].m_logLevel.getLogLevel(cat)) { NDB_SOCKET_TYPE fd= m_clients[i].m_socket; if(fd != NDB_INVALID_SOCKET) { int r; if (m_clients[i].m_parsable) r= println_socket(fd, MAX_WRITE_TIMEOUT, str.c_str()); else r= println_socket(fd, MAX_WRITE_TIMEOUT, m_text); if (r == -1) { copy.push_back(fd); m_clients.erase(i, false); } } } } m_clients.unlock(); if ((n= (int)copy.size())) { for(i= 0; i < n; i++) NDB_CLOSE_SOCKET(copy[i]); LogLevel tmp; tmp.clear(); m_clients.lock(); for(i= m_clients.size() - 1; i >= 0; i--) tmp.set_max(m_clients[i].m_logLevel); m_clients.unlock(); update_log_level(tmp); } DBUG_VOID_RETURN;}voidNdb_mgmd_event_service::update_max_log_level(const LogLevel &log_level){ LogLevel tmp= m_logLevel; tmp.set_max(log_level); update_log_level(tmp);}voidNdb_mgmd_event_service::update_log_level(const LogLevel &tmp){ if(!(tmp == m_logLevel)){ m_logLevel = tmp; EventSubscribeReq req; req = tmp; req.blockRef = 0; m_mgmsrv->m_log_level_requests.push_back(req); }}voidNdb_mgmd_event_service::check_listeners(){ int i, n= 0; DBUG_ENTER("Ndb_mgmd_event_service::check_listeners"); m_clients.lock(); for(i= m_clients.size() - 1; i >= 0; i--) { int fd= m_clients[i].m_socket; DBUG_PRINT("info",("%d %d",i,fd)); char buf[1]; buf[0]=0; if (fd != NDB_INVALID_SOCKET && println_socket(fd,MAX_WRITE_TIMEOUT,"<PING>") == -1) { NDB_CLOSE_SOCKET(fd); m_clients.erase(i, false); n=1; } } if (n) { LogLevel tmp; tmp.clear(); for(i= m_clients.size() - 1; i >= 0; i--) tmp.set_max(m_clients[i].m_logLevel); update_log_level(tmp); } m_clients.unlock(); DBUG_VOID_RETURN;}voidNdb_mgmd_event_service::add_listener(const Event_listener& client){ DBUG_ENTER("Ndb_mgmd_event_service::add_listener"); DBUG_PRINT("enter",("client.m_socket: %d", client.m_socket)); check_listeners(); m_clients.push_back(client); update_max_log_level(client.m_logLevel); DBUG_VOID_RETURN;}voidNdb_mgmd_event_service::stop_sessions(){ m_clients.lock(); for(int i = m_clients.size() - 1; i >= 0; i--){ if(m_clients[i].m_socket != NDB_INVALID_SOCKET){ NDB_CLOSE_SOCKET(m_clients[i].m_socket); m_clients.erase(i); } } m_clients.unlock();}voidMgmApiSession::setParameter(Parser_t::Context &, Properties const &args) { BaseString node, param, value; args.get("node", node); args.get("parameter", param); args.get("value", value); BaseString result; int ret = m_mgmsrv.setDbParameter(atoi(node.c_str()), atoi(param.c_str()), value.c_str(), result); m_output->println("set parameter reply"); m_output->println("message: %s", result.c_str()); m_output->println("result: %d", ret); m_output->println("");}voidMgmApiSession::setConnectionParameter(Parser_t::Context &ctx, Properties const &args) { BaseString node1, node2, param, value; args.get("node1", node1); args.get("node2", node2); args.get("param", param); args.get("value", value); BaseString result; int ret = m_mgmsrv.setConnectionDbParameter(atoi(node1.c_str()), atoi(node2.c_str()), atoi(param.c_str()), atoi(value.c_str()), result); m_output->println("set connection parameter reply"); m_output->println("message: %s", result.c_str()); m_output->println("result: %s", (ret>0)?"Ok":"Failed"); m_output->println("");}voidMgmApiSession::getConnectionParameter(Parser_t::Context &ctx, Properties const &args) { BaseString node1, node2, param; int value = 0; args.get("node1", node1); args.get("node2", node2); args.get("param", param); BaseString result; int ret = m_mgmsrv.getConnectionDbParameter(atoi(node1.c_str()), atoi(node2.c_str()), atoi(param.c_str()), &value, result); m_output->println("get connection parameter reply"); m_output->println("value: %d", value); m_output->println("result: %s", (ret>0)?"Ok":result.c_str()); m_output->println("");}voidMgmApiSession::listen_event(Parser<MgmApiSession>::Context & ctx, Properties const & args) { Uint32 parsable= 0; BaseString node, param, value; args.get("node", node); args.get("filter", param); args.get("parsable", &parsable); int result = 0; BaseString msg; Ndb_mgmd_event_service::Event_listener le; le.m_parsable = parsable; le.m_socket = m_socket; Vector<BaseString> list; param.trim(); param.split(list, " ,"); for(size_t i = 0; i<list.size(); i++){ Vector<BaseString> spec; list[i].trim(); list[i].split(spec, "=:"); if(spec.size() != 2){ msg.appfmt("Invalid filter specification: >%s< >%s< %d", param.c_str(), list[i].c_str(), spec.size()); result = -1; goto done; } spec[0].trim().ndb_toupper(); int category = ndb_mgm_match_event_category(spec[0].c_str()); if(category == NDB_MGM_ILLEGAL_EVENT_CATEGORY){ category = atoi(spec[0].c_str()); if(category < NDB_MGM_MIN_EVENT_CATEGORY || category > NDB_MGM_MAX_EVENT_CATEGORY){ msg.appfmt("Unknown category: >%s<", spec[0].c_str()); result = -1; goto done; } } int level = atoi(spec[1].c_str()); if(level < 0 || level > 15){ msg.appfmt("Invalid level: >%s<", spec[1].c_str()); result = -1; goto done; } category -= CFG_MIN_LOGLEVEL; le.m_logLevel.setLogLevel((LogLevel::EventCategory)category, level); } if(list.size() == 0){ msg.appfmt("Empty filter specification"); result = -1; goto done; } m_mgmsrv.m_event_listner.add_listener(le); m_stop = true; m_socket = NDB_INVALID_SOCKET;done: m_output->println("listen event"); m_output->println("result: %d", result); if(result != 0) m_output->println("msg: %s", msg.c_str()); m_output->println("");}struct PurgeStruct{ NodeBitmask free_nodes;/* free nodes as reported * by ndbd in apiRegReqConf */ BaseString *str;};voidMgmApiSession::stop_session_if_not_connected(SocketServer::Session *_s, void *data){ MgmApiSession *s= (MgmApiSession *)_s; struct PurgeStruct &ps= *(struct PurgeStruct *)data; if (s->m_allocated_resources->is_reserved(ps.free_nodes)) { ps.str->appfmt(" %d", s->m_allocated_resources->get_nodeid()); s->stopSession(); }}voidMgmApiSession::purge_stale_sessions(Parser_t::Context &ctx, const class Properties &args){ struct PurgeStruct ps; BaseString str; ps.str = &str; m_mgmsrv.get_connected_nodes(ps.free_nodes); ps.free_nodes.bitXORC(NodeBitmask()); // invert connected_nodes to get free nodes m_mgmsrv.get_socket_server()->foreachSession(stop_session_if_not_connected,&ps); m_output->println("purge stale sessions reply"); if (str.length() > 0) m_output->println("purged:%s",str.c_str()); m_output->println("result: Ok"); m_output->println("");}voidMgmApiSession::check_connection(Parser_t::Context &ctx, const class Properties &args){ m_output->println("check connection reply"); m_output->println("result: Ok"); m_output->println("");}voidMgmApiSession::transporter_connect(Parser_t::Context &ctx, Properties const &args){ m_mgmsrv.transporter_connect(m_socket); m_stop= true; m_stopped= true; // force a stop (no closing socket) m_socket= NDB_INVALID_SOCKET; // so nobody closes it}voidMgmApiSession::get_mgmd_nodeid(Parser_t::Context &ctx, Properties const &args){ m_output->println("get mgmd nodeid reply"); m_output->println("nodeid:%u",m_mgmsrv.getOwnNodeId()); m_output->println("");}voidMgmApiSession::report_event(Parser_t::Context &ctx, Properties const &args){ Uint32 length; const char *data_string; Uint32 data[25]; args.get("length", &length); args.get("data", &data_string); BaseString tmp(data_string); Vector<BaseString> item; tmp.split(item, " "); for (int i = 0; i < length ; i++) { sscanf(item[i].c_str(), "%u", data+i); } m_mgmsrv.eventReport(data); m_output->println("report event reply"); m_output->println("result: ok"); m_output->println("");}template class MutexVector<int>;template class Vector<ParserRow<MgmApiSession> const*>;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -