diff options
Diffstat (limited to 'ndb/src/mgmsrv/MgmtSrvr.cpp')
-rw-r--r-- | ndb/src/mgmsrv/MgmtSrvr.cpp | 255 |
1 files changed, 210 insertions, 45 deletions
diff --git a/ndb/src/mgmsrv/MgmtSrvr.cpp b/ndb/src/mgmsrv/MgmtSrvr.cpp index 011643237f8..fae0941beb8 100644 --- a/ndb/src/mgmsrv/MgmtSrvr.cpp +++ b/ndb/src/mgmsrv/MgmtSrvr.cpp @@ -205,16 +205,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; @@ -222,10 +222,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", @@ -359,42 +359,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; } @@ -488,14 +487,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); @@ -518,7 +517,6 @@ MgmtSrvr::MgmtSrvr(SocketServer *socket_server, break; } } - ndb_mgm_destroy_iterator(iter); } _props = NULL; @@ -594,7 +592,8 @@ MgmtSrvr::start(BaseString &error_string) DBUG_RETURN(false); } } - theFacade= TransporterFacade::theFacadeInstance= new TransporterFacade(); + theFacade= TransporterFacade::theFacadeInstance + = new TransporterFacade(); if(theFacade == 0) { DEBUG("MgmtSrvr.cpp: theFacade is NULL."); @@ -622,7 +621,26 @@ MgmtSrvr::start(BaseString &error_string) theFacade = 0; DBUG_RETURN(false); } - + + TransporterRegistry *reg = theFacade->get_registry(); + for(unsigned int i=0;i<reg->m_transporter_interface.size();i++) { + BaseString msg; + DBUG_PRINT("info",("Setting dynamic port %d->%d : %d", + reg->get_localNodeId(), + reg->m_transporter_interface[i].m_remote_nodeId, + reg->m_transporter_interface[i].m_s_service_port + ) + ); + int res = setConnectionDbParameter((int)reg->get_localNodeId(), + (int)reg->m_transporter_interface[i] + .m_remote_nodeId, + (int)CFG_CONNECTION_SERVER_PORT, + reg->m_transporter_interface[i] + .m_s_service_port, + msg); + DBUG_PRINT("info",("Set result: %d: %s",res,msg.c_str())); + } + _ownReference = numberToRef(_blockNumber, _ownNodeId); startEventLog(); @@ -1890,8 +1908,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) { @@ -2022,9 +2038,9 @@ MgmtSrvr::handleStatus(NodeId nodeId, bool alive, bool nfComplete) theData[1] = nodeId; if (alive) { m_started_nodes.push_back(nodeId); - theData[0] = EventReport::Connected; + theData[0] = NDB_LE_Connected; } else { - theData[0] = EventReport::Disconnected; + theData[0] = NDB_LE_Disconnected; if(nfComplete) { handleStopReply(nodeId, 0); @@ -2104,10 +2120,7 @@ MgmtSrvr::get_connected_nodes(NodeBitmask &connected_nodes) const if (getNodeType(i) == NDB_MGM_NODE_TYPE_NDB) { const ClusterMgr::Node &node= theFacade->theClusterMgr->getNodeInfo(i); - if (node.connected) - { - connected_nodes.bitOR(node.m_state.m_connected_nodes); - } + connected_nodes.bitOR(node.m_state.m_connected_nodes); } } } @@ -2149,8 +2162,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)) require(false); @@ -2217,6 +2235,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) { @@ -2229,6 +2248,7 @@ MgmtSrvr::alloc_node_id(NodeId * nodeId, } id_found= tmp; // mgmt server matched, check for more matches } + NdbMutex_Unlock(m_configMutex); if (id_found) { @@ -2371,7 +2391,7 @@ MgmtSrvr::eventReport(NodeId nodeId, const Uint32 * theData) { const EventReport * const eventReport = (EventReport *)&theData[0]; - EventReport::EventType type = eventReport->getEventType(); + Ndb_logevent_type type = eventReport->getEventType(); // Log event g_eventLogger.log(type, theData, nodeId, &m_event_listner[0].m_logLevel); @@ -2625,13 +2645,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; } @@ -2639,16 +2664,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) @@ -2659,6 +2687,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; } @@ -2684,6 +2713,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); @@ -2721,9 +2751,144 @@ MgmtSrvr::setDbParameter(int node, int param, const char * value, } while(node == 0 && iter.next() == 0); msg.assign("Success"); + NdbMutex_Unlock(m_configMutex); return 0; } +int +MgmtSrvr::setConnectionDbParameter(int node1, + int node2, + int param, + int value, + BaseString& msg){ + Uint32 current_value,new_value; + + DBUG_ENTER("MgmtSrvr::setConnectionDbParameter"); + + 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())"); + NdbMutex_Unlock(m_configMutex); + DBUG_RETURN(-1); + } + + for(;iter.valid();iter.next()) { + Uint32 n1,n2; + iter.get(CFG_CONNECTION_NODE_1, &n1); + iter.get(CFG_CONNECTION_NODE_2, &n2); + if((n1 == (unsigned)node1 && n2 == (unsigned)node2) + || (n1 == (unsigned)node2 && n2 == (unsigned)node1)) + break; + } + 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); + } + + ConfigValues::Iterator i2(_config->m_configValues->m_config, + iter.m_config); + + 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); +} + + +int +MgmtSrvr::getConnectionDbParameter(int node1, + int node2, + int param, + int *value, + BaseString& msg){ + DBUG_ENTER("MgmtSrvr::getConnectionDbParameter"); + + 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())"); + NdbMutex_Unlock(m_configMutex); + DBUG_RETURN(-1); + } + + for(;iter.valid();iter.next()) { + Uint32 n1=0,n2=0; + iter.get(CFG_CONNECTION_NODE_1, &n1); + iter.get(CFG_CONNECTION_NODE_2, &n2); + if((n1 == (unsigned)node1 && n2 == (unsigned)node2) + || (n1 == (unsigned)node2 && n2 == (unsigned)node1)) + break; + } + if(!iter.valid()) { + msg.assign("Unable to find connection between nodes"); + NdbMutex_Unlock(m_configMutex); + DBUG_RETURN(-1); + } + + if(iter.get(param, (Uint32*)value) != 0) { + msg.assign("Unable to get current value of parameter"); + NdbMutex_Unlock(m_configMutex); + DBUG_RETURN(-1); + } + + msg.assfmt("%d",*value); + NdbMutex_Unlock(m_configMutex); + DBUG_RETURN(1); +} + +void MgmtSrvr::transporter_connect(NDB_SOCKET_TYPE sockfd) +{ + if (theFacade->get_registry()->connect_server(sockfd)) + { + /** + * Force an update_connections() so that the + * ClusterMgr and TransporterFacade is up to date + * with the new connection. + * Important for correct node id reservation handling + */ + NdbMutex_Lock(theFacade->theMutexPtr); + theFacade->get_registry()->update_connections(); + NdbMutex_Unlock(theFacade->theMutexPtr); + } +} + +int MgmtSrvr::set_connect_string(const char *str) +{ + return ndb_mgm_set_connectstring(m_config_retriever->get_mgmHandle(),str); +} + + template class Vector<SigMatch>; #if __SUNPRO_CC != 0x560 template bool SignalQueue::waitFor<SigMatch>(Vector<SigMatch>&, SigMatch**, NdbApiSignal**, unsigned); |