services.cpp
来自「MySQL源码文件5.X系列, 可自已编译到服务器」· C++ 代码 · 共 1,723 行 · 第 1/4 页
CPP
1,723 行
}voidMgmApiSession::get_nodeid(Parser_t::Context &, const class Properties &args){ const char *cmd= "get nodeid reply"; Uint32 version, nodeid= 0, nodetype= 0xff; Uint32 timeout= 20; // default seconds timeout const char * transporter; const char * user; const char * password; const char * public_key; const char * endian= NULL; const char * name= NULL; Uint32 log_event= 1; bool log_event_version; union { long l; char c[sizeof(long)]; } endian_check; args.get("version", &version); args.get("nodetype", &nodetype); args.get("transporter", &transporter); args.get("nodeid", &nodeid); args.get("user", &user); args.get("password", &password); args.get("public key", &public_key); args.get("endian", &endian); args.get("name", &name); args.get("timeout", &timeout); /* for backwards compatability keep track if client uses new protocol */ log_event_version= args.get("log_event", &log_event); endian_check.l = 1; if(endian && strcmp(endian,(endian_check.c[sizeof(long)-1])?"big":"little")!=0) { m_output->println(cmd); m_output->println("result: Node does not have the same endianness as the management server."); m_output->println(""); return; } bool compatible; switch (nodetype) { case NODE_TYPE_MGM: case NODE_TYPE_API: compatible = ndbCompatible_mgmt_api(NDB_VERSION, version); break; case NODE_TYPE_DB: compatible = ndbCompatible_mgmt_ndb(NDB_VERSION, version); break; default: m_output->println(cmd); m_output->println("result: unknown nodetype %d", nodetype); m_output->println(""); return; } struct sockaddr_in addr; SOCKET_SIZE_TYPE addrlen= sizeof(addr); int r = getpeername(m_socket, (struct sockaddr*)&addr, &addrlen); if (r != 0 ) { m_output->println(cmd); m_output->println("result: getpeername(%d) failed, err= %d", m_socket, r); m_output->println(""); return; } NodeId tmp= nodeid; if(tmp == 0 || !m_allocated_resources->is_reserved(tmp)){ BaseString error_string; int error_code; NDB_TICKS tick= 0; /* only report error on second attempt as not to clog the cluster log */ while (!m_mgmsrv.alloc_node_id(&tmp, (enum ndb_mgm_node_type)nodetype, (struct sockaddr*)&addr, &addrlen, error_code, error_string, tick == 0 ? 0 : log_event)) { /* NDB_MGM_ALLOCID_CONFIG_MISMATCH is a non retriable error */ if (tick == 0 && error_code != NDB_MGM_ALLOCID_CONFIG_MISMATCH) { // attempt to free any timed out reservations tick= NdbTick_CurrentMillisecond(); struct PurgeStruct ps; m_mgmsrv.get_connected_nodes(ps.free_nodes); // invert connected_nodes to get free nodes ps.free_nodes.bitXORC(NodeBitmask()); ps.str= 0; ps.tick= tick; m_mgmsrv.get_socket_server()-> foreachSession(stop_session_if_timed_out,&ps); m_mgmsrv.get_socket_server()->checkSessions(); error_string = ""; continue; } const char *alias; const char *str; alias= ndb_mgm_get_node_type_alias_string((enum ndb_mgm_node_type) nodetype, &str); m_output->println(cmd); m_output->println("result: %s", error_string.c_str()); /* only use error_code protocol if client knows about it */ if (log_event_version) m_output->println("error_code: %d", error_code); m_output->println(""); return; } } #if 0 if (!compatible){ m_output->println(cmd); m_output->println("result: incompatible version mgmt 0x%x and node 0x%x", NDB_VERSION, version); m_output->println(""); return; }#endif m_output->println(cmd); m_output->println("nodeid: %u", tmp); m_output->println("result: Ok"); m_output->println(""); m_allocated_resources->reserve_node(tmp, timeout*1000); if (name) g_eventLogger.info("Node %d: %s", tmp, name); return;}voidMgmApiSession::getConfig_common(Parser_t::Context &, const class Properties &args, bool compat) { Uint32 version, node = 0; args.get("version", &version); args.get("node", &node); const Config *conf = m_mgmsrv.getConfig(); if(conf == NULL) { m_output->println("get config reply"); m_output->println("result: Could not fetch configuration"); m_output->println(""); return; } if(version > 0 && version < makeVersion(3, 5, 0) && compat){ Properties *reply = backward("", conf->m_oldConfig); reply->put("Version", version); reply->put("LocalNodeId", node); backward("", reply); //reply->print(); const Uint32 size = reply->getPackedSize(); 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::getClusterLogLevel(Parser<MgmApiSession>::Context & , Properties const &) { const char* names[] = { "startup", "shutdown", "statistics", "checkpoint", "noderestart", "connection", "info", "warning", "error", "congestion", "debug", "backup" }; int loglevel_count = (CFG_MAX_LOGLEVEL - CFG_MIN_LOGLEVEL + 1) ; LogLevel::EventCategory category; m_output->println("get cluster loglevel"); for(int i = 0; i < loglevel_count; i++) { category = (LogLevel::EventCategory) i; m_output->println("%s: %d", names[i], m_mgmsrv.m_event_listner[0].m_logLevel.getLogLevel(category)); } m_output->println("");}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);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?