diff --git a/ndb/include/mgmapi/mgmapi.h b/ndb/include/mgmapi/mgmapi.h index f667c6d3a67c53f59c299ba71a0a2556f42d60bf..726552d63d1924fa1c070e525fb87879013a0c04 100644 --- a/ndb/include/mgmapi/mgmapi.h +++ b/ndb/include/mgmapi/mgmapi.h @@ -994,7 +994,7 @@ extern "C" { * * @note the socket is now able to be used as a transporter connection */ - NDB_SOCKET_TYPE ndb_mgm_convert_to_transporter(NdbMgmHandle handle); + NDB_SOCKET_TYPE ndb_mgm_convert_to_transporter(NdbMgmHandle *handle); /** * Get the node id of the mgm server we're connected to diff --git a/ndb/include/mgmcommon/ConfigRetriever.hpp b/ndb/include/mgmcommon/ConfigRetriever.hpp index b91bb36283742689b6ef5e7bce90315b9be24520..95d257dea230117ff92bd32972356b7966c9b091 100644 --- a/ndb/include/mgmcommon/ConfigRetriever.hpp +++ b/ndb/include/mgmcommon/ConfigRetriever.hpp @@ -76,6 +76,7 @@ public: const char *get_mgmd_host() const; const char *get_connectstring(char *buf, int buf_sz) const; NdbMgmHandle get_mgmHandle() { return m_handle; }; + NdbMgmHandle* get_mgmHandlePtr() { return &m_handle; }; Uint32 get_configuration_nodeid() const; private: diff --git a/ndb/include/transporter/TransporterRegistry.hpp b/ndb/include/transporter/TransporterRegistry.hpp index f69cd058c6561407fb5f2e8098f334e9feaa88a1..363cdabe10ad619b14e04003641749278f04b250 100644 --- a/ndb/include/transporter/TransporterRegistry.hpp +++ b/ndb/include/transporter/TransporterRegistry.hpp @@ -116,7 +116,7 @@ public: */ bool connect_server(NDB_SOCKET_TYPE sockfd); - int TransporterRegistry::connect_client(NdbMgmHandle h); + bool connect_client(NdbMgmHandle *h); /** * Given a SocketClient, creates a NdbMgmHandle, turns it into a transporter @@ -128,7 +128,7 @@ public: * Given a connected NdbMgmHandle, turns it into a transporter * and returns the socket. */ - NDB_SOCKET_TYPE connect_ndb_mgmd(NdbMgmHandle h); + NDB_SOCKET_TYPE connect_ndb_mgmd(NdbMgmHandle *h); /** * Remove all transporters diff --git a/ndb/src/common/transporter/TransporterRegistry.cpp b/ndb/src/common/transporter/TransporterRegistry.cpp index 6d5f9457a24dfa17fcb9bfdd40c85670512eb388..34d5a77001850a8cd0883f33eb85e510bb40f343 100644 --- a/ndb/src/common/transporter/TransporterRegistry.cpp +++ b/ndb/src/common/transporter/TransporterRegistry.cpp @@ -1365,6 +1365,8 @@ TransporterRegistry::add_transporter_interface(NodeId remoteNodeId, bool TransporterRegistry::start_service(SocketServer& socket_server) { + struct ndb_mgm_reply mgm_reply; + DBUG_ENTER("TransporterRegistry::start_service"); if (m_transporter_interface.size() > 0 && !nodeIdSpecified) { @@ -1372,6 +1374,11 @@ TransporterRegistry::start_service(SocketServer& socket_server) DBUG_RETURN(false); } + if(!ndb_mgm_is_connected(m_mgm_handle)) + ndb_mgm_connect(m_mgm_handle, 0, 0, 0); + if(!ndb_mgm_is_connected(m_mgm_handle)) + DBUG_RETURN(false); + for (unsigned i= 0; i < m_transporter_interface.size(); i++) { Transporter_interface &t= m_transporter_interface[i]; @@ -1404,6 +1411,18 @@ TransporterRegistry::start_service(SocketServer& socket_server) } t.m_s_service_port= (t.m_s_service_port<=0)?-port:port; // -`ve if dynamic DBUG_PRINT("info", ("t.m_s_service_port = %d",t.m_s_service_port)); + + if(t.m_s_service_port < 0 + && ndb_mgm_set_connection_int_parameter(m_mgm_handle, + get_localNodeId(), + t.m_remote_nodeId, + CFG_CONNECTION_SERVER_PORT, + t.m_s_service_port, + &mgm_reply) < 0) + { + delete transporter_service; + DBUG_RETURN(false); + } transporter_service->setTransporterRegistry(this); } DBUG_RETURN(true); @@ -1521,15 +1540,18 @@ TransporterRegistry::get_transporter(NodeId nodeId) { return theTransporters[nodeId]; } -int TransporterRegistry::connect_client(NdbMgmHandle h) +bool TransporterRegistry::connect_client(NdbMgmHandle *h) { DBUG_ENTER("TransporterRegistry::connect_client(NdbMgmHandle)"); - Uint32 mgm_nodeid= ndb_mgm_get_mgmd_nodeid(h); + Uint32 mgm_nodeid= ndb_mgm_get_mgmd_nodeid(*h); + + if(!mgm_nodeid) + return false; Transporter * t = theTransporters[mgm_nodeid]; if (!t) - return -1; + return false; DBUG_RETURN(t->connect_client(connect_ndb_mgmd(h))); } @@ -1538,24 +1560,25 @@ int TransporterRegistry::connect_client(NdbMgmHandle h) * Given a connected NdbMgmHandle, turns it into a transporter * and returns the socket. */ -NDB_SOCKET_TYPE TransporterRegistry::connect_ndb_mgmd(NdbMgmHandle h) +NDB_SOCKET_TYPE TransporterRegistry::connect_ndb_mgmd(NdbMgmHandle *h) { struct ndb_mgm_reply mgm_reply; - if ( h == NULL ) + if ( h==NULL || *h == NULL ) { return NDB_INVALID_SOCKET; } for(unsigned int i=0;i < m_transporter_interface.size();i++) - if (ndb_mgm_set_connection_int_parameter(h, + if (m_transporter_interface[i].m_s_service_port < 0 + && ndb_mgm_set_connection_int_parameter(*h, get_localNodeId(), m_transporter_interface[i].m_remote_nodeId, CFG_CONNECTION_SERVER_PORT, m_transporter_interface[i].m_s_service_port, &mgm_reply) < 0) { - ndb_mgm_destroy_handle(&h); + ndb_mgm_destroy_handle(h); return NDB_INVALID_SOCKET; } @@ -1565,7 +1588,7 @@ NDB_SOCKET_TYPE TransporterRegistry::connect_ndb_mgmd(NdbMgmHandle h) */ NDB_SOCKET_TYPE sockfd= ndb_mgm_convert_to_transporter(h); if ( sockfd == NDB_INVALID_SOCKET) - ndb_mgm_destroy_handle(&h); + ndb_mgm_destroy_handle(h); return sockfd; } @@ -1613,7 +1636,7 @@ NDB_SOCKET_TYPE TransporterRegistry::connect_ndb_mgmd(SocketClient *sc) return NDB_INVALID_SOCKET; } - return connect_ndb_mgmd(h); + return connect_ndb_mgmd(&h); } template class Vector<TransporterRegistry::Transporter_interface>; diff --git a/ndb/src/kernel/vm/Configuration.cpp b/ndb/src/kernel/vm/Configuration.cpp index 02f4f2a9b9885d892b7014f9df819cb353a7f42b..29455e5b1154b2570fa5381cfde4fbc75e77f7ab 100644 --- a/ndb/src/kernel/vm/Configuration.cpp +++ b/ndb/src/kernel/vm/Configuration.cpp @@ -154,6 +154,7 @@ Configuration::Configuration() m_config_retriever= 0; m_clusterConfig= 0; m_clusterConfigIter= 0; + m_mgmd_host= NULL; } Configuration::~Configuration(){ @@ -166,6 +167,9 @@ Configuration::~Configuration(){ if(_backupPath != NULL) free(_backupPath); + if(m_mgmd_host) + free(m_mgmd_host); + if (m_config_retriever) { delete m_config_retriever; } @@ -210,8 +214,16 @@ Configuration::fetch_configuration(){ ERROR_SET(fatal, ERR_INVALID_CONFIG, "Could not connect to ndb_mgmd", s); } - m_mgmd_port= m_config_retriever->get_mgmd_port(); - m_mgmd_host= m_config_retriever->get_mgmd_host(); + { + m_mgmd_port= m_config_retriever->get_mgmd_port(); + /** + * We copy the mgmd host as the handle is later + * destroyed, so a pointer won't work + */ + int len= strlen(m_config_retriever->get_mgmd_host()); + m_mgmd_host= (char*)malloc(sizeof(char)*len); + strcpy(m_mgmd_host,m_config_retriever->get_mgmd_host()); + } ConfigRetriever &cr= *m_config_retriever; @@ -313,7 +325,8 @@ Configuration::setupConfiguration(){ ERROR_SET(fatal, ERR_INVALID_CONFIG, "Invalid configuration fetched", "No transporters configured"); } - if(!globalTransporterRegistry.connect_client(m_config_retriever->get_mgmHandle())) + if(!globalTransporterRegistry.connect_client( + m_config_retriever->get_mgmHandlePtr())) ERROR_SET(fatal, ERR_INVALID_CONFIG, "Connection to mgmd terminated before setup was complete", "StopOnError missing"); } diff --git a/ndb/src/kernel/vm/Configuration.hpp b/ndb/src/kernel/vm/Configuration.hpp index a257881e35338f1306628ed82d24f1fd1423723b..dd690665413a0c48020b1ca40ffbea420664201d 100644 --- a/ndb/src/kernel/vm/Configuration.hpp +++ b/ndb/src/kernel/vm/Configuration.hpp @@ -67,7 +67,7 @@ public: const ndb_mgm_configuration_iterator * getOwnConfigIterator() const; Uint32 get_mgmd_port() const {return m_mgmd_port;}; - const char *get_mgmd_host() const {return m_mgmd_host;}; + char *get_mgmd_host() const {return m_mgmd_host;}; ConfigRetriever* get_config_retriever() { return m_config_retriever; }; class LogLevel * m_logLevel; @@ -99,7 +99,7 @@ private: bool _initialStart; char * _connectString; Uint32 m_mgmd_port; - const char *m_mgmd_host; + char *m_mgmd_host; bool _daemonMode; void calcSizeAlt(class ConfigValues * ); diff --git a/ndb/src/mgmapi/mgmapi.cpp b/ndb/src/mgmapi/mgmapi.cpp index f326a77a8af80a0aa32a86192b543020877af342..99b6efe320b8adee347cab15355c9588236beae7 100644 --- a/ndb/src/mgmapi/mgmapi.cpp +++ b/ndb/src/mgmapi/mgmapi.cpp @@ -2189,21 +2189,21 @@ ndb_mgm_get_connection_int_parameter(NdbMgmHandle handle, extern "C" NDB_SOCKET_TYPE -ndb_mgm_convert_to_transporter(NdbMgmHandle handle) +ndb_mgm_convert_to_transporter(NdbMgmHandle *handle) { NDB_SOCKET_TYPE s; - CHECK_HANDLE(handle, NDB_INVALID_SOCKET); - CHECK_CONNECTED(handle, NDB_INVALID_SOCKET); + CHECK_HANDLE((*handle), NDB_INVALID_SOCKET); + CHECK_CONNECTED((*handle), NDB_INVALID_SOCKET); - handle->connected= 0; // we pretend we're disconnected - s= handle->socket; + (*handle)->connected= 0; // we pretend we're disconnected + s= (*handle)->socket; SocketOutputStream s_output(s); s_output.println("transporter connect"); s_output.println(""); - ndb_mgm_destroy_handle(&handle); // set connected=0, so won't disconnect + ndb_mgm_destroy_handle(handle); // set connected=0, so won't disconnect return s; }