diff --git a/ndb/src/common/transporter/TransporterRegistry.cpp b/ndb/src/common/transporter/TransporterRegistry.cpp index a89192b85017515fff1b3d8b1debe117d0db0ff9..b0bcf22acd4701a869b8d1ea4c55588bd2538469 100644 --- a/ndb/src/common/transporter/TransporterRegistry.cpp +++ b/ndb/src/common/transporter/TransporterRegistry.cpp @@ -1497,7 +1497,7 @@ NDB_SOCKET_TYPE TransporterRegistry::connect_ndb_mgmd(SocketClient *sc) { char c[100]; char *cs= &c[0]; - int len= strlen(sc->get_server_name())+20; + unsigned len= strlen(sc->get_server_name())+20; if( len > sizeof(c) ) { /* diff --git a/ndb/src/mgmapi/mgmapi.cpp b/ndb/src/mgmapi/mgmapi.cpp index f6427204814e10a8e50dff24deed92742c0ec6c1..548f8cbf63cda21027f4deb7281d43d8ac66f894 100644 --- a/ndb/src/mgmapi/mgmapi.cpp +++ b/ndb/src/mgmapi/mgmapi.cpp @@ -151,7 +151,7 @@ ndb_mgm_create_handle() h->socket = NDB_INVALID_SOCKET; h->read_timeout = 50000; h->write_timeout = 100; - h->cfg_i = 0; + h->cfg_i = -1; strncpy(h->last_error_desc, "No error", NDB_MGM_MAX_ERR_DESC_SIZE); @@ -178,7 +178,7 @@ ndb_mgm_set_connectstring(NdbMgmHandle handle, const char * mgmsrv) SET_ERROR(handle, NDB_MGM_ILLEGAL_CONNECT_STRING, ""); return -1; } - handle->cfg_i= 0; + handle->cfg_i= -1; return 0; } @@ -191,6 +191,10 @@ ndb_mgm_destroy_handle(NdbMgmHandle * handle) { if(!handle) return; + /** + * important! only disconnect if connected + * other code relies on this + */ if((* handle)->connected){ ndb_mgm_disconnect(* handle); } @@ -1748,13 +1752,19 @@ ndb_mgm_get_configuration_nodeid(NdbMgmHandle handle) extern "C" int ndb_mgm_get_connected_port(NdbMgmHandle handle) { - return handle->cfg.ids[handle->cfg_i].port; + if (handle->cfg_i >= 0) + return handle->cfg.ids[handle->cfg_i].port; + else + return 0; } extern "C" const char *ndb_mgm_get_connected_host(NdbMgmHandle handle) { - return handle->cfg.ids[handle->cfg_i].name.c_str(); + if (handle->cfg_i >= 0) + return handle->cfg.ids[handle->cfg_i].name.c_str(); + else + return 0; } extern "C" diff --git a/ndb/src/mgmsrv/MgmtSrvr.cpp b/ndb/src/mgmsrv/MgmtSrvr.cpp index 124091d43e420e91265dc0fc9bc42685ca28eb02..57cc8fb9284388f9ba553db97e341c7bb021eb08 100644 --- a/ndb/src/mgmsrv/MgmtSrvr.cpp +++ b/ndb/src/mgmsrv/MgmtSrvr.cpp @@ -189,16 +189,16 @@ MgmtSrvr::logLevelThreadRun() void MgmtSrvr::startEventLog() { + NdbMutex_Lock(m_configMutex); + g_eventLogger.setCategory("MgmSrvr"); - ndb_mgm_configuration_iterator * iter = ndb_mgm_create_configuration_iterator - ((ndb_mgm_configuration*)_config->m_configValues, CFG_SECTION_NODE); - if(iter == 0) - return ; - - if(ndb_mgm_find(iter, CFG_NODE_ID, _ownNodeId) != 0){ - ndb_mgm_destroy_iterator(iter); - return ; + ndb_mgm_configuration_iterator + iter(* _config->m_configValues, CFG_SECTION_NODE); + + if(iter.find(CFG_NODE_ID, _ownNodeId) != 0){ + NdbMutex_Unlock(m_configMutex); + return; } const char * tmp; @@ -206,10 +206,10 @@ MgmtSrvr::startEventLog() char *clusterLog= NdbConfig_ClusterLogFileName(_ownNodeId); NdbAutoPtr<char> tmp_aptr(clusterLog); - if(ndb_mgm_get_string_parameter(iter, CFG_LOG_DESTINATION, &tmp) == 0){ + if(iter.get(CFG_LOG_DESTINATION, &tmp) == 0){ logdest.assign(tmp); } - ndb_mgm_destroy_iterator(iter); + NdbMutex_Unlock(m_configMutex); if(logdest.length() == 0 || logdest == "") { logdest.assfmt("FILE:filename=%s,maxsize=1000000,maxfiles=6", @@ -343,42 +343,41 @@ MgmtSrvr::getNodeCount(enum ndb_mgm_node_type type) const } int -MgmtSrvr::getPort() const { - const Properties *mgmProps; - - ndb_mgm_configuration_iterator * iter = - ndb_mgm_create_configuration_iterator(_config->m_configValues, - CFG_SECTION_NODE); - if(iter == 0) +MgmtSrvr::getPort() const +{ + if(NdbMutex_Lock(m_configMutex)) return 0; - if(ndb_mgm_find(iter, CFG_NODE_ID, getOwnNodeId()) != 0){ + ndb_mgm_configuration_iterator + iter(* _config->m_configValues, CFG_SECTION_NODE); + + if(iter.find(CFG_NODE_ID, getOwnNodeId()) != 0){ ndbout << "Could not retrieve configuration for Node " << getOwnNodeId() << " in config file." << endl << "Have you set correct NodeId for this node?" << endl; - ndb_mgm_destroy_iterator(iter); + NdbMutex_Unlock(m_configMutex); return 0; } unsigned type; - if(ndb_mgm_get_int_parameter(iter, CFG_TYPE_OF_SECTION, &type) != 0 || + if(iter.get(CFG_TYPE_OF_SECTION, &type) != 0 || type != NODE_TYPE_MGM){ ndbout << "Local node id " << getOwnNodeId() << " is not defined as management server" << endl << "Have you set correct NodeId for this node?" << endl; - ndb_mgm_destroy_iterator(iter); + NdbMutex_Unlock(m_configMutex); return 0; } Uint32 port = 0; - if(ndb_mgm_get_int_parameter(iter, CFG_MGM_PORT, &port) != 0){ + if(iter.get(CFG_MGM_PORT, &port) != 0){ ndbout << "Could not find PortNumber in the configuration file." << endl; - ndb_mgm_destroy_iterator(iter); + NdbMutex_Unlock(m_configMutex); return 0; } - ndb_mgm_destroy_iterator(iter); - + NdbMutex_Unlock(m_configMutex); + return port; } @@ -472,14 +471,14 @@ MgmtSrvr::MgmtSrvr(SocketServer *socket_server, { ndb_mgm_configuration_iterator - *iter = ndb_mgm_create_configuration_iterator(_config->m_configValues, - CFG_SECTION_NODE); - for(ndb_mgm_first(iter); ndb_mgm_valid(iter); ndb_mgm_next(iter)){ + iter(* _config->m_configValues, CFG_SECTION_NODE); + + for(iter.first(); iter.valid(); iter.next()){ unsigned type, id; - if(ndb_mgm_get_int_parameter(iter, CFG_TYPE_OF_SECTION, &type) != 0) + if(iter.get(CFG_TYPE_OF_SECTION, &type) != 0) continue; - if(ndb_mgm_get_int_parameter(iter, CFG_NODE_ID, &id) != 0) + if(iter.get(CFG_NODE_ID, &id) != 0) continue; MGM_REQUIRE(id < MAX_NODES); @@ -502,7 +501,6 @@ MgmtSrvr::MgmtSrvr(SocketServer *socket_server, break; } } - ndb_mgm_destroy_iterator(iter); } _props = NULL; @@ -1884,8 +1882,6 @@ void MgmtSrvr::handleReceivedSignal(NdbApiSignal* signal) { // The way of handling a received signal is taken from the Ndb class. - int returnCode; - int gsn = signal->readSignalNumber(); switch (gsn) { @@ -2187,8 +2183,13 @@ MgmtSrvr::alloc_node_id(NodeId * nodeId, int r_config_addr= -1; unsigned type_c= 0; + if(NdbMutex_Lock(m_configMutex)) + { + error_string.appfmt("unable to lock configuration mutex"); + return false; + } ndb_mgm_configuration_iterator - iter(*(ndb_mgm_configuration *)_config->m_configValues, CFG_SECTION_NODE); + iter(* _config->m_configValues, CFG_SECTION_NODE); for(iter.first(); iter.valid(); iter.next()) { unsigned tmp= 0; if(iter.get(CFG_NODE_ID, &tmp)) abort(); @@ -2258,6 +2259,7 @@ MgmtSrvr::alloc_node_id(NodeId * nodeId, "Suggest specifying node id in connectstring,\n" "or specifying unique host names in config file.", id_found, tmp); + NdbMutex_Unlock(m_configMutex); DBUG_RETURN(false); } if (config_hostname == 0) { @@ -2270,6 +2272,7 @@ MgmtSrvr::alloc_node_id(NodeId * nodeId, } id_found= tmp; // mgmt server matched, check for more matches } + NdbMutex_Unlock(m_configMutex); if (id_found) { @@ -2682,13 +2685,18 @@ MgmtSrvr::Allocated_resources::get_nodeid() const int MgmtSrvr::setDbParameter(int node, int param, const char * value, BaseString& msg){ + + if(NdbMutex_Lock(m_configMutex)) + return -1; + /** * Check parameter */ - ndb_mgm_configuration_iterator iter(* _config->m_configValues, - CFG_SECTION_NODE); + ndb_mgm_configuration_iterator + iter(* _config->m_configValues, CFG_SECTION_NODE); if(iter.first() != 0){ msg.assign("Unable to find node section (iter.first())"); + NdbMutex_Unlock(m_configMutex); return -1; } @@ -2696,16 +2704,19 @@ MgmtSrvr::setDbParameter(int node, int param, const char * value, if(node != 0){ if(iter.find(CFG_NODE_ID, node) != 0){ msg.assign("Unable to find node (iter.find())"); + NdbMutex_Unlock(m_configMutex); return -1; } if(iter.get(CFG_TYPE_OF_SECTION, &type) != 0){ msg.assign("Unable to get node type(iter.get(CFG_TYPE_OF_SECTION))"); + NdbMutex_Unlock(m_configMutex); return -1; } } else { do { if(iter.get(CFG_TYPE_OF_SECTION, &type) != 0){ msg.assign("Unable to get node type(iter.get(CFG_TYPE_OF_SECTION))"); + NdbMutex_Unlock(m_configMutex); return -1; } if(type == NODE_TYPE_DB) @@ -2716,6 +2727,7 @@ MgmtSrvr::setDbParameter(int node, int param, const char * value, if(type != NODE_TYPE_DB){ msg.assfmt("Invalid node type or no such node (%d %d)", type, NODE_TYPE_DB); + NdbMutex_Unlock(m_configMutex); return -1; } @@ -2741,6 +2753,7 @@ MgmtSrvr::setDbParameter(int node, int param, const char * value, break; } msg.assign("Could not get parameter"); + NdbMutex_Unlock(m_configMutex); return -1; } while(0); @@ -2778,6 +2791,7 @@ MgmtSrvr::setDbParameter(int node, int param, const char * value, } while(node == 0 && iter.next() == 0); msg.assign("Success"); + NdbMutex_Unlock(m_configMutex); return 0; } @@ -2791,12 +2805,18 @@ MgmtSrvr::setConnectionDbParameter(int node1, DBUG_ENTER("MgmtSrvr::setConnectionDbParameter"); - ndb_mgm_configuration_iterator iter(* _config->m_configValues, - CFG_SECTION_CONNECTION); + if(NdbMutex_Lock(m_configMutex)) + { + DBUG_RETURN(-1); + } + + ndb_mgm_configuration_iterator + iter(* _config->m_configValues, CFG_SECTION_CONNECTION); if(iter.first() != 0){ msg.assign("Unable to find connection section (iter.first())"); - return -1; + NdbMutex_Unlock(m_configMutex); + DBUG_RETURN(-1); } for(;iter.valid();iter.next()) { @@ -2809,11 +2829,13 @@ MgmtSrvr::setConnectionDbParameter(int node1, } if(!iter.valid()) { msg.assign("Unable to find connection between nodes"); + NdbMutex_Unlock(m_configMutex); DBUG_RETURN(-2); } if(iter.get(param, ¤t_value) < 0) { msg.assign("Unable to get current value of parameter"); + NdbMutex_Unlock(m_configMutex); DBUG_RETURN(-3); } @@ -2822,15 +2844,18 @@ MgmtSrvr::setConnectionDbParameter(int node1, if(i2.set(param, (unsigned)value) == false) { msg.assign("Unable to set new value of parameter"); + NdbMutex_Unlock(m_configMutex); DBUG_RETURN(-4); } if(iter.get(param, &new_value) < 0) { msg.assign("Unable to get parameter after setting it."); + NdbMutex_Unlock(m_configMutex); DBUG_RETURN(-5); } msg.assfmt("%u -> %u",current_value,new_value); + NdbMutex_Unlock(m_configMutex); DBUG_RETURN(1); } @@ -2843,12 +2868,18 @@ MgmtSrvr::getConnectionDbParameter(int node1, BaseString& msg){ DBUG_ENTER("MgmtSrvr::getConnectionDbParameter"); - ndb_mgm_configuration_iterator iter(* _config->m_configValues, - CFG_SECTION_CONNECTION); + if(NdbMutex_Lock(m_configMutex)) + { + DBUG_RETURN(-1); + } + + ndb_mgm_configuration_iterator + iter(* _config->m_configValues, CFG_SECTION_CONNECTION); if(iter.first() != 0){ msg.assign("Unable to find connection section (iter.first())"); - return -1; + NdbMutex_Unlock(m_configMutex); + DBUG_RETURN(-1); } for(;iter.valid();iter.next()) { @@ -2861,15 +2892,18 @@ MgmtSrvr::getConnectionDbParameter(int node1, } if(!iter.valid()) { msg.assign("Unable to find connection between nodes"); - return -1; + NdbMutex_Unlock(m_configMutex); + DBUG_RETURN(-1); } if(iter.get(param, (Uint32*)value) < 0) { msg.assign("Unable to get current value of parameter"); - return -1; + NdbMutex_Unlock(m_configMutex); + DBUG_RETURN(-1); } msg.assfmt("%d",*value); + NdbMutex_Unlock(m_configMutex); DBUG_RETURN(1); } diff --git a/ndb/src/mgmsrv/Services.cpp b/ndb/src/mgmsrv/Services.cpp index 344a7afd348aea51b9127205007f9ac2f8727e94..a43bf13fd1cd08582f96d049bb13ef22912f424f 100644 --- a/ndb/src/mgmsrv/Services.cpp +++ b/ndb/src/mgmsrv/Services.cpp @@ -318,7 +318,7 @@ MgmApiSession::runSession() { break; } } - if(m_socket >= 0) + if(m_socket != NDB_INVALID_SOCKET) NDB_CLOSE_SOCKET(m_socket); } @@ -1547,7 +1547,7 @@ MgmApiSession::transporter_connect(Parser_t::Context &ctx, m_stop= true; m_stopped= true; // force a stop (no closing socket) - m_socket= -1; // so nobody closes it + m_socket= NDB_INVALID_SOCKET; // so nobody closes it m_mgmsrv.transporter_connect(s); }