Commit bb5a2f28 authored by unknown's avatar unknown
Browse files

Use the mgm connection used for fetching configuration as a transporter.


ndb/include/mgmapi/mgmapi.h:
  Add mgmapi call: ndb_mgm_get_mgmd_nodeid()
  
  - returns the node id that the handle is connected to.
  - returns 0 on error.
ndb/include/transporter/TransporterRegistry.hpp:
  Add TransporterRegistry::connect_client(NdbMgmHandle h)
   - uses a connected NdbMgmHandle to connect to the mgm server as a client.
   - sets up a transporter connection
   - used to transform the initial mgm connection (used for fetching configuration)
     into a transporter connection
  
  Added connect_ndb_mgmd(NdbMgmHandle h)
   - turn the supplied mgm connection into a transporter connection
   - return the socket
  
  Improve comments on connect_ndb_mgmd(SocketClient)
ndb/src/common/transporter/Transporter.cpp:
  Add Transporter::connect_client(NDB_SOCKET_TYPE)
   - use an existing socket to make a transporter connection
ndb/src/common/transporter/Transporter.hpp:
  Add connect_client(NDB_SOCKET_TYPE)
ndb/src/common/transporter/TransporterRegistry.cpp:
  Add TransporterRegistry::connect_client(NdbMgmHandle)
   - use an existing mgm connection to connect a transporter
   - used to change the mgm connection used for fetching configuration into a transporter
  
  Add connect_ndb_mgmd(NdbMgmHandle)
   - use existing NdbMgmHandle
   - convert to transporter
   - return socket
ndb/src/kernel/vm/Configuration.cpp:
  After fetching configuration, use the mgm connection as a transporter.
  Fail fatally if this fails.
ndb/src/mgmapi/mgmapi.cpp:
  Add ndb_mgm_get_mgmd_nodeid(h)
   - returns the node id of the mgm server you're connected to.
ndb/src/mgmsrv/Services.cpp:
  Add "get mgmd nodeid" mgmd call
  
  returns 'nodeid' - the node id of the mgm server your connected to
ndb/src/mgmsrv/Services.hpp:
  add prototype for get_mgmd_nodeid
parent 3bd6f299
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -996,6 +996,10 @@ extern "C" {
   */
  NDB_SOCKET_TYPE ndb_mgm_convert_to_transporter(NdbMgmHandle handle);

  /**
   * Get the node id of the mgm server we're connected to
   */
  Uint32 ndb_mgm_get_mgmd_nodeid(NdbMgmHandle handle);

  /**
   * Config iterator
+10 −1
Original line number Diff line number Diff line
@@ -116,11 +116,20 @@ public:
   */
  bool connect_server(NDB_SOCKET_TYPE sockfd);

  int TransporterRegistry::connect_client(NdbMgmHandle h);

  /**
   * use a mgmd connection to connect as a transporter
   * Given a SocketClient, creates a NdbMgmHandle, turns it into a transporter
   * and returns the socket.
   */
  NDB_SOCKET_TYPE connect_ndb_mgmd(SocketClient *sc);

  /**
   * Given a connected NdbMgmHandle, turns it into a transporter
   * and returns the socket.
   */
  NDB_SOCKET_TYPE connect_ndb_mgmd(NdbMgmHandle h);

  /**
   * Remove all transporters
   */
+9 −0
Original line number Diff line number Diff line
@@ -124,6 +124,15 @@ Transporter::connect_client() {
  else
    sockfd= m_socket_client->connect();

  connect_client(sockfd);
}  

bool
Transporter::connect_client(NDB_SOCKET_TYPE sockfd) {

  if(m_connected)
    return true;

  if (sockfd == NDB_INVALID_SOCKET)
    return false;

+1 −0
Original line number Diff line number Diff line
@@ -44,6 +44,7 @@ public:
   *    Use isConnected() to check status
   */
  bool connect_client();
  bool connect_client(NDB_SOCKET_TYPE sockfd);
  bool connect_server(NDB_SOCKET_TYPE socket);

  /**
+53 −17
Original line number Diff line number Diff line
@@ -1521,10 +1521,61 @@ TransporterRegistry::get_transporter(NodeId nodeId) {
  return theTransporters[nodeId];
}

int TransporterRegistry::connect_client(NdbMgmHandle h)
{
  DBUG_ENTER("TransporterRegistry::connect_client(NdbMgmHandle)");

  Uint32 mgm_nodeid= ndb_mgm_get_mgmd_nodeid(h);

  Transporter * t = theTransporters[mgm_nodeid];
  if (!t)
    return -1;

  DBUG_RETURN(t->connect_client(connect_ndb_mgmd(h)));
}

/**
 * Given a connected NdbMgmHandle, turns it into a transporter
 * and returns the socket.
 */
NDB_SOCKET_TYPE TransporterRegistry::connect_ndb_mgmd(NdbMgmHandle h)
{
  struct ndb_mgm_reply mgm_reply;

  if ( 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,
				   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);
      return NDB_INVALID_SOCKET;
    }

  /**
   * convert_to_transporter also disposes of the handle (i.e. we don't leak
   * memory here.
   */
  NDB_SOCKET_TYPE sockfd= ndb_mgm_convert_to_transporter(h);
  if ( sockfd == NDB_INVALID_SOCKET)
    ndb_mgm_destroy_handle(&h);
  return sockfd;
}

/**
 * Given a SocketClient, creates a NdbMgmHandle, turns it into a transporter
 * and returns the socket.
 */
NDB_SOCKET_TYPE TransporterRegistry::connect_ndb_mgmd(SocketClient *sc)
{
  NdbMgmHandle h= ndb_mgm_create_handle();
  struct ndb_mgm_reply mgm_reply;

  if ( h == NULL )
  {
@@ -1562,22 +1613,7 @@ NDB_SOCKET_TYPE TransporterRegistry::connect_ndb_mgmd(SocketClient *sc)
    return NDB_INVALID_SOCKET;
  }

  for(unsigned int i=0;i < m_transporter_interface.size();i++)
    if (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);
      return NDB_INVALID_SOCKET;
    }

  NDB_SOCKET_TYPE sockfd= ndb_mgm_convert_to_transporter(h);
  if ( sockfd == NDB_INVALID_SOCKET)
    ndb_mgm_destroy_handle(&h);
  return sockfd;
  return connect_ndb_mgmd(h);
}

template class Vector<TransporterRegistry::Transporter_interface>;
Loading