diff --git a/ndb/include/mgmapi/mgmapi.h b/ndb/include/mgmapi/mgmapi.h index 1870dac60ad..c2f326995d6 100644 --- a/ndb/include/mgmapi/mgmapi.h +++ b/ndb/include/mgmapi/mgmapi.h @@ -519,6 +519,13 @@ extern "C" { */ int ndb_mgm_connect(NdbMgmHandle handle, int no_retries, int retry_delay_in_seconds, int verbose); + /** + * Return true if connected. + * + * @param handle Management handle + * @return 0 if not connected, non-zero if connected. + */ + int ndb_mgm_is_connected(NdbMgmHandle handle); /** * Disconnects from a management server diff --git a/ndb/src/common/transporter/TransporterRegistry.cpp b/ndb/src/common/transporter/TransporterRegistry.cpp index b0bcf22acd4..f07deafc98d 100644 --- a/ndb/src/common/transporter/TransporterRegistry.cpp +++ b/ndb/src/common/transporter/TransporterRegistry.cpp @@ -1211,11 +1211,34 @@ TransporterRegistry::start_clients_thread() switch(performStates[nodeId]){ case CONNECTING: if(!t->isConnected() && !t->isServer) { + int result= 0; + /** + * First, we try to connect (if we have a port number). + */ + if (t->get_s_port()) + result= t->connect_client(); + + + if (result<0 && t->get_s_port()!=0) + g_eventLogger.warning("Error while trying to make connection " + "(Node %u to %u via port %u) " + "error: %d. Retrying...", + t->getRemoteNodeId(), + t->getLocalNodeId(), + t->get_s_port()); + + /** + * If dynamic, get the port for connecting from the management server + */ if(t->get_s_port() <= 0) { // Port is dynamic int server_port= 0; struct ndb_mgm_reply mgm_reply; int res; + if(!ndb_mgm_is_connected(m_mgm_handle)) + if(ndb_mgm_connect(m_mgm_handle, 0, 0, 0)<0) + ndbout_c("Failed to reconnect to management server"); + res= ndb_mgm_get_connection_int_parameter(m_mgm_handle, t->getRemoteNodeId(), t->getLocalNodeId(), @@ -1231,17 +1254,6 @@ TransporterRegistry::start_clients_thread() else ndbout_c("Failed to get dynamic port to connect to: %d", res); } - if (theTransporterTypes[nodeId] != tt_TCP_TRANSPORTER - || t->get_s_port() > 0) { - int result = t->connect_client(); - if (result<0) - ndbout_c("Error while trying to make connection (Node %u to" - " %u via port %u) error: %d. Retrying...", - t->getRemoteNodeId(), - t->getLocalNodeId(), - t->get_s_port()); - } else - NdbSleep_MilliSleep(400); // wait before retrying } break; case DISCONNECTING: diff --git a/ndb/src/mgmapi/mgmapi.cpp b/ndb/src/mgmapi/mgmapi.cpp index 548f8cbf63c..cde0c9b5d9e 100644 --- a/ndb/src/mgmapi/mgmapi.cpp +++ b/ndb/src/mgmapi/mgmapi.cpp @@ -334,6 +334,17 @@ ndb_mgm_call(NdbMgmHandle handle, const ParserRow *command_reply, return p; } +/** + * Returns true if connected + */ +extern "C" +int ndb_mgm_is_connected(NdbMgmHandle handle) +{ + if(!handle) + return 0; + return handle->connected; +} + /** * Connect to a management server */