bool Transporter::connect_client(NDB_SOCKET_TYPE sockfd) { if(m_connected) return true; if (sockfd == NDB_INVALID_SOCKET) return false; DBUG_ENTER("Transporter::connect_client"); DBUG_PRINT("info",("port %d isMgmConnection=%d",m_s_port,isMgmConnection)); SocketOutputStream s_output(sockfd); SocketInputStream s_input(sockfd); // send info about own id // send info about own transporter type s_output.println("%d %d", localNodeId, m_type); // get remote id int nodeId, remote_transporter_type= -1; char buf[256]; if (s_input.gets(buf, 256) == 0) { NDB_CLOSE_SOCKET(sockfd); DBUG_RETURN(false); } int r= sscanf(buf, "%d %d", &nodeId, &remote_transporter_type); switch (r) { case 2: break; case 1: // we're running version prior to 4.1.9 // ok, but with no checks on transporter configuration compatability break; default: NDB_CLOSE_SOCKET(sockfd); DBUG_RETURN(false); } DBUG_PRINT("info", ("nodeId=%d remote_transporter_type=%d", nodeId, remote_transporter_type)); if (remote_transporter_type != -1) { if (remote_transporter_type != m_type) { DBUG_PRINT("error", ("Transporter types mismatch this=%d remote=%d", m_type, remote_transporter_type)); NDB_CLOSE_SOCKET(sockfd); g_eventLogger.error("Incompatible configuration: transporter type " "mismatch with node %d", nodeId); DBUG_RETURN(false); } } else if (m_type == tt_SHM_TRANSPORTER) { g_eventLogger.warning("Unable to verify transporter compatability with node %d", nodeId); } { struct sockaddr_in addr; SOCKET_SIZE_TYPE addrlen= sizeof(addr); getpeername(sockfd, (struct sockaddr*)&addr, &addrlen); m_connect_address= (&addr)->sin_addr; } bool res = connect_client_impl(sockfd); if(res){ m_connected = true; m_errorCount = 0; } DBUG_RETURN(res); }
bool Transporter::connect_client(NDB_SOCKET_TYPE sockfd) { DBUG_ENTER("Transporter::connect_client(sockfd)"); if(m_connected) { DBUG_PRINT("error", ("Already connected")); DBUG_RETURN(true); } if (!my_socket_valid(sockfd)) { DBUG_PRINT("error", ("Socket " MY_SOCKET_FORMAT " is not valid", MY_SOCKET_FORMAT_VALUE(sockfd))); DBUG_RETURN(false); } DBUG_PRINT("info",("server port: %d, isMgmConnection: %d", m_s_port, isMgmConnection)); // Send "hello" DBUG_PRINT("info", ("Sending own nodeid: %d and transporter type: %d", localNodeId, m_type)); SocketOutputStream s_output(sockfd); if (s_output.println("%d %d", localNodeId, m_type) < 0) { DBUG_PRINT("error", ("Send of 'hello' failed")); NDB_CLOSE_SOCKET(sockfd); DBUG_RETURN(false); } // Read reply DBUG_PRINT("info", ("Reading reply")); char buf[256]; SocketInputStream s_input(sockfd); if (s_input.gets(buf, 256) == 0) { DBUG_PRINT("error", ("Failed to read reply")); NDB_CLOSE_SOCKET(sockfd); DBUG_RETURN(false); } // Parse reply int nodeId, remote_transporter_type= -1; int r= sscanf(buf, "%d %d", &nodeId, &remote_transporter_type); switch (r) { case 2: break; case 1: // we're running version prior to 4.1.9 // ok, but with no checks on transporter configuration compatability break; default: DBUG_PRINT("error", ("Failed to parse reply")); NDB_CLOSE_SOCKET(sockfd); DBUG_RETURN(false); } DBUG_PRINT("info", ("nodeId=%d remote_transporter_type=%d", nodeId, remote_transporter_type)); // Check nodeid if (nodeId != remoteNodeId) { g_eventLogger->error("Connected to wrong nodeid: %d, expected: %d", nodeId, remoteNodeId); NDB_CLOSE_SOCKET(sockfd); DBUG_RETURN(false); } // Check transporter type if (remote_transporter_type != -1 && remote_transporter_type != m_type) { g_eventLogger->error("Connection to node: %d uses different transporter " "type: %d, expected type: %d", nodeId, remote_transporter_type, m_type); NDB_CLOSE_SOCKET(sockfd); DBUG_RETURN(false); } // Cache the connect address my_socket_connect_address(sockfd, &m_connect_address); if (!connect_client_impl(sockfd)) DBUG_RETURN(false); m_connected = true; DBUG_RETURN(true); }