Commit 983cad51 authored by unknown's avatar unknown

Bug #13009 No gaps allowed in node id number sequence

+ some small bugfixes in ndb_config
+ extending ndb_config to print connections and take shm option

parent e0fd72c9
...@@ -5,3 +5,8 @@ ndbd,1,localhost ndbd,2,localhost ndb_mgmd,3,localhost mysqld,4, mysqld,5, mysql ...@@ -5,3 +5,8 @@ ndbd,1,localhost ndbd,2,localhost ndb_mgmd,3,localhost mysqld,4, mysqld,5, mysql
1 2 1 2
ndbd,1,localhost ndbd,2,localhost ndb_mgmd,3,localhost mysqld,4, mysqld,5, mysqld,6, mysqld,7, ndbd,1,localhost ndbd,2,localhost ndb_mgmd,3,localhost mysqld,4, mysqld,5, mysqld,6, mysqld,7,
ndbd,1,localhost,52428800,26214400 ndbd,2,localhost,52428800,36700160 ndbd,3,localhost,52428800,52428800 ndbd,4,localhost,52428800,52428800 ndb_mgmd,5,localhost,, mysqld,6,localhost,, ndbd,1,localhost,52428800,26214400 ndbd,2,localhost,52428800,36700160 ndbd,3,localhost,52428800,52428800 ndbd,4,localhost,52428800,52428800 ndb_mgmd,5,localhost,, mysqld,6,localhost,,
ndbd,1,localhost ndbd,2,localhost ndbd,3,localhost ndbd,4,localhost ndb_mgmd,5,localhost mysqld,6, mysqld,7, mysqld,8, mysqld,9, mysqld,10,
Cluster configuration warning line 0: Could not use next node id 2 for section [API], using next unused node id 7.
ndbd,2,localhost ndbd,3,localhost ndbd,4,localhost ndbd,5,localhost ndb_mgmd,6,localhost mysqld,1, mysqld,7, mysqld,8, mysqld,9, mysqld,10,
ndbd,3,localhost ndbd,4,localhost ndbd,5,localhost ndbd,6,localhost ndb_mgmd,1,localhost ndb_mgmd,2,localhost mysqld,11, mysqld,12, mysqld,13, mysqld,14, mysqld,15,
shm,3,4,35,3 shm,3,5,35,3 shm,3,6,35,3 shm,4,5,35,4 shm,4,6,35,4 shm,5,6,35,5 tcp,11,3,55,3 tcp,11,4,55,4 tcp,11,5,55,5 tcp,11,6,55,6 tcp,12,3,55,3 tcp,12,4,55,4 tcp,12,5,55,5 tcp,12,6,55,6 tcp,13,3,55,3 tcp,13,4,55,4 tcp,13,5,55,5 tcp,13,6,55,6 tcp,14,3,55,3 tcp,14,4,55,4 tcp,14,5,55,5 tcp,14,6,55,6 tcp,15,3,55,3 tcp,15,4,55,4 tcp,15,5,55,5 tcp,15,6,55,6 tcp,1,3,55,1 tcp,1,4,55,1 tcp,1,5,55,1 tcp,1,6,55,1 tcp,2,3,55,2 tcp,2,4,55,2 tcp,2,5,55,2 tcp,2,6,55,2
#
# Testing automatic node id generation
#
[cluster_config]
NoOfReplicas=2
Signum=39
[cluster_config.cluster0]
ndbd = localhost,localhost,localhost,localhost
ndb_mgmd = localhost
mysqld = ,,,,
[cluster_config.cluster1]
ndbd = localhost,localhost,localhost,localhost
ndb_mgmd = localhost
mysqld = ,,,,
[cluster_config.ndbd.1.cluster1]
NodeId=2
[cluster_config.mysqld.1.cluster1]
NodeId=1
[cluster_config.cluster2]
ndbd = localhost,localhost,localhost,localhost
ndb_mgmd = localhost,localhost
mysqld = ,,,,
[cluster_config.mysqld.1.cluster2]
NodeId=11
[cluster_config.ndb_mgmd.1.cluster2]
NodeId=1
[cluster_config.ndbd.1.cluster2]
NodeId=3
...@@ -11,3 +11,8 @@ ...@@ -11,3 +11,8 @@
# End of 4.1 tests # End of 4.1 tests
--exec $NDB_TOOLS_DIR/ndb_config --defaults-group-suffix=.jonas --defaults-file=$MYSQL_TEST_DIR/std_data/ndb_config_mycnf1.cnf --query=type,nodeid,host,IndexMemory,DataMemory --mycnf 2> /dev/null --exec $NDB_TOOLS_DIR/ndb_config --defaults-group-suffix=.jonas --defaults-file=$MYSQL_TEST_DIR/std_data/ndb_config_mycnf1.cnf --query=type,nodeid,host,IndexMemory,DataMemory --mycnf 2> /dev/null
--exec $NDB_TOOLS_DIR/ndb_config --defaults-group-suffix=.cluster0 --defaults-file=$MYSQL_TEST_DIR/std_data/ndb_config_mycnf2.cnf --query=type,nodeid,host --mycnf 2> /dev/null
--exec $NDB_TOOLS_DIR/ndb_config --defaults-group-suffix=.cluster1 --defaults-file=$MYSQL_TEST_DIR/std_data/ndb_config_mycnf2.cnf --query=type,nodeid,host --mycnf 2> /dev/null
--exec $NDB_TOOLS_DIR/ndb_config --defaults-group-suffix=.cluster2 --defaults-file=$MYSQL_TEST_DIR/std_data/ndb_config_mycnf2.cnf --query=type,nodeid,host --mycnf 2> /dev/null
--exec $NDB_TOOLS_DIR/ndb_config --defaults-group-suffix=.cluster2 --defaults-file=$MYSQL_TEST_DIR/std_data/ndb_config_mycnf2.cnf --ndb-shm --connections --query=type,nodeid1,nodeid2,group,nodeidserver --mycnf 2> /dev/null
...@@ -116,6 +116,7 @@ ...@@ -116,6 +116,7 @@
#define CFG_CONNECTION_HOSTNAME_1 407 #define CFG_CONNECTION_HOSTNAME_1 407
#define CFG_CONNECTION_HOSTNAME_2 408 #define CFG_CONNECTION_HOSTNAME_2 408
#define CFG_CONNECTION_GROUP 409 #define CFG_CONNECTION_GROUP 409
#define CFG_CONNECTION_NODE_ID_SERVER 410
#define CFG_TCP_SERVER 452 #define CFG_TCP_SERVER 452
#define CFG_TCP_SEND_BUFFER_SIZE 454 #define CFG_TCP_SEND_BUFFER_SIZE 454
......
...@@ -231,8 +231,11 @@ IPCConfig::configureTransporters(Uint32 nodeId, ...@@ -231,8 +231,11 @@ IPCConfig::configureTransporters(Uint32 nodeId,
Uint32 server_port= 0; Uint32 server_port= 0;
if(iter.get(CFG_CONNECTION_SERVER_PORT, &server_port)) break; if(iter.get(CFG_CONNECTION_SERVER_PORT, &server_port)) break;
Uint32 nodeIdServer= 0;
if(iter.get(CFG_CONNECTION_NODE_ID_SERVER, &nodeIdServer)) break;
/* /*
We check the node type. MGM node becomes server. We check the node type.
*/ */
Uint32 node1type, node2type; Uint32 node1type, node2type;
ndb_mgm_configuration_iterator node1iter(config, CFG_SECTION_NODE); ndb_mgm_configuration_iterator node1iter(config, CFG_SECTION_NODE);
...@@ -242,20 +245,12 @@ IPCConfig::configureTransporters(Uint32 nodeId, ...@@ -242,20 +245,12 @@ IPCConfig::configureTransporters(Uint32 nodeId,
node1iter.get(CFG_TYPE_OF_SECTION,&node1type); node1iter.get(CFG_TYPE_OF_SECTION,&node1type);
node2iter.get(CFG_TYPE_OF_SECTION,&node2type); node2iter.get(CFG_TYPE_OF_SECTION,&node2type);
conf.serverNodeId= (nodeId1 < nodeId2)? nodeId1:nodeId2; if(node1type==NODE_TYPE_MGM || node2type==NODE_TYPE_MGM)
conf.isMgmConnection= false;
if(node2type==NODE_TYPE_MGM)
{
conf.isMgmConnection= true;
conf.serverNodeId= nodeId2;
}
else if(node1type==NODE_TYPE_MGM)
{
conf.isMgmConnection= true; conf.isMgmConnection= true;
conf.serverNodeId= nodeId1; else
} conf.isMgmConnection= false;
else if (nodeId == conf.serverNodeId) {
if (nodeId == nodeIdServer && !conf.isMgmConnection) {
tr.add_transporter_interface(remoteNodeId, localHostName, server_port); tr.add_transporter_interface(remoteNodeId, localHostName, server_port);
} }
...@@ -279,6 +274,7 @@ IPCConfig::configureTransporters(Uint32 nodeId, ...@@ -279,6 +274,7 @@ IPCConfig::configureTransporters(Uint32 nodeId,
conf.s_port = server_port; conf.s_port = server_port;
conf.localHostName = localHostName; conf.localHostName = localHostName;
conf.remoteHostName = remoteHostName; conf.remoteHostName = remoteHostName;
conf.serverNodeId = nodeIdServer;
switch(type){ switch(type){
case CONNECTION_TYPE_SHM: case CONNECTION_TYPE_SHM:
......
This diff is collapsed.
...@@ -640,7 +640,7 @@ InitConfigFileParser::store_in_properties(Vector<struct my_option>& options, ...@@ -640,7 +640,7 @@ InitConfigFileParser::store_in_properties(Vector<struct my_option>& options,
value_int = *(Uint64*)options[i].value; value_int = *(Uint64*)options[i].value;
break; break;
case GET_STR: case GET_STR:
ctx.m_currentSection->put(options[i].name, (char*)options[i].value); ctx.m_currentSection->put(options[i].name, *(char**)options[i].value);
continue; continue;
default: default:
abort(); abort();
...@@ -762,9 +762,6 @@ InitConfigFileParser::parse_mycnf() ...@@ -762,9 +762,6 @@ InitConfigFileParser::parse_mycnf()
Vector<struct my_option> options; Vector<struct my_option> options;
for(i = 0; i<ConfigInfo::m_NoOfParams; i++) for(i = 0; i<ConfigInfo::m_NoOfParams; i++)
{ {
if (strcmp(ConfigInfo::m_ParamInfo[i]._section, "DB") == 0 ||
strcmp(ConfigInfo::m_ParamInfo[i]._section, "API") == 0 ||
strcmp(ConfigInfo::m_ParamInfo[i]._section, "MGM") == 0)
{ {
struct my_option opt; struct my_option opt;
bzero(&opt, sizeof(opt)); bzero(&opt, sizeof(opt));
...@@ -855,6 +852,12 @@ InitConfigFileParser::parse_mycnf() ...@@ -855,6 +852,12 @@ InitConfigFileParser::parse_mycnf()
goto end; goto end;
if(!handle_mycnf_defaults(options, ctx, "MGM")) if(!handle_mycnf_defaults(options, ctx, "MGM"))
goto end; goto end;
if(!handle_mycnf_defaults(options, ctx, "TCP"))
goto end;
if(!handle_mycnf_defaults(options, ctx, "SHM"))
goto end;
if(!handle_mycnf_defaults(options, ctx, "SCI"))
goto end;
{ {
struct sect { struct my_option* src; const char * name; } sections[] = struct sect { struct my_option* src; const char * name; } sections[] =
......
...@@ -33,7 +33,7 @@ ...@@ -33,7 +33,7 @@
static int g_verbose = 0; static int g_verbose = 0;
static int try_reconnect = 3; static int try_reconnect = 3;
static int g_nodes = 1; static int g_nodes, g_connections, g_section;
static const char * g_connectstring = 0; static const char * g_connectstring = 0;
static const char * g_query = 0; static const char * g_query = 0;
...@@ -70,13 +70,19 @@ static struct my_option my_long_options[] = ...@@ -70,13 +70,19 @@ static struct my_option my_long_options[] =
"Overides specifying entries in NDB_CONNECTSTRING and Ndb.cfg", "Overides specifying entries in NDB_CONNECTSTRING and Ndb.cfg",
(gptr*) &g_connectstring, (gptr*) &g_connectstring, (gptr*) &g_connectstring, (gptr*) &g_connectstring,
0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 }, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 },
{ "ndb-shm", 256, "Print nodes",
(gptr*) &opt_ndb_shm, (gptr*) &opt_ndb_shm,
0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
{ "nodes", 256, "Print nodes", { "nodes", 256, "Print nodes",
(gptr*) &g_nodes, (gptr*) &g_nodes, (gptr*) &g_nodes, (gptr*) &g_nodes,
0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0}, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
{ "connections", 256, "Print connections",
(gptr*) &g_connections, (gptr*) &g_connections,
0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
{ "query", 'q', "Query option(s)", { "query", 'q', "Query option(s)",
(gptr*) &g_query, (gptr*) &g_query, (gptr*) &g_query, (gptr*) &g_query,
0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
{ "host", 257, "Host", { "host", 256, "Host",
(gptr*) &g_host, (gptr*) &g_host, (gptr*) &g_host, (gptr*) &g_host,
0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
{ "type", 258, "Type of node/connection", { "type", 258, "Type of node/connection",
...@@ -155,6 +161,11 @@ struct NodeTypeApply : public Apply ...@@ -155,6 +161,11 @@ struct NodeTypeApply : public Apply
virtual int apply(const Iter&); virtual int apply(const Iter&);
}; };
struct ConnectionTypeApply : public Apply
{
virtual int apply(const Iter&);
};
static int parse_query(Vector<Apply*>&, int &argc, char**& argv); static int parse_query(Vector<Apply*>&, int &argc, char**& argv);
static int parse_where(Vector<Match*>&, int &argc, char**& argv); static int parse_where(Vector<Match*>&, int &argc, char**& argv);
static int eval(const Iter&, const Vector<Match*>&); static int eval(const Iter&, const Vector<Match*>&);
...@@ -172,6 +183,15 @@ main(int argc, char** argv){ ...@@ -172,6 +183,15 @@ main(int argc, char** argv){
ndb_std_get_one_option))) ndb_std_get_one_option)))
return -1; return -1;
if (g_nodes && g_connections)
{
ndbout_c("Only one option of --nodes and --connections allowed");
}
g_section = CFG_SECTION_NODE; //default
if (g_connections)
g_section = CFG_SECTION_CONNECTION;
ndb_mgm_configuration * conf = 0; ndb_mgm_configuration * conf = 0;
if (g_config_file || g_mycnf) if (g_config_file || g_mycnf)
...@@ -202,7 +222,7 @@ main(int argc, char** argv){ ...@@ -202,7 +222,7 @@ main(int argc, char** argv){
exit(0); exit(0);
} }
Iter iter(* conf, CFG_SECTION_NODE); Iter iter(* conf, g_section);
bool prev= false; bool prev= false;
iter.first(); iter.first();
for(iter.first(); iter.valid(); iter.next()) for(iter.first(); iter.valid(); iter.next())
...@@ -231,13 +251,32 @@ parse_query(Vector<Apply*>& select, int &argc, char**& argv) ...@@ -231,13 +251,32 @@ parse_query(Vector<Apply*>& select, int &argc, char**& argv)
for(unsigned i = 0; i<list.size(); i++) for(unsigned i = 0; i<list.size(); i++)
{ {
const char * str= list[i].c_str(); const char * str= list[i].c_str();
if(strcasecmp(str, "id") == 0 || strcasecmp(str, "nodeid") == 0) if(g_section == CFG_SECTION_NODE)
select.push_back(new Apply(CFG_NODE_ID)); {
else if(strncasecmp(str, "host", 4) == 0) if(strcasecmp(str, "id") == 0 || strcasecmp(str, "nodeid") == 0)
select.push_back(new Apply(CFG_NODE_HOST)); {
else if(strcasecmp(str, "type") == 0) select.push_back(new Apply(CFG_NODE_ID));
select.push_back(new NodeTypeApply()); continue;
else if(g_nodes) }
else if(strncasecmp(str, "host", 4) == 0)
{
select.push_back(new Apply(CFG_NODE_HOST));
continue;
}
else if(strcasecmp(str, "type") == 0)
{
select.push_back(new NodeTypeApply());
continue;
}
}
else if (g_section == CFG_SECTION_CONNECTION)
{
if(strcasecmp(str, "type") == 0)
{
select.push_back(new ConnectionTypeApply());
continue;
}
}
{ {
bool found = false; bool found = false;
for(int p = 0; p<ConfigInfo::m_NoOfParams; p++) for(int p = 0; p<ConfigInfo::m_NoOfParams; p++)
...@@ -245,9 +284,15 @@ parse_query(Vector<Apply*>& select, int &argc, char**& argv) ...@@ -245,9 +284,15 @@ parse_query(Vector<Apply*>& select, int &argc, char**& argv)
if(0)ndbout_c("%s %s", if(0)ndbout_c("%s %s",
ConfigInfo::m_ParamInfo[p]._section, ConfigInfo::m_ParamInfo[p]._section,
ConfigInfo::m_ParamInfo[p]._fname); ConfigInfo::m_ParamInfo[p]._fname);
if(strcmp(ConfigInfo::m_ParamInfo[p]._section, "DB") == 0 || if(g_section == CFG_SECTION_CONNECTION &&
strcmp(ConfigInfo::m_ParamInfo[p]._section, "API") == 0 || (strcmp(ConfigInfo::m_ParamInfo[p]._section, "TCP") == 0 ||
strcmp(ConfigInfo::m_ParamInfo[p]._section, "MGM") == 0) strcmp(ConfigInfo::m_ParamInfo[p]._section, "SCI") == 0 ||
strcmp(ConfigInfo::m_ParamInfo[p]._section, "SHM") == 0)
||
g_section == CFG_SECTION_NODE &&
(strcmp(ConfigInfo::m_ParamInfo[p]._section, "DB") == 0 ||
strcmp(ConfigInfo::m_ParamInfo[p]._section, "API") == 0 ||
strcmp(ConfigInfo::m_ParamInfo[p]._section, "MGM") == 0))
{ {
if(strcasecmp(ConfigInfo::m_ParamInfo[p]._fname, str) == 0) if(strcasecmp(ConfigInfo::m_ParamInfo[p]._fname, str) == 0)
{ {
...@@ -263,11 +308,6 @@ parse_query(Vector<Apply*>& select, int &argc, char**& argv) ...@@ -263,11 +308,6 @@ parse_query(Vector<Apply*>& select, int &argc, char**& argv)
return 1; return 1;
} }
} }
else
{
fprintf(stderr, "Unknown query option: %s\n", str);
return 1;
}
} }
} }
return 0; return 0;
...@@ -425,6 +465,31 @@ NodeTypeApply::apply(const Iter& iter) ...@@ -425,6 +465,31 @@ NodeTypeApply::apply(const Iter& iter)
return 0; return 0;
} }
int
ConnectionTypeApply::apply(const Iter& iter)
{
Uint32 val32;
if (iter.get(CFG_TYPE_OF_SECTION, &val32) == 0)
{
switch (val32)
{
case CONNECTION_TYPE_TCP:
printf("tcp");
break;
case CONNECTION_TYPE_SCI:
printf("sci");
break;
case CONNECTION_TYPE_SHM:
printf("shm");
break;
default:
printf("<unknown>");
break;
}
}
return 0;
}
ndb_mgm_configuration* ndb_mgm_configuration*
fetch_configuration() fetch_configuration()
{ {
......
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