Commit 2a153686 authored by stewart@mysql.com's avatar stewart@mysql.com

Distinguish between "real" ports and those that can be negative (dynamic).

(Suggested by Tomas Ulin as part of review for WL2278)
parent c71278bd
......@@ -232,12 +232,12 @@ public:
class Transporter_interface {
public:
NodeId m_remote_nodeId;
int m_service_port;
int m_s_service_port; // signed port number
const char *m_interface;
};
Vector<Transporter_interface> m_transporter_interface;
void add_transporter_interface(NodeId remoteNodeId, const char *interf,
int port);
int s_port); // signed port. <0 is dynamic
Transporter* get_transporter(NodeId nodeId);
NodeId get_localNodeId() { return localNodeId; };
......
......@@ -371,8 +371,18 @@ IPCConfig::configureTransporters(Uint32 nodeId,
}
DBUG_PRINT("info", ("Transporter between this node %d and node %d using port %d, signalId %d, checksum %d",
nodeId, remoteNodeId, server_port, sendSignalId, checksum));
/*
This may be a dynamic port. It depends on when we're getting
our configuration. If we've been restarted, we'll be getting
a configuration with our old dynamic port in it, hence the number
here is negative (and we try the old port number first).
On a first-run, server_port will be zero (with dynamic ports)
If we're not using dynamic ports, we don't do anything.
*/
if((int)server_port<0)
server_port= -server_port; // A dynamic port
server_port= -server_port;
switch(type){
case CONNECTION_TYPE_SHM:{
......
......@@ -1267,17 +1267,17 @@ TransporterRegistry::stop_clients()
void
TransporterRegistry::add_transporter_interface(NodeId remoteNodeId,
const char *interf,
int port)
int s_port)
{
DBUG_ENTER("TransporterRegistry::add_transporter_interface");
DBUG_PRINT("enter",("interface=%s, port= %d", interf, port));
DBUG_PRINT("enter",("interface=%s, s_port= %d", interf, s_port));
if (interf && strlen(interf) == 0)
interf= 0;
for (unsigned i= 0; i < m_transporter_interface.size(); i++)
{
Transporter_interface &tmp= m_transporter_interface[i];
if (port != tmp.m_service_port || tmp.m_service_port==0)
if (s_port != tmp.m_s_service_port || tmp.m_s_service_port==0)
continue;
if (interf != 0 && tmp.m_interface != 0 &&
strcmp(interf, tmp.m_interface) == 0)
......@@ -1291,7 +1291,7 @@ TransporterRegistry::add_transporter_interface(NodeId remoteNodeId,
}
Transporter_interface t;
t.m_remote_nodeId= remoteNodeId;
t.m_service_port= port;
t.m_s_service_port= s_port;
t.m_interface= interf;
m_transporter_interface.push_back(t);
DBUG_PRINT("exit",("interface and port added"));
......@@ -1311,9 +1311,9 @@ TransporterRegistry::start_service(SocketServer& socket_server)
{
Transporter_interface &t= m_transporter_interface[i];
unsigned short port= t.m_service_port;
if(t.m_service_port<0)
port= -t.m_service_port; // is a dynamic port
unsigned short port= (unsigned short)t.m_s_service_port;
if(t.m_s_service_port<0)
port= -t.m_s_service_port; // is a dynamic port
TransporterService *transporter_service =
new TransporterService(new SocketAuthSimple("ndbd", "ndbd passwd"));
if(!socket_server.setup(transporter_service,
......@@ -1321,7 +1321,7 @@ TransporterRegistry::start_service(SocketServer& socket_server)
{
DBUG_PRINT("info", ("Trying new port"));
port= 0;
if(t.m_service_port>0
if(t.m_s_service_port>0
|| !socket_server.setup(transporter_service,
&port, t.m_interface))
{
......@@ -1332,13 +1332,13 @@ TransporterRegistry::start_service(SocketServer& socket_server)
ndbout_c("Unable to setup transporter service port: %s:%d!\n"
"Please check if the port is already used,\n"
"(perhaps the node is already running)",
t.m_interface ? t.m_interface : "*", t.m_service_port);
t.m_interface ? t.m_interface : "*", t.m_s_service_port);
delete transporter_service;
return false;
}
}
t.m_service_port= (t.m_service_port<=0)?-port:port; // -`ve if dynamic
DBUG_PRINT("info", ("t.m_service_port = %d",t.m_service_port));
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));
transporter_service->setTransporterRegistry(this);
}
return true;
......
......@@ -211,7 +211,7 @@ int main(int argc, char** argv)
globalTransporterRegistry.get_localNodeId(),
globalTransporterRegistry.m_transporter_interface[i].m_remote_nodeId,
CFG_CONNECTION_SERVER_PORT,
globalTransporterRegistry.m_transporter_interface[i].m_service_port,
globalTransporterRegistry.m_transporter_interface[i].m_s_service_port,
&mgm_reply);
......
......@@ -620,18 +620,18 @@ MgmtSrvr::start(BaseString &error_string)
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 : %u",
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_service_port
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,
(int)reg->m_transporter_interface[i]
.m_service_port,
reg->m_transporter_interface[i]
.m_s_service_port,
msg);
DBUG_PRINT("info",("Set result: %d: %s",res,msg.c_str()));
}
......
......@@ -500,7 +500,7 @@ int Ndb_cluster_connection::connect(int no_retries, int retry_delay_in_seconds,
CFG_CONNECTION_SERVER_PORT,
m_impl.m_transporter_facade->get_registry()
->m_transporter_interface[i]
.m_service_port,
.m_s_service_port,
&mgm_reply);
ndb_mgm_destroy_configuration(props);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment